C51温度采集控制报告.doc

上传人:时光煮雨 文档编号:14892452 上传时间:2022-02-23 格式:DOC 页数:22 大小:3.01MB
返回 下载 相关 举报
C51温度采集控制报告.doc_第1页
第1页 / 共22页
C51温度采集控制报告.doc_第2页
第2页 / 共22页
C51温度采集控制报告.doc_第3页
第3页 / 共22页
C51温度采集控制报告.doc_第4页
第4页 / 共22页
C51温度采集控制报告.doc_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《C51温度采集控制报告.doc》由会员分享,可在线阅读,更多相关《C51温度采集控制报告.doc(22页珍藏版)》请在三一文库上搜索。

1、温度采集控制的设计与实现电子科技大学 英才实验 学院实 验 报 告实验名称 现代电子技术综合实验姓名:汪晓华学号:2702108015评分:教师签字电子科技大学教务处制电 子 科 技 大 学实 验 报 告学生姓名:汪晓华 学号:2702108015 指导教师:王军实验地点: 331 实验时间:(双周)周二9、10、11节一、 实验室名称: 电子技术综合实验室二、 实验项目名称:温度采集控制的设计与实现三、 实验学时: 32四、 实验目的与任务:1、 熟悉系统设计与实现原理2、 掌握KEIL C51的基本使用方法3、 熟悉SMART SOPC实验箱的应用4、 连接电路,编程调试,实现各部分的功能

2、5、 完成系统软件的编写与调试五、 实验器材1、 PC机一台2、 示波器、SMART SOPC实验箱一套六、 实验原理、步骤及内容1、 数码管动态扫描原理七段式LED数码管是常见的电子设备显示器件,能够显示数字09以及字母a f,外加一个小数点,作为第八段。数码管有静态和动态之分,每一类又有共阳和共阴之分。静态数码管驱动方法简单、亮度高,但是连线比较多,而动态数码管常常以多位联体的形式提供,连线较少,但是要用动态扫描的方法驱动,为了获得足够的亮度,限流电阻取值常常比较小。 动态数码管扫描的具体过程如下,先把第1个数码管的显示数据送到abcdefg和dp,同时选通com1,而其它数码管的com信

3、号禁止;延时一段时间(通常不超过10ms),再把第2个数码管的显示数据送到abcdefg和dp,同时选通com2,而其它数码管的comd信号禁止;延时一段时间,再显示下一个。当扫描整个数码管的频率应当保证在50Hz以上时,就不会看到明显的闪烁,肉眼 观察,看上去是一起亮的。原理图如下:图 1 数码管的动态扫描原理图2、 蜂鸣器工作原理蜂鸣器发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的,因此需要一定的电流才能驱动它,单片机IO引脚输出的电流较小,单片机输出的TTL电平基本上驱动不了蜂鸣器,因此需要增加一个电流放大的电路。原理图见图:图 2 蜂鸣器的原理图如图2所示,蜂鸣器的负

4、极经电阻R3接地,蜂鸣器的正极接到三极管的集电极C,三极管的基级B经过限流电阻R2后由单片机的P1.3引脚控制,当P1.3输出高电平时,三极管Q1截止,没有电流流过线圈,蜂鸣器不发声;当P1.3输出低电平时,三极管导通,这样蜂鸣器的电流形成回路,发出声音。因此,我们可以通过程序控制P1.3脚的电平来使蜂鸣器发出声音和关闭。程序中改变单片机P1.3引脚输出波形的频率,就可以调整控制蜂鸣器音调,产生各种不同音色、音调的声音。另外,改变P1.3输出电平的高低电平占空比,则可以控制蜂鸣器的声音大小。3、 I2C工作原理1)I2C总线概述I2C总线是PHLIPS公司推出的一种串行总线,是具备多主机系统所

5、需的包括总线裁决和高低速器件同步功能的高性能串行总线。 2)I2C信号线I2C总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。I2C总线通过上拉电阻接正电源。当总线空闲时,两根线均为高电平。连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线“与”关系。图 3 I2C总线框图3)I2C总线的数据传送 a)数据位的有效性规定 I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。图 4 SDA与SCL的工作时序图b) 起始和终止信号SCL线为高电平期

