实验五 万秒计时器的设计Word下载.docx
《实验五 万秒计时器的设计Word下载.docx》由会员分享,可在线阅读,更多相关《实验五 万秒计时器的设计Word下载.docx(18页珍藏版)》请在冰豆网上搜索。
使用中断实现每1秒更新一次数字的设计思路;
使用键盘控制时间显示的设计思路;
以及实现当4位数码管显示的内容皆为“9”时,蜂鸣器蜂鸣的设计思路。
(1)数码管动态显示的原理如“实验原理”里所述,不赘述;
(2)使用中断实现每1s更新一次数字的设计思路:
本次实验使用Timer0中断,由于其定时时间最大为65536us,不能实现1s的长延时,那么可以使用多次中断来实现,并且在中断到来时,不断地死循环显示数字。
在编写代码时,初始化千位百位十位个位的数字为0;
设置Timer0定时时间为50ms,可以用一个参数i计算中断的次数;
当中断的次数达到20次时,说明已经达到了1s,此时更新数字,即将数字GeWei自增1;
当GeWei数字大于9时,ShiWei自增1;
当ShiWei数字大于9时,BaiWei自增1;
当BaiWei数字大于9时,QianWei自增1;
当QianWei大于9时,个位十位百位千位清零。
(3)扫描键值的函数放在中断里面,每次中断时,判断是否有键被按下,并判断键值是多少,执行相对应的操作。
这里比较值得注意的是,标志位flag的设置问题。
不能直接对TR0进行操作来实现暂停与启动,因为在中断的定时器设置会覆盖掉,所以要用标志位flag而不是TR0。
本实验中,按P37千位加1;
按P36百位加1,按P35十位加1,按P34个位加1,按P33暂停计时,按P32启动计时。
(4)判断GeWei%10,ShiWei%10,BaiWei%10,QianWei%10是否皆为“9”,若是则将P15置0,让三极管导通,蜂鸣器蜂鸣。
2、针对电路图及设计要求给出程序框图。
设计步骤:
1、编写源代码
第一步:
打开KeiluVision4,单击主菜单“project”的“newproject”选项,选择工程保存路径,输入工程名“FivePro”;
在弹出的对话框里选择Atmel的80C51,单击“确定”;
第二步:
单击主菜单的“File”的“New”选项,在编辑窗口里编写源代码。
/***************************************************************************
效果:
1、数码管做精确的秒计数0000-9999;
2、如果四位为9999时,蜂鸣器蜂鸣;
3、按键控制“停止与启动计时”、“加个位显示内容”、
“加十位显示内容”、“加百位显示内容”、“加千位显示内容”;
编者:
2014年05月22日
****************************************************************************/
//头文件:
#include"
reg51.h"
//变量定义:
codeunsignedcharTab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//表:
共阳数码管0-9
unsignedcharGeWei;
unsignedcharShiWei;
unsignedcharBaiWei;
unsignedcharQianWei;
unsignedcharflag;
//定义标志位
unsignedchartt=0;
//中断次数
//引脚定义:
//P3作为键盘控制时间显示
sbitS2=P3^2;
//P32设置为启动计时
sbitS3=P3^3;
//P33设置为停止计时
sbitS4=P3^4;
//P34设置为个位加1
sbitS5=P3^5;
//P35设置为十位加1
sbitS6=P3^6;
//P36设置为百位加1
sbitS7=P3^7;
//P37设置为千位加1
//P1作为数码管位选信号
sbitSMG_q=P1^0;
//定义数码管阳级控制脚(千位)
sbitSMG_b=P1^1;
//定义数码管阳级控制脚(百位)
sbitSMG_s=P1^2;
//定义数码管阳级控制脚(十位)
sbitSMG_g=P1^3;
//定义数码管阳级控制脚(个位)
sbitSound=P1^5;
//定义蜂鸣器控制脚
//函数声明:
voiddelay(unsignedinttimer);
//数码管扫描延时
voidDisplayGeWei(unsignedcharG);
//个位显示函数
voidDisplayShiWei(unsignedcharS);
//十位显示函数
voidDisplayBaiWei(unsignedcharB);
//百位显示函数
voidDisplayQianWei(unsignedcharQ);
//千位显示函数
voiddelay60ms(void);
//键盘消抖延时
voidkey_scan(void);
//键盘扫描
voidmain()
{
TMOD=0x01;
//设置定时器1为模式一,即16位计算模式
TH0=(65536-50000)/256;
//给计数寄存器赋值,50毫秒时间
TL0=(65536-50000)%256;
EA=1;
//开启总中断
ET0=1;
//开启定时器0中断
TR0=1;
//启定定时器0
GeWei=0;
//初始化
ShiWei=0;
BaiWei=0;
QianWei=0;
while
(1)
{
if(tt==20)
{//20*50ms定时时间为1秒
tt=0;
GeWei++;
//计数变量加1
if(GeWei>
9)
{
GeWei=0;
ShiWei++;
}
if(ShiWei>
9)
{
ShiWei=0;
BaiWei++;
if(BaiWei>
BaiWei=0;
QianWei++;
if(QianWei>
9)
{
QianWei=0;
if(QianWei==9&
BaiWei==9&
ShiWei==9&
GeWei==9){
Sound=0;
else
Sound=1;
}
DisplayGeWei(GeWei);
DisplayShiWei(ShiWei);
DisplayBaiWei(BaiWei);
DisplayQianWei(QianWei);
}
//中断函数
voidtimer()interrupt1
{
TR0=0;
key_scan();
//执行键盘扫描
if(flag)
tt++;
TH0=(65536-46083)/256;
//定时器T0高四位赋值
TL0=(65536-46083)%256;
//定时器T0低四位赋值
//键盘扫描函数
voidkey_scan(void)
P3=0xff;
//将P3置高电平
if((P3&
0xff)!
=0xff)//p3与自身与,如果不为原来的,则说明有键按下
delay60ms();
//延时60ms再检测
=0xff)//确实有键按下
if(S2==0)//如果是S2按下启动计时
flag=1;
if(S3==0)//如果是S3按下停止计时
flag=0;
if(S4==0)//如果是S4键按下个位加1
GeWei++;
if(S5==0)//如果是S5键按下十位加1
ShiWei++;
if(S6==0)//如果是S6键按下百位加1
BaiWei++;
if(S7==0)//如果是S7键按下千位加1
//显示个位
voidDisplayGeWei(unsignedcharG)
SMG_g=0;
//P1.3引脚输出低电平,个位点亮
P0=Tab[G%10];
delay(500);
SMG_g=1;
//熄灭个位
//显示十位
voidDisplayShiWei(unsignedcharS)
SMG_s=0;
//P1.2引脚输出低电平,十位点亮
P0=Tab[S%10];
SMG_s=1;
//熄灭十位
//显示百位
voidDisplayBaiWei(unsignedcharB)
SMG_b=0;
//P1.1引脚输出低电平,百位点亮
P0=Tab[B%10];
SMG_b=1;
//熄灭百位
//显示千位
voidDisplayQianWei(unsignedcharQ)
SMG_q=0;
//P1.0引脚输出低电平,千位点亮
P0=Tab[Q%10];
SMG_q=1;
//熄灭千位
//键盘扫描延时消抖
voiddelay60ms(void)
unsignedchari,j;
for(i=0;
i<
200;
i++)
for(j=0;
j<
100;
j++)
;
//动态扫描延时
voiddelay(unsignedinttimer)
{
while(timer--)
第三步:
选择主菜单的“File”的“Save”选项,输入文件名如“code”,后缀名为.c;
第四步:
回到编辑界面,单击“Target1”前面的“+”号,在“SourceGroup1”选项上右击,选择“AddFilestoGroup’SourceGroup1”,在弹出的窗口的“文件类型”里选择“AllFiles”选择“code.c”,单击“Add”,然后单击“Close”;
第五步:
单击左边“Project”窗口的“Target1”,然后选择菜单“Project/OptionforTarget’Target1’,选择“Output”,勾选”CreatHEXFile”,点击“确定”;
(此步骤是为了生成.hex文件,用于烧录到板子或者装载到硬件仿真软件,如果不考虑此目的,则可以省略此步骤);
3、编译连接与调试。
(1)编译与连接:
点击“Project/RebuildallTargetFiles”进行文件编译。
编译结果若有错误或警告,则将要修改直至文件编译成功。
编译成功,其结果为:
(2)调试:
依次点击“Debug”“Start/StopDebugSession”
在界面左边出现工作寄存器R0~R7、累加器A等特殊功能寄存器,这些寄存器的数值会随着调试的进行发生变化;
点击F11,会进行单步调试功能;
界面有反汇编窗口、命令窗口、程序窗口、存储器观察窗口、寄存器观察窗口等,根据需要来观测。
点击“peripjerals”中的“I/Oport”选择不同的输出端口,点击“Timer--time0”,弹出如下图窗口。
点击debug中的run,可以看到运行中的P1、P0的输出值以及Timer的工作状态。
P1端口与P0端口各管脚的波形如下,从中可以看出符合设计逻辑与时间间隔。
I
对应的存储器里的指令:
经检验,P1、P0端口以及Timer和存储器里面的指令逻辑上是符合的、一致的。
从而可以判断实验的准确。
4、根据原理图在proteus上放置元件并进行仿真
双击“ISIS”,打开Proteus工作页面;
单击“文件”、“新建文件”,在弹出的选择模块窗口中选择DEFAULT模块,点击“确定”、“保存”,设置好保存路径,在文件名中输入文件名,点击“保存”;
点击左边的“P”,从元件库中选取所需的元件,放置好各元件,连线;
设计好的电路图如下:
右击单片机AT89C51,在“编辑元件”对话框中单击“ProgramFile”右侧文本旁边的按钮,选取在μVision4.0产生的“FivePro.hex”,在“Clockfrequency”输入“12MHz”,点击确定;
9、单击“调试”菜单的“执行”命令,如果有提示错误或警告,则要修改直至没有提示出错,系统进行仿真。
仿真信息提示如下:
10、下载到向老师租借的板子上跑,实验效果符合实验要求。
5、实验结果与分析
通过单步跟踪调试程序,观察各个相关SFR、SRAM单元结果可知程序结果正确。
6、实验结论与心得
本次实验使用Timer0工作在方式1,多次中断来实现2s的定时。
其中每次触发中断时间为50ms,用一变量计算中断次数,则中断次数*50ms为持续时间。
可以在时间到的时候,进行各种操作,比如进行键值判断。
中断模块,可以作为一个比较标准的模块,稍加改动用于其他的实验中。
通过此次试验,我更加了解到中断的工作原理,以及在编写代码时如何使用中断,以及使用中断进行长延时或者其他操作。
认识到中断的机制,解放了CPU的含义。
实验充满着趣味。