用单片机做温控系统.docx_第1页
用单片机做温控系统.docx_第2页
用单片机做温控系统.docx_第3页
用单片机做温控系统.docx_第4页
用单片机做温控系统.docx_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

百度知道 电脑/网络 编程语言 其他编程语言 用单片机做温控系统的程序谁懂? 我去年做了一个差不多的,也是报警控制的,你借鉴一下吧:软件设计: 有两个文件,DS18B20.c和DS18B20.h,将这两个文件添加到工程里即可。DS18B20.c:/*程序名称:DS18B20温度测量、报警系统简要说明:DS18B20温度计,温度测量范围099.9摄氏度 可设置上限报警温度、下限报警温度 即高于上限值或者低于下限值时蜂鸣器报警 默认上限报警温度为32、默认下限报警温度为10 报警值可设置范围:最低上限报警值等于当前下限报警值 最高下限报警值等于当前上限报警值 将下限报警值调为0时为关闭下限报警功能 */#include #include DS18B20.h #define uint unsigned int#define uchar unsigned char /宏定义#define SET P3_1 /定义调整键#define DEC P3_2 /定义减少键#define ADD P3_3 /定义增加键#define BEEP P3_7 /定义蜂鸣器#define JDQ P3_5 bit shanshuo_st; /闪烁间隔标志bit beep_st; /蜂鸣器间隔标志sbit DIAN = P27; /小数点uchar x=0; /计数器signed char m; /温度值全局变量uchar n; /温度值全局变量uchar set_st=0; /状态标志signed char shangxian=70; /上限报警温度,默认值为70signed char xiaxian=0; /下限报警温度,默认值为0uchar code LEDData=;/*延时子程序*/void Delay(uint num) while( -num );void shortdelay(void) /误差 0us unsigned char a,b,c; for(c=165;c0;c-) for(b=100;b0;b-) for(a=150;a0;a-); _nop_; /if Keil,require use intrins.h _nop_; /if Keil,require use intrins.h/*初始化定时器0*/void InitTimer(void) TMOD=0x1; TH0=0x3c; TL0=0xb0; /50ms(晶振12M)/*定时器0中断服务程序*/void timer0(void) interrupt 1 TH0=0x3c; TL0=0xb0; x+;/*外部中断0服务程序*/void int0(void) interrupt 0 EX0=0; /关外部中断0 if(DEC=0&set_st=1) shangxian-; if(shangxian else if(DEC=0&set_st=2) xiaxian-; if(xiaxian99)shangxian=99; else if(ADD=0&set_st=2) xiaxian+; if(xiaxianshangxian)xiaxian=shangxian; /*读取温度*/void check_wendu(void) uint a,b,c; c=ReadTemperature()-5; /获取温度值并减去DS18B20的温漂误差 a=c/100; /计算得到十位数字 b=c/10-a*10; /计算得到个位数字 m=c/10; /计算得到整数位 n=c-a*100-b*10; /计算得到小数位 if(m99) /设置温度显示上限 /*显示开机初始化等待画面*/Disp_init() P2 = 0xbf; /显示- P1 = 0xf7; Delay(200); P1 = 0xfb; Delay(200); P1 = 0xfd; Delay(200); P1 = 0xfe; Delay(200); P1 = 0xff; /关闭显示/*显示温度子程序*/Disp_Temperature() /显示温度 P2 =0xc6; /显示C P1 = 0xf7; Delay(300); P2 =LEDDatan; /显示个位 P1 = 0xfb; Delay(300); P2 =LEDDatam%10; /显示十位 DIAN = 0; /显示小数点 P1 = 0xfd; Delay(300); P2 =LEDDatam/10; /显示百位 P1 = 0xfe; Delay(300); P1 = 0xff; /关闭显示/*显示报警温度子程序*/Disp_alarm(uchar baojing) P2 =0xc6; /显示C P1 = 0xf7; Delay(200); P2 =LEDDatabaojing%10; /显示十位 P1 = 0xfb; Delay(200); P2 =LEDDatabaojing/10; /显示百位 P1 = 0xfd; Delay(200); if(set_st=1)P2 =0x89; else if(set_st=2)P2 =0xc7; /上限H、下限L标示 P1 = 0xfe; Delay(200); P1 = 0xff; /关闭显示/*报警子程序*/void Alarm() if(x=10) if(m=shangxianbeep_st=1)|(m else BEEP=1;if(m=shangxian)|(m shortdelay();JDQ=0; else JDQ=1;/*主函数*/void main(void) uint z; InitTimer(); /初始化定时器 EA=1; /全局中断开关 TR0=1; ET0=1; /开启定时器0 IT0=1; IT1=1; check_wendu(); check_wendu(); for(z=0;z2)set_st=0; if(set_st=0) EX0=0; /关闭外部中断0 EX1=0; /关闭外部中断1 check_wendu(); Disp_Temperature(); Alarm(); /报警检测 else if(set_st=1) BEEP=1; /关闭蜂鸣器 EX0=1; /开启外部中断0 EX1=1; /开启外部中断1 if(x=10) if(shanshuo_st) else if(set_st=2) BEEP=1; /关闭蜂鸣器 EX0=1; /开启外部中断0 EX1=1; /开启外部中断1 if(x=10) if(shanshuo_st) /*END*/DS18B20.h:#include #define DQ P3_6 /定义DS18B20总线I/O/*延时子程序*/void Delay_DS18B20(int num) while(num-) ;/*初始化DS18B20*/void Init_DS18B20(void) unsigned char x=0; DQ = 1; /DQ复位 Delay_DS18B20(8); /稍做延时 DQ = 0; /单片机将DQ拉低 Delay_DS18B20(80); /精确延时,大于480us DQ = 1; /拉高总线 Delay_DS18B20(14); x = DQ; /稍做延时后,如果x=0则初始化成功,x=1则初始化失败 Delay_DS18B20(20);/*读一个字节*/unsigned char ReadOneChar(void) unsigned char i=0; unsigned char dat = 0; for (i=8;i0;i-) DQ = 0; / 给脉冲信号 dat=1; DQ = 1; / 给脉冲信号 if(DQ) dat|=0x80; Delay_DS18B20(4); return(dat);/*写一个字节*/void WriteOneChar(unsigned char dat) unsigned char i=0; for (i=8; i0; i-) DQ = 0; DQ = dat&0x01; Delay_DS18B20(5); DQ = 1; dat=1; /*读取温度*/unsigned int ReadTemperature(void) unsigned char a=0; unsigned char b=0; unsigned int t=0; float tt=0; Init_DS18B20(); WriteOneChar(0xCC); /跳过读序号列号的操作 WriteOneChar(0x44); /启动温度转换 Init_DS18B20(); WriteOneChar(0xCC); /跳过读序号列号的操作 WriteOneChar(0xBE); /读取温度寄存器 a=ReadOneChar(); /读低8位 b=ReadOneChar(); /读高8位 t=b; t电脑/网络 编程语言 其他编程语言 请教关于单片机温控程序 举报违规检举侵权投诉|2014-03-24 13:34 展华威 | 浏览 0 次 悬赏:50 编程语言程序名称:DS18B20温度测量、报警系统简要说明:DS18B20温度计,温度测量范围 -1060摄氏度 可设置目标温度,设置目标温度时有指示灯闪烁! 高于目标值 B端口输出低电平,延时0.5秒A端口输出高电平; 低于目标值时A端口输出低电平,延时0.5秒B端口输出低电平; 低于或者高于目标温度有led指示 报警! 默认目标温度为24、按键时有蜂鸣器滴提示! 设单独一按键 控制照明开关!万分感谢!/question/159351064.html这是的帖子!分享到: 专业回答团队 lyzengxiang 2014-03-25 15:13 我在10年做了一个差不多的,也是报警控制的,你借鉴一下吧:软件设计:有两个文件,DS18B20.c和DS18B20.h,将这两个文件添加到工程里即可。DS18B20.c:/*程序名称:DS18B20温度测量、报警系统简要说明:DS18B20温度计,温度测量范围099.9摄氏度可设置上限报警温度、下限报警温度即高于上限值或者低于下限值时蜂鸣器报警默认上限报警温度为32、默认下限报警温度为10报警值可设置范围:最低上限报警值等于当前下限报警值最高下限报警值等于当前上限报警值将下限报警值调为0时为关闭下限报警功能*/#include#includeDS18B20.h#defineuintunsignedint#defineucharunsignedchar/宏定义#defineSETP3_1/定义调整键#defineDECP3_2/定义减少键#defineADDP3_3/定义增加键#defineBEEPP3_7/定义蜂鸣器#defineJDQP3_5bitshanshuo_st;/闪烁间隔标志bitbeep_st;/蜂鸣器间隔标志sbitDIAN=P27;/小数点ucharx=0;/计数器signedcharm;/温度值全局变量ucharn;/温度值全局变量ucharset_st=0;/状态标志signedcharshangxian=70;/上限报警温度,默认值为70signedcharxiaxian=0;/下限报警温度,默认值为0ucharcodeLEDData=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff;/*延时子程序*/voidDelay(uintnum)while(-num);voidshortdelay()(void)/误差0usunsignedchara,b,c;for(c=165;c0;c-)for(b=100;b0;b-)for(a=150;a0;a-);_nop_;/ifKeil,requireuseintrins.h_nop_;/ifKeil,requireuseintrins.h/*初始化定时器0*/voidInitTimer(void)TMOD=0x1;TH0=0x3c;TL0=0xb0;/50ms(晶振12M)/*定时器0中断服务程序*/voidtimer0(void)interrupt1TH0=0x3c;TL0=0xb0;x+;/*外部中断0服务程序*/voidint0(void)interrupt0EX0=0;/关外部中断0if(DEC=0&set_st=1)shangxian-;if(shangxianxiaxian)shangxian=xiaxian;elseif(DEC=0&set_st=2)xiaxian-;if(xiaxian99)shangxian=99;elseif(ADD=0&set_st=2)xiaxian+;if(xiaxianshangxian)xiaxian=shangxian;/*读取温度*/voidcheck_wendu(void)uinta,b,c;c=ReadTemperature()-5;/获取温度值并减去DS18B20的温漂误差a=c/100;/计算得到十位数字b=c/10-a*10;/计算得到个位数字m=c/10;/计算得到整数位n=c-a*100-b*10;/计算得到小数位if(m99)m=99;n=9;/设置温度显示上限/*显示开机初始化等待画面*/Disp_init()P2=0xbf;/显示-P1=0xf7;Delay(200);P1=0xfb;Delay(200);P1=0xfd;Delay(200);P1=0xfe;Delay(200);P1=0xff;/关闭显示/*显示温度子程序*/Disp_Temperature()/显示温度P2=0xc6;/显示CP1=0xf7;Delay(300);P2=LEDDatan;/显示个位P1=0xfb;Delay(300);P2=LEDDatam%10;/显示十位DIAN=0;/显示小数点P1=0xfd;Delay(300);P2=LEDDatam/10;/显示百位P1=0xfe;Delay(300);P1=0xff;/关闭显示/*显示报警温度子程序*/Disp_alarm(ucharbaojing)P2=0xc6;/显示CP1=0xf7;Delay(200);P2=LEDDatabaojing%10;/显示十位P1=0xfb;Delay(200);P2=LEDDatabaojing/10;/显示百位P1=0xfd;Delay(200);if(set_st=1)P2=0x89;elseif(set_st=2)P2=0xc7;/上限H、下限L标示P1=0xfe;Delay(200);P1=0xff;/关闭显示/*报警子程序*/voidAlarm()if(x=10)beep_st=beep_st;x=0;if(m=shangxian&beep_st=1)|(m=shangxian)|(mxiaxian)shortdelay()();JDQ=0;elseJDQ=1;/*主函数*/voidmain(void)uintz;InitTimer();/初始化定时器EA=1;/全局中断开关TR0=1;ET0=1;/开启定时器0IT0=1;IT1=1;check_wendu();check_wendu();for(z=0;z2)set_st=0;if(set_st=0)EX0=0;/关闭外部中断0EX1=0;/关闭外部中断1check_wendu();Disp_Temperature();Alarm();/报警检测elseif(set_st=1)BEEP=1;/关闭蜂鸣器EX0=1;/开启外部中断0EX1=1;/开启外部中断1if(x=10)shanshuo_st=shanshuo_st;x=0;if(shanshuo_st)Disp_alarm(shangxian);elseif(set_st=2)BEEP=1;/关闭蜂鸣器EX0=1;/开启外部中断0EX1=1;/开启外部中断1if(x=10)shanshuo_st=shanshuo_st;x=0;if(shanshuo_st)Disp_alarm(xiaxian);/*END*/DS18B20.h:#include#defineDQP3_6/定义DS18B20总线I/O/*延时子程序*/voidDelay_DS18B20(intnum)while(num-);/*初始化DS18B20*/voidInit_DS18B20(void)unsignedcharx=0;DQ=1;/DQ复位Delay_DS18B20(8);/稍做延时DQ=0;/单片机将DQ拉低Delay_DS18B20(80);/精确延时,大于480usDQ=1;/拉高总线D

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论