软件设计课程设计实验报告基于单片CPU的LCD显示温度控制器设计.doc

上传人:仙人指路1688 文档编号:2883847 上传时间:2023-03-01 格式:DOC 页数:30 大小:775KB
返回 下载 相关 举报
软件设计课程设计实验报告基于单片CPU的LCD显示温度控制器设计.doc_第1页
第1页 / 共30页
软件设计课程设计实验报告基于单片CPU的LCD显示温度控制器设计.doc_第2页
第2页 / 共30页
软件设计课程设计实验报告基于单片CPU的LCD显示温度控制器设计.doc_第3页
第3页 / 共30页
软件设计课程设计实验报告基于单片CPU的LCD显示温度控制器设计.doc_第4页
第4页 / 共30页
软件设计课程设计实验报告基于单片CPU的LCD显示温度控制器设计.doc_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《软件设计课程设计实验报告基于单片CPU的LCD显示温度控制器设计.doc》由会员分享,可在线阅读,更多相关《软件设计课程设计实验报告基于单片CPU的LCD显示温度控制器设计.doc(30页珍藏版)》请在三一办公上搜索。

1、南京邮电大学2010/2011学年 第2学期 软件设计实验报告题 目 基于单片的显示温度控制器设计专 业 电子信息工程 学 号 姓 名 指导老师 实验日期 2011 年 05 月 05 日题目:基于CPU的LCD显示温度控制器设计一 ,实验目的和要求1,Proteus软件的MCS51单片机仿真学习2,根据提供的参考工程,在proteus平台自己重新设计实验电路所需要的电器原理图,并在此基础上编写相对应的程序,实现其功能,学习proteus软件的使用,其中包括原理图器件的选取,原理图的电气连接,程序的编写编译以及运行,并能查出其错误等。基本要求: 用热敏电阻或温度传感器作温度探头,通过AD转换器

2、变换,把温度数据转换成BCD码在LCD上显示。 显示精度0。5 能记录和回放温度参数,记录间隔可任意设定(1S到1h,步长1s) 回放数据速度可设定 画出温度变化曲线。发挥部分:1 显示精度提高到0。12 显示精度提高到0。013 与实际温度计温度比较,找出温度显示误差曲线,在报告中描出,并分析误差来源4 实现温度自动补赏二,实验仪器微型计算机三,实验原理温度测量通常可以用两种方式来实现,一种是用热敏电阻之类的器件,由于感温效应,热敏电阻的阻值能够随温度变化,当热敏电阻接入电路,测量过它的电流或其两端的电压就会随温度 变化发生响应的变化,在将温度变化的电压或电流采集过来,进行A/D转化后,发送

3、到单片机进行处理,通过显示电路,就可以将被测温度显示出来。这种设计需要用到A/D转换电路,其测温电路比较麻烦。第二种方法是用温度传感器芯片。温度传感器芯片能把温度信号转换成数字信号,直接发送给单片机,转换后通过显示电路既可以显示。四,基本原件及其原理单片机微型计算机简称单片机,是指在一块芯片体上集成了中央处理器CPU、随机存储器RAM、程序存储器ROM或EPROM、定时器/计数器、中断控制器以及串行和并行I/O接口等部件,构成一个完整的微型计算机。目前,新型单片机内还有A/D及D/A转换器、高速输入/输出部件、DMA通道、浮点运算等特殊功能部件。由于它的结构和指令功能都是按工业控制设计要求设计

4、的,特别适用于工业控制及其数据处理场合,因此,确切的称谓是微控制器,单片机只是习惯称呼。51单片机引脚图如下:(1)单片机的特点1)有优异的性能价值比。2)集成度高、体积小、有很高的可靠性。单片机把各个功能部件集成在一块芯片上,内部采用总线结构,减少了各芯片之间的连线,大大提高了单片机的可靠性与抗干扰能力。另外,其体积小,对于强磁场环境易于采取措施,适合于恶劣环境下工作;也易于产品化。3)控制功能强。为了满足工业控制的要求,一般单片机的指令系统中均有及其丰富的转移指令、I/O口逻辑操作及位处理指令。一般来说,单片机的逻辑控制功能及运行速度高于同意档次的微机。4)单片机的系统扩展和系统配置都比较

