实验四数码管的动态显示实验.docx
- 文档编号:5547021
- 上传时间:2022-12-19
- 格式:DOCX
- 页数:10
- 大小:312.54KB
实验四数码管的动态显示实验.docx
《实验四数码管的动态显示实验.docx》由会员分享,可在线阅读,更多相关《实验四数码管的动态显示实验.docx(10页珍藏版)》请在冰豆网上搜索。
实验四数码管的动态显示实验
实验四数码管的动态显示实验
班级通信1102 姓名谢剑辉 学号20110803223 指导老师袁文澹
一、实验目的
熟悉掌握数码管动态显示的基本方法;
根据已知电路和设计要求在实验板上实现数码管动态显示。
根据已知电路和设计要求在PROTEUS平台仿真实现控制系统。
二、实验内容
1、在STC89C52实验平台的4位数码管上实现动态显示0123→1234→2345→3456→4567→5678→6789→7890→8901→9012→0123→不断反复,每隔2s切换显示内容。
2、思考:
如何实现当4位数码管显示的内容中有“1”时,蜂鸣器蜂鸣。
3、实验原理
实验要求“4位数码管上实现动态显示0123→1234→2345→3456→4567→5678→6789→7890→8901→9012→0123→不断反复,每隔2s切换显示内容”。
动态扫描可以实现要求。
简单地说,动态扫描就是选通一位,送一位数据。
原理图中的P10~P13是位选信号,即选择哪个数码管显示数字;P00~P07是段码,即要显示的数字。
可以通过依次选通一位7段数码管并通过P0端口送出显示数据。
由于人眼的视觉残留原理,如果这种依次唯一选通每一位7段数码管的动作在0.1s内完成,就会造成多位数码管同时点亮显示各自数字的假象。
本实验使用中断,实现每2s更新一次数字。
四、实验方法与步骤
设计思路和方法:
1、根据电路图,分析数码管动态显示的设计思路,使用中断实现每2秒更新一次数字的设计思路,以及实现当4位数码管显示的内容中有“1”时,蜂鸣器蜂鸣的设计思路。
(1)数码管动态显示的原理如“实验原理”里所述,不赘述;
(2)使用中断实现每2s更新一次数字的设计思路:
本次实验使用Timer0中断,由于其定时时间最大为65536us,不能实现2s的长延时,那么可以使用多次中断来实现,并且在中断到来时,不断地死循环显示数字,即根据动态显示原理“选通一位,来一位数据”。
由于最大的数字为9,则(x%10),(x+1)%10,(x+2)%10,(x+3)%10分别是千位,百位,十位,个位上的数字。
在编写代码时,设置Timer0定时时间为50ms,可以用一个参数i计算中断的次数;当中断的次数达到40次时,说明已经达到了2s,此时更新数字,即将数字x自增1;同时,判断(x%10),(x+1)%10,(x+2)%10,(x+3)%10里面是否有1,如果有1的话,则将P15置0,让三极管导通,蜂鸣器蜂鸣。
2、针对电路图及设计要求给出继电器定时控制的程序框图。
设计步骤:
1、编写源代码
第一步:
打开KeiluVision4,单击主菜单“project”的“newproject”选项,选择工程保存路径,输入工程名“SMGPro”;在弹出的对话框里选择Atmel的80C51,单击“确定”;
第二步:
单击主菜单的“File”的“New”选项,在编辑窗口里编写源代码。
/********************************************
//实验四:
数码管的动态显示
//2014.05.10 谢剑辉
********************************************/
#include
sbitsound=P1^5;
sbits0=P1^0;
sbits1=P1^1;
sbits2=P1^2;
sbits3=P1^3;
unsignedchari; //记录中断次数
unsignedintx; //x%10为千位的数字
unsignedcharTab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//数码管显示0~9的段码表
/***********************************************************************
函数功能:
快速动态扫描延时程序
***********************************************************************/
voiddelay(unsignedinttimer){
while(timer--)
;}
/***********************************************************************
函数功能:
4位数的数码显示器显示
***********************************************************************/
voiddisplay(unsignedintk)
{
s0=0;//即P1=11111110B,P1.0引脚输出低电平,数码显示器千位接通电源
P0=Tab[k%10];//显示千位
delay(200);
s0=1;
s1=0;//即P1=11111101B,P1.1引脚输出低电平,数码显示器百位位接通电源
P0=Tab[(k+1)%10];//显示百位
delay(200);
s1=1;
s2=0;//即P1=11111011B,P1.2引脚输出低电平,数码显示器十位接通电源
P0=Tab[(k+2)%10];//显示十位
delay(200);
s2=1;
s3=0;//即P1=11110111B,P1.3引脚输出低电平,数码显示器个位接通电源
P0=Tab[(k+3)%10];//显示个位
delay(200);
s3=1;
}
voidmain(void)//主函数
{
sound=0;
TMOD=0x01;//使用定时器T0
TH0=(65536-46083)/256;
//上式将定时器计时时间设定为46083×1.085微秒=50000微秒=50毫秒
TL0=(65536-46083)%256;
EA=1;//开启总中断
ET0=1;//定时器T0中断允许
TR0=1;//启动定时器T0开始运行
while
(1){
display(x); //调用检测结果的显示程序
}
}
/********************************************************
函数功能:
定时器T0的中断服务程序
********************************************************/
voidTime0(void)interrupt1using1
{
TR0=0; //关闭定时器T0
i++; //每来一次中断,i自加1
if(i==40) //够40次中断,即2秒钟进行一次检测结果采样
{
x++; //2秒更新一次x
i=0; //将i清0,重新统计中断次数
if(x%10==1||(x+1)%10==1||(x+2)%10==1||(x+3)%10==1)
sound=0;
else
sound=1;
}
TH0=(65536-46083)/256; //重新给计数器T0赋初值
TL0=(65536-46083)%256;
TR0=1; //启动定时器T0
}
第三步:
选择主菜单的“File”的“Save”选项,输入文件名如“SMGcode”,后缀名为.c;
第四步:
回到编辑界面,单击“Target1”前面的“+”号,在“SourceGroup1”选项上右击,选择“AddFilestoGroup’SourceGroup1”,在弹出的窗口的“文件类型”里选择“All Files”选择“SMGcode.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的工作状态
P0与P1端口的波形:
I
对应的存储器里的指令:
经检验,P1、P0端口以及Timer和存储器里面的指令逻辑上是符合的、一致的。
4、根据原理图在proteus上放置元件并进行仿真
第一步:
双击“ISIS”,打开Proteus工作页面;单击“文件”、“新建文件”,在弹出的选择模块窗口中选择DEFAULT模块,点击“确定”、“保存”,设置好保存路径,在文件名中输入文件名,点击“保存”;
第二步:
点击左边的“P”,从元件库中选取所需的元件,放置好各元件,连线;设计好的电路图如下:
第三步:
右击单片机AT89C51,在“编辑元件”对话框中单击“ProgramFile”右侧文本旁边的按钮,选取在μVision4.0产生的“JSMGPro.hex”,在“Clockfrequency”输入“12MHz”,点击确定;
9、单击“调试”菜单的“执行”命令,如果有提示错误或警告,则要修改直至没有提示出错,系统进行仿真。
仿真信息提示如下:
5、实验结果与分析
通过单步跟踪调试程序,观察各个相关SFR、SRAM单元结果可知程序结果正确。
6、实验结论与心得
1、本次实验使用Timer0工作在方式1,多次中断来实现2s的定时。
其中每次触发中断时间为50ms,用一变量计算中断次数,则中断次数*50ms为持续时间。
可以在时间到的时候,进行各种操作,比如进行判断,如本实验中进行判断是否包含1;也可以进行清零等操作;其中中断模块,可以作为一个比较标准的模块,稍加改动用于其他的实验中。
2、在proteul仿真图中,一开始的时候,由于元件参数值不对,导致并不能显示理想的结果。
仔细检查代码逻辑与在烧录到板子上运行的结果,发现符合要求。
那么肯定是proteul的问题。
在本次实验中,和同学交流,发现需要在数码管位选信号的数码管的P极,串联一个电阻。
而且阻值也有要求。
同学的是2千欧电阻,我选的时候,2千欧是不行的,可能是其他元件参数设置不同。
当我选择5千欧时,可以正常显示。
这个问题纠结了我很久,同时也清楚认识到在实际应用中,参数设置的重要性。
同时发现,蜂鸣器直接导通时就可以蜂鸣,并不需要加一定的频率。
查资料表明,实验中的蜂鸣器是直流蜂鸣器,基于压控实现。
不过要实现动听的蜂鸣,可以加入不同组合的频率。
3、通过此次试验,我更加了解到中断的工作原理,以及在编写代码时如何使用中断,以及使用中断进行长延时或者其他操作。
认识到中断的机制,解放了CPU的含义。
实验充满着趣味。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 数码管 动态 显示