单原理,数码管动态显示实验单原理实验报告_第1页
单原理,数码管动态显示实验单原理实验报告_第2页
单原理,数码管动态显示实验单原理实验报告_第3页
单原理,数码管动态显示实验单原理实验报告_第4页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、本文格式为word版,下载可任意编辑单原理,数码管动态显示实验单原理实验报告 宁德师范学院计算机系 试验报告 (20212021 学年 第 2 学期) 课程名称 单片机原理 试验名称 数码管动态显示试验 专 业计算机科学与技术(非师范) 年 级 2021 级 学号 b2021102147 姓名 王 秋 指导老师 杨烈君 试验日期 2021.4.17 试验目的 : 1. 巩固 proteus 软件和 keil 软件的使用方法 2. 学习端口输入输出的高级应用 3. 把握 7 段数码管的连接方式和动态显示法 4. 把握查表程序和延时等子程序的设计 试验 要求: 1. 在 proteus 软件中画好

2、 51 单片机最小核心电路,包括复位电路和晶振电路 2. 在电路中增加八位 7 段数码管(共阳/共阴自选),将 p2 口作数据输出口与 7 段数码管数据引 脚相连 ,p3 引脚输出位选掌握信号 3. 在 keil 软件中编写程序,采纳动态显示法,实现数码管分别显示数字 1-8 4. 实现指定数值的显示 (可使用 缓存数值) 5. 实现类似时钟的效果,如" 13-23-25' 13 时 23 分 25 秒 6. 实现时钟的自动计时 7. 扩展要求: 结合 led 显示,实现带数码显示的交通灯 试验设备(环境): 1(计算机 2(proteus isis 7 profession