5、典型、规范,而且非常容易构成各种规模的应用系统。(2)单片机并行I/O接口的扩展单片机与外部交换信息是通过I/O接口电路来实现的。AT89C51单片机本身有4个8位的并行I/O口P0-P3,但实际使用时往往再增加些I/O口,以便与外部设备交换数据。AT89C51单片机外部RAM和扩展I/O接口是统一编址的。用户可以把外部64KB RAM空间的一部分作为扩展I/O接口地址空间,每一个I/O接口相当于一个RAM存储单元,访问外部RAM存储单元就像访问外部I/O接口,即用“MOVX”指令对扩展I/O接口进行输入输出操作。查询式键盘的接口电路查询式键盘属于独立式键盘,键盘的各个按键之间彼此是独立的且是

6、最简单的键盘电路。每个键地接入一根数据输入线。如图所示。注意:由于每一个按键均需要一根I/O口线 ,当键盘按键数量比较多时,需要的I/O口线也较多,因此独立式键盘只适合于按键较少的应用场合。一般情况下,按键数等于占用I/O端口数。查询式键盘的结构图如图所示:P1.0P1.1 查询式键盘的接口电路查询式键盘可以工作在多种方式下,中断方式、程序查询方式、定时查询发送和中断查询方式。在中断模式下,按键的数量受到外部中断源的限制。在有特殊需要的场合,还可以借用内部的定时器中断。所以在这种模式下,按键的数目小于外部中断源和单片机定时器数量之和。程序查询和定时查询类似,都是通过读I/O状态,当有键被按下时

7、相应的I/O口线变为低电平,而未被按下的键对应的I/O口线保持为高电平,这样通过读I/O口状态可判断是否有键按下和哪一个键被按下。1602LCD的基本参数及引脚功能1602lcd分为带背光和不带背光两种,其控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别。LM016L结构图温度传感器及其原理温度传感器是一种将温度变化转换为电量变化装置。将温度变化转换为热电势变化的称热电偶传感器。将温度变化转换为电阻变化的称为热电阻传感器;金属热电阻式传感器简称为热电阻,半导体热电阻式传感器简称为热敏电阻。温度传感在工业生产、科学研究、民用生活等许多领域得到广泛应用。电阻式传感器

8、广泛被用于-200960范围内的温度。是利用导体或半导体的电阻随温度变化而变化的性质而工作的,用仪表测量出热电阻的阻值变化,从而得到与电阻值对应的温度值。电阻式传感器分为金属热电阻传感器和半导体热电阻传感器两大类。前者称为热电阻,后者称为热敏电阻。对于热敏电阻,需要了解以下几点:(1)测温原理及特性NTC热敏电阻研制的较早,也较成熟。最常见的是由金属氧化物组成。根据不同的用途,NTC又可以分为两大类。第一类用于测量温度。它的电阻值与温度之间呈负的指数关系。第二类为负的突变型,当其温度上升到某设定值时,其电阻值突然下降,多用于各种电子电路中抑制浪涌电流,起保护作用。典型的PTC热敏电阻通常是在钛

