1、基于DS18B20的温度监控系统程序附录:系统程序/*/*/* 温度多功能测定报警程序 07082324 刘杰 */#include#include#include#define uchar unsigned char #define uint unsigned int#define led P0 /数码管断码控制口#define key P2 /按键uchar THH; /温度上限值uchar TLL; /温度下限值bit flagw; / 温度显示标志位bit flags; / 上限标志位温度设置bit flagx; / 下限设置温度标志位bit flagckf; /串口发送标志bit f
2、lagcj; /串口接收标志位bit flagbjg;bit flagbjk;bit flagsz; /时钟标志位bit flagsm;sbit key24=P24;sbit key25=P25;sbit key26=P26;sbit key27=P27;sbit key20=P20;sbit key21=P21;sbit key22=P22;sbit key23=P23; /各个按键sbit g=P35; /二极管总控制口sbit fmq=P32; /蜂鸣器sbit jdq=P36; /继电器sbit s1=P17; /数码管sbit s2=P16;sbit s3=P15;sbit s4=P
3、14;sbit wd=P22; /18b20uchar code smg12=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; /定义段码uchar code smg34=0xC0,0xCF,0xa4,0x86,0x8B,0x92,0x90,0xC7,0x80,0x82;uchar code dian=0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10;uchar code dian34=0x40,0x4f,0x24,0x06,0x0b,0x12,0x10,0x47,0x00,0x02; /含有
4、点的34数码管uchar code dian12=0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10; /含有点的12数码管uchar code tab=0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39; /串口发送代码uchar TH,TL,TZ,TX; /定义温度的高八位 低八位 转换后的整数位 小数位delayms(uint a) /1毫秒延时uint b,c;for(b=0;b110;b+)for(c=0;ca;c+); /* 以上为一些常规设定 */* /*时钟*/void init()
5、TMOD=0x21; /工作在方式1 定时器T0 TH0=0x3c; /设定初值3cb0 为50ms延时TL0=0xb0;ET0=1;EA=1;TR0=1;uint aa1,db,bb,cc,dd,c1,c2,d1,d2;void t0() interrupt 1 /时钟中断入口if(TZTLL)fmq=1;g=1;TH0=0x3c; /重新装初值TL0=0xb0;aa1+;if(aa1=10)db=1;if(aa1=20) db=0;bb+; /秒位aa1=0;if(bb=60)cc+; /分位bb=0;aa1=0;if(cc=60)dd+; /小时位aa1=0;bb=0;cc=0;if(d
6、d=24)aa1=0;bb=0;cc=0;dd=0;uchar b1,b2;szm()b1=bb/10;b2=bb%10;led=smg34b1;s3=0;delayms(1);s3=1;led=smg34b2;s4=0;delayms(1);s4=1;szxs()c1=cc/10;c2=cc%10;d1=dd/10;d2=dd%10;if(db)led=smg34c1;elseled=dian34c1;s3=0;delayms(1);s3=1;led=smg34c2;s4=0;delayms(1);s4=1;led=smg12d1;s1=0;delayms(1);s1=1;if(db)led
7、=smg12d2;elseled=dian12d2;s2=0;delayms(1);s2=1;/* /* 一下为温度18b20程序 */uchar time;bit init18b20(void) /初始化bit flag;wd=0;for(time=0;time200;time+); /拉低480us到960uswd=1;for(time=0;time10;time+); /拉高15到60usflag=wd;for(time=0;time200;time+); / 主机接收480us左右return(flag);uchar readonechar(void) /读取18b20的一个字节uch
8、ar i;uchar dat;for(i=0;i=1;_nop_();wd=1;for(time=0;time2;time+); /延时6us让主机采样if(wd=1)dat|=0x80; /如果读到的是,则将1存入datelsedat|=0x00;for(time=0;time5;time+); /延时3us,两个读时序之间必须有大于1us的恢复期 return(dat); writeonechar(uchar dat) /向18b20写一个字节uchar i=0;for(i=0;i8;i+)wd=1;_nop_();wd=0;wd=dat&0x01; /利用与运算取出要写的某位二进制数据,
9、 并将其送到数据线上等待DS18B20采样 for(time=0;time10;time+); /延时约30us,DS18B20在拉低后的约1560us期间从数据线上采样 wd=1;for(time=0;time=1; /将dat中的各二进制位数据右移1位for(time=0;time4;time+); /稍作延时,给硬件一点反应时间void readtmp() /准备读温度 init18b20(); writeonechar(0xcc); / 跳过读序号列号的操作writeonechar(0x44); /启动温度转换for(time=0;time100;time+);/300us左右转化in
10、it18b20();writeonechar(0xcc);writeonechar(0xbe); /存储温度的高低位 /* 以上为18b20程序 */*/*/* 以下为键盘识别程序 */键盘选择程序void keyz()uchar a;key=0xf0;a=key;a&=0xf0;a|=0xf0;if(a!=0)/按键24if(key24=0)delayms(20);if(key24=0)key=0xef;_nop_();/按键24 20 温度加按键if(key20=0)delayms(20);if(key20=0)while(key20!=0);delayms(1);while(key20!
11、=0);if(flagw=0) /设定温度上下限值if(flags)if(THH=TLL)THH+;if(flagx)if(TLL=0&TLLTHH)TLL+;flagbjg=0; /报警开flagbjk=1;if(flagsz) /时钟小时加dd+;if(dd=24)dd=0;/按键24 21 /功能切换键if(key21=0)delayms(20);if(key21=0)while(key21!=0);delayms(1);while(key21!=0);if(flagw)flagw=0;flags=1;flagx=0;flagsz=0;else if(flags)flags=0;flag
12、x=1;flagw=0;flagsz=0;else if(flagx) flags=0;flagw=0;flagx=0;flagsz=1;elseflags=0;flagw=1;flagx=0;flagsz=0;/按键24 22 温度减按键if(key22=0)delayms(20);if(key22=0)while(key22!=0);delayms(1);while(key22!=0);if(flagw=0) /设定温度上下限减if(flags)if(THHTLL)THH-;if(flagx)if(TLL0&TLL=THH)TLL-;flagcj=0;flagbjg=1; /报警关flag
13、bjk=0;if(flagsz) /时钟分钟加cc+;if(cc=60)cc=0;/按键24 23if(key23=0)delayms(20);if(key23=0)while(key23!=0);delayms(1);while(key23!=0); /处理程序 /到此为设置24按键/按键25if(key25=0)delayms(20);if(key25=0)key=0xdf;_nop_();/按键25 20if(key20=0)delayms(20);if(key20=0)while(key20!=0);delayms(1);while(key20!=0);/按键25 21if(key21
14、=0)delayms(20);if(key21=0)while(key21!=0);delayms(1);while(key21!=0);flagckf=1;if(flagsz)if(flagsm=0)flagsm=1;else flagsm=0;if(flags)flagcj=1;if(flagx)flagcj=1; /按键25 22if(key22=0)delayms(20);if(key22=0)while(key22!=0);delayms(1);while(key22!=0);/按键25 23if(key23=0)delayms(20);if(key23=0)while(key23!
15、=0);delayms(1);while(key23!=0); /处理程序 /到此为设置25按键/* 以上为按键识别程序 */*/* /* 以下为 串口发送程序 */ckinit()TMOD=0x21;SCON=0x50;TH1=0xf3;TL1=0xf3;PCON=0x80;ES=1;EA=1;TR1=1;uchar aa; uchar ckjs; void serial() interrupt 4 if(TZTLL)fmq=1;g=1;if(flags) if(flagcj) if(RI)RI=0;ckjs=SBUF;THH=ckjs;if(flagx)if(flagcj)if(RI)RI
16、=0;ckjs=SBUF;TLL=ckjs; / *以上为串口发送程序*/* /* 以下为温度上下限显设定示 */wds() /设置上限uchar a,b,c;ckinit();a=THH/100; / 上限百位温度b=(THH%100)/10; / 上限十位温度c=THH%10; / 上限个位温度if(a0)led=smg12a;s1=0;delayms(1);s1=1;if(b0|a0)led=smg12b;s2=0;delayms(1);s2=1;led=smg34c;s3=0;delayms(1);s3=1;led=0x7f;s4=0;delayms(1);s4=1;uchar ckj
17、sx; wdx() /设置下限uchar a1,b1,c1;ckinit();a1=TLL/100; / 下限百位温度b1=(TLL%100)/10; / 下限十位温度c1=TLL%10; / 下限个位温度if(a10)led=smg12a1;s1=0;delayms(1);s1=1;if(b10|a10)led=smg12b1;s2=0;delayms(1);s2=1;led=smg34c1;s3=0;delayms(1);s3=1;led=0x7f;s1=0;delayms(1);s1=1;/* 以上为温度上下限显示设定 */*/*/* 以下为温度显示程序 */xianshiwendu()
18、 /显示温度程序 uchar j,k,l,m; /定义个 十 百 小数 readtmp(); TL=readonechar(); TH=readonechar(); TZ=TH*16+TL/16; TX=(TL%16)*10/16; j=TZ/100; / 温度百位 k=(TZ%100)/10; / 温度十位 l=TZ%10; / 温度个位 m=TX ; / 温度小数位if(flagbjg=0)if(TZ=THH|TZ=TLL) /上下限报警fmq=0;g=0;led=0x5a;delayms(1);elsefmq=1;g=1; g=1;if(flagbjk=0)fmq=1; led=smg1
19、2k; s1=0; delayms(1); s1=1; led=dianl; s2=0; delayms(1); s2=1; led=smg34m; s3=0; delayms(1); s3=1; led=0x70; s4=0; delayms(1); s4=1; /发送温度ckinit();while(flagckf)ES=0;SBUF=tabk; while(!TI); TI=0; SBUF=tabl; while(!TI); TI=0; SBUF=46; while(!TI); TI=0; SBUF=tabm; while(!TI); TI=0; SBUF=32; while(!TI);
20、 TI=0; ES=1; flagckf=0; /* 以上为温度显示程序 */*/*/* 以下为主函数 */void main()THH=30;TLL=10;flagw=1;flags=0;flagx=0;flagbjg=0;flagbjk=1;flagsz=0;g=1;flagsm=0;init();while(1) keyz(); if(flagw=1) xianshiwendu(); if(flags=1) wds(); if(flagx=1) wdx(); if(flagsz) TR1=0;ES=0; if(flagsm=0) szxs(); if(flagsm=1) szm(); /*程序结束*/
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1