单片机原理数码管动态显示实验单片机原理实验报告材料文档格式.docx
《单片机原理数码管动态显示实验单片机原理实验报告材料文档格式.docx》由会员分享,可在线阅读,更多相关《单片机原理数码管动态显示实验单片机原理实验报告材料文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
![单片机原理数码管动态显示实验单片机原理实验报告材料文档格式.docx](https://file1.bdocx.com/fileroot1/2022-12/7/2aa5bc3c-6837-4b61-91d5-1e320a16e121/2aa5bc3c-6837-4b61-91d5-1e320a16e1211.gif)
2.ProteusISIS7Professional应用程序
3.Keil应用程序
实验内容:
数码管动态显示技术要求实现:
1.动态显示法,实现数码管分别显示数字1-8;
2.实现指定数值的显示(可使用缓存数值)(33355223);
3.实现类似时钟的效果,如“13-23-25”13时23分25秒;
4.实现时钟的自动计时;
扩展要求:
结合LED显示,实现带数码显示的交通灯;
实验步骤、实验结果及分析:
1实验步骤:
1、使用ProteusISIS7Professional应用程序,建立一个.DSN文件
2、在“库”下拉菜单中,选中“拾取元件”(快捷键P),分别选择以下元件:
AT89C51、CAP、CAP-ELEC、CRYSTA、LRESPACK-8。
3、构建仿真电路:
连接图
显示1-8
显示33355223
显示时间13.23.25
时钟自动计时
红绿灯效果图1
红绿灯效果图2
5、把用户程序经过编译后生成的
2实验程序<
流程图>
定义数组
Ledcode[]
Y)
P3=1<
<
i
i++
调用延时函数
P2=~Ledcode[i]
4、创建一个Keil应用程序:
新建一个工程项目文件;
为工程选择目标器件(AT89C52);
为工程
项目创建源程序文件并输入程序代码;
保存创建的源程序项目文件;
把源程序文件添加到项目中。
HEX文件添加到仿真电路中的处理器中(编辑元件→文件路径)
P2=~Ledcode[DispBuf[i]]
定义Dispbug[]
存放指定数
调用延时
函数
定义子函数
PutTime()
{...}
Y
If(ms>
=60)
While
(1)
Sec1=20-comsec;
Sec2=30-comsec;
R1=1;
y1=0;
g1=0;
r2=0;
y2=0;
g2=1;
comsesec+1)%60;
ms=0
For(i=0;
i<
8)
If(comsec>
=20
&
comsec<
30)
sec1=60-comsec;
Sec2=60-comsec;
R1=0;
y1=1;
r2=1;
g2=0;
sec1=30-comsec;
Sec2=30-comsec;
R1=1;
y2=1;
If(Comsec>
60)
=30
50)
Sec2=50-comsec;
R1=0;
g1=1;
程序源代码:
#include<
reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
ucharcodeLedcode[]={
定义一个数组里面放
0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//入1-8
voiddelay(uintx)
{
while(x--);
}
voidmain()
uchari;
while
(1)
for(i=0;
8;
i++)
i;
//P3口表示从第一个位开始显示数值
P2=~Ledcode[i];
//P2口用来显示所需要显示的数值delay(500);
2.实现指定数值的显示(可使用缓存数值)(33355223);
unsignedcharcodeLedCode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
unsignedcharDispBuf[8]={3,3,3,5,5,2,2,3};
//指定要显示的数的位置voiddelay(unsignedintx){
unsignedinti;
i++){
P2=~LedCode[DispBuf[i]];
//显示指定数的位置delay(500);
3.实现类似时钟的效果,如“13-23-25”13时23分25秒;
unsignedcharcodeLedCode[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
unsignedcharHour=13,Min=23,Sec=25;
unsignedcharDispBuf[8];
voiddelay(unsignedintx){
voidPutTime()
DispBuf[7]=Sec%10;
//
取对应秒数的个位放在最右边显示
DispBuf[6]=Sec/10;
取对应秒数的十位放在右起第二位显示
DispBuf[5]=10;
DispBuf[4]=Min%10;
此处表示秒跟分之间用横杆隔开
DispBuf[3]=Min/10;
DispBuf[2]=10;
DispBuf[1]=Hour%10;
DispBuf[0]=Hour/10;
}voidmain()
longn=0;
while
(1){
unsignedchari;
PutTime();
delay(500);
4.实现时钟的自动计时;
voiddelay(unsignedintx)
unsignedchari,ms;
//定义一个ms用于控制秒数加一的延时PutTime();
ms++;
//控制加一的时延
if(ms>
=20)
Sec++;
ms=0;
if(Sec>
=60)//表示进位,当秒满六十则向分钟进一,同时秒数清零{
Min++;
Sec=0;
if(Min>
Hour++;
Min=0;
if(Hour>
=24)//当小时数满24小时时,则小时数清零,完成计时{
Hour=0;
5.扩展要求:
#include"
reg52.h"
#defineDisp_Null10
ucharcodeLedCode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
ucharDispBuf[8];
sbitr1=P2^0;
sbity1=P2^1;
sbitg1=P2^2;
sbitr2=P2^3;
sbity2=P2^4;
sbitg2=P2^5;
ucharsec1;
sec2;
comsec;
voidPntTime()
DispBuf[3]=sec2%10;
DispBuf[2]=sec2/10;
DispBuf[1]=sec1%10;
DispBuf[0]=sec1/10;
voiddisplay()
for(i=0;
i<
8;
i++)
P3=0;
P1=~LedCode[DispBuf[i]];
delay(100);
voidmain()
ucharms;
PntTime();
display();
if(ms>
=60){
comsec=(comsec+1)%60;
//定义一个计数变量,使其一直保持在60内}
if(comsec<
20){//comsec在20以内时g2、r1亮
sec1=20-comsec;
sec2=30-comsec;
r1=1;
r2=0;
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口做为输出口,将四个数码管的七段引脚分别接到P2.0至P2.7.由于电路中采用共阳极的数码管,所以当P2端口相应的引脚为0时,对应的数码管段点亮。
程序中预设了数字0-9的段码。
由于是让八个数码管显示不同的数值,所以要用扫描的方式来实现。
因此可定义扫描函数,接到单片机的P3口。
在实验中,预设的数字段码表存放在数组LedCode中,由于段码表是固定的,因此存储类型可设为code.在Proteus软件中按照要求画出电路,再利用Keil软件按需要实现的功能编写c程序,生成Hex文件,把Hex文件导到Proteus软件中进行仿真。
心得体会:
实验数码管显示程序的编程方法
1)先准备好要显示的数据,放入相应的显示存储单元中。
2)根据要使用的数码管的具体位置来确定扫描初值和扫描方向。
3)根据使用数码管的个数来确定扫描的位数。
4)查表将要显示的数据转换为能使数码管正确显示相对应的段码。
5)分时送段码和位码,数码管开始循环显示。
指导教师评语:
1、完成所有规定的实验内容,实验步骤正确,结果正确;
2、完成绝大部分规定的实验内容,实验步骤正确,结果正确;
3、完成大部分规定的实验内容,实验步骤正确,结果正确;
评定等级:
A(优秀)B(良好)C(中等)D(及格)E(不及格)
成绩评定
教师签字
年月日备注:
注:
1、报告内的项目或设置,可根据实际情况加以补充和调整
2、教师批改学生实验报告应在学生提交实验报告10日内