9、酸钡陶瓷中加入施主杂质以增大电阻温度系数。(2)热敏电阻的应用热敏电阻具有尺寸小、响应速度快、阻值大、灵敏度高等特点,因此它在许多领域被广泛应用。(3)热敏电阻的温度补偿热敏电阻可以在一定的温度范围内对某些元件进行温度补偿。热敏电阻可以用于温度控制:DS18B20温度传感器的作用是将温度经过热敏电阻Rt转换为电压信号。在本课题中温度范围的计算原理:首先把A/D转换中电位器旋钮顺时针旋到底,即模拟信号的输入不衰减,选取两个温度状态T1、T2,分别测量出其模拟输出电压V1、V2;根据0809的输入范围在0到5伏,即可计算出温度极限。0伏时对应的温度TL:T1-(V1-0)(T2-T1)/(V2-V

10、1)。5伏时对应的温度TH: T1-(V1-5)(T2-T1)/(V2-V1)本实验中近似计算TH为150摄氏度,TL为-50摄氏度。程序温度的计算原理:首先用温度范围除以0到256(即每个十六进制数的温度增长率),然后乘以模拟转换的数字量,即得到升高的温度,在和最低温度相加,就可以得到实际的温度值。其公式为:TL+AX(TH-TL)/256TL:显示的最低温度TH:显示的最高温度AX:模拟电压所转换的数字量五,仿真软件的使用1.Keil软件的使用:首先正确安装keil软件打开keilprojectnew Uvision project为工程取名字,并选择工程要保存的路径,建议每个工程新建一个

11、文件夹,方便文件管理出来一个对话框,是选择芯片的,你根据你的芯片公司和型号来选择就行了,比如:最常用的at89c52,点atmel,找到at89c52,点OK后会出来一个对话框,问你是否添加启动文件,点“是”这样就建好了一个工程,点File菜单下New新建文件先保存文件,点保存按钮后出来路径框,取名字后缀是.c或者.h,点保存接下来在左边project下把Target1点开,在Source Group 1上右键,点击Add File to Group Source Group 1在弹出的框中点刚刚保存的文件,然后点Add,关闭对话框,左边project框中可以看到文件已经添加在开始之前还是先来

12、配置一下keil环境,点击工具栏品字图标左边像魔棒一样的按钮接下来的配置比较复杂,我用图来解释,Target项目下只改一个晶振的值,Output下要点击生产HEX文件,Debug下左边是keil仿真调试配置,右边是程序下载到芯片调试配置,看你是怎么用了。一切完工,可以编程调试了。2.proteus软件的使用:新建文件,查找元件,并添加。画好电路图后,添加用keil生成的hex文件,即可运行。六,实验数据 实验原理图:四张图分别代表:实验连接图(无键盘),实验连接图(有键盘),温度记录控制图1, 温度记录控制图2。1.实验连接图(无键盘)2.实验连接图(有键盘)3.温度记录控制图1。4.温度记录

13、控制图2。置存储取首址;显示缓冲区首址(对应字形码);置串行输出口即RXD,置时钟输出口即TXD;存入显示数据。 表头地址;查表指令;段码地址指针,显示段码字节数;输出子程序;取段码;段码左移则输出一位段码然后发送脉冲一位。显示程序流程图LCD显示器流程图如图所示:A=1YNA #80HA0C0H调命令写入子程序调数据写入子程序返回 (显示子程序)显示地址P0显示数据 P0RS0RS 1清WR有效清WR有效调使能脉冲子程序调使能脉冲子程序返回返回(写数据子程序) (写命令子程序)A/D转换子程序设计 显示缓冲器存放0AH,0DH,0XH,0XH;串行静态显示“ADXX”XX表示0F;A/D地址

14、清零,启动A/D转换器,延时等待转换结果然后读入结果送入数码管显示。累加器内容存入B中,A的内容高四位与低四位交换,A的内容高四位清零,A/D转换结果高位送入DBUF3中,取出A/D转换后的结果,A的内容高四位清零则结果低位送入DBF4中;串行静态显示“ADXX”。静态显示子程序;显示表头地址;取段码到TEMP中去显示段码地址指针读出段码字节数;移位次数取段码;段码左移;输出一位段码;发送一个一位脉冲。A/D转换流程图A/D转换流程图如图所示:初始启动A/D转换A/D转换完成?数据输出延时开始结束查询式键盘程序设计先初始化地址参数,显示缓冲区初始;输入前,锁存器置“1”;读取键盘状况;有键按下