3、al 应用程序 3(keil 应用程序 试验内容: 数码管动态显示技术 要求实现: 1(动态显示法,实现数码管分别显示数字 1-8; 2(实现指定数值的显示 (可使用 缓存数值) (33355223); 3(实现类似时钟的效果,如" 13-23-25' 13 时 23 分 25 秒; 4(实现时钟的自动计时; 扩展要求: 结合 led 显示,实现带数码显示的交通灯; 试验步骤、试验结果及分析: 1 试验步骤: 1、使用 proteus isis 7 professional 应用程序,建立一个.dsn 文件 2、在"库'下拉菜单中,选中"拾取元件&

4、#39;(快捷键 p),分别选择以下元件:at89c51、cap、cap-elec、 crystal、respack-8。 3、构建仿真电路: 连接图 显示 1-8 显示 33355223 显示时间 13.23.25 时钟自动计时 连接图 红绿灯效果图 1 红绿灯效果图 2 4、创建一个 keil 应用程序:新建一个工程项目文件;为工程选择目标器件(at89c52);为工程项目创建源程序文件并输入程序代码;保存创建的源程序项目文件;把源程序文件添加到项目中。 5、把用户程序经过编译后生成的 hex 文件添加到仿真电路中的处理器中(编辑元件?文件路径) 2 试验程序 流程图 开头 定义数组 开头

5、 ledcode开头 定义数组 定义数组 定义数组 dispbugledcodeledcode存放指定数 while 定义 dispbugwhile(1)存放指定数(1)yyfor 定义子函数 forn(i=0;i8(i=0;i8puttime(),.,调用延 yy 时函数 p3=1ip3=1iwhile(1)i+p2=ledcop2=ledcodedispbudeifiputtime()p2=ledcodedispbufii+i+ for 调用延时 n 调用延时(i=0;ip3=1i 函数函数 8)y 开头 p3=1isbit r1=p20;.sbit g2=p25;p2=ledcodedi

6、spbufi定义数组 ledcodei+ 调用延时定义 dispbug函数存放指定数 if(ms=60)定义子函数 yputtime()comsec=(com,.,sec+1) % 60;,ms=0 while(1)if(comsec 20) yy sec1=20-comsec;puttime()sec2=30-comsec;r1=1;y1=0;g1=0;r2=0;y2=0;g2=1; yforif(comsec=20 (i=0;i8) comsec30)sec1=60-comsec;sec1=30-comsec;sec2=60-comsec;sec2=30-comsec;r1=0;y1=1;

7、g1=0;r1=1;y1=0;g1=0;r2=1;y2=0;g2=0;r2=0;y2=1;g2=0; y if(comsec=30 if(comsec60) comsec50) sec1=60-comsec;ysec2=50-comsec;r1=0;y1=0;g1=1;r2=1;y2=0;g2=0; 程序源代码: 1(动态显示法,实现数码管分别显示数字 1-8; #includereg51.h #define uchar unsigned char #define uint unsigned int uchar code ledcode= 0x06,0x5b,0x4f,0x66,0x6d,0x

8、7d,0x07,0x7f,0x6f; /定义一个数组里面放入 1-8 void delay(uint x) while(x-); void main() uchar i; while(1) for(i=0;i8;i+) p3=1i; /p3 口表示从第一个位开头显示数值 p2=ledcodei; /p2 口用来显示所需要显示的数值 delay(500); 2. 实现指定数值的显示 (可使用 缓存数值) (33355223); #includereg51.h unsigned char code ledcode= 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0

9、x7f,0x6f,0x40 ; unsigned char dispbuf8=3,3,3,5,5,2,2,3; /指定要显示的数的位置 void delay(unsigned int x) while(x-); void main() unsigned int i; for(i=0;i8;i+) p3=1i; p2=ledcodedispbufi; /显示指定数的位置 delay(500); 3. 实现类似时钟的效果,如" 13-23-25' 13 时 23 分 25 秒; #includereg51.h unsigned char code ledcode= 0x3f,0x

10、06,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) while(x-); void puttime() dispbuf7=sec%10; /取对应秒数的个位放在最右边显示 dispbuf6=sec/10; /取对应秒数的十位放在右起其次位显示 dispbuf5=10; /此处表示秒跟分之间用横杆隔开 dispbuf4=min%10; dispbuf3=min/10; disp

11、buf2=10; dispbuf1=hour%10; dispbuf0=hour/10; void main() long n=0; while(1) unsigned char i; puttime(); for(i=0;i8;i+) p3=1i; p2=ledcodedispbufi; delay(500); 4. 实现时钟的自动计时; #includereg51.h unsigned char code ledcode= 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40; unsigned char hour=13,min=23

12、,sec=25; unsigned char dispbuf8; void delay(unsigned int x) while(x-); void puttime() dispbuf7=sec%10; dispbuf6=sec/10; dispbuf5=10; dispbuf4=min%10; dispbuf3=min/10; dispbuf2=10; dispbuf1=hour%10; dispbuf0=hour/10; void main() long n=0; while(1) unsigned char i,ms; /定义一个 ms 用于掌握秒数加一的延时 puttime(); f

13、or(i=0;i8;i+) p3=1i; p2=ledcodedispbufi; delay(500); ms+; /掌握加一的时延 if(ms=20) sec+;ms=0; if(sec=60) /表示进位,当秒满六十则向分钟进一,同时秒数清零 min+;sec=0; if(min=60) hour+;min=0; if(hour=24) /当小时数满 24 小时时,则小时数清零,完成计时 hour=0; 5. 扩展要求: 结合 led 显示,实现带数码显示的交通灯; #include reg52.h #define uint unsigned int #define uchar unsig

14、ned char #define disp_null 10 uchar 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 delay(uint x) while(x-); void pnttime( ) dispbuf3=sec2 % 10; dispbuf2=sec2

15、 / 10; dispbuf1=sec1 % 10; dispbuf0=sec1 / 10; void display() uchar i; for (i = 0;i 8;i +) p3=0; p1=ledcode dispbufi ; p3=1i; delay(100) ; void main () while(1) uchar ms; pnttime(); display(); ms+; if( ms =60) ms=0; comsec=(comsec+1) % 60; /定义一个计数变量,使其始终保持在60 内 if( comsec 20) /comsec 在 20 以内时 g2、r1

16、亮 sec1=20-comsec; sec2=30-comsec; r1=1;y1=0;g1=0; r2=0;y2=0;g2=1; if(comsec=20 comsec30) /comsec 在 20 与 30 之间时y2、r1 亮 sec1=30-comsec; sec2=30-comsec; r1=1;y1=0;g1=0; r2=0;y2=1;g2=0; if(comsec=30 comsec50) /g1、r2 在 comsec 增加 20内亮 sec1=60-comsec; sec2=50-comsec; r1=0;y1=0;g1=1; r2=1;y2=0;g2=0; if(coms

17、ec=50) sec1=60-comsec; sec2=60-comsec; r1=0;y1=1;g1=0; r2=1;y2=0;g2=0; 过程总结: 本试验是将单片机的 p2 口做为输出口,将四个数码管的七段引脚分别接到 p2.0 至p2.7.由于电路中采纳共阳极的数码管,所以当 p2 端口相应的引脚为 0 时,对应的数码管段点亮。程序中预设了数字 0-9 的段码。由于是让八个数码管显示不同的数值,所以要用扫描的方式来实现。因此可定义扫描函数,接到单片机的 p3 口。 在试验中,预设的数字段码表存放在数组 ledcode 中,由于段码表是固定的,因此存储类型可设为 code.在 proteus 软件中根据要求画出电路,再利用 keil 软件按需要实现的功能编写 c 程序,生成 hex 文件,把 hex 文件导到 proteus 软件中进行仿真。 心得体会: 试验数码管显示程序的编程方法 1)先预备好要显示的数据,放入相应的显示存储单元中。 2)依据要使用的数码管的详细位置来确定扫描初值和扫描方向。 3)依据使用数码管的个数来确定扫描

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论