资源描述:
《基于AT89S52及DS18B20的数码管显示数字温度计C语言程序.docx》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、#include"reg52.h"#include"intrins.h"//_nop_();延时函数用#defineDisdataP0//段码输出口#definediscanP2//扫描口#defineucharunsignedchar#defineuintunsignedintsbitDQ=P3^3;//温度输入口sbitDIN=P0^7;//LED小数点控制uinth;ucharflag;//**************温度小数部分用查表法***********//ucharcodeditab[16]={0x00,0x01,0x01,0x02,0x
2、03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};//ucharcodedis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};//共阳LED段码表"0""1""2""3""4""5""6""7""8""9""不亮""-"ucharcodescan_con[4]={0xbf,0x7f,0xef,0xfe};//列扫描控制字uchardatatemp_data[2]={0x00,0x00};//读出温
3、度暂放uchardatadisplay[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据和一个运算暂用///////***********11微秒延时函数**********///voiddelay(uintt){for(;t>0;t--);}///***********显示扫描函数**********/scan(){chark;for(k=0;k<4;k++)//四位LED扫描控制{Disdata=0xff;Disdata=dis_7[display[k]];if(k==1){DIN=0;}discan=sca
4、n_con[k];delay(90);discan=0xff;}}/////***********18B20复位函数**********/ow_reset(void){charpresence=1;while(presence){while(presence){DQ=1;_nop_();_nop_();DQ=0;//delay(50);//550usDQ=1;//delay(6);//66uspresence=DQ;//presence=0继续下一步}delay(45);//延时500uspresence=~DQ;}DQ=1;}/////*******
5、***18B20写命令函数*********///向1-WIRE总线上写一个字节voidwrite_byte(ucharval){uchari;for(i=8;i>0;i--)//{DQ=1;_nop_();_nop_();DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();//5usDQ=val&0x01;//最低位移出delay(6);//66usval=val/2;//右移一位}DQ=1;delay(1);}///*********18B20读1个字节函数********///从总线上读取一个字节ucharr
6、ead_byte(void){uchari;ucharvalue=0;for(i=8;i>0;i--){DQ=1;_nop_();_nop_();value>>=1;DQ=0;//_nop_();_nop_();_nop_();_nop_();//4usDQ=1;_nop_();_nop_();_nop_();_nop_();//4usif(DQ)value
7、=0x80;delay(6);//66us}DQ=1;return(value);}///***********读出温度函数**********///read_temp(){ow_reset();
8、//总线复位write_byte(0xCC);//发SkipROM命令write_byte(0xBE);//发读命令temp_data[0]=read_byte();//温度低8位temp_data[1]=read_byte();//温度高8位ow_reset();write_byte(0xCC);//SkipROMwrite_byte(0x44);//发转换命令}///***********温度数据处理函数**********/voidwork_temp(){ucharn=0;uchardoth,dotl;ucharflag3=1,flag2=1;/
9、/数字显示修正标记if((temp_data[1]&0xf8)!=0x00){temp_dat