实验五 万秒计时器的设计.docx

上传人:b****6 文档编号:4725559 上传时间:2022-12-08 格式:DOCX 页数:18 大小:558.27KB
下载 相关 举报
实验五 万秒计时器的设计.docx_第1页
第1页 / 共18页
实验五 万秒计时器的设计.docx_第2页
第2页 / 共18页
实验五 万秒计时器的设计.docx_第3页
第3页 / 共18页
实验五 万秒计时器的设计.docx_第4页
第4页 / 共18页
实验五 万秒计时器的设计.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

实验五 万秒计时器的设计.docx

《实验五 万秒计时器的设计.docx》由会员分享,可在线阅读,更多相关《实验五 万秒计时器的设计.docx(18页珍藏版)》请在冰豆网上搜索。

实验五 万秒计时器的设计.docx

实验五万秒计时器的设计

实验四数码管的动态显示实验

一、实验目的

熟悉掌握数码管动态显示的基本方法;

根据已知电路和设计要求在实验板上实现数码管动态显示。

根据已知电路和设计要求在PROTEUS平台仿真实现控制系统。

二、实验内容

1、在STC89C52实验平台的4位数码管上实现动态显示0000→0001→0002→…→9998→9999→0000→0001→0002→…不断反复,每隔1s切换显示内容。

2、应用键盘控制时间的显示。

键盘按键控制“停止计时”、“启动计时”、“加个位显示内容”、“加十位显示内容”、“加百位显示内容”、“加千位显示内容”。

3、思考:

如何实现当4位数码管显示的内容为“9999”时,蜂鸣器蜂鸣。

3、实验原理

 

 

实验要求1、动态扫描可以实现要求。

简单地说,动态扫描就是选通一位,送一位数据。

原理图中的P10~P13是位选信号,即选择哪个数码管显示数字;P00~P07是段码,即要显示的数字。

可以通过依次选通一位7段数码管并通过P0端口送出显示数据。

由于人眼的视觉残留原理,如果这种依次唯一选通每一位7段数码管的动作在0.1s内完成,就会造成多位数码管同时点亮显示各自数字的假象。

本实验使用中断,实现每1s更新一次数字。

实验要求2、利用键盘扫描,对扫描结果判断与进行对应操作可以实现要求。

简单地说,就是中断来临时,对键盘进行一次扫描,将扫描到的键值与对应操作联系起来。

其中对启动与停止设置标志位,通过对标志位的判断来停止或启动,而不是对TR0进行直接操作,以防与中断计数的启动与停止互相覆盖,而达不到要求。

实验要求3、判断每一位的数字,当每位皆“9”时,置P15低电平,蜂鸣器蜂鸣。

四、实验方法与步骤

设计思路和方法:

1、根据电路图,分析数码管动态显示的设计思路;使用中断实现每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>9)

{

BaiWei=0;

QianWei++;}

if(QianWei>9)

{

GeWei=0;

ShiWei=0;

BaiWei=0;

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低四位赋值

TR0=1;

}

//键盘扫描函数

voidkey_scan(void)

{

P3=0xff;//将P3置高电平

if((P3&0xff)!

=0xff)//p3与自身与,如果不为原来的,则说明有键按下

{

delay60ms();//延时60ms再检测

if((P3&0xff)!

=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

QianWei++;

}

}

}

//显示个位

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];

delay(500);

SMG_s=1;//熄灭十位

}

//显示百位

voidDisplayBaiWei(unsignedcharB)

{

SMG_b=0;//P1.1引脚输出低电平,百位点亮

P0=Tab[B%10];

delay(500);

SMG_b=1;//熄灭百位

}

//显示千位

voidDisplayQianWei(unsignedcharQ)

{

SMG_q=0;//P1.0引脚输出低电平,千位点亮

P0=Tab[Q%10];

delay(500);

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的含义。

实验充满着趣味。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1