ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:18.12KB ,
资源ID:6525889      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6525889.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于DS18B20的温度监控系统程序.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

基于DS18B20的温度监控系统程序.docx

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