15、,若无键按下返回;延时去抖动;确有键按下则从键表中取键值然后相比较,若相等则等键释放,延时去抖动得键码;若不相等,到继续访问键值表,键值不在键值中,即多键同时按下;然后键表值静态显示。查询式键盘流程图查询式键盘流程图如图所示:显示缓冲区初始LCD显示有键输入?读取键值键值转换为显示数NY开始温度传感器设计温度传感器的程序设计输入A/D端口地址;显示温度,将正负值区分显示;显示“”号时求补码;显示“ ”时存入显示内容,读入结果,计算温度。其公式为:TL+AX(TH-TL)/256(TL:显示的最低温度TH:显示的最高温度AX:模拟电压所转换的数字量)温度检测的流程图:温度检测流程图如图所示: A

16、/D转换温度计算判断正负显示加 “”号温度控制系统的总流程图如图所示:初始化温度参数当前温度和设定温度送显示缓冲显示温度采样当前温度键盘值是?当前温度与设定温度比较不变读键盘向上键向下键设定温度加1设定温度减1开始当前温度和设定温度送显示缓冲实验程序C语言代码#include#include #define uchar unsigned char#define uint unsigned intuchar code tab2=Temprature:;uchar code tab3= ;sbit DQ = P37;/定义DS18B20数据端口char code tab44=1,4,7,10,2,

17、5,8,0,3,6,9,11,12,13,14,15;uchar a,miao,shi,fen,tt,key1n,key3n,key2n,nian,yue,r,nianb,speak,wendu,wendu1,wendu3,miao1,shu,shu1,wendu4;unsigned char code dotcode167=0,6,12,19,25,31,37,44,50,56,62,69,75,81,87,94;sbit rs=P31;sbit rw=P32;sbit en=P33;/定义1602端口#define yh 0x80 /第一行的初始位置#define er 0x80+0x40

18、 /第二行初始位置sfr DBPort = 0x80;unsigned char tt,tt1;unsigned char t2,*pt;void delay(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-)/定义DQ引脚为P3.7/*ds18b20延迟子函数(晶振12MHz )*/void delay_18B20(unsigned int i)while(i-);/*ds18b20初始化函数*/void Init_DS18B20(void)unsigned char x=0;DQ = 1; /DQ复位delay_18B20(8); /稍做延时DQ