6、间,SDA线由高电平向低电平的变化表示起始信号SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。起始和终止信号都是由主机发出的,在起始信号产生后,总线就处于被占用的状态;在终止信号产生后,总线就处于空闲状态。c) I2C总线的数据传送速率 I2C总线的通信速率受主机控制,能快能慢,最高速率限制为100Kb/s d) I2C总线的数据传送格式 主机向从机发送数据 从机向主机发送数据图 5 I2C总线的数据传送格式S:起始位 SA: 从机地址,7位W/:写标志位,1位 R:读标志位,1位A:应答位,1位 A/:非应答位,1位D:数据,8位 P:停止位阴影:主机产生的信号 无阴影:从

7、机产生的信号4)总线的寻址 I2C总线协议有明确的规定:采用7位的寻址字节(寻址字节是起始信号后的第一个字节)。寻址字节的位定义 D7D1位组成从机的地址。D0位是数据传送方向位,为“0”时表示主机向从机写数据,为“1”时表示主机由从机读数据。主机发送地址时,总线上的每个从机都将这7位地址码与自己的地址进行比较,如果相同,则认为自己正被主机寻址,根据R/位将自己确定为发送器或接收器。从机的地址由固定部分和可编程部分组成。在一个系统中可能希望接入多个相同的从机,从机地址中可编程部分决定了可接入总线该类器件的最大数目。如一个从机的7位寻址位有4位是固定位,3位是可编程位,这时仅能寻址8个同样的器件

8、,即可以有8个同样的器件接入到该I2C总线系统中。4、 LM75特征及应用LM75A是一个使用了内置带隙温度传感器和模数转换技术的温度-数字转换器I2C 总线接口。工作温度范围-55oC+125 oC,精度可达0.125 oC。 LM75A可设置成工作在两种模式:正常工作模式或关断模式。在正常工作模式中,每隔100ms执行一次温度-数字的转换,Temp寄存器保存着最后一次更新的结果;但是,在该模式下,器件的I2C接口仍然有效,寄存器读/写操作纠结执行。器件的工作模式通过配置寄存器可编程位B0业设定。当器件上电或从关断模式进入正常工作模式时启动温度转换。LM75A可配置成不同的工作条件。它可设置

9、成在正常工作模式下周期性地对环境温度进行监控或进入关断模式来将器件功耗降至最低。OS输出有2种可选的工作模式:OS比较器模式和OS中断模式。OS输出可选择高电平或低电平有效。图表 6 LM75A工作原理图温度寄存器(Temp)Temp寄存器存放着每次A/D转换的或监控到的数字结果。包含2 个8位的数据字节,由一个高数据字节(MS)和一个低数据字节(LS)组成。其中,只有11位用来存放分辨率为0.125 oC的Temp数据(以二进制补码数据的形式) 对于正的温度值,D100 T=Temp *0.125oC对于负的温度值,D101 T=-Temp的补码*0.125oCLM75A主要应用于系统温度管

10、理、个人计算机、电子设备和工业控制器等地方,典型应用实例为:图 7 LM75A典型应用5、 步进电机驱动原理步进电机是一种将电脉冲转化为角位位移的执行机构。通俗一点讲:当步进驱动器接收到一个脉冲从头到尾,它就驱动步进电机按设定的方向转动一个固定的角度(即步进角)。所以,我们可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的,同时也可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调整的目的。本实验中驱动电机的信号仍由PWM脉冲方波控制。原理图如图8所示。图 8 步进电机驱动原理图6、 程序框图主程序初始化SysInit() 开启16位定时器T0DispInit() 数据管显示初

11、始化 开启中断T1I2C_Init() I2C总线协议初始化设定PWM,温度初值读取温度显示温度扫描键盘判断是否有键按下+,温度cnt+更新DispBuf设置延时标志flag的值中断时间到蜂鸣器响0.5s-, 温度cnt-判断k更新温度值判断是否有键抬起扫描键盘有无无每1ms进入一次中断(T1)中断服务程序开始有更新扫描数据判断延时标志 flag为0 ,BUZZER取反比较cnt与temp,设置PwmValue值为差的绝对值若大则致热灯亮若小则致冷灯亮相等则送风灯亮中断服务程序结束PwmValue的值控制脉冲宽度tPwmValuePWM = 0tPWM_MAXt = 0思考题: 设定温度的按键

