单片机时钟温度实训报告.docx
《单片机时钟温度实训报告.docx》由会员分享,可在线阅读,更多相关《单片机时钟温度实训报告.docx(17页珍藏版)》请在冰豆网上搜索。
单片机时钟温度实训报告
∙
单片机实训报告
系别:
电气信息工程学院
姓名:
胡猛
专业:
电气自动化1133
绪论
计算机的产生加快了人类改造世界的步伐,但是它毕竟体积大。
单片机在这种情况下诞生了。
截止今日,单片机应用技术飞速发展,纵观我们现在生活的各个领域,从导弹的导航装置,到飞机上各种仪表的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据处理,以及我们生活中广泛使用的各种智能IC卡、电子宠物等,这些都离不开单片机。
单片计算机即单片微型计算机。
(Single-ChipMicrocomputer),是集CPU,RAM,ROM,定时,计数和多种接口于一体的微控制器。
它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。
而51系列单片机是各单片机中最为典型和最有代表性的一种。
这次毕业设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。
二、实训任务
1.在Proteus环境下建立原理图。
2.在Keil环境下编写程序实现电子钟和温度显示。
3.系统功能要求:
(1)使用四位LED数码管显示器实现小时、分钟显示,小时和分钟之间用小数点隔开,秒的显示利用最后一位数字的小数点代表秒。
小时调整使用按键K1实现,分钟调整使用按键K2实现。
当K3按下时显示DS18B20所测温度。
其他附加功能不限。
(2)扩展功能:
在完成功能
(1)的基础上可利用蜂鸣器实现整点报时,超温报警等功能。
4.焊接电路板,完成硬件电路的焊接烧写程序,完成系统功能要求。
硬件元件清单:
显示原理
硬件介绍
PDIP封装的AT89C52引脚图
AT89C52为8位通用微处理器,采用工业标
准的C51内核,在内部功能及管脚排布上与通用的8xc52相同,其主要用于会聚调整时的功能控制。
功能包括对会聚主IC内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。
主要管脚有:
XTAL1(19脚)和XTAL2(18脚)为振荡器输入输出端口,外接12MHz晶振。
RST/Vpd(9脚)为复位输入端口,外接电阻电容组成的复位电路。
VCC(40脚)和VSS(20脚)为供电端口,分别接+5V电源的正负端。
P0~P3为可编程通用I/O脚,其功能用途由软件定义,在本设计中,P0端口(32~39脚)被定义为N1功能控制端口,分别与N1的相应功能管脚相连接,13脚定义为IR输入端,10脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,12脚、27脚及28脚定义为握手信号功能端口,连接主板CPU的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。
1、兼容MCS51指令系统
2、8kB可反复擦写(大于1000次)FlashROM;
3、32个双向I/O口;
4、256x8bit内部RAM;
5、3个16位可编程定时/计数器中断;
6、时钟频率0-24MHz;
7、2个串行中断,可编程UART串行通道;
8、2个外部中断源,共8个中断源;
9、2个读写中断口线,3级加密位;
10、低功耗空闲和掉电模式,软件设置睡眠和唤醒功能;
温度显示
DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢
封装式,型号多种多样,有LTM8877,LTM8874等等。
主要根据应用场合的不同而改变其外观。
封装后的DS18B20可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。
耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。
1:
技术性能描述
①、独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
②、测温范围-55℃~+125℃,固有测温误差(注意,不是分辨率,这里之前是错误的)0.5℃。
③、支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联8个,实现多点测温,如果数量过多,会使供电电源电压过低,从而造成信号传输的不稳定。
④、工作电源:
3~5V/DC(可以数据线寄生电源)
⑤、在使用中不需要任何外围元件
⑥、测量结果以9~12位数字量方式串行传送
⑦、不锈钢保护管直径Φ6
⑧、适用于DN15~25,DN40~DN250各种介质工业管道和狭小空间设备测温
⑨、标准安装螺纹M10X1,M12X1.5,G1/2”任选
数码管
原理图
实物图
数码管是一种半导体发光器件,其基本单元是发光二极管,是单片机系统中最常用的一种显示输出,主要用于单片机控制中的数据输出和状态信息显示。
数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。
共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。
共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。
当某一字段的阴极为高电平时,相应字段就不亮。
。
共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。
共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。
当某一字段的阳极为低电平时,相应字段就不亮。
仿真图:
三、软件设计
1.主程序流程图
图1主程序流程图
图2.1s中断服务子程序流程图
2.电子时钟:
利用定时器T0实现1s定时,T0设置为方式1,时间50ms,利用软件计数20次,实现1s定时。
中断服务子程序流程图如图2
参考以上流程图编写程序。
使用Proteus和Keil仿真。
使用定时器中断T0实现。
图3.显示子程序流程图图4.按键扫描子程序流程图
3.显示子程序流程图:
参考以上流程图3,编写显示时间的子程序或函数。
小时和分钟之间利用显示器的小数点隔开,秒的显示用显示器最后一位的小数点来表示,1秒闪一次。
使用Proteus和Keil仿真调试。
4.按键扫描子程序功能:
扫描按键K1、K2和K3,当K1按下时,小时加1,当K2按下时分钟加1,使用K3实现,时间/温度切换显示。
按以下流程图4编写程序。
4.焊接电路板,完成硬件电路的焊接烧写程序,完成系统功能要求。
硬件元件清单:
名称
引脚
数量
名称
引脚
数量
瓷片电容
2
2
蜂鸣器
2
1
电解电容
2
1
电阻
2
25
4位共阳LED数码管
12
1
温度传感器
3
1
按键
4
4
AT89C51
40
1
晶体振荡器
2
1
松香
1盒
导线
1段
40针管座
2
焊锡
1段
程序:
#include
#include<18b20.h>
#defineuintunsignedint
#defineucharunsignedchar
sbitk1=P1^0;
sbitk2=P1^1;
sbitk3=P1^2;
sbitbeep=P3^6;
ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
ucharcodewei1[]={0x01,0x02,0x04,0x08,0x10,0x20};
ucharshi=0,fen=0,miao=0,count=0;
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidbuzz()
{uinti;
if((fen==59)&&(miao>51))
{beep=~beep;
for(i=0;i<50;i++);
}
}
voiddisplaytime()
{
P2=wei1[0];
P0=table[shi/10];
delay(5);
P2=wei1[1];
P0=table[shi%10];
delay(5);
P2=wei1[2];
P0=table[fen/10];
delay(5);
P2=wei1[3];
P0=table[fen%10];
delay(5);
P2=wei1[4];
P0=table[miao/10];
delay(5);
P2=wei1[5];
P0=table[miao%10];
delay(5);
}
voidkeyscan()
{
if(k1==0)//调分钟
{delay(5);
if(k1==0)
{
fen++;
while(!
k1);
if(fen==60)
fen=0;
}
}
if(k2==0)//调小时
{
delay(5);
if(k2==0)
{shi++;
while(!
k2);
if(shi==12)
shi=0;
}
}
}
voidmain()
{
TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;
EA=1;
ET0=1;
TR0=1;
ET1=1;
TR1=1;
while
(1)
{
keyscan();
}
}
voidt0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==10)
{count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
}
if(fen==60)
{
fen=0;
shi++;
}
if(shi==12)
{
shi=0;
fen=0;
miao=0;
}
}
}
voidt1()interrupt3
{
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;
if(k3==1)
{
delay(5);
if(k3==1)
{
displaytime();
buzz();
}
}
else
{ds1820rst();//初始化显示
read_temp();//读取温度
ds1820disp();//显示
}
}
#defineuintunsignedint
#defineucharunsignedchar
sbitDQ=P3^0;//ds18b20与单片机连接口
unsignedcharcodestr[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共yang数码管字码表
unsignedcharcodestr1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//个位带小数点字码表
unsignedcharcodewei[]={0x01,0x02,0x04,0x08,0x10,0x20};
unsignedchardatadisdata[4];
unsignedinttvalue;//温度值
unsignedchartflag;//温度正负标志
/******************************ds1820程序***************************************/
voiddelay_18B20(unsignedinti)//延时1微秒
{
while(i--);
}
voidds1820rst()/*ds1820复位*/
{unsignedcharx=0;
DQ=1;//DQ复位
delay_18B20(4);//延时
DQ=0;//DQ拉低
delay_18B20(100);//精确延时大于480us
DQ=1;//拉高
delay_18B20(40);
}
unsignedchards1820rd()/*读数据*/
{unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
voidds1820wr(ucharwdata)/*写数据*/
{uchari=0;
for(i=8;i>0;i--)
{DQ=0;
DQ=wdata&0x01;
delay_18B20(10);
DQ=1;
wdata>>=1;
}
}
read_temp()/*读取温度值并转换*/
{uchara,b;
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0x44);//*启动温度转换*/
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else
{tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
return(tvalue);
}
/*******************************************************************/
voidds1820disp()//温度值显示
{ucharflagdat;
uchari;
disdata[0]=tvalue/1000;//位数
disdata[1]=tvalue%1000/100;//十位数
disdata[2]=tvalue%100/10;//ge
disdata[3]=tvalue%10;//小数位
if(tflag==0)
flagdat=0x20;//正温度不显示符号
else
flagdat=0x2d;//负温度显示负号:
-
for(i=0;i<150;i++)
{
P2=wei[0];
P0=str[disdata[0]];
delay_18B20(60);
P2=wei[1];
P0=str[disdata[1]];
delay_18B20(60);
P2=wei[2];
P0=str1[disdata[2]];
delay_18B20(60);
P2=wei[3];
P0=str[disdata[3]];
delay_18B20(60);
P2=wei[4];
P0=0x9c;
delay_18B20(60);
P2=wei[5];
P0=0xc6;
delay_18B20(60);
}
}