c51单片机实验温度采集控制报告.docx
- 文档编号:8874865
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:18
- 大小:311.37KB
c51单片机实验温度采集控制报告.docx
《c51单片机实验温度采集控制报告.docx》由会员分享,可在线阅读,更多相关《c51单片机实验温度采集控制报告.docx(18页珍藏版)》请在冰豆网上搜索。
c51单片机实验温度采集控制报告
电子科技大学电子工程学院
实验报告
实验名称现代电子技术综合实验
姓名:
赵源
学号:
2902301022
评分:
教师签字
电子科技大学教务处制
电子科技大学
实验报告
学生姓名:
李康为学号:
2902108014指导教师:
唐续
实验地点:
科A331实验时间:
第九周
一、实验室名称:
电子技术综合实验室
二、实验项目名称:
温度采集控制设计与实现
三、实验学时:
32
四、实验目的与任务:
1、熟悉系统设计与实现原理
2、掌握KEILC51的基本使用方法
3、熟悉SMARTSOPC实验箱的应用
4、连接电路,编程调试,实现各部分的功能
5、完成系统软件的编写与调试
五、实验器材
1、PC机一台
2、示波器、SMARTSOPC实验箱一套
六、实验原理、步骤及内容
(一)试验要求
1、在数码管的第一、二个显示当前环境温度,第三、六个数码管熄灭,第四、五个数码管显示设定温度,第七、八个数码管显示电机转速;设定温度初值25,利用“+”“-”两个按键可以加减该温度数值,范围在16~30之间,按键按下蜂鸣器响0.2s。
2、根据设定温度和实际环境温度的温差驱动直流电机。
设定温度等于环境温度,直流电机停转;设定温度和环境温度温差的绝对值越大,直流电机转速越快(要求最大转速控制在100以内)。
3、增加一个按键,当其按下,数码管显示学号(后8位)10秒,然后恢复的温度和转速的显示。
(附加内容,酌情给与附加分)
4、(选做)设定温度、环境温度、电机转速、学号分成四行在液晶上显示,其他要求不变。
(二)实验内容
1、数码管动态扫描原理
七段式LED数码管是常见的电子设备显示器件,能够显示数字0~9以及字
母a~f,外加一个小数点,作为第八段。
数码管有静态和动态之分,每一类又有共阳和共阴之分。
静态数码管驱动方法简单、亮度高,但是连线比较多,而动态数码管常常以多位联体的形式提供,连线较少,但是要用动态扫描的方法驱动,为了获得足够的亮度,限流电阻取值常常比较小。
动态数码管扫描的具体过程如下,先把第1个数码管的显示数据送到abcdefg和dp,同时选通com1,而其它数码管的com信号禁止;延时一段时间(通常不超过10ms),再把第2个数码管的显示数据送到abcdefg和dp,同时选通com2,而其它数码管的comd信号禁止;延时一段时间,再显示下一个。
当扫描整个数码管的频率应当保证在50Hz以上时,就不会看到明显的闪烁,肉眼观察,看上去是一起亮的。
原理图如下:
图1数码管的动态扫描原理图
2、蜂鸣器工作原理
蜂鸣器发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的,因此需要一定的电流才能驱动它,单片机IO引脚输出的电流较小,单片机输出的TTL电平基本上驱动不了蜂鸣器,因此需要增加一个电流放大的电路。
原理图见图:
图2蜂鸣器的原理图
如图2所示,蜂鸣器的负极经电阻R3接地,蜂鸣器的正极接到三极管的集电极C,三极管的基级B经过限流电阻R2后由单片机的P1.3引脚控制,当P1.3输出高电平时,三极管Q1截止,没有电流流过线圈,蜂鸣器不发声;当P1.3输出低电平时,三极管导通,这样蜂鸣器的电流形成回路,发出声音。
因此,我们可以通过程序控制P1.3脚的电平来使蜂鸣器发出声音和关闭。
程序中改变单片机P1.3引脚输出波形的频率,就可以调整控制蜂鸣器音调,产生各种不同音色、音调的声音。
另外,改变P1.3输出电平的高低电平占空比,则可以控制蜂鸣器的声音大小。
3、I2C工作原理
1)I2C总线概述
I2C总线是PHLIPS公司推出的一种串行总线,是具备多主机系统所需
的包括总线裁决和高低速器件同步功能的高性能串行总线。
2)I2C信号线
I2C总线只有两根双向信号线。
一根是数据线SDA,另一根是时钟线SCL。
I2C总线通过上拉电阻接正电源。
当总线空闲时,两根线均为高电平。
连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线“与”关系。
图3I2C总线框图
3)I2C总线的数据传送
a)数据位的有效性规定
I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。
图4SDA与SCL的工作时序图
b)起始和终止信号
SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号
SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。
起始和终止信号都是由主机发出的,在起始信号产生后,总线就处于被占用的状态;在终止信号产生后,总线就处于空闲状态。
c)I2C总线的数据传送速率
I2C总线的通信速率受主机控制,能快能慢,最高速率限制为100Kb/s
d)I2C总线的数据传送格式
主机向从机发送数据
从机向主机发送数据
图5I2C总线的数据传送格式
S:
起始位SA:
从机地址,7位
W/:
写标志位,1位R:
读标志位,1位
A:
应答位,1位A/:
非应答位,1位
D:
数据,8位P:
停止位
阴影:
主机产生的信号无阴影:
从机产生的信号
4)总线的寻址
I2C总线协议有明确的规定:
采用7位的寻址字节(寻址字节是起始信号后的第一个字节)。
寻址字节的位定义
D7~D1位组成从机的地址。
D0位是数据传送方向位,为“0”时表示主机
向从机写数据,为“1”时表示主机由从机读数据。
主机发送地址时,总线上的每个从机都将这7位地址码与自己的地址进行比较,如果相同,则认为自己正被主机寻址,根据R/位将自己确定为发送器或接收器。
从机的地址由固定部分和可编程部分组成。
在一个系统中可能希望接入多
个相同的从机,从机地址中可编程部分决定了可接入总线该类器件的最大数目。
如一个从机的7位寻址位有4位是固定位,3位是可编程位,这时仅能寻址8个同样的器件,即可以有8个同样的器件接入到该I2C总线系统中。
4、LM75特征及应用
LM75A是一个使用了内置带隙温度传感器和
模数转换技术的温度-数字转换器I2C总线接口。
工作温度范围-55oC~+125oC,精度可达0.125oC。
LM75A可设置成工作在两种模式:
正常工作模式或关断模式。
在正常工作模式中,每隔100ms执行一次温度-数字的转换,Temp寄存器保存着最后一次更新的结果;但是,在该模式下,器件的I2C接口仍然有效,寄存器读/写操作纠结执行。
器件的工作模式通过配置寄存器可编程位B0业设定。
当器件上电或从关断模式进入正常工作模式时启动温度转换。
LM75A可配置成不同的工作条件。
它可设置成在正常工作模式下周期性地对环境温度进行监控或进入关断模式来将器件功耗降至最低。
OS输出有2种可选的工作模式:
OS比较器模式和OS中断模式。
OS输出可选择高电平或低电平有效。
图表6LM75A工作原理图
温度寄存器(Temp)
Temp寄存器存放着每次A/D转换的或监控到的数字结果。
包含2个8位的数据字节,由一个高数据字节(MS)和一个低数据字节(LS)组成。
其中,只有11位用来存放分辨率为0.125oC的Temp数据(以二进制补码数据的形式)
对于正的温度值,D10=0T=Temp*0.125oC
对于负的温度值,D10=1T=-Temp的补码*0.125oC
LM75A主要应用于系统温度管理、个人计算机、电子设备和工业控制器等地方,典型应用实例为:
图7LM75A典型应用
5、电机驱动原理
电机是一种将电脉冲转化为角位位移的执行机构。
通俗一点讲:
当驱动器接收到一个脉冲从头到尾,它就驱动电机按设定的方向转动一个固定的角度(即步进角)。
所以,我们可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的,同时也可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调整的目的。
本实验中驱动电机的信号仍由PWM脉冲方波控制。
原理图如图8所示。
图8电机驱动原理图
6、程序框图
(三)思考题
设定温度的按键改用外部中断模式,电路如何修改(画示意图)?
程序如何修改,写出中断服务程序。
七、总结及心得体会
通过本试验,对单片机的中断和定时的时序问题有了深入的了解。
在最开始对于程序的简单模仿所产生的问题使我学会了分析代码和独立思考,和同学的讨论提高了协作能力。
同时,深刻地体会到了在硬件条件的限制下对于软件上优化的重要性,例如本次试验对于端口的冲突一度导致本人的研究遇到瓶颈,后来通过合理的分配引脚巧妙的解决了这个问题。
本次试验让我深刻地认识到,理论是基础,没有扎实的理论指导就很难得出理想的试验结果。
最后,深深感谢那些在本次试验中帮助过我的老师和同学们。
八、对本实验过程及方法、手段的改进建议
九、附录
温度采集控制实验程序
/*
main.c
LM75A数字温度计
*/
#include"I2C.h"
#include
#include
#include
#include
//定义显示缓冲区(由定时中断程序自动扫描)
unsignedcharDispBuf[8];
codeunsignedcharTab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
sbitKEY1=P2^0;//按键1
sbitKEY2=P2^1;//按键2
sbitKEY3=P2^2;
sbitPWM=P3^5;//PWM方波输出(接至MotorA,控制直流电机转速)
sbitBUZZER=P2^3;//蜂鸣器
unsignedcharSpeed;//预设的电机转速值,范围20~250
bitSWTR;//软件定时器运行标志
bitSWTF;//软件定时器溢出标志
unsignedintSWTV;//软件定时器定时值
bitBuzzerR;//蜂鸣器软件定时器运行标志
bitBuzzerF;//软件定时器溢出标志
unsignedintBuzzerV;//软件定时器定时值
/*
函数:
KeyScan()
功能:
键盘扫描
返回:
扫描到的键值
*/
unsignedcharKeyScan()
{
unsignedchark='\0';
if(KEY1==0)k='+';
if(KEY2==0)k='-';
if(KEY3==0)k='q';
returnk;
}
/*
函数:
T1INTSVC()
功能:
定时器T1的中断服务函数
*/
voidT1INTSVC()interrupt3
{
codeunsignedcharcom[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
staticunsignedcharn=0;
staticunsignedchart=0;
TR1=0;
TH1=0xFC;
TL1=0xA4;
TR1=1;
P1=0xFF;//暂停显示
XBYTE[0xE800]=~DispBuf[n];//更新扫描数据
P1=~com[n];//重新显示
n++;
n&=0x07;
//产生PWM方波,驱动电机
t++;
if(t { PWM=1; } else { PWM=0; } //模拟一个软件定时器 if(SWTR) { if(--SWTV==0)SWTF=1; } if(BuzzerR) { BUZZER=! BUZZER; if(--BuzzerV==0) BuzzerF=1; if(BuzzerF==1) {BuzzerF=0; BuzzerV=1000; BuzzerR=0; } } } /* 函数: DispClear() 功能: 清除数码管的所有显示 */ voidDispClear() { unsignedchari; for(i=0;i<8;i++) { DispBuf[i]=0x00; } } /* 函数: Delay() 功能: 延时1ms~65.536s 参数: t>0时,延时(t*1u)s t=0时,延时65.536s */ /* 函数: Delay() 功能: 延时0.1ms~6.5536s 参数: t>0时,延时(t*0.1)ms t=0时,延时6.5536s */ voidDelay(unsignedintt) { SWTV=t;//软件定时器赋初值 SWTR=1;//启动软件定时器 while(! SWTF);//等待溢出 SWTR=0;//停止软件定时器 SWTF=0;//清除溢出标志 } /* 函数: SysInit() 功能: 系统初始化 */ voidSysInit() { unsignedchari; for(i=0;i<8;i++) { DispBuf[i]=0x00;//数码管初始化为全灭 } Speed=0;//设置电机初始转速 SWTR=0; SWTF=0; SWTV=0; TMOD&=0x0F; TMOD|=0x20;//设置T1为8位定时器,自动重装 TH1=TL1=0xA4;//设置T1初值,对应100μs ET1=1;//使能T1中断 TR1=1;//启动T1 EA=1;//使能总中断 TMOD&=0xF0; TMOD|=0x05; I2C_Init();//初始化I2C总线 } /* 函数: LM75A_GetTemp 功能: 读出LM75A的温度值 返回: LM75A温度寄存器的数值(乘以0.125可得到摄氏度值) */ intLM75A_GetTemp() { unsignedcharbuf[2]; intt; I2C_Gets(0x90,0x00,2,buf); t=buf[0]; t<<=8; t+=buf[1]; t>>=5;//去掉无关位 returnt; } /* 函数: MeasureSpeed() 功能: 测量电机转速 返回: 转速值(单位: 转/秒) */ unsignedcharMeasureSpeed() { TH0=TL0=0;//清除计数器T0 TR0=1;//启动计数器T0 Delay(2500);//延时250ms(因为直流电机转盘上正好有4个槽) TR0=0;//停止计数 TF0=0;//清除(可能的)溢出标志 returnTL0;//返回结果(单位: 转/秒;已知电机转速不会超过100) } voidmain() { intt; inti; intcnt=25; intspd=0; unsignedchark; bitID=0; SysInit(); if(i if(i>cnt)Speed=(i-cnt)*10; if(i==cnt)Speed=0; for(;;) { DispClear(); DispBuf[0]=Tab[i/10]; DispBuf[1]=Tab[i%10]; DispBuf[2]=0x00; DispBuf[3]=Tab[cnt/10]; DispBuf[4]=Tab[cnt%10]; DispBuf[5]=0x00; for(;;) { if(ID) { DispClear(); DispBuf[0]=Tab[0]; DispBuf[1]=Tab[2]; DispBuf[2]=Tab[1]; DispBuf[3]=Tab[0]; DispBuf[4]=Tab[8]; DispBuf[5]=Tab[0]; DispBuf[6]=Tab[1]; DispBuf[7]=Tab[4]; } else { t=LM75A_GetTemp(); i=t/8; spd=MeasureSpeed(); DispBuf[0]=Tab[i/10]; DispBuf[1]=Tab[i%10]; DispBuf[3]=Tab[cnt/10]; DispBuf[4]=Tab[cnt%10]; DispBuf[6]=Tab[spd/10]; DispBuf[7]=Tab[spd%10]; } Delay(250);//延时25ms k=KeyScan();//键盘扫描 if(k! ='\0') { BuzzerF=0; BuzzerV=1000; BuzzerR=1; } break;//如果有键按下,退出循环 } switch(k)//判断键值,执行具体功能 { case'+': { if(cnt<30)cnt++; if(i if(i>cnt)Speed=(i-cnt)*10; if(i==cnt)Speed=0; break; } case'-': { if(cnt>16)cnt--; if(i if(i>cnt)Speed=(i-cnt)*10; if(i==cnt)Speed=0; break; } case'q': { ID=! ID; break; } default: break; } for(;;) { Delay(250);//延时25ms if(KeyScan()=='\0')break;//如果按键抬起,退出循环 } Delay(2500); } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c51 单片机 实验 温度 采集 控制 报告