12、改用外部中断模式,电路如何修改(画示意图)?程序如何修改,写出中断服务程序。答:将KEY1与KEY2键通过跳线分别接到INT0与INT1接口上。开启中断:SysInit() EA=0; /禁止总中断 EX1=1; /使能/INT1中断EX0=1; /使能/INT0中断EA1; /使能总中断中断服务程序:void INT0SVC () interrupt 0if(cnt=17) cnt-; 示意图七、 总结及心得体会 通过本实验课程,我对中断和定时有了较深入的了解,对单片机的认识也进一步的提高。在编程的过程中,遇到了一些问题,本质原因是因为对单片机的认识不足,对工作机理不清楚,望文生义,从而导致

13、一些程序行不通,不过最终还是在老师和同学的帮助下,顺利的完成了实验。我想,对于语言来说,要想机器懂你,就必须遵守规则,所以,先弄懂是怎么运行的,再着手编程,会更顺理成章一点。八、 对本实验过程及方法、手段的改进建议无九、 附录1、 学号+秒表+按键+电机的程序2、 温度采集控制(数码管+直流电机)程序附录1:学号+秒表+按键+电机的程序/*main.c加减计数器*/#include #include #include /定义按键sbit KEY1 = P20;/按键1sbit KEY2 = P21;/按键2sbit BUZZER = P32;sbit PWM =P33;/定义PWM最大级数#d

14、efine PWM_MAX50/定义PWM级数,分为0PWM_MAX-1级unsigned char cnt = 18;/定义计数器变量int flag=1;unsigned char PwmValue;unsigned char sec = 0;unsigned int count = 998;code unsigned char Tab =/定义0123456789AbCdEF的数码管字型数据0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F;unsigned char DispBuf8;/*函数:KeyScan()功能:键盘扫描返回:扫描到

15、的键值*/unsigned char KeyScan()unsigned char k = 0;if ( KEY1 = 0 ) k = +;if ( KEY2 = 0 ) k = -;return k;/*函数:T1INTSVC()功能:定时器T1的中断服务函数*/void T1INTSVC() interrupt 3code unsigned char com = 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80;static unsigned char n = 0;static unsigned char t = 0;TR1 = 0;TH1 = 0xFC;TL

16、1 = 0x66;TR1 = 1;P1 = 0xFF;/暂停显示XBYTE0xE800 = DispBufn;/更新扫描数据P1 = comn;/重新显示n+; t+;n &= 0x07;if(flag=0)BUZZER=!BUZZER; if (n =8)n = 0;count +;/统计毫秒 /pwmcnt + ; if (count = 999)/一秒时间到sec +; count = 0;DispBuf4 = Tabsec / 10;/分离十位DispBuf3 = Tabsec % 10;/分离个位if (sec = 30)sec = 0; if(cntsec) PwmValue=cn

