温度传感器.docx
- 文档编号:9861005
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:16
- 大小:104.20KB
温度传感器.docx
《温度传感器.docx》由会员分享,可在线阅读,更多相关《温度传感器.docx(16页珍藏版)》请在冰豆网上搜索。
温度传感器
MCS—8031单片机
课程设计报告
题目:
温度传感器实验
学院(系):
电气工程学院
年级专业:
09级工业自动化仪表2班
学号:
090103020081
学生姓名:
指导教师:
教师职称:
教授
目录
摘要
第一章.基本设计思路
第二章.系统框图及硬件电路图
第三章.源程序及目标程序
第四章.程序设计说明
第五章.学习心得
参考文献
摘要
随着时代的进步和发展,人民生活水平的提高,单片机技术已经普及到,生活,工作,科研,各个领域,已经成为一种比较成熟的技术,它给人们带来的方便也是不可否定的,其中数字温度计就是其中的一个典型的例子,但是人们对它的要求越来越高,要为现代人,生活,工作,科研提供更好的,更方便的设施就要从单片机入手,一切向数字化,智能化方向发展。
基于MCS80C31单片机设计温度检测报警,可以实时采集周围的温度信息进行显示,并且可以根据应用环境不同设定不同的报警上下限。
本次设计的温度检测报警系统是在日常生活和工业应用非常广泛的工具,能实时采集周围的温度信息进行显示,程序内部设定有报警上下限,根据应用环境不同可设定不同的报警上下限。
该系统实现了对温度的自动监测,为设备的正常运行提供了条件,在工业中具有一定的实用价值和广泛的应用前景。
第一章基本设计思路
1.1.基本功能
1.实时温度检测并显示其对应的值。
2.基本范围:
-99℃-99℃
3.误差小于1℃
4.LED数码管直接显示
1.2.扩展功能
1.具有温度报警功能。
2.可以设报警置温度上下限。
1.3.设计方案
由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来。
第二章系统框图及硬件电路图
2.1测温电路图图
2.2单片机控制A/D转换图
第四章源程序及目标程序
4.1目标程序:
#include
#defineLEDLen6
#defineLowTemp(-99)//A/D0
#defineHighTemp99//A/D255
xdataunsignedcharOUTBIT_at_0x9002;
xdataunsignedcharOUTSEG_at_0x9004;//段控制口
xdataunsignedcharIN_at_0x9001;
xdataunsignedcharADPort_at_0x8000;
signedcharCurTemp;
unsignedcharLEDBuf[LEDLen];
codeunsignedcharLEDMAP[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
voidDelay(unsignedcharCNT)
{
unsignedchari;
do{
i=100;
do{
}while(--i);
}while(--CNT);
}
voidDisplayLED()
{
unsignedchari;
unsignedcharPos;
unsignedcharLED;
//初始位置为右边
Pos=0x20;
for(i=0;i //关闭所显示位 OUTBIT=0; //取出显示数据 LED=LEDBuf[i]; OUTSEG=LED; //输出位选通信号,选择一位LED点亮 OUTBIT=Pos; //延时 Delay (2); //移位,选择下一位LED准备点亮 Pos>>=1; } OUTBIT=0; } voidDisplayResult() { signedcharT; T=CurTemp; if(T<0){ //如果温度低于零度,显示'-'号 LEDBuf[0]=0x40; T=-T; }elseLEDBuf[0]=0; //显示温度十位数 LEDBuf[1]=LEDMAP[T/10]; //显示温度个位数 LEDBuf[2]=LEDMAP[T%10]; LEDBuf[3]=0; } unsignedcharReadAD() { unsignedinti; //启动A/D变换 ADPort=0; //延时100us, for(i=0;i<20;i++); //得到A/D采样值 return(0xff-ADPort); } voidReadTemp() { unsignedchari; signedintTemp; Temp=0; //采样16次,取平均数 for(i=0;i<16;i++){ Temp+=ReadAD(); }; //AD采样值转换为实际温度 CurTemp=(Temp>>4)*(HighTemp-LowTemp)/256+LowTemp; } voidmain() { unsignedchardtimer; while (1){ for(dtimer=15;dtimer>0;dtimer--){ //当前温度和设定温度送显示缓冲 DisplayResult(); //显示当前温度和设定温度 DisplayLED(); }; //读入当前温度 ReadTemp(); } } 4.2目标程序: #include sbitSpeaker=P1^0; #defineLEDLen6 #defineLowTemp(-99)//A/D0 #defineHighTemp99//A/D255 xdataunsignedcharOUTBIT_at_0x9002; xdataunsignedcharOUTSEG_at_0x9004;//段控制口 xdataunsignedcharIN_at_0x9001; xdataunsignedcharADPort_at_0x8000; signedcharCurTemp; unsignedcharLEDBuf[LEDLen]; codeunsignedcharLEDMAP[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 }; voidDelay(unsignedcharCNT) { unsignedchari; do{ i=100; do{ }while(--i); }while(--CNT); } voidDelay1(intn) { inti,j; for(j=0;j for(i=0;i<80;i++);//100us } voidDisplayLED() { unsignedchari; unsignedcharPos; unsignedcharLED; //初始位置为右边 Pos=0x20; for(i=0;i //关闭所显示位 OUTBIT=0; //取出显示数据 LED=LEDBuf[i]; OUTSEG=LED; //输出位选通信号,选择一位LED点亮 OUTBIT=Pos; //延时 Delay (2); //移位,选择下一位LED准备点亮 Pos>>=1; } OUTBIT=0; } voidDisplayResult() { signedcharT; T=CurTemp; if(T<0){ //如果温度低于零度,显示'-'号 LEDBuf[0]=0x40; T=-T; }elseLEDBuf[0]=0; //显示温度十位数 LEDBuf[1]=LEDMAP[T/10]; //显示温度个位数 LEDBuf[2]=LEDMAP[T%10]; LEDBuf[3]=0; } unsignedcharReadAD() { unsignedinti; //启动A/D变换 ADPort=0; //延时100us, for(i=0;i<20;i++); //得到A/D采样值 return(0xff-ADPort); } voidReadTemp() { unsignedchari; signedintTemp; Temp=0; //采样16次,取平均数 for(i=0;i<16;i++){ Temp+=ReadAD(); }; //AD采样值转换为实际温度 CurTemp=(Temp>>4)*(HighTemp-LowTemp)/256+LowTemp; } voidmain() { unsignedchardtimer; while (1){ for(dtimer=15;dtimer>0;dtimer--) { //当前温度和设定温度送显示缓冲 DisplayResult(); //显示当前温度和设定温度 DisplayLED(); }; //读入当前温度 ReadTemp(); while(CurTemp>80) { Speaker=0; Delay1 (2); Speaker=1; //Delay1 (1); for(dtimer=3;dtimer>0;dtimer--) { //当前温度和设定温度送显示缓冲 DisplayResult(); //显示当前温度和设定温度 DisplayLED(); }; //读入当前温度 ReadTemp(); } } } 4.3程序解释: 1.a/d转换: ReadAD() ADPort=0;启动a/d转换,延时一段时间后,a/d转换完毕,将a/d值送到单片机 2.单片机读取a/d值: ReadTemp() Temp=0; //采样16次,取平均数 for(i=0;i<16;i++){ Temp+=ReadAD(); }; //AD采样值转换为实际温度 连续读取16个数,相加存入temp中 CurTemp=(Temp>>4)*(HighTemp-LowTemp)/256+LowTemp; 取平均值并按照公式求得实际温度值 3.对温度值进行处理: DisplayResult() T=CurTemp; if(T<0){ //如果温度低于零度,显示'-'号 LEDBuf[0]=0x40; T=-T; }elseLEDBuf[0]=0; //显示温度十位数 LEDBuf[1]=LEDMAP[T/10]; //显示温度个位数 LEDBuf[2]=LEDMAP[T%10]; LEDBuf[3]=0; 用数码管第四位显示温度,最高位显示正负,通过T/10和T%10与段码表对应,获得各位数码管应该显示的段码 4.在数码管上显示: DisplayLED() Pos=0x20; %0x20转换为二进制数为00100000正好为试验箱上最高位为1,即从最高位扫描 for(i=0;i //关闭所显示位 OUTBIT=0; //取出显示数据 LED=LEDBuf[i]; OUTSEG=LED; //输出位选通信号,选择一位LED点亮 OUTBIT=Pos; //延时 %显示该位数码管 Delay (2); %移位,选择下一位LED准备点亮 Pos>>=1; } OUTBIT=0; } %实现了各位数码管的逐位显示 5.主函数: voidmain() voidmain() { unsignedchardtimer; while (1){ for(dtimer=15;dtimer>0;dtimer--) { //当前温度和设定温度送显示缓冲 DisplayResult(); //显示当前温度和设定温度 DisplayLED(); }; %读完当前温度后,显示15次 ReadTemp(); %再次读入当前温度 while(CurTemp>80) %对当前温度进行判断,是否大于80度 { Speaker=0; Delay1 (2); Speaker=1; Delay1 (1); %当温度大于80度时,蜂鸣器报警 for(dtimer=3;dtimer>0;dtimer--) { //当前温度和设定温度送显示缓冲 DisplayResult(); //显示当前温度和设定温度 DisplayLED(); }; //读入当前温度 ReadTemp(); } %蜂鸣器报警的的同时继续测温并且显示温度 第五章.学习心得 通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。 我在设计的过程中遇到了许多问题,同时也发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说不懂一些元器件的使用方法,对汇编语言掌握得不透彻。 还有,这次的设计让我明白了求人不如求己,虽然我们要讲究合作,但更重要的是自己,只有自己懂,自己做,才不会在关键时刻掉链子。 别人终究是一个陪衬,路总是要自己走,属于自己的任务就要自己搞。 所以,我们必须要时刻强大自己,别人终究是别人。 这个过程虽然不是很平坦,肯定会遇到各种各样的问题,但一旦征服了它那它就是你的东西了,当这样的厚积达到一定程度那你就能享受到薄发那刻的辉煌。 参考文献 《单片机原理及应用技术》张淑清,国防工业出版社 《过程控制系统及仪表》邵玉森巴筱云 《单片机原理及应用》李大友,高等教育出版社 《机械量测量》机械工业出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 温度传感器