19、= 0; /单片机将DQ拉低delay_18B20(80); /精确延时 大于 480usDQ = 1; /拉高总线delay_18B20(14);x=DQ; /稍做延时后 如果x=0则初始化成功 x=1则初始化失败delay_18B20(20);/*ds18b20读一个字节*/unsigned char ReadOneChar(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_18B20(4);return(

20、dat);/*ds18b20写一个字节*/void WriteOneChar(unsigned char dat)unsigned char i=0;for (i=8; i0; i-)DQ = 0;DQ = dat&0x01;delay_18B20(5);DQ = 1;dat=1;/*读取ds18b20当前温度*/unsigned char *ReadTemperature()unsigned char tt2;Init_DS18B20();WriteOneChar(0xCC); / 跳过读序号列号的操作WriteOneChar(0x4E); / /写入写暂存器命令,修改TH和TL和分辩率配置

21、寄存器/先写TH,再写TL,最后写配置寄存器WriteOneChar(100);/写入想设定的温度报警上限WriteOneChar(4);/写入想设定的温度报警下限WriteOneChar(0x7f);/写配置寄存器,格式为0 R1 R0 1,1 1 1 1/R1R0=00分辨率娄9位,R1R0=11分辨率为12位delay_18B20(80); / this message is wery importantInit_DS18B20();WriteOneChar(0xCC); / 跳过读序号列号的操作WriteOneChar(0x44); / 启动温度转换delay_18B20(80); /

22、 this message is wery importantInit_DS18B20();WriteOneChar(0xCC); /跳过读序号列号的操作WriteOneChar(0xBE); /读取温度寄存器等(共可读9个寄存器) 前两个就是温度delay_18B20(80);tt0=ReadOneChar(); /读取温度值低位tt1=ReadOneChar();return(tt);void covert1(void)/将温度转换为LCD显示的数据unsigned char TH=110,TL=-20;unsigned char x=0x00,y=0x00;pt=ReadTemperat

23、ure();t0=*pt;pt+;t1=*pt;if(t10x07) /判断正负温度wendu3=1; /0x2d为-的ASCII码t1=t1; /*下面几句把负数的补码*/t0=t0; /* 换算成绝对值*/x=t0+1; t0=x;if(x255) t1+;else wendu3=0; /0xfe为变+的ASCII码t1=4;/右移4位x=x&0x0f;/和前面两句就是取出t0的高四位x=t1|x; /将高低字节的有效值的整数部分拼成一个字节wendu=x;t0=t0&0x0f;/取有效的两位小数x=t0;wendu1=dotcodex; /分离出百分位unsigned char LCD_

24、Wait(void)rs=0;rw=1;delay(1);en=1;delay(1);/while(DBPort&0x80);/在用Proteus仿真时,注意用屏蔽此语句,在调用GotoXY()时,会进入死循环,/可能在写该控制字时,该模块没有返回写入完备命令,即DBPort&0x80=0x80/实际硬件时打开此语句en=0;return DBPort;void LCD_Write(bit style, unsigned char input)en=0;rs=style;rw=0;_nop_();DBPort=input;_nop_();/注意顺序en=1;_nop_(); /注意顺序en=0

25、;_nop_();LCD_Wait();void GotoXY(unsigned char x, unsigned char y)if(y=0)LCD_Write(0,0x80|x);if(y=1)LCD_Write(0,0x80+0x40+x);/sbit s4=P03;uchar num,count,flag,flag1,flag2,flag3,s1num,j;void keyscan();write_1602com(uchar com)/液晶写入指令函数en=0;rs=0; /置为写入命令rw=0;_nop_();P0=com; /送入数据_nop_();en=1;/拉高使能端_nop_

26、();en=0;/完成高脉冲_nop_();LCD_Wait();write_1602dat(uchar dat)en=0;rs=1; /置为写入数据rw=0;_nop_();P0=dat;/送入数据_nop_();en=1;_nop_();en=0;_nop_();LCD_Wait();void write_sfm(uchar add,uchar dat)/写时分秒uchar gw,sw;gw=dat%10;sw=dat/10;write_1602com(add+er);write_1602dat(0x30+sw);write_1602dat(0x30+gw);void write_nyr(

27、uchar add,uchar dat)/写时分秒uchar gw,sw;gw=dat%10;sw=dat/10;write_1602com(add+yh);write_1602dat(0x30+sw);write_1602dat(0x30+gw);void write(uchar add) /写时分秒write_1602com(add+yh);write_1602dat(58);void init()write_1602com(0x38); /设置液晶工作模式write_1602com(0x0c); /开显示不显示光标write_1602com(0x06); /整屏不移动,指针加一write

28、_1602com(0x01);write_1602com(yh); /字符写入的位置for(a=0;a16;a+)write_1602dat(tab3a);/delay(3);write_1602com(er+2);for(a=0;a16;a+)write_1602dat(tab2a);/delay(3);keys()unsigned char hang,lie,key;if(P3!=0x0f)delay(5);if(P3!=0x0f)switch(P3&0x0f)case 0x0e:lie=0;break;case 0x0d:lie=1;break;case 0x0b:lie=2;break

29、;case 7:lie=3;break;P3=0xf0;P3=0xf0;switch(P3&0xf0)case 0xe0:hang=0;break;case 0xd0:hang=1;break;case 0xb0:hang=2;break;case 0x70:hang=3;break;P3=0x0f;while(P3!=0x0f)P1_1=1;P1_1=0;key=tabhanglie;elsekey=20;speak=0;return(key);char kbscan() /键盘扫描int key;key=keys();if(key=10)key1n+;if(key1n=6)key1n=0;

30、if(key=12)key3n+;if(key3n=2)key3n=0;if(key=11)key2n+;if(key2n=6)key2n=0;while(key1n!=0)key=keys();if(key=10)key1n+;if(key1n=7)key1n=0;switch(key1n)case 1: TR1=0;/关闭定时器/TR1=0;write_1602com(er+0x02);/写入光标位置write_1602com(0x0f); /设置光标为闪烁break;case 2: write_1602com(er+3);/fen/write_1602com(0x0f);break;ca

31、se 3: write_1602com(er+5);/shi/write_1602com(0x0f);break;case 4: write_1602com(er+6);/fen/write_1602com(0x0f)break;case 5: write_1602com(er+8);/shi/write_1602com(0x0f);break;case 6: write_1602com(er+9);/fen/write_1602com(0x0f);break;case 0:write_1602com(0x0c);/设置光标不闪烁TR1=1;/打开定时器break;if(key10)write

32、_1602dat(0x30+key);switch(key1n)case 1: shi=shi%10+key*10;break;case 2: shi=shi/10*10+key;break;case 3: fen=fen%10+key*10;break;case 4: fen=fen/10*10+key;break;case 5: miao=miao%10+key*10;break;case 6: miao=miao/10*10+key;break;case 0:write_1602com(0x0c);/设置光标不闪烁TR1=1; /打开定时器break;while(key2n!=0)key

33、=keys();speak=0;if(key=11)key2n+;if(key2n=4)key2n=0;switch(key2n)case 1: TR1=0; /关闭定时器/TR1=0;write_1602com(er+13);/写入光标位置write_1602com(0x0f);/设置光标为闪烁break;case 2: write_1602com(er+14);/fen/write_1602com(0x0f);break;case 3: write_1602com(er+15);/shi/write_1602com(0x0f);break;case 0:write_1602com(0x0c

34、);/设置光标不闪烁TR1=1;/打开定时器break;if(key10)write_1602dat(0x30+key);switch(key2n)case 2: shu=shu%10+key*10;break;case 3: shu=shu/10*10+key;break;case 1: shu1=key*100;break;case 0:write_1602com(0x0c);/设置光标不闪烁TR1=1;/打开定时器break;miao1=shu;r=1;main()nian=0;nianb=20;yue=0;miao1=1;init();TMOD = 0x10;TH1 = 0xFF;TL

35、1 = 0x0E0;EA = 1;ET1 = 1;TR1 = 1;P1=0X00;covert1();P3=0X0F;while(1)kbscan() ;covert1();if(miao1=0)wendu4=wendu;write_sfm(8,miao);write_sfm(5,fen);write_sfm(2,shi);write_nyr(5,wendu);write_nyr(8,wendu1);if(key3n=1)write_nyr(12,wendu4);elsewrite_1602com(yh+12);/字符写入的位置write_1602dat( );write_1602dat( )

36、;void timer1() interrupt 3TH1 = 0x3c;TL1 = 0x0b0;tt+;if(tt=20)tt=0;miao+;if(r=1)miao1-;if(miao=60)miao=0;fen+;if(fen=60)fen=0;shi+;实验小结:本次软件设计实验,维持了几周时间。在这期间,有查阅过资料,虽然说只是51单片机的简单应用,但是对我们没学过,没接触过单片机的同学来说还是有点难度的,在这期间,大家都很认真,翻阅书本,还有在网络上查阅资料,对proteus和keil软件也有了进一步了解,虽然实验要求做的不是很完美,但是对51单片机我们有了更深入的认识。也非常感谢在这过程中老师的指导和同学之间的讨论,最终可以做出温度显示实验。通过此次试验,不仅仅学到了书本上的知识,而且也学会小组之间互相讨论,互相协作的良好习惯。相信在以后的学习过程中,我会更加努力。

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

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号