实验十六、温度自动控制系统(数码管显示)_第1页
实验十六、温度自动控制系统(数码管显示)_第2页
实验十六、温度自动控制系统(数码管显示)_第3页
实验十六、温度自动控制系统(数码管显示)_第4页
实验十六、温度自动控制系统(数码管显示)_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

1、实验十六、温度自动控制系统(数码管显示 ) 一、实验目的1. 进一步掌握温度自动控制与测量的方法2. 进一步掌握单片机与pc机 uart通讯的设计与应用3锻炼单片机综合应用和开发的能力二、实验设备1单片机最小系统2图符型液晶显示屏实验模块3温度测量控制实验模块4独立式键盘实验模块5. rs232 接口模块三、实验要求综合以上实验模块,构成满足以下要求的温度自动控制测量系统:(1)显示当前温度:在图符型液晶模块上,第一行显示“设置温度”,第二行显示实际“测量温度”(单位为);并显示出当前pwm 波形的占空比。(2)具有 3 个功能按键:1 个“升温键”,按下后“设置温度”加1;1 个“降温键”,

2、按下后“设置温度”减1。一个“开始/ 停止”键,用来启动/ 停止温度自动控制。(3)在“开始 / 停止”键第一次按下后,温度自动测量控制功能启动;从这时开始,系统开始以一定的时间间隔读取温度传感器的“测量温度”,并送液晶进行显示;比较“测量温度”和“设置温度”,根据比较的结果,调整输出的pwm 波形的脉宽 ( 通过软件进行脉宽调制) ,从而实现温度自动控制。再次按下该键,停止自动测量控制功能。(4)系统“监听”上位机的命令,响应以下2 个命令:设置温度命令,该命令可以灵活修改系统原先的“设置温度”;采集温度命令,该命令要求系统将当前的“测量温度”值送给上位机;上位机以一定的时间间隔发送“采集温

3、度命令”,由此得到温度曲线。四、实验原理(1)硬件逻辑结构:如图16-1 所示,该系统是一个闭环温度控制系统。图 16-1 硬件逻辑结构单片机引脚分配如图16-2 所示:图 162 硬件示意图硬件电路图如图48-3 所示,使用p3.4 端口输出 pwm 波形,该波形加到单向可控硅上控制温度加热元件。温度测量使用p3.3 端口,使用ds18b20器件,显示使用p1.0 和 p1.2 口。按键控制功能与实验26 相同. 图 483 电路连接图(2)软件流程设计该闭环系统采用的直接反馈的方法,根据温度传感器测量出来温度与我们希望的温度相比较,根据比较结果,不断改变占空比。如测量的温度小于期望的温度值

4、,就增加pwm 波形的占空比,如果大于期望的温度值,就减少pwm 波形的占空比 , ,最终达到一定的平衡状态。软件系统基本流程如左图所示:数码管显示单 片 机系统温度控制加热元件与对象温度测量232 接口通讯数码管显示#include #include #include sbit data1=p10; sbit clk=p11; sbit plus=p20; sbit subs=p21; sbit stop=p22; sbit output=p34; sbit dq=p33; unsigned char flag,flag_1=0; / 占空比调节unsigned char high_time

5、,low_time,count=0; 参数unsigned char set_temper=40; /设定温度unsigned char temper; /测量的温度unsigned char i; unsigned char j=0; /* 延时子程序 ,延时时间以12m 晶振为准 ,延时时间为30ustime */ void delay(unsigned char time) unsigned char m,n; for(n=0;ntime;n+) for(m=0;m2;m+) /* 写一位数据子程序*/ void write_bit(unsigned char bitval) ea=0;

