单片机实习报告电子时钟以及温度测量系统设计.docx
- 文档编号:14816717
- 上传时间:2023-06-27
- 格式:DOCX
- 页数:27
- 大小:612.96KB
单片机实习报告电子时钟以及温度测量系统设计.docx
《单片机实习报告电子时钟以及温度测量系统设计.docx》由会员分享,可在线阅读,更多相关《单片机实习报告电子时钟以及温度测量系统设计.docx(27页珍藏版)》请在冰点文库上搜索。
单片机实习报告电子时钟以及温度测量系统设计
前言
时钟,自从它创造的那天起,就成为了人类的朋友,但随着时间的推移,科学技术的不断开展,人们对时间计量的精度要求越来越高,应用越来越广。
怎样让时钟更好的为人民效劳,怎样让我们的老朋友焕发青春呢?
这就要求人们不断设计出新型时钟。
现今,高精度的计时工具大多数都使用了石英体振荡器,于电子钟,石英表,石英钟都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调校,数字式电子钟用集成电路计时时,译码代替机械式转动,用LED显示器代替显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时,分,秒显示时间的功能,还可以进展时和分的校对,片选的灵活性好。
本次实习利用单片机实现数字时钟功能的主要内容,其中AT89S52是核心元件同时采用数码管动态显示“时〞,“分〞,“秒〞以及“温度〞的现代计时装置。
与传统机械表相比,它具有走时准确,显示直观等特点。
它的计时周期为24小时,显满刻度为“23时59分59秒〞,另外具有校时功能。
本文主要介绍用单片机内部的定时/计数器来实现电子时钟的方法,本设计由单片机AT89S52芯片和LED数码管为核心,辅以必要的电路,构成了一个单片机电子时钟,并有定时功能。
第一章系统设计
1.1电路组成及工作原理
本次实习数字时钟设计原理主要利用AT89S52单片机,由单片机的P0口控制数码管的段码,P3口控制数码管的位码,P1.0P1.1P1.2三口用于调节时间,具有改变当前时间数值功能。
P1.7口接有发光二极管,该二极管一秒变化一次,刚好与数字时钟的变化一致。
在设计中引入一个电源电路,是外部电源系统产生+5V电压,用于给CPU及显示电路提供工作电压,这是数字时钟正常工作时的电压。
系统工作时,秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度,将标准秒信号送入“秒计数器〞,“秒计数器〞采用60进制计数器,每累计60秒发出一个“分脉冲〞信号,该信号将作为“分计数器〞的时钟脉冲。
该信号将被送到“时计数器〞也采用60进制计数器,每累计到60分钟,发出一个“时脉冲〞信号,该信号将被送到“时计数器〞。
“时计数器〞采用24进制计数器,可实现对一天,24小时的累计。
显示电路将“时〞、“分〞、“秒〞、计数器的输出,通过六个七段LED显示器显示出来。
校时是由P1口控制,由内部设定程序扫描控制。
单片机的特点是体积小、本钱低、功能强、功耗小单片机型号:
本次实习采用的是AT89S52型单片机。
芯片引脚图如下:
芯片引脚解释如下:
MCS-51系类单片机共有40个引脚,有P0、P1、P2、P3口以及控制口线电源及时钟,具体如下所示:
在这次实习中我们采用的内部振荡器方式,将18和19和引脚接晶体振荡器以及电容。
第二章方案论证及程序流程图
ABCDEFGDP由P1口来实现段码的选择,而P3口那么实现了位码的选择。
实习中使用了74LS244芯片来提高单片机的驱动能力,由于单片机P3口的输出时高电平,所以使用了2803反向芯片。
第三章实习要求
1.以MCS-51系列单片机为核心器件,组成一个电子时钟系统。
2.系统显示器由4位LED数码管组成,分别显示时间值的小时和分,以24h〔小时〕计时方式。
3.能够使用按键开关随时对当前时间进展调整。
〔推荐:
键1为功能切换键,键2为移位键,键3为增加键,键4为减少键。
也可自行定义。
〕
4.有精力的学生可以实现闹钟定时功能和上位机时钟显示控制功能。
计算机外用表5V稳压电源面包板
序号
名称
型号
数量
用途
1
面包板
1个
2
连接线
2捆
3
单片机芯片
89S52
1个
控制器
4
晶振
12MHz
1个
时钟电路
5
独石电容
30pF
2个
时钟电路
6
电阻
10K
1个
复位电路
7
电解电容
10uF
1个
复位电路
8
电阻
1个
温度测量
9
74LS32
1个
或门,片选电路
10
DS18B20
1
温度测量
11
LED发光二极管
9个
输出控制电路
12
电阻
200欧姆
17个
9个用于LED发光二极管限流,8个用于数码管限流
13
按键
5个
1个用于复位电路,4个用于按键输入
14
电阻
4个
按键输入限流
15
数码管〔共阴〕
4位一体
2个
显示
16
74LS374
3个
驱动数码管
17
2803
1个
驱动数码管
18
塑料袋
4个
2个大的,2个小的
19
稳压电源
1个
20
编程器
21
万用表
为了实现LED显示器的数字显示,可以采用静态显示法和动态显示法。
由于静态显示法需要数据锁存器等硬件,接口复杂一些。
考虑时钟显示只有4位,且系统没有其他复杂的处理任务,所以决定采用动态扫描法实现LED的显示。
单片机采用易购的AT89S51系列,这样单片机可具有足够的空余硬件资源实现其它的扩大功能。
硬件系统的总体构成框架可以参考下列图〔实际电路请自行设计〕。
3.4系统硬件电路的设计
秒表/时钟计时器的硬件电路可以参考下列图〔实际电路请自行设计〕,采用AT89S52口接三个按钮开关,用以调时功能设置,P1.6口接温度传感器用于温度的测量。
为了提供共阴LED数码管的驱动电压,用74LS244作电源驱动输出。
采用12MHz晶振,有利于提高通信波特率的准确性。
为了提高驱动能力在P0口,P3口和数码管之间要接上74LS244和2803芯片,实习中我开场没有接,发现数码管很暗。
线路设计如下:
注:
74LS244,2803
芯片引脚连线如下
〔1〕主程序
本设计中,计时采用定时器T0中断完成,其余状态循环调用显示子程序,当端口开关按下时,转入相应功能程序。
〔2〕LED显示子程序
数码管显示的数据存放在内存单元disp_buf[0]-disp_buf[7]中。
其中disp_buf[0]-disp_buf[1]存放时数据,disp_buf[2]-disp_buf[3]存放分数据,disp_buf[4]-disp_buf[5]存放秒数据,每一地址单元内均为十进制BCD码。
由于采用软件动态扫描实现数据显示功能,显示用十进制BCD码数据的对应码段存放在ROM表(codevalue[17]中。
显示时,先取出disp_buf[0]-disp_buf[7]中的某一数据,然后查得对应的显示用码段,并从P0口输出,P3口将对应的数码管选中供电,就能显示该地址单元的数据值。
(3)定时器T0中断效劳程序
定时器T0用于时间计时。
中断进入后,时钟计时累计中断达1秒时,对秒计数单元进展加1操作。
在计数单元中采用十进制BCD码计数,满60进位,T0中断效劳程序执行流程见下列图:
第四章实习具体过程
本次实习教师首先向我们讲解了单片机的原理以及KAIL和Protuse软件的使用方法。
为了让我们具体体会这些软件的使用方法,我们先设计了一个最小系统,具体如下:
1.电路连线图:
2.设计思想:
9号引脚接复位系统电路,按钮按下为高电平,系统复位。
18,19号引脚接晶体振荡器以及电容够成内部振荡电路。
我采用P1.7号引脚接发光二极管,可以驱动二极管发光。
3.程序如下:
#include
sbitLED=P1^7;
unsignedcharnum;
main()
{
num=0;
TMOD=01;
TH0=-10000/256;
TL0=-10000%256;
TR0=1;EA=1;
ET0=1;
while
(1);
}
voidtimer()interrupt1
{
TH0=-10000/256;
TL0=-10000%256;
num=num+1;
if(num==100)
{LED=!
LED;
num=0;
}
}
这是这次实习的主要任务,有了上面的根底,我很顺利地把电路图画出,具体电路见下列图。
1.实习中的连线问题:
使用了为了提供共阴LED数码管的驱动电压,用74LS244作电源驱动输出。
由P0口输出驱动数码管的段选择,而P3口的输出接上2803芯片驱动数码管的位选择。
在连线时要注意芯片端口号和引脚号的区别,所以我参考了教师给我们的芯片资料,感觉非常有用,不但帮我们完成了线路图的连接,而且对于我们以后的学习也是非常有用的。
对于数码管的段端口号和位端口号确实定有一定的困难,开场连线时我没有自己确定端口号,而是直接参考王教师连得电路图,感觉非常困难,后来我想到数码管就是由一个一个的二极管组成的,我为什么不用外用表自己来测量呢?
这样既可以完成实验操作,而且还可以提高自己动手解决问题的能力。
弄清原理后我很快确定好了数码管各个端口号对应的芯片引脚。
P1.0,P1.1和P1.2是开关调节按钮,具体功能下面表达,连线比拟简单。
对于这次连线总的来说还是比拟简单的,可能一个看起来很复杂的电路图,如果我们能够弄清楚原理,那么就非常简单。
同样对于我们学习也是这样的,遇到困难不能退缩,如果那样的话,那么也许我们永远不能够解决问题。
我们在大一时学习了C++语言,当时不知道它有什么具体的作用,无非不就是编写一些简单无聊的程序。
通过这次单片机的实习,我充分认识到C语言的强大功能。
现在有点懊悔当初没有好好学习这门语言。
上学期学习单片机根底知识时我们主要是应用汇编语言编写程序,但是对于一些大型复杂的程序,可能汇编语言会很复杂。
如何解决这个问题呢?
实习教师向我们讲解了C51语言的强大功能,让我们到图书馆找一些资料学习一下。
经过两个星期的系统学习,我根本掌握了编程思想和一般的方法。
3.具体的程序如下:
#include
#include
sbitDQ=P1^6;
sbitLED=P1^7;
sbitKEY1=P1^0;
sbitKEY2=P1^1;
sbitKEY3=P1^2;
#definejump_ROM0xcc
#definestart0x44
#defineread_EEROM0xbe
bitsecond_flag;//秒周期控制
bitminute_flag;//分周期控制
unsignedintnum;//10毫秒累加一次
unsignedcharhours,minutes,seconds;//小时分钟秒当前值
unsignedinttemperature;
#defineSEG_PORTP0
#defineBIT_PORTP3
unsignedchardisp_buf[8];
codeunsignedcharcodevalue[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
bitkey_operated;//按键已处理过
unsignedcharstart_time,elaps;
unsignedcharstatus;//状态
voiddelay(unsignedcharN)//N*2us软件延时
{unsignedchari;
i=N;
do
{}while(--i);
}
voiddelay_ms(unsignedcharN)//N*100us软件延时
{unsignedchari,j;
i=N;
j=50;
do
{do
{}while(--j);
}while(--i);
}
unsignedcharreset(void)//18B20复位
{unsignedcharready;
DQ=1;
delay
(1);
DQ=0;
delay(240);//>480us
DQ=1;
delay(30);//大于60us小于75
ready=DQ;
delay(120);//响应周期>300us
return(ready);
}
voidwrite_byte(unsignedchardat)//18B20写字节
{unsignedchari;
EA=0;
for(i=0;i<8;i++)
{DQ=0;
DQ=dat&0x01;//至少隔1us再输出
delay(30);//数据至少保持60us
DQ=1;
dat>>=1;//至少隔1us再输出下一位
}
EA=1;
}
unsignedcharread_byte(void)//18B20读字节
{unsignedchari=0;
unsignedchardat=0;
EA=0;
for(i=0;i<8;i++)
{DQ=0;
dat>>=1;//1us
DQ=1;
if(DQ==1)
dat|=0x80;
delay(30);//大于60us//
}
EA=1;
return(dat);
}
convert_temp()
{reset();
write_byte(jump_ROM);
write_byte(start);
}read_temp()//温度测量子程序
{unsignedcharTMPH,TMPL;
reset();
write_byte(jump_ROM);
write_byte(read_EEROM);
TMPL=read_byte();
TMPH=read_byte();
TMPH=TMPH<<4;
TMPL=TMPL>>4;
temperature=TMPH+TMPL;
if(temperature<128)
{disp_buf[6]=temperature/10;
disp_buf[7]=temperature%10;
}
else
{temperature=256-temperature;
disp_buf[6]=17;
disp_buf[7]=temperature%10;
}
}
init_timer0()//定时器初始化子程序
{TMOD=01;
TH0=-1000/256;
TL0=-1000%256;
TR0=1;
EA=1;
ET0=1;
}
ISR_Timer0()interrupt1//10ms定时中断效劳子程序
{staticunsignedchari=0;
unsignedchartemp;
TH0=-1000/256;
TL0=-1000%256;
num++;
if(num%200==0)
flash_flag=1;
if(num==1000)
{num=0;
second_flag=1;
seconds++;
seconds=seconds%60;
if(seconds==0)minute_flag=1;
}
BIT_PORT=0x00;
SEG_PORT=codevalue[disp_buf[i]];
temp=0x01;
BIT_PORT=temp<
i++;
i=i%8;
}
clock()//时钟运行子程序
{if(minute_flag)
{minute_flag=0;
minutes++;
if(minutes==60)
{minutes=0;
hours++;
if(hours==24)
hours=0;
}
}
disp_buf[0]=hours/10;
disp_buf[1]=hours%10;
disp_buf[2]=minutes/10;
disp_buf[3]=minutes%10;
disp_buf[4]=seconds/10;
disp_buf[5]=seconds%10;
}
unsignedcharscankey()
{unsignedchartemp1,temp2;
staticbitkey_first;//第一次扫描到按键按下
temp1=P1;
temp1=~P1;
temp1&=0x0f;
if(temp1==0)
{key_first=1;
elaps=0;
}
else
{delay_ms(100);
temp2=~P1;
temp2&=0x0f;
if(temp1==temp2)
{if(key_first)
{start_time=seconds;
key_first=0;
key_operated=0;
}
elaps=(seconds+60-start_time)%60;
returntemp1;
}
}
return0;
}
voidmain()
{unsignedcharkeyval;
bitflag=0;
bitflag2=0;
init_timer0();
status=0;
while
(1)
{keyval=scankey();
if((keyval==1)&&(!
key_operated))
{disp_buf[0]=hours/10;
disp_buf[1]=hours%10;
disp_buf[2]=minutes/10;
disp_buf[3]=minutes%10;
disp_buf[4]=seconds/10;
disp_buf[5]=seconds%10;
switch(status)
{case0:
if(elaps>=3){status=1;key_operated=1;}break;
case1:
status=2;key_operated=1;break;
case2:
status=0;key_operated=1;break;
default:
break;
}
}
if(status==0)
clock();
if(second_flag)
{second_flag=0;
flag2=!
flag2;
if(flag2)
read_temp();
else
convert_temp();
LED=!
LED;
}
if((keyval==2)&&((!
key_operated)||elaps%2==1))
{key_operated=1;
if(status==1)
{hours++;
hours=hours%24;
disp_buf[0]=hours/10;
disp_buf[1]=hours%10;
}
if(status==2)
{minutes++;
minutes=minutes%60;
disp_buf[2]=minutes/10;
disp_buf[3]=minutes%10;
}
}
if((keyval==4)&&((!
key_operated)||elaps%2==1))
{key_operated=1;
if(status==1)
{hours+=24;
hours--;
hours=hours%24;
disp_buf[0]=hours/10;
disp_buf[1]=hours%10;
}
if(status==2)
{minutes+=60;
minutes--;
minutes=minutes%60;
disp_buf[2]=minutes/10;
disp_buf[3]=minutes%10;
}
}
{
}
if(flash_flag)
{flash_flag=0;
flag=!
flag;
if(status==2)
{if(flag)
{disp_buf[2]=minutes/10;
disp_buf[3]=minutes%10;
}
else
{disp_buf[2]=16;
disp_buf[3]=16;
}
}
if(status==1)
{if(flag)
{disp_buf[0]=hours/10;
disp_buf[1]=hours%10;
}
else
{disp_buf[0]=16;
disp_buf[1]=16;
}
}
}
}
}
第五章实习中遇到的问题
本次单片机实习对于实际动手能力有一定的要求,对于以后我们就业找工作有一定的帮助。
我在这次实习中也遇到了许多的困难,但是在几位指导教师的帮助下我最终很好地完成了实习任务,得到教师的肯定。
具体问题如下:
1.如何在软件中会出模拟的电路图?
答:
Proteus软件应用如下:
1.原理图编辑窗口〔TheEditingWindow〕:
顾名思义,它是用来绘制原理图的。
蓝色方框内为可编辑区,元件要放到它里面。
注意,这个窗口是没有滚动条的,你可用预览窗口来改变原理图的可视范围。
2.预览窗口〔TheOverviewWindow〕:
它可显示两个内容,一个是:
当你在元件列表中选择一个元件时,它会显示该元件的预览图;另一个是,当你的鼠标焦点落在原理图编辑窗口时〔即放置元件到原理图编辑窗口后或在原理图编辑窗口中点击鼠标后〕,它会显示整张原理图的缩略图,并会显示一个绿色的方框,绿色的方框里面的内容就是当前原理图窗口中显示的内容,因此,你可用鼠标在它上面点击来改变绿色的方框的位置,从而改变原理图的可视范围。
3.模型选择工具栏〔ModeSelectorToolbar〕:
主要模型〔MainModes〕:
1*选择元件〔components〕〔默认选择的〕
2*放置连接
3*放置标签〔用总线时会用到〕
4*放置文本
5*用于绘制总线
6*用于放置子电路
7*用于即时编辑元件参数〔先单击该图标再单击要修改的元件〕
配件〔Gadgets〕:
1*终端接口〔terminals〕:
有VCC、地、输出、输入等接口
2*器件引脚:
用于绘制各种引脚
3*仿真图表〔graph〕:
用
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 实习 报告 电子 时钟 以及 温度 测量 系统 设计