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

更新时间:2023-04-23 17:19:46 阅读: 评论:0


2023年4月23日发(作者:客户生命周期)

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

班级 通信1102 姓名 谢剑辉 学号2 指导老师 袁文澹

一、实验目的

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

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

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

二、实验内容

1、在STC89C52实验平台的4位数码管上实现动态显示0123123423453456

4567567867897890890190120123→不断反复,每隔2s切换显示内容。

2、思考:如何实现当4位数码管显示的内容中有“1”时,蜂鸣器蜂鸣。

三、实验原理

实验要求“4位数码管上实现动态显示0123123423453456456756786789

7890890190120123→不断反复,每隔2s切换显示内容”。动态扫描可以实现要求。

简单地说,动态扫描就是选通一位,送一位数据。原理图中的P10~P13是位选信号,即选

择哪个数码管显示数字;P00~P07是段码,即要显示的数字。可以通过依次选通一位7段数

码管并通过P0端口送出显示数据。由于人眼的视觉残留原理,如果这种依次唯一选通每一

7段数码管的动作在0.1s内完成,就会造成多位数码管同时点亮显示各自数字的假象。

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

四、实验方法与步骤

设计思路和方法:

1、根据电路图,分析数码管动态显示的设计思路,使用中断实现每2秒更新一次数字的设

计思路,以及实现当4位数码管显示的内容中有“1”时,蜂鸣器蜂鸣的设计思路。

1)数码管动态显示的原理如“实验原理”里所述,不赘述;

2)使用中断实现每2s更新一次数字的设计思路:本次实验使用Timer0中断,由于其定

时时间最大为65536us不能实现2s的长延时,那么可以使用多次中断来实现,并且在中断

到来时,不断地死循环显示数字,即根据动态显示原理“选通一位,来一位数据”。由于最

大的数字为9,则(x%10x+1%10x+2%10x+3%10分别是千位,百位,十

位,个位上的数字。在编写代码时,设臵Timer0定时时间为50ms,可以用一个参数i计算

中断的次数;当中断的次数达到40次时,说明已经达到了2s,此时更新数字,即将数字x

自增1;同时,判断(x%10x+1%10x+2%10x+3%10里面是否有1,如果

1的话,则将P150,让三极管导通,蜂鸣器蜂鸣。

2、针对电路图及设计要求给出继电器定时控制的程序框图。

设计步骤:

1、编写源代码

第一步:打开Keil uVision4,单击主菜单“project”的“new project”选项,选择工程保存

路径,输入工程名“SMGPro;在弹出的对话框里选择Atmel80C51,单击“确定”

第二步:单击主菜单的“File”的“New”选项,在编辑窗口里编写源代码。

/****************怎么隐藏战绩 ****************************

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

//2014.05.10 谢剑辉

********************************************/

#include

sbit sound=P1^5;

sbit s0=P1^0;

sbit s1=P1^1;

sbit s2=P1^2;

sbit s3=P1^3;

unsigned char i; //记录中断次数

unsigned int x; //x%10为千位的数字

unsigned char Tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

//数码管显示09的段码表

/***********************************************************************

函数功能:快速动态扫描延时程序

***********************************************************************/

void delay(unsigned int timer){

while(timer--)

;}

/***********************************************************************

函数功能:4位数的数码显示器显示

***********************************************************************/

void di上海的一本大学 splay(unsigned int k)

{

s0=0;//P1=1111 1110BP1.0引脚输出低电平,数码显示器千位接通电源

P0=Tab[k%10];//显示千位

delay(200);

s0=1;

s1=0;//P1=1111 1101BP1.1引脚输出低电平,数码显示器百位位接通电源

P0=Tab[(k+1)%10];//显示百位

delay(200);

s1=1;

s2=0;//P1=1111 1011BP1.2引脚输出低电平,数码显示器十位接通电源

P0=Tab[(k+2)%10];//显示十位

delay(200);

s2=1;

s3=0;//P1=1111 0111B P1.3引脚输出低电平,数码显示器个位接通电源

P0=Tab[(k+3)%10];//显示个位

delay(200);

s3=1;

}

void main(void)//主函数

{

sound=0;

TMOD=0x01;//使用定时器T0

TH0=(65536-46083)/256;

//上式将定时器计时时间设定为460831.085微秒=50000微秒=50毫秒

TL0=(65536-46083)%256;

EA=1;//开启总中断

ET0=1;//定时器T0中断允许

TR0=1;//启动定时器T0开始运行

while(1){

display(x); //调用检测结果的显示程序

}

}

/********************************************************

函数功能:定时器T0的中断服务程序

*************新年的说说 *******************************************/

void Time0(void) interrupt 1 using 1

{

TR0=0; //关闭定时器T0

i++; //每来一次中断,i自加1

if(i==40) //40次中断,即2秒钟进行一次检测结果采样

{

x++; //2秒更新一次x

i=0; //i0,重新统计中断次数

if(x%10==1||(x+1)%10==1||(x+2)%10==1||(x+3)%10==1)

sound=0;

el

sound=1;

}

TH0=(65536-46083)/256; //重新给计数器T0赋初值

TL0=(65536-46083)%256;

TR0=1; //启动定时器T0

}

第三步:选择主菜单的“File”的“Save”选项,输入文件名如“SMGcode,后缀名为.c

第四步:回到编辑界面,单击“Target1”前面的“+”号,在“Source Group1”选项上右击,

选择Add Files to Group Source Group1在弹出的窗口的“文件类型”里选择All Files

选择“SMGcode.c,单击“Add,然后单击“Clo

:单击左Project”窗的“Target1后选菜单Project /Option for

Target Target1,选择Output勾选Creat HEX File点击“确定”(此步骤是为了生成.hex

文件,用于烧录到板子或者装载到硬件仿真软件,如果不考虑此目的,则可以省略此步骤)

3、编译连接与调试。

1)编译与连接:点击“Project/Rebuild all Target Files”进行文件编译。编译结果若有错误

或警告,则将要修改直至文件编译成功。编译成功,其结果为:

2)调试:

