单片机课设Word文档下载推荐.docx
《单片机课设Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《单片机课设Word文档下载推荐.docx(29页珍藏版)》请在冰点文库上搜索。
在0—100摄氏度时,最大线形偏差小于1摄氏度。
DS18B20的最大特点之一采用了单总线的数据传输,由数字温度计DS18B20和微控制器AT89S51构成的温度测量装置,它直接输出温度的数字信号,可直接与计算机连接。
这样,测温系统的结构就比较简单,体积也不大。
采用51单片机控制,软件编程的自由度大,可通过编程实现各种各样的算术算法和逻辑控制,而且体积小,硬件实现简单,安装方便。
既可以单独对多DS18B20控制工作,还可以与PC机通信上传数据,另外AT89S51在工业控制上也有着广泛的应用,编程技术及外围功能电路的配合使用都很成熟。
该系统利用AT89S51芯片控制温度传感器DS18B20进行实时温度检测并显示,能够实现快速测量环境温度,并可以根据需要设定上下限报警温度。
该系统扩展性非常强,它可以在设计中加入时钟芯片DS1302以获取时间数据,在数据处理同时显示时间,并可以利用AT24C16芯片作为存储器件,以此来对某些时间点的温度数据进行存储,利用键盘来进行调时和温度查询,获得的数据可以通过MAX232芯片与计算机的RS232接口进行串口通信,方便的采集和整理时间温度数据。
5、方案说明
5.1系统设计原理
利用温度传感器DS18B20可以直接读取被测温度值,进行转换的特性,模拟温度值经过DS18B20处理后转换为数字值,然后送到单片机中进行数据处理,并与设置的温度报警限比较,超过限度后通过扬声器报警。
同时处理后的数据送到LED中显示。
5.2系统组成
本课题以是80C51单片机为核心设计的一种数字温度控制系统,系统整体硬件电路包括,传感器数据采集电路,温度显示电路,上下限报警调整电路,单片机主板电路等组成。
5.2.1系统框图
系统框图主要由主控制器、单片机复位、报警按键设置、时钟振荡、LED显示、温度传感器组成。
5.2.2主控制器
单片机AT89C51具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。
5.2.3显示电路
显示电路采用LED液晶显示数码管,从P3口RXD,TXD串口输出段码。
显示电路是使用的串口显示,这种显示最大的优点就是使用口资源比较少,只用p3口的RXD,和TXD,串口的发送和接收,四只数码管采用74LS164右移寄存器驱动,显示比较清晰。
5.2.4温度传感器
温度传感器采用美国DALLAS半导体公司生产的DS18B20温度传感器。
DS18B20输出信号全数字化。
便于单片机处理及控制,在0—100摄氏度时,最大线形偏差小于1摄氏度,采用单总线的数据传输,可直接与计算机连接。
用AT89S51芯片控制温度传感器DS18B20进行实时温度检测并显示,能够实现快速测量环境温度,并可以根据需要设定上下限报警温度。
获得的数据可以通过MAX232芯片与计算机的RS232接口进行串口通信,方便的采集和整理时间温度数据。
5.3DS18B20温度传感器与单片机的接口电路
DS18B20可以采用两种方式供电,一种是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。
另一种是寄生电源供电方式,如图所示单片机端口接单线总线,为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个MOSFET管来完成对总线的上拉。
当DS18B20处于写存储器操作和温度A/D转换操作时,总线上必须有强的上拉,上拉开启时间最大为10us。
采用寄生电源供电方式时VDD端接地。
由于单线制只有一根线,因此发送接口必须是三态的。
6.硬件设计方案
6.180C51单片机介绍
80C51有40个引脚,4个8位并行I/O口,1个全双工异步串行口,同时内含5个中断源,2个优先级,2个16位定时/计数器。
80C51的存储器系统由4K的程序存储器(掩膜ROM),和128B的数据存储器(RAM)组成。
具体如下:
1.一个8位的微处理器(CPU)。
2.片内数据存储器RAM(128B),用以存放可以读/写的数据,如运算的中间结果、最终结果以及欲显示的数据等,SST89系列单片机最多提供1K的RAM。
3.片内程序存储器ROM(4KB),用以存放程序、一些原始数据和表格。
但也有一些单片机内部不带ROM/EPROM,如8031,8032,80C31等。
目前单片机的发展趋势是将RAM和ROM都集成在单片机里面,这样既方便了用户进行设计又提高了系统的抗干扰性。
SST公司推出的89系列单片机分别集成了16K、32K、64KFlash存储器,可供用户根据需要选用。
4.四个8位并行I/O接口P0~P3,每个口既可以用作输入,也可以用作输出。
5.两个定时器/计数器,每个定时器/计数器都可以设置成计数方式,用以对外部事件进行计数,也可以设置成定时方式,并可以根据计数或定时的结果实现计算机控制。
为方便设计串行通信,目前的52系列单片机都会提供3个16位定时器/计数器。
6.五个中断源的中断控制系统。
现在新推出的单片机都不只5个中断源,例如SST89E58RD就有9个中断源。
7.一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单机与微机之间的串行通信。
8.片内振荡器和时钟产生电路,但石英晶体和微调电容需要外接。
最高允许振荡频率为12MHz。
SST89V58RD最高允许振荡频率达40MHz,因而大大的提高了指令的执行速度。
6.280C51单片机引脚图
6.3芯片DS18B20的主要特性
(1)适应电压范围更宽,电压范围:
3.0~5.5V,在寄生电源方式下可由数据线供电
(2)独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理与DS18B20的双向通讯
(3)DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温
(4)DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内
(5)温范围-55℃~+125℃,在-10~+85℃时精度为±
0.5℃
(6)可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可以实现高精度测温。
(7)在9位分辨率最多在93.75ms把温度转换成数字,12位分辨率是最多可在750ms内将温度转换成数字,速度更快。
(8)温度测试结果直接转换成数字温度信号,以“一线总线”串行传输给CPU,同事科传送SRC检验码,菊友极强的抗干扰校正能力。
(9)负压特性:
电源极性接反时芯片不会因发热而烧毁,但不会正常工作。
6.4液晶显示器1602LCD的说明
6.4.1接口信号说明:
编号
符号
引脚说明
1
VSS
电源地
9
D2
DataI/0
2
VDD
电源正极
10
D3
3
VL
液晶显示偏压信号
11
D4
4
RS
数据/命令选择端
12
D5
5
R/W
读/写选择端
13
D6
6
E
使能信号
14
D7
7
D0
15
BLA
背光级正极
8
D1
16
BLK
背光级负极
6.4.2控制命令表
序号
指令
清显示
光标返回
*
置输入模式
I/D
S
显示开/关控制
D
C
B
光标或字符移位
S/C
R/L
置功能
DL
N
F
置字符发生存贮器地址
字符发生存贮器地址
置数据存贮器地址
显示数据存贮器地址
读忙标志或地址
BF
计数器地址
写数到CGRAM或DDRAM)
要写的数据内容
从CGRAM或DDRAM读数
读出的数据内容
6.4.3液晶显示简介
液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。
要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,下图是1602的内部显址。
⒈液晶显示原理
液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。
液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。
⒉字符的显示
用LCD显示一个字符时比较复杂,因为一个字符由6×
8或8×
8点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为“1”,其它的为“0”,为“1”的点亮,为“0”的不亮。
这样一来就组成某个字符。
但由于内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显示的行列号及每行的列数找出显示RAM对应的地址,设立光标,在此送上该字符对应的代码即可。
7.软件设计方案
7.1程序流程图
7.2读出温度子程序
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。
如下左图所示。
7.3温度转换命令子程序
温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。
如上右图所示。
7.4计算温度子程序
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,如下:
1所示。
图1:
图2:
7.5显示数据刷新子程序
显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高显示位为0时将符号显示位移入下一位。
如上图2所示。
8.附录
8.1程序清单
#include<
AT89X51.H>
intrins.h>
#include<
absacc.h>
#defineuintunsignedint
#defineuncharunsignedchar
unchartempl,temph,i,y,z,n;
unchara,b;
//LCD的变量
uncharsign=0;
//标志变量
bitk;
//判断正负变量
sbitdq=P3^5;
sbitrs=P2^0;
//LCD显示的定义取值
sbitrw=P2^1;
sbite=P2^2;
sbitbf=P0^7;
sbitDQ=P2^5;
//键盘定义
sbitread=P3^0;
sbitincH=P3^2;
sbitdesH=P3^3;
sbitreset=P3^4;
//蜂鸣器
sbitBUZZER=P2^6;
floatt4,t5,t6,t7,tt;
//温度转换的变量
uinttp;
unchartemperature,Htemp,Ltemp;
uncharD1,D2,D3;
uintD4,D5,D6,D9,D7,D8;
uncharcodedis1[]={"
0123456789"
};
uncharcodedis2[]={"
temp:
"
uncharcodedis3[]={"
WARN"
uncharcodedis4[]={"
Htemp:
uncharcodedis5[]={"
working"
uncharcodedis6[]={"
Ltemp:
bitflag_1820_1;
bitflag_1820_2;
voiddelay_ms(unsignedchartime);
voidledshow(void);
voidkeypress(void);
voidinit(void);
voidgettemp();
voidinit1820(void);
voidwrite1820(unchar);
unsignedcharread1820(void);
voiddelay_us(unchar);
voiddelay3(unchar);
/*延时*/
voiddelay(uintt)
{uinti;
while(t--)
{for(i=0;
i<
125;
i++)
{}
}
}
//LCD显示函数
voiddelay1(unchartime)
{uncharn;
n=0;
while(n<
time)
{n++;
return;
voiddelay3(uncharx)
{for(y=x;
y>
0;
y--)
for(z=x;
z>
z--);
}unchartestBF()
{bitresult;
rs=0;
rw=1;
e=1;
_nop_();
_nop_();
result=bf;
e=0;
returnresult;
voidwritecmd(uncharZL)
{while(testBF()==1);
rw=0;
P0=ZL;
e=0;
voidpos(uncharpos)
{writecmd(pos|0x80);
voidwritedate(unchardate)
{while(testBF()==1);
rs=1;
P0=date;
voidinit()
{delay3(20);
writecmd(0x38);
delay3(30);
writecmd(0x0d);
writecmd(0x06);
writecmd(0x01);
//键盘程序
//主程序
voidmain(void)
{
TMOD=0x01;
TH0=50000/256;
TL0=50000%256;
Htemp=124;
Ltemp=-24;
P3=0xFF;
init();
if(sign==0)
{EA=1;
TR0=1;
ET0=1;
EX0=0;
//关闭外部中断0
EX1=0;
//关闭外部中断1
while
(1)
{
if(read==0)
delay3(2000);
{sign++;
if(sign==1)
BUZZER=1;
//关闭蜂鸣器
EX0=1;
//开启外部中断0
EX1=1;
//开启外部中断1
pos(0);
for(i=0;
6;
)
{writedate(dis4[i]);
i++;
D6=Htemp%10;
D7=Htemp%100/10;
D8=Htemp/100;
pos(0x6);
writedate(dis1[D8]);
writedate(dis1[D7]);
if(sign==2)
{BUZZER=1;
EX0=1;
{writedate(dis6[i]);
}
D6=Htemp%10;
writedate(dis1[D6]);
if(sign>
2)
{sign=0;
//中断程序
voidint0(void)interrupt0
//关外部中断0
if(desH==0&
&
sign==1)
Htemp--;
if(Htemp<
Ltemp)
Htemp=Ltemp;
elseif(desH==0&
sign==2)
Ltemp--;
/*****外部中断1服务程序*****/
voidint1(void)interrupt2
//关外部中断1
if(incH==0&
Htemp++;
elseif(incH==0&
Ltemp++;
if(Ltemp>
Htemp)
Ltemp=Htemp;
}
//定时器T0服务程序
voidisr_t0(void)interrupt1
{TH0=50000/256;
TMOD=0x10;
TH1=50000/256;
TL1=50000%256;
gettemp();
delay(50);
if(tp<
{BUZZER=1;
pos(0x04);
for(i=0;
7;
)
{
writedate(dis5[i]);
i++;
}
pos(0x40);
for(i=0;
5;
{writedate(dis2[i]);
i++;
D1=(unchar)(tp%10);
D2=(unchar)(tp%100/10);
D3=(unchar)(tp/100);
D4=(uint)(tt*10);
D5=((uint)(tt*100))%10;
if(k==1)
{pos(0x46);
writedate('
-'
);
else
writedate();
pos(0x47);
writedate(dis1[D3]);
writedate(dis1[D2]);
writedate(dis1[D1]);
.'
writedate(dis1[D4]);
writedate(dis1[D5]);
writedate(0xdf);
C'
else
{init();
pos(0x04);
4;
{
writedate(dis3[i]);
BUZZER=0;
//DS18B20读取温度
voidgettemp()
{
init1820();
write1820(0xcc);
write1820(0x44);
write1820(0xbe);
templ=read1820();
//低8位(其中的第四位是小数点后的)
temph=read1820();
//高8位(其中前五位是符号值)
z=temph;
//把符号位留下判断正负
k=(bit)(z>
>
7);
if(k==1)//负数就取反加一
{templ=~templ;
templ=templ+1;