51单片机+ds1302+DS18b20温度时钟(电路图+C语言程序) 下载本文

dis_bit3=1; }

//*************************************************************** //功能:把数据1显示在数码管1上 void display1(uchar dis_data) {

smg_data=tabl1[dis_data];//送显示断码 dis_bit1=0;//锁存数据 delay_50us(40); dis_bit1=1; }

//*************************************************************** //功能:把数据1显示在数码管1上 void display2(uchar dis_data) {

smg_data=tabl1[dis_data];//送显示断码 dis_bit2=0;//锁存数据 delay_50us(40); dis_bit2=1; }

//**************************************************************************************************

//函数名称:void delay_50US(unsigned int t) //功能: 延时50*t(us) void delay_50us(uint t) {

unsigned char j; for(;t>0;t--) {

for(j=19;j>0;j--); } }

//*******************************************************************************

//8微秒延时基准程序 void delay_8us(uint t) {

while(--t); }

//******************************************************************************* //3微秒延时程序 void delay_3us() {

; ; }

//*******************************************************************************

//子程序功能:向DS18B20写一字节的数据 void w_1byte_ds18b20(uchar value) {

uchar i=0; for(i=0;i<8;i++) {

dq_ds18b20=1; delay_3us(); dq_ds18b20=0; delay_8us(2);

if (value & 0x01) dq_ds18b20=1; //DQ = 1 delay_50us(1); //延时50us 以上 delay_8us(2); value>>=1; }

dq_ds18b20=1; //DQ = 1 }

//读一个字节

uchar r_1byte_ds18b20(void) {

uchar i=0;

uchar value = 0; for (i=0;i<8;i++) {

value>>=1;

dq_ds18b20=0;// DQ_L; delay_3us();

dq_ds18b20=1; //DQ_H; delay_8us(2);

if(dq_ds18b20==1) value|=0x80; delay_8us(6); //延时40us }

dq_ds18b20=1; return value; }

//;************************************************** //ds18b20复位子程序 void rest_ds18b20(void) {

rest:delay_3us(); //稍做延时 delay_3us(); dq_ds18b20=1; delay_3us();

dq_ds18b20=0;// DQ_L;

delay_50us(11);//480us

if(dq_ds18b20==1) {

return; }

delay_50us(2); //延时90us if(dq_ds18b20==1) {

return; } else {

goto rest; } }

//**************************************************** //读取温度

void readtemp_ds18b20(void) {

uchar temp32; rest_ds18b20();

w_1byte_ds18b20(0xcc); //跳过读序列号的操作 w_1byte_ds18b20(0x44); //启动温度转换 delay_8us(2); rest_ds18b20();

w_1byte_ds18b20(0xcc); //跳过读序列号的操作 w_1byte_ds18b20(0xbe); //读取温度寄存器等(共可读9个寄存器)是温度

templ=r_1byte_ds18b20(); temph=r_1byte_ds18b20();

if((temph&0xf0))//判断温度的正负性 {

temp_flag=0;//温度为负数标志 temph=-temph; templ=-templ;

t_x=tabl3[templ & 0x0f];//计算温度的小数 temp32=temph & 0x0f;

前两个就 temp32<<=4; templ>>=4;

temp32=temp32 | templ;

t_b=temp32/100;//计算温度的百位数据 t_s=temp32/10;//计算温度的十位数据 t_g=temp32;//计算温度的个位数据 }

else//为正数 {

t_x=tabl3[templ & 0x0f];//计算温度的小数 temp32=temph & 0x0f; temp32<<=4; templ>>=4;

temp32=temp32 | templ;

t_b=temp32/100;//计算温度的百位数据 t_s=temp32/10;//计算温度的十位数据 t_g=temp32;//计算温度的个位数据 temp_flag=1; } }

void dis_temp()//温度显示函数 {

if(temp_flag=1) {

if(t_b==0) {

dis(12,12,t_s,t_g,13,12); } else {

dis(12,t_b,t_s,t_g,13,12); } } else {

dis(14,t_b,t_s,t_g,13,12); } }

//;##############################################################################

//;子程序名:w_1byte_ds1302

//;功能: 向DS1302写一个字节的数据 void w_1byte_ds1302(uchar t) {