第一步:依次点击“DebugStart/Stop Debug Session

第二步:在界面左边出现工作寄存器R0~R7、累加器A等特殊功能寄存器,这些寄存器的

数值会随着调试的进行发生变化;点击F11,会进行单步调试功能;

第三步:界面有反汇编窗口、命令窗口、程序窗口、存储器观察窗口、寄存器观察窗口等,

根据需要来观测。点击peripjerals中的I/O port选择不同的输出端口,点击Timer--time0

弹出如下窗口:

点击debug中的run,可以看到运行中的P1P0的输出值以及Timer的工作状态

P0P1端口的波形:

I

对应的存储器里的指令:

经检验,P1P0端口以及Timer和存储器里面的指令逻辑上是符合的、一致的。

4、根据原理图在proteus上放臵元件并进行仿真

第一步:双击“ISIS,打开Proteus工作页面;单击“文件”“新建文件”,在弹出的选择

模块窗口中选择DEF宝莲灯的故事 AULT模块,点击“确定”“保存”,设臵好保存路径,在文件名中输

入文件名,点击“保存”

第二步:点击左边的“P,从元件库中选取所需的元件,放臵好各元件,连线;设计好的

电路图如下:

第三步:右击单片机AT89C51,在“编辑元件”对话框中单击“Program File”右侧文本旁

边的按钮,选取在Vision4.0产生的Clock frequency输入12MHz

点击确定;

9、单击“调试”菜单的“执行”命令,如果有提示错误或警告,则要修改直至没有提示出

错,系统进行仿真。仿真信息提示如下:

五、实验幼儿跆拳道 结果与分析

通过单步跟踪调试程序,观察各个相关SFRSRAM单元结果可知程序结果正确。

六、实验结论与心得

1、本次实验使用Timer0工作在方式1,多次中断来实现2s的定时。其中每次触发中断时

间为50ms,用一变量计算中断次数,则中断次数*50ms为持续时间。可以在时间到的时候,

进行各种操作,比如进行判断,如本实验中进行判断是否包含1;也可以进行清零等操作;

其中中断模块,可以作为一个比较标准的模块,稍加改动用于其他的实验中。

2、在proteul仿真图中,一开始的时候,由于元件参数值不对,导致并不能显示理想的结

果。仔细检查代码逻辑与在烧录到板子上运行的结果,发现符合要求。那么肯定是proteul

的问题。在本次实验中,和同学交流,发现需要在数码管位选信号的攀爬者 数码管的P极,串联

一个电阻。而且阻值也有要求。同学的是2千欧电阻,我选的时候,2千欧是不行的,可能

是其他元件参数设臵不同。当我选择5千欧时,可以正常显示。这个问题纠结了我很久,

时也清楚认识到在实际应用中,参数设臵的重要性。同时发现,蜂鸣器直接导通时就可以蜂

鸣,并不需要加一定的频率。查资料表明,实验中的蜂鸣器是直流蜂鸣器,基于压控实现。

不过要实现动听的蜂鸣,可以加入不同组合的频率。

3、通过此次试验,我更加了解到中断的工作原理,以及在编写代码时如何使用中断,以及

使用中断进行长延时或者其他操作。认识到中断的机制,解放了CPU的含义。实验充满着

趣味。


本文发布于:2023-04-23 17:19:46,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/511155.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图