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

下载本文档

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

文档简介

1、用单片机做温控系统的程序谁懂?我去年做了一个差不多的,也是报警控制的,你借鉴一下吧:软件设计:有两个文件, DS18B20.c 和 DS18B20.h ,将这两个文件添加到工程里即可。DS18B20.c :/*程序名称: DS18B20 温度测量、报警系统简要说明: DS18B20 温度计,温度测量范围 099.9 摄氏度 可设置上限报警温度、下限报警温度 即高于上限值或者低于下限值时蜂鸣器报警 默认上限报警温度为 32、默认下限报警温度为 10 报警值可设置范围:最低上限报警值等于当前下限报警值 最高下限报警值等于当前上限报警值 将下限报警值调为 0 时为关闭下限报警功能*/ #includ

2、e#include DS18B20.h #define uint unsigned int#define uchar unsigned char/宏定义#define SETP3_1/ 定义调整键#define DECP3_2/定义减少键#define ADDP3_3/定义增加键#define BEEP P3_7/定义蜂鸣器#define J DQ P3_5bit shanshuo_st;/闪烁间隔标志bit beep _st;/蜂鸣器间隔标志sbit DIAN = P27; / 小数点 uchar x=0;/ 计数器signed char m;/温度值全局变量uchar n; /温度值全局变

3、量 uchar set_st=0; /状态标志 signed char shangxian=70; / 上限报警温度,默认值为 70signed char xiaxian=0;/下限报警温度,默认值为 0uchar code LEDData=;/*延时子程序*/void Delay (uint num)while( -num );void short delay (void) /误差 0usunsigned char a,b,c;for(c=165;c0;c-)for(b=100;b0;b-) for(a=150;a0;a-);_nop _; /if Keil,require use intr

4、ins.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 1TH0=0x3c;TL0=0xb0;x+;/*外部中断 0 服务程序 */ void int0(void) interrupt 0EX0=0;/关外部中断 0if(DEC =0&set_st=1)shangxian-;if(shangxianelse if( DEC =

5、0&set_st=2)xiaxian-;if(xiaxian99)shangxian=99;else if( ADD =0&set_st=2)xiaxian+;if(xiaxianshangxian)xiaxian=shangxian; /*读取温度*/void check_w end u(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) /设置温度显示

6、上限/* 显示开机初始化等待画面 */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 = 0xf

7、d;Delay(300);P2 =LEDDatam/10;/显示百位P1 = 0xfe;Delay(300);P1 = 0xff;/ 关闭显示/* 显示报警温度子程序 */Disp_alarm(uchar baojing)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;else if(set_st=2)P2 =0xc7; / 上限 H

8、、下限 L 标示 P1 = 0xfe;Delay(200);P1 = 0xff;/ 关闭显示/*报警子程序*/void Alarm()if(x=10)if(m=shangxian beep _st=1)|(m else BEEP=1;if(m=shangxian)|(m shortdelay();JDQ=0;else J DQ =1;/*主函数 */void main(void)uint z;InitTimer(); / 初始化定时器EA=1;/全局中断开关TR0=1;ET0=1;/开启定时器 0IT0=1;IT1=1;check_w end u(); check_w end u(); for

9、(z=0;z2)set_st=0;if(set_st=0)EX0=0;/关闭外部中断 0EX1=0;/关闭外部中断 1check_wendu();Disp_Temperature();Alarm();/报警检测else if(set_st=1)EX0=1;/开启外部中断 0EX1=1;/开启外部中断 1if(x=10)if(shanshuo_st)else if(set_st=2)BEEP=1;/关闭蜂鸣器EX0=1;/开启外部中断 0EX1=1;/开启外部中断 1if(x=10)if(shanshuo_st)ENDDS18B20.h :#include#define DQ P3_6/ 定义

10、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);/ 精确延时,大于 480usDQ = 1;/拉高总线Delay_DS18B20(14);x = DQ;/ 稍做延时后,如果 x=0 则初始化成功, x=1 则初始化失败Delay_DS18B20(20);/

11、* 读一个字节 */ unsigned char R eadOneChar(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)

12、;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(); b=ReadOneChar(); t=b; t=8; t=t|a; tt=t*0.0625; t= tt

13、*10+0.5; return(t);/跳过读序号列号的操作 /启动温度转换/跳过读序号列号的操作 /读取温度寄存器 /读低 8 位/读高 8 位/放大 10 倍输出并四舍五入END其中控制部分我用的是 5V 继电器,可以直接控制你的电机了。两个电路图都差不多的, 只不过我的多了几个调整按键, 报警温度可以调的。 我 的这个程序你完全可以用到你的电路里德? 量问答? 经验个人中心 手机知道 开放平台请教关于单片机温控程序2014-03-24 13:34 编程语言分享到:专业回答团队 lyzengxiang2014-03-25 15:13我在 10 年做了一个差不多的,也是报警控制的,你借鉴一下

14、吧:软件设计:有两个文件, DS18B20.c 和 DS18B20.h ,将这两个文件添加到工程里即可。DS18B20.c :/*程序名称: DS18B20 温度测量、报警系统简要说明: DS18B20 温度计,温度测量范围 099.9 摄氏度可设置上限报警温度、下限报警温度即高于上限值或者低于下限值时蜂鸣器报警默认上限报警温度为 32、默认下限报警温度为 10 报警值可设置范围:最低上限报警值等于当前下限报警值最高下限报警值等于当前上限报警值将下限报警值调为 0 时为关闭下限报警功能#include #include DS18B20.h#define uint unsigned int#de

15、fine 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 c

16、har shangxian=70; / 上限报警温度,默认值为 70 signed char xiaxian=0; / 下限报警温度,默认值为 0 uchar code LEDData=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff;/* 延时子程序 */ void Delay(uint num) while( -num );void shortdelay()(void) / 误差 0usunsigned char a,b,c;for(c=165;c0;c-)for(b=100;b0;b-)for(a=150;a0;a-);_nop

17、_; /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 1TH0=0x3c;TL0=0xb0;x+;/*外部中断 0服务程序 */void int0(void) interrupt 0EX0=0; / 关外部中断 0if(DEC=0&set_st=1)shangxian-;

18、if(shangxianxiaxian)shangxian=xiaxian;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

19、/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;

20、/ 显示个位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; / 显示 CP1 = 0xf7;显示十位显示百位Delay(200);P2 =LEDDatabaojing%10; /P1 = 0xfb;Delay(200);P2 =LEDDatabaojing/10;

21、 /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)beep_st=beep_st;x=0; if(m=shangxian&beep_st=1)|(m=shangxian)|(mxiaxian)shortdelay()();JDQ=0;else JDQ=1;/* 主函数*/void main(void)uint z;InitTimer();

22、 / 初始化定时器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(); / 报警检测else if(set_st=1)BEEP=1; / 关闭蜂鸣器EX0=1; / 开启外部中断 0EX1=1; / 开启外部中断 1 if(x=10)shanshuo_st=shanshuo_st;x=

23、0; if(shanshuo_st) Disp_alarm(shangxian);else if(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 #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); / 精确延时,大于 480usDQ = 1; / 拉高总线Delay_DS18B20(14);x = DQ;/ 稍做延时后,如果 x=0 则初始化成功, x=1 则初始化失败Dela

温馨提示

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

评论

0/150

提交评论