南邮设计报告基于单片CPU的LCD显示温度控制器设计DOC.docx
- 文档编号:9960422
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:35
- 大小:772.32KB
南邮设计报告基于单片CPU的LCD显示温度控制器设计DOC.docx
《南邮设计报告基于单片CPU的LCD显示温度控制器设计DOC.docx》由会员分享,可在线阅读,更多相关《南邮设计报告基于单片CPU的LCD显示温度控制器设计DOC.docx(35页珍藏版)》请在冰豆网上搜索。
南邮设计报告基于单片CPU的LCD显示温度控制器设计DOC
南京邮电大学
2010/2011学年第2学期
软件设计实验报告
题目基于单片CPU的LCD显示温度控制器设计
专业电子信息工程
学号
姓名
指导老师林建中
实验日期2011年05月05日
题目:
基于CPU的LCD显示温度控制器设计
一,实验目的和要求
1,Proteus软件的MCS51单片机仿真学习
2,根据提供的参考工程,在proteus平台自己重新设计实验电路所需要的电器原理图,并在此基础上编写相对应的程序,实现其功能,学习proteus软件的使用,其中包括原理图器件的选取,原理图的电气连接,程序的编写编译以及运行,并能查出其错误等。
基本要求:
用热敏电阻或温度传感器作温度探头,通过AD转换器变换,把温度数据转换成BCD码在LCD上显示。
显示精度±0。
5℃
能记录和回放温度参数,记录间隔可任意设定(1S到1h,步长1s)
回放数据速度可设定
画出温度变化曲线。
发挥部分:
1显示精度提高到±0。
1℃
2显示精度提高到±0。
01℃
3与实际温度计温度比较,找出温度显示误差曲线,在报告中描出,并分析误差来源4实现温度自动补赏
二,实验仪器
微型计算机
三,实验原理
温度测量通常可以用两种方式来实现,一种是用热敏电阻之类的器件,由于感温效应,热敏电阻的阻值能够随温度变化,当热敏电阻接入电路,测量过它的电流或其两端的电压就会随温度变化发生响应的变化,在将温度变化的电压或电流采集过来,进行A/D转化后,发送到单片机进行处理,通过显示电路,就可以将被测温度显示出来。
这种设计需要用到A/D转换电路,其测温电路比较麻烦。
第二种方法是用温度传感器芯片。
温度传感器芯片能把温度信号转换成数字信号,直接发送给单片机,转换后通过显示电路既可以显示。
四,基本原件及其原理
单片机微型计算机简称单片机,是指在一块芯片体上集成了中央处理器CPU、随机存储器RAM、程序存储器ROM或EPROM、定时器/计数器、中断控制器以及串行和并行I/O接口等部件,构成一个完整的微型计算机。
目前,新型单片机内还有A/D及D/A转换器、高速输入/输出部件、DMA通道、浮点运算等特殊功能部件。
由于它的结构和指令功能都是按工业控制设计要求设计的,特别适用于工业控制及其数据处理场合,因此,确切的称谓是微控制器,单片机只是习惯称呼。
51单片机引脚图如下:
(1)单片机的特点
1)有优异的性能价值比。
2)集成度高、体积小、有很高的可靠性。
单片机把各个功能部件集成在一块芯片上,内部采用总线结构,减少了各芯片之间的连线,大大提高了单片机的可靠性与抗干扰能力。
另外,其体积小,对于强磁场环境易于采取措施,适合于恶劣环境下工作;也易于产品化。
3)控制功能强。
为了满足工业控制的要求,一般单片机的指令系统中均有及其丰富的转移指令、I/O口逻辑操作及位处理指令。
一般来说,单片机的逻辑控制功能及运行速度高于同意档次的微机。
4)单片机的系统扩展和系统配置都比较典型、规范,而且非常容易构成各种规模的应用系统。
(2)单片机并行I/O接口的扩展
单片机与外部交换信息是通过I/O接口电路来实现的。
AT89C51单片机本身有4个8位的并行I/O口P0-P3,但实际使用时往往再增加些I/O口,以便与外部设备交换数据。
AT89C51单片机外部RAM和扩展I/O接口是统一编址的。
用户可以把外部64KBRAM空间的一部分作为扩展I/O接口地址空间,每一个I/O接口相当于一个RAM存储单元,访问外部RAM存储单元就像访问外部I/O接口,即用“MOVX”指令对扩展I/O接口进行输入输出操作。
查询式键盘的接口电路
查询式键盘属于独立式键盘,键盘的各个按键之间彼此是独立的且是最简单的键盘电路。
每个键地接入一根数据输入线。
如图所示。
注意:
由于每一个按键均需要一根I/O口线,当键盘按键数量比较多时,需要的I/O口线也较多,因此独立式键盘只适合于按键较少的应用场合。
一般情况下,按键数等于占用I/O端口数。
查询式键盘的结构图如图所示:
P1.0
P1.1
查询式键盘的接口电路
查询式键盘可以工作在多种方式下,中断方式、程序查询方式、定时查询发送和中断查询方式。
在中断模式下,按键的数量受到外部中断源的限制。
在有特殊需要的场合,还可以借用内部的定时器中断。
所以在这种模式下,按键的数目小于外部中断源和单片机定时器数量之和。
程序查询和定时查询类似,都是通过读I/O状态,当有键被按下时相应的I/O口线变为低电平,而未被按下的键对应的I/O口线保持为高电平,这样通过读I/O口状态可判断是否有键按下和哪一个键被按下。
1602LCD的基本参数及引脚功能
1602lcd分为带背光和不带背光两种,其控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别。
LM016L结构图
温度传感器及其原理
温度传感器是一种将温度变化转换为电量变化装置。
将温度变化转换为热电势变化的称热电偶传感器。
将温度变化转换为电阻变化的称为热电阻传感器;金属热电阻式传感器简称为热电阻,半导体热电阻式传感器简称为热敏电阻。
温度传感在工业生产、科学研究、民用生活等许多领域得到广泛应用。
电阻式传感器广泛被用于-200~960℃范围内的温度。
是利用导体或半导体的电阻随温度变化而变化的性质而工作的,用仪表测量出热电阻的阻值变化,从而得到与电阻值对应的温度值。
电阻式传感器分为金属热电阻传感器和半导体热电阻传感器两大类。
前者称为热电阻,后者称为热敏电阻。
对于热敏电阻,需要了解以下几点:
(1)测温原理及特性
NTC热敏电阻研制的较早,也较成熟。
最常见的是由金属氧化物组成。
根据不同的用途,NTC又可以分为两大类。
第一类用于测量温度。
它的电阻值与温度之间呈负的指数关系。
第二类为负的突变型,当其温度上升到某设定值时,其电阻值突然下降,多用于各种电子电路中抑制浪涌电流,起保护作用。
典型的PTC热敏电阻通常是在钛酸钡陶瓷中加入施主杂质以增大电阻温度系数。
(2)热敏电阻的应用
热敏电阻具有尺寸小、响应速度快、阻值大、灵敏度高等特点,因此它在许多领域被广泛应用。
(3)热敏电阻的温度补偿
热敏电阻可以在一定的温度范围内对某些元件进行温度补偿。
热敏电阻可以用于温度控制:
DS18B20温度传感器的作用是将温度经过热敏电阻Rt转换为电压信号。
在本课题中温度范围的计算原理:
首先把A/D转换中电位器旋钮顺时针旋到底,即模拟信号的输入不衰减,选取两个温度状态T1、T2,分别测量出其模拟输出电压V1、V2;根据0809的输入范围在0到5伏,即可计算出温度极限。
0伏时对应的温度TL:
T1-(V1-0)(T2-T1)/(V2-V1)。
5伏时对应的温度TH:
T1-(V1-5)(T2-T1)/(V2-V1)
本实验中近似计算TH为150摄氏度,TL为-50摄氏度。
程序温度的计算原理:
首先用温度范围除以0到256(即每个十六进制数的温度增长率),然后乘以模拟转换的数字量,即得到升高的温度,在和最低温度相加,就可以得到实际的温度值。
其公式为:
TL+AX(TH-TL)/256
TL:
显示的最低温度
TH:
显示的最高温度
AX:
模拟电压所转换的数字量
五,仿真软件的使用
1.Keil软件的使用:
首先正确安装keil软件—>打开keil—>project—>newUvisionproject—>为工程取名字,并选择工程要保存的路径,建议每个工程新建一个文件夹,方便文件管理—>出来一个对话框,是选择芯片的,你根据你的芯片公司和型号来选择就行了,比如:
最常用的at89c52,点atmel,找到at89c52,点OK后会出来一个对话框,问你是否添加启动文件,点“是”—>这样就建好了一个工程,点File菜单下New新建文件—>先保存文件,点保存按钮后出来路径框,取名字后缀是.c或者.h,点保存—>接下来在左边project下把Target1点开,在SourceGroup1上右键,点击AddFiletoGroup'SourceGroup1'—>在弹出的框中点刚刚保存的文件,然后点Add,关闭对话框,左边project框中可以看到文件已经添加—>在开始之前还是先来配置一下keil环境,点击工具栏品字图标左边像魔棒一样的按钮—>接下来的配置比较复杂,我用图来解释,Target项目下只改一个晶振的值,Output下要点击生产HEX文件,Debug下左边是keil仿真调试配置,右边是程序下载到芯片调试配置,看你是怎么用了。
—>一切完工,可以编程调试了。
2.proteus软件的使用:
新建文件,查找元件,并添加。
画好电路图后,添加用keil生成的hex文件,即可运行。
六,实验数据
实验原理图:
四张图分别代表:
实验连接图(无键盘),实验连接图(有键盘),温度记录控制图1,温度记录控制图2。
1.实验连接图(无键盘)
2.实验连接图(有键盘)
3.温度记录控制图1。
4.温度记录控制图2。
置存储取首址;显示缓冲区首址(对应字形码);置串行输出口即RXD,置时钟输出口即TXD;存入显示数据。
表头地址;查表指令;段码地址指针,显示段码字节数;输出子程序;取段码;段码左移则输出一位段码然后发送脉冲一位。
显示程序流程图
LCD显示器流程图如图所示:
YN
(显示子程序)
(写数据子程序)(写命令子程序)
A/D转换子程序设计
显示缓冲器存放0AH,0DH,-,0XH,0XH;串行静态显示“AD–XX”XX表示0~F;A/D地址清零,启动A/D转换器,延时等待转换结果然后读入结果送入数码管显示。
累加器内容存入B中,A的内容高四位与低四位交换,A的内容高四位清零,A/D转换结果高位送入DBUF3中,取出A/D转换后的结果,A的内容高四位清零则结果低位送入DBF4中;串行静态显示“AD–XX”。
静态显示子程序;显示表头地址;取段码到TEMP中去显示段码地址指针读出段码字节数;移位次数取段码;段码左移;输出一位段码;发送一个一位脉冲。
A/D转换流程图
A/D转换流程图如图所示:
查询式键盘程序设计
先初始化地址参数,显示缓冲区初始;输入前,锁存器置“1”;读取键盘状况;有键按下,若无键按下返回;延时去抖动;确有键按下则从键表中取键值然后相比较,若相等则等键释放,延时去抖动得键码;若不相等,到继续访问键值表,键值不在键值中,即多键同时按下;然后键表值静态显示。
查询式键盘流程图
查询式键盘流程图如图所示:
温度传感器设计
温度传感器的程序设计
输入A/D端口地址;显示温度,将正负值区分显示;显示“–”号时求补码;显示“”时存入显示内容,读入结果,计算温度。
其公式为:
TL+AX(TH-TL)/256(TL:
显示的最低温度TH:
显示的最高温度AX:
模拟电压所转换的数字量)
温度检测的流程图:
温度检测流程图如图所示:
温度控制系统的总流程图如图所示:
实验程序C语言代码
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetab2[]="Temprature:
";
ucharcodetab3[]="";
sbitDQ=P3^7;//定义DS18B20数据端口
charcodetab[4][4]={{1,4,7,10},{2,5,8,0},{3,6,9,11},{12,13,14,15}};
uchara,miao,shi,fen,tt,key1n,key3n,key2n,nian,yue,r,nianb,speak,wendu,wendu1,wendu3,miao1,shu,shu1,wendu4;
unsignedcharcodedotcode[167]={0,6,12,19,25,31,37,44,50,56,62,69,75,81,87,94};
sbitrs=P3^1;sbitrw=P3^2;sbiten=P3^3;//定义1602端口
#defineyh0x80//第一行的初始位置
#defineer0x80+0x40//第二行初始位置
sfrDBPort=0x80;
unsignedchartt,tt1;
unsignedchart[2],*pt;
voiddelay(uintz)
{uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--)
}
//定义DQ引脚为P3.7
/*ds18b20延迟子函数(晶振12MHz)*/
voiddelay_18B20(unsignedinti)
{while(i--);
}
/*ds18b20初始化函数*/
voidInit_DS18B20(void)
{
unsignedcharx=0;
DQ=1;//DQ复位
delay_18B20(8);//稍做延时
DQ=0;//单片机将DQ拉低
delay_18B20(80);//精确延时大于480us
DQ=1;//拉高总线
delay_18B20(14);
x=DQ;//稍做延时后如果x=0则初始化成功x=1则初始化失败
delay_18B20(20);
}
/*ds18b20读一个字节*/
unsignedcharReadOneChar(void)
{unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(4);
}
return(dat);
}
/*ds18b20写一个字节*/
voidWriteOneChar(unsignedchardat)
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay_18B20(5);
DQ=1;
dat>>=1;
}
}
/*读取ds18b20当前温度*/
unsignedchar*ReadTemperature()
{
unsignedchartt[2];
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x4E);////写入"写暂存器"命令,修改TH和TL和分辩率配置寄存器
//先写TH,再写TL,最后写配置寄存器
WriteOneChar(100);//写入想设定的温度报警上限
WriteOneChar(4);//写入想设定的温度报警下限
WriteOneChar(0x7f);//写配置寄存器,格式为0R1R01,1111
//R1R0=00分辨率娄9位,R1R0=11分辨率为12位
delay_18B20(80);//thismessageisweryimportant
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
delay_18B20(80);//thismessageisweryimportant
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度
delay_18B20(80);
tt[0]=ReadOneChar();//读取温度值低位
tt[1]=ReadOneChar();
return(tt);
}
voidcovert1(void)//将温度转换为LCD显示的数据
{
unsignedcharTH=110,TL=-20;
unsignedcharx=0x00,y=0x00;
pt=ReadTemperature();
t[0]=*pt;pt++;t[1]=*pt;
if(t[1]>0x07)//判断正负温度
{wendu3=1;//0x2d为"-"的ASCII码
t[1]=~t[1];/*下面几句把负数的补码*/
t[0]=~t[0];/*换算成绝对值*/
x=t[0]+1;
t[0]=x;
if(x>255)
t[1]++;
}
elsewendu3=0;//0xfe为变"+"的ASCII码
t[1]<<=4;//将高字节左移4位
t[1]=t[1]&0x70;//取出高字节的3个有效数字位
x=t[0];//将t[0]暂存到X,因为取小数部分还要用到它
x>>=4;//右移4位
x=x&0x0f;//和前面两句就是取出t[0]的高四位
x=t[1]|x;//将高低字节的有效值的整数部分拼成一个字节
wendu=x;
t[0]=t[0]&0x0f;//取有效的两位小数
x=t[0];
wendu1=dotcode[x];//分离出百分位
}
unsignedcharLCD_Wait(void)
{rs=0;
rw=1;delay
(1);
en=1;delay
(1);
//while(DBPort&0x80);//在用Proteus仿真时,注意用屏蔽此语句,在调用GotoXY()时,会进入死循环,
//可能在写该控制字时,该模块没有返回写入完备命令,即DBPort&0x80==0x80
//实际硬件时打开此语句
en=0;
returnDBPort;
}
voidLCD_Write(bitstyle,unsignedcharinput)
{en=0;rs=style;
rw=0;_nop_();
DBPort=input;_nop_();//注意顺序
en=1;_nop_();//注意顺序
en=0;_nop_();
LCD_Wait();
}
voidGotoXY(unsignedcharx,unsignedchary)
{
if(y==0)
LCD_Write(0,0x80|x);
if(y==1)
LCD_Write(0,0x80+0x40+x);
}
//sbits4=P0^3;
ucharnum,count,flag,flag1,flag2,flag3,s1num,j;
voidkeyscan();
write_1602com(ucharcom)//液晶写入指令函数
{en=0;
rs=0;//置为写入命令
rw=0;_nop_();P0=com;//送入数据
_nop_();
en=1;//拉高使能端
_nop_();
en=0;//完成高脉冲
_nop_();LCD_Wait();
}
write_1602dat(uchardat)
{en=0;
rs=1;//置为写入数据
rw=0;_nop_();P0=dat;//送入数据
_nop_();
en=1;_nop_();en=0;
_nop_();
LCD_Wait();
}
voidwrite_sfm(ucharadd,uchardat)//写时分秒
{uchargw,sw;
gw=dat%10;
sw=dat/10;
write_1602com(add+er);
write_1602dat(0x30+sw);
write_1602dat(0x30+gw);
}
voidwrite_nyr(ucharadd,uchardat)//写时分秒
{uchargw,sw;
gw=dat%10;
sw=dat/10;
write_1602com(add+yh);
write_1602dat(0x30+sw);
write_1602dat(0x30+gw);
}
voidwrite(ucharadd)//写时分秒
{write_1602com(add+yh);
write_1602dat(58);
}
voidinit()
{write_1602com(0x38);//设置液晶工作模式
write_1602com(0x0c);//开显示不显示光标
write_1602com(0x06);//整屏不移动,指针加一
write_1602com(0x01);
write_1602com(yh);//字符写入的位置
for(a=0;a<16;a++)
{write_1602dat(tab3[a]);
//delay(3);
}
write_1602com(er+2);
for(a=0;a<16;a++)
{
write_1602dat(tab2[a]);
//delay(3);
}
}
keys()
{unsignedcharhang,lie,key;
if(P3!
=0x0f)
delay(5);
if(P3!
=0x0f)
{switch(P3&0x0f)
{case0x0e:
lie=0;break;
case0x0d:
lie=1;break;
case0x0b:
lie=2;break;
case7:
lie=3;break;
}
P3=0xf0;
P3=0xf0;
switch(P3&0xf0)
{case0xe0:
hang=0;break;
case0xd0:
hang=1;break;
case0xb0:
hang=2;break;
case0x70:
hang=3;break;
}
P3=0x0f;
while(P3!
=0x0f)
P1_1=1;
P1_1=0;key=tab[hang][lie];
else
key=20;
speak=0;
return(key);
}
charkbscan()//键盘扫描
{intkey;key=keys();
if(key==10)
{key1n++;
if(key1n==6)
key1n=0;
}
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)
{
case1:
TR1=0;//关闭定时器
//TR1=0;
write_16
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 设计 报告 基于 单片 CPU LCD 显示 温度 控制器 DOC