6、 dq=0; /拉低 dq 以开始一个写时序if(bitval=1) _nop_(); dq=1; /如要写 1,则将总线置高 delay(5); /延时 90us 供 da18b20 采样dq=1; /释放 dq 总线_nop_(); _nop_(); ea=0; /* 写一字节数据子程序*/ void write_byte(unsigned char val) unsigned char i; unsigned char temp; ea=0; /tr0=0; for(i=0;ii; /移位操作,将本次要写的位移到最低位temp=temp&1; write_bit(temp); /

7、向总线写该位 delay(7); /延时 120us 后/ tr0=1; ea=1; /* 读一位数据子程序*/ unsigned char read_bit() unsigned char i,value_bit; ea=0; dq=0; /拉低 dq,开始读时序_nop_(); _nop_(); dq=1; /释放总线for(i=0;i2;i+) /8us delay value_bit=dq; ea=1; return(value_bit); /* 读一字节数据子程序*/ unsigned char read_byte() unsigned char i,value=0; ea=0; f

8、or(i=0;i8;i+) if(read_bit() /读一字节数据,一个时序中读一次,并作移位处理value|=0 x01i; delay(4); /延时 80us以完成此次都时序,之后再读下一数据 ea=1; return(value); /* 复位子程序*/ unsigned char reset() unsigned char presence; ea=0; dq=0; /拉低 dq 总线开始复位delay(30); /保持低电平480us dq=1; /释放总线delay(3); /等待芯片应答信号75us presence=dq; /获取应答信号delay(28); /延时以完成

9、整个时序ea=1; return(presence); /返回应答信号,有芯片应答返回0,无芯片则返回1 /* 获取温度子程序*/ void get_temper() unsigned char i,j; do i=reset(); /复位while(i!=0); /1 为无反馈信号i=0 xcc; /发送设备定位命令write_byte(i); i=0 x44; /发送开始转换命令write_byte(i); delay(180); /延时do i=reset(); /复位while(i!=0); /0 为无反馈信号c,再次复位i=0 xcc; /设备定位write_byte(i); i=0

10、 xbe; /读出缓冲区内容write_byte(i); j=read_byte(); /先读出低位i=read_byte(); /后读出高位i=(i4; temper=i|j; /* 温度比较处理子程序*/ compare_temper() if(+flag_1=2) if(set_tempertemper) if(high_time100) /温度未达到,但占空比已经100,则不执行 high_time+; low_time=100-high_time; else if(set_tempertemper) if(low_time100) /温度超过设定温度,但占空比已经为1,则不执行 hi

11、gh_time-; low_time=100-high_time; else flag_1=0; /* t0 中断服务子程序,用于控制电平的翻转,40us*100=4ms 周期*/ void serve_t0() interrupt 1 using 1 if(+count=(high_time) output=1; else if(count=100) output=0; else count=0; th0=0 x2f; tl0=0 xe0; /* 串行口中断服务程序,用于上位机通讯*/ void serve_sio() interrupt 4 using 2 ea=0; ri=0; /cle

12、ar receive flag i=sbuf; if(i=2) while(ri=0) /等待接收温度值ri=0; set_temper=sbuf; /设定控制温度值sbuf=0 x02; /发给主机02 while(ti=0) ti=0; else if(i=3) /主机要求采样温度,发温度值 ti=0; sbuf=temper; while(ti=0) ti=0; ea=1; /* void disp_1(unsigned char disp_num16) unsigned char n,a,k,m; for(n=0;n6;n+) k=disp_num1n; for(a=0;a=1; if

13、(m=1) data1=1; else data1=0; _nop_(); clk=1; _nop_(); /* 显示子程序功能:将占空比温度转化为单个字符,显示占空比和测得到的温度*/ void display() unsigned char code number=0 xfc,0 x60,0 xda,0 xf2,0 x66,0 xb6,0 xbe,0 xe0,0 xfe,0 xe6; unsigned char disp_num6; unsigned int k,k1; k=high_time; k=k%1000; k1=k/100; if(k1=0) disp_num0=0; else

14、disp_num0=0 x60; k=k%100; disp_num1=numberk/10; disp_num2=numberk%10; disp_num3=0; k=temper; k=k%100; disp_num4=numberk/10; disp_num5=numberk%10; disp_1(disp_num); /* 主程序*/ main() unsigned char z; unsigned char a,b,flag_2=1,count1=0; unsigned char phil=2,0 xce,0 x6e,0 x60,0 x1c,2; tmod=0 x21; /t1 为

15、8 位重装定时器,t0 为 16 位定时器th0=0 x2f; /50ms 中断tl0=0 x40; scon=0 x50; /串口工作于方式1,允许接收,采用中断方式pcon=0 x00; /波特率不加倍th1=0 xfd; /波特率为9600 tl1=0 xfd; ps=1; /串口中断优先ea=1; /开总中断ex1=0; /关外部中断et0=1; /开定时器0 中断/et0=0; es=1; /开串行口中断tr0=1; /定时器 1 开始计时tr1=1; high_time=50; /初始化为占空比50%,周期为200ms low_time=50; while(1) if(plus=0

16、) ea=0; for(a=0;a5;a+) for(b=0;b102;b+) /消抖延时if(plus=0) set_temper+; flag=0; else if(subs=0) for(a=0;a5;a+) for(b=0;a102;b+) /消抖延时if(subs=0) set_temper-; flag=0; else if(stop=0) for(a=0;a5;a+) for(b=0;b5) temper=a; else temper=b; a=temper; flag_2=0; if(+count150) display(); count1=0; compare_temper(); /温度比较和控制 tr0=0; z=1; while(1) ea=0; /显示 -phil- disp_1(phil); if(stop=0) for(a=0;a5;a+) fo

温馨提示

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

最新文档

评论

0/150

提交评论