1、2 Proteus ISIS 7 Professional 应用程序3 Keil 应用程序实验内容:数码管动态显示技术 要求实现:1动态显示法,实现数码管分别显示数字 1-8 ;2实现指定数值的显示 (可使用 缓存数值) ( 33355223);3实现类似时钟的效果,如“ 13-23-25 ” 13 时 23分 25 秒; 4实现时钟的自动计时;扩展要求: 结合 LED显示,实现带数码显示的交通灯;实验步骤、实验结果及分析:1 实验步骤:1、使用 Proteus ISIS 7 Professional 应用程序,建立一个 .DSN 文件2、在“库”下拉菜单中, 选中“拾取元件”(快捷键 P),
2、分别选择以下元件: AT89C51、CAP、CAP-ELEC、 CRYSTA、L RESPACK-8。3、构建仿真电路:连接图显示 1-8显示 33355223显示时间 13.23.25时钟自动计时红绿灯效果图 1红绿灯效果图 25、把用户程序经过编译后生成的2 实验程序 定义数组LedcodeY)P3=1=60)While (1)Sec1=20-comsec;Sec2=30-comsec;R1=1;y1=0;g1=0; r2=0;y2=0;g2=1;comse sec+1) % 60;,ms=0For (i=0;i=20& comsec60)=3050)Sec2=50-comsec;R1=0
3、;g1=1;程序源代码:#include#define uchar unsigned char#define uint unsigned intuchar code Ledcode=定义一个数组里面放0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; / 入 1-8void delay(uint x)while(x-);void main()uchar i;while(1)for(i=0;8;i+)i; /P3 口表示从第一个位开始显示数值P2=Ledcodei; /P2 口用来显示所需要显示的数值 delay(500);2.实现指定数值的显示 (可使用
4、 缓存数值) ( 33355223);unsigned char code LedCode= 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40 ;unsigned char DispBuf8=3,3,3,5,5,2,2,3; / 指定要显示的数的位置 void delay(unsigned int x)unsigned int i;i+)P2=LedCodeDispBufi; / 显示指定数的位置 delay(500);3.实现类似时钟的效果,如“ 13-23-25 ” 13 时 23 分 25 秒;unsigned char cod
5、e LedCode=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40;unsigned char Hour=13,Min=23,Sec=25;unsigned char DispBuf8; void delay(unsigned int x) void PutTime()DispBuf7=Sec%10; /取对应秒数的个位放在最右边显示DispBuf6=Sec/10;取对应秒数的十位放在右起第二位显示DispBuf5=10;DispBuf4=Min%10;此处表示秒跟分之间用横杆隔开DispBuf3=Min/10;DispBuf2=1
6、0;DispBuf1=Hour%10;DispBuf0=Hour/10; void main()long n=0; while(1) unsigned char i;PutTime();delay(500);4.实现时钟的自动计时;void delay(unsigned int x)unsigned char i,ms; / 定义一个 ms 用于控制秒数加一的延时 PutTime();ms+; / 控制加一的时延if(ms=20)Sec+;ms=0;if(Sec=60) / 表示进位,当秒满六十则向分钟进一,同时秒数清零 Min+;Sec=0;if(MinHour+;Min=0;if(Hour
7、=24) / 当小时数满 24 小时时,则小时数清零,完成计时 Hour=0;5.扩展要求:#include reg52.h#define Disp_Null 10uchar code LedCode= 0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x40;uchar DispBuf8;sbit r1=P20;sbit y1=P21;sbit g1=P22;sbit r2=P23;sbit y2=P24;sbit g2=P25;uchar sec1;sec2;comsec;void PntTime( )DispBuf3=sec2 % 1
8、0;DispBuf2=sec2 / 10;DispBuf1=sec1 % 10;DispBuf0=sec1 / 10;void display()for (i = 0;i =60)comsec=(comsec+1) % 60; / 定义一个计数变量 , 使其一直保持在 60 内 if( comsec =20 &30) /comsec 在 20 与 30 之间时 y2 、 r1亮=30 &50) /g1 、 r2 在 comsec增加 20 内亮 sec2=50-comsec;r1=0;r2=1;=50) sec2=60-comsec;过程总结:本实验是将单片机的 P2口做为输出口,将四个数码管
9、的七段引脚分别接到 P2.0 至P2.7. 由于 电路中采用共阳极的数码管,所以当 P2端口相应的引脚为 0 时,对应的数码管段点亮。程序中预 设了数字 0-9 的段码。由于是让八个数码管显示不同的数值,所以要用扫描的方式来实现。因此可 定义扫描函数,接到单片机的 P3 口。在实验中,预设的数字段码表存放在数组 LedCode 中,由于段码表是固定的,因此存储类型可 设为 code. 在 Proteus 软件中按照要求画出电路,再利用 Keil 软件按需要实现的功能编写 c 程序, 生成 Hex文件,把 Hex 文件导到 Proteus 软件中进行仿真。心得体会:实验数码管显示程序的编程方法1
10、)先准备好要显示的数据,放入相应的显示存储单元中。2)根据要使用的数码管的具体位置来确定扫描初值和扫描方向。3)根据使用数码管的个数来确定扫描的位数。4)查表将要显示的数据转换为能使数码管正确显示相对应的段码。5)分时送段码和位码,数码管开始循环显示。指导教师评语:1、完成所有规定的实验内容,实验步骤正确,结果正确;2、完成绝大部分规定的实验内容,实验步骤正确,结果正确;3、完成大部分规定的实验内容,实验步骤正确,结果正确;评定等级: A(优秀) B(良好) C(中等) D(及格) E (不及格)成绩评定教师签字年月日 备注:注: 1、报告内的项目或设置,可根据实际情况加以补充和调整2 、教师批改学生实验报告应在学生提交实验报告 10 日内
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1