17、t-sec;elsePwmValue=sec-cnt;if ( t = PWM_MAX ) t = 0;if ( t = PwmValue)PWM = 1; elsePWM = 0; /*函数:DispClear()功能:清除数码管的所有显示*/void DispClear()unsigned char i;for ( i=0; i0时,延时(t*0.01)st=0时,延时2.56s说明:晶振用11.0592MHz*/void Delay(unsigned char t)doTH0 = 0xDC;TL0 = 0x00;TR0 = 1;while ( !TF0 );TR0 = 0;TF0 = 0

18、; while ( -t != 0 ); /*函数:SysInit()功能:系统初始化*/void SysInit()TMOD &= 0xF0;TMOD |= 0x01;/设置定时器T0为16位定时器DispInit();/数码管扫描显示初始化PwmValue = PWM_MAX / 2;/设置PWM初值PWM = 1; /PWM管脚为高void main()unsigned char k;/定义键值变量SysInit();/系统初始化DispBuf7=Tab1;DispBuf6=Tab5;DispBuf1=Tabcnt/10;DispBuf0=Tabcnt%10;for (;)for (;)

19、Delay(5);/延时50msk = KeyScan();/键盘扫描if ( k != 0 )flag=0;Delay(50);flag=1; break; switch ( k )/判断键值,执行具体功能case +:if ( cnt 16 ) cnt-;break;default:break;DispBuf1=Tabcnt/10;DispBuf0=Tabcnt%10;for (;)Delay(5);/延时50msif ( KeyScan() = 0 ) break;/如果按键抬起,退出循环附录2:温度采集控制(数码管+直流电机)程序/*main.cLM75A数字温度计*/#include

20、 I2C.h#include #include #include #include /定义按键sbit KEY1 = P20;/按键1sbit KEY2 = P21;/按键2sbit BUZZER = P32;sbit PWM =P33;sbit LED0 = P22;sbit LED1 = P23;/定义LED由P0.0控制 /定义LED由P0.0控制 sbit LED2 = P24;/定义LED由P0.0控制 #define PWM_MAX50/定义PWM级数,分为0PWM_MAX-1级unsigned char PwmValue;unsigned char cnt = 25;/定义计数器

21、变量int flag=1;unsigned int temp;code unsigned char Tab =/定义0123456789AbCdEF的数码管字型数据0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F;unsigned char DispBuf8;/*函数:KeyScan()功能:键盘扫描返回:扫描到的键值*/unsigned char KeyScan()unsigned char k = 0;if ( KEY1 = 0 ) k = +;if ( KEY2 = 0 ) k = -;return k;/*函数:T1INTSVC()功能

22、:定时器T1的中断服务函数*/void T1INTSVC() interrupt 3code unsigned char com = 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80;static unsigned char n = 0;static unsigned char t = 0;TR1 = 0;TH1 = 0xFC;TL1 = 0x66;TR1 = 1;P1 = 0xFF;/暂停显示XBYTE0xE800 = DispBufn;/更新扫描数据P1 = comn;/重新显示n+; t+;n &= 0x07;if(flag=0) BUZZER=!BUZZE

23、R; if (cnt=temp/8) LED2=0; LED1=1; LED0=1;if(cnttemp/8) PwmValue=cnt-temp/8;if(PwmValue1)LED0=0;LED1=1;LED2=1;if(cnt1)LED1=0;LED2=1;LED0=1;if ( t = PWM_MAX ) t = 0;if ( t = PwmValue)PWM = 1; elsePWM = 0; /*函数:DispClear()功能:清除数码管的所有显示*/void DispClear()unsigned char i;for ( i=0; i0时,延时(t*0.01)st=0时,延时

24、2.56s说明:晶振用11.0592MHz*/void Delay(unsigned char t)doTH0 = 0xDC;TL0 = 0x00;TR0 = 1;while ( !TF0 );TR0 = 0;TF0 = 0; while ( -t != 0 );/*函数:SysInit()功能:系统初始化*/void SysInit()TMOD &= 0xF0;TMOD |= 0x01;/设置定时器T0为16位定时器DispInit();I2C_Init();/数码管扫描显示初始化PwmValue = PWM_MAX / 2;/设置PWM初值PWM = 1;/PWM管脚为高/*函数:LM75

25、A_GetTemp功能:读出LM75A的温度值返回:LM75A温度寄存器的数值(乘以0.125可得到摄氏度值)*/int LM75A_GetTemp()unsigned char buf2;int t;I2C_Gets(0x90,0x00,2,buf);t = buf0;t = 5;/去掉无关位return t;/*函数:DispTemp()功能:在数码管上显示出温度值参数:t:补码,除以8以后才是真正温度值*/void DispTemp(int t)unsigned char i;/整数部分unsigned int d;/小数部分/分离出整数和小数部分i = t / 8;DispBuf7=T

26、abi/10;DispBuf6=Tabi%10+0x80;d = (t % 8)*125;DispBuf5=Tabd/100;DispBuf4=Tabd%100/10;DispBuf3=Tabd%100%10;/整数部分转换成字符串void main()unsigned char k;SysInit();DispBuf1=Tabcnt/10;DispBuf0=Tabcnt%10;for (;)temp = LM75A_GetTemp();DispTemp(temp);Delay(50);for (;)Delay(5);/延时50msk = KeyScan();/键盘扫描if ( k != 0 )flag=0;Delay(50);flag=1; break;switch ( k )/判断键值,执行具体功能case +:if ( cnt 16 ) cnt-;break;default:break;DispBuf1=Tabcnt/10;DispBuf0=Tabcnt%10;temp = LM75A_GetTemp();DispTemp(temp);Delay(50);for (;)Delay(5);/延时50msif ( KeyScan() = 0 ) break;/如果按键抬起,退出循环22

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1