首先附上电路图:attachment download
然后就是程序了:
#include"io.h"
#include"font.h"
#include"write_data_595.h"
uchar th;
uchar tl;
uint temp_ds18b20;
uchar hour_shi,hour_ge,minite_shi,minite_ge,sec_shi,sec_ge;
uchar num_ds1302[8]={9,8,7,6,5,4,3,2};
//秒 分 时 日 月 星期 年 控制
uchar set_clk[8]={0x00,0x41,0x16};
uchar get_clk[8];
void RTInputByte(uchar d)//写入一个字节
{
uchar i=0;
ACC=d;
for(i=8;i>0;i--)
{
T_IO=ACC0;
T_CLK=1;
T_CLK=0;
ACC=ACC>>1;
}
}
uchar RTOutputByte(void)//读一个字节
{
uchar i=0;
for(i=0;i<8;i++)
{
ACC=ACC>>1;
ACC7=T_IO;
T_CLK=1;
T_CLK=0;
}
return(ACC);
}
void W1302(uchar ucAddr, uchar ucDa)
{
T_RST=0;
T_CLK=0;
T_RST=1;
RTInputByte(ucAddr);
RTInputByte(ucDa);
T_CLK=1;
T_RST=0;
}
/*uchar R1302(uchar ucAddr)
{
uchar R_DATA=0;
T_RST=0;
T_CLK=0;
T_RST=1;
RTInputByte(ucAddr);
R_DATA=RTOutputByte();
T_CLK=1;
T_RST=0;
return R_DATA;
} */
void BurstW1302T(uchar *pWClock)
{
uchar i=0;
W1302(0x8e,0x00);
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(0xbe);
for(i=0;i<8;i++)
{
RTInputByte(*pWClock);
pWClock++;
}
T_CLK=1;
T_RST=0;
}
void BurstR1302T(uchar *pRClock)
{
uchar i=0;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(0xbf);
for(i=0;i<8;i++)
{
*pRClock=RTOutputByte();
pRClock++;
}
T_CLK=1;
T_RST=0;
}void delay_ds18b20(uint z) //延时子函数
{
uint x,y;
for(x=z;z>0;z--)
for(y=11;y>0;y--);
}
void dsreset(void) //温度采集复位函数
{
uint i;
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
}bit tmpreadbit(void) //read a bit
{
uint i;
bit dat;
DS=0;i++; //i++ for delay
DS=1;i++;i++;
dat=DS;
i=8;while(i>0)i--;
return (dat);
}uchar tmpread(void) //read a byte date
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat);
}void tmpwritebyte(uchar dat) //write a byte to ds18b20
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //write 1
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0; //write 0
i=8;while(i>0)i--;
DS=1;
i++;i++;
}}
}void tmpchange(void) //DS18B20 begin change
{
dsreset();
delay_ds18b20(1);
tmpwritebyte(0xcc); // address all drivers on bus
tmpwritebyte(0x44); // initiates a single temperature conversion发命令开始装换温度
}uchar tmp() //get the temperature
{
float tt;
dsreset();
delay_ds18b20(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe);
tl=tmpread();
th=tmpread();
temp_ds18b20=th;
temp_ds18b20<<=8; //two byte compose a int variable
temp_ds18b20=temp_ds18b20|tl;
tt=temp_ds18b20*0.0625;
temp_ds18b20=tt*10+0.5;
return temp_ds18b20;}
/*******************************************************
函数名称:xuan_hang()
函数功能:选择第几行
*******************************************************/
void xuan_hang(unsigned char h)
{
P2=hang[h]|0x00;
}/*******************************************************
函数名称:display(uchar n)
函数功能: 显示函数 n为第几行字 0:华东交大 1:信息学院 2:通信工程 3:欢迎您!
入口参数:n
出口参数:
*******************************************************/
void display(unsigned char n) //显示数组的第n个汉字开始的后4个字
{
uchar i;
for(i=0;i<16;i++)
{write_data_595(xianshi[n][2*i],xianshi[n][2*i+1],xianshi[n+1][2*i],xianshi[n+1][2*i+1],xianshi[n+2][2*i],xianshi[n+2][2*i+1],xianshi[n+3][2*i],xianshi[n+3][2*i+1]);
xuan_hang(i);//先选行后选列
}
}
void display_ds18b20()
{ uchar shi,ge,xiaoshu;
uchar a;
uchar i,wendu;
tmpchange();//开始转换
tmp();
wendu=temp_ds18b20;shi=wendu/100; //百位
a=wendu%100; //
ge=a/10; //十位
xiaoshu=a%10; //个位
//返回参数a1,a2,a3
for(i=0;i<16;i++)
{
write_data_595(xianshi[12][2*i],xianshi[12][2*i+1], xianshi[12+1][2*i],xianshi[12+1][2*i+1], //温度
shuzi[shi],shuzi[ge], //十位和个位
shuzi[10], // . 小数点
shuzi[xiaoshu]); // 小数点后的一位
xuan_hang(i);//先选行后选列
}
}
void display_ds1302() //显示时分秒
{
uchar i;
unsigned char loop=0;
hour_shi=get_clk[2]>>4;
hour_ge=get_clk[2]&0X0F;num_ds1302[2]=16;
minite_shi=get_clk[1]>>4; //得到要显示数据的万位
minite_ge=get_clk[1]&0X0F;num_ds1302[5]=16;
sec_shi=get_clk[0]>>4; //得到要显示数据的十位
sec_ge=get_clk[0]&0X0F; //得到要显示数据的个位
/* hour_shi=hour/10;
hour_ge=hour%10;
minite_shi=minite/10;
minite_ge=minite%10;
sec_shi=sec/10;
sec_ge=sec%10; */
for(i=0;i<16;i++)
{
write_data_595(shuzi[hour_shi],shuzi[hour_ge],
shuzi[11],
shuzi[minite_shi], shuzi[minite_ge],
shuzi[11],
shuzi[sec_shi], shuzi[sec_ge]);
xuan_hang(i);//先选行后选列
}
}/*******************************************************
函数名称:main()
函数功能:主函数
*******************************************************/
void main()
{
uint i;
uchar j,num;
num=160;
//BurstW1302T(set_clk);//设定初始时间
while(1)
{for(j=0;j<num;j++)
{
display(0);
}
for(j=0;j<num;j++)
{
display(4);
}
for(j=0;j<num;j++)
{
display(8);
}
for(i=0;i<1000;i++)
{
BurstR1302T(get_clk);
display_ds1302();
}
for(i=0;i<1000;i++)
{
display_ds18b20();
}
}
}
用户1707053 2014-4-15 21:24
用户1622284 2012-4-10 02:26