一、实验任务
- 实现两个数码管同时显示0-9,间隔时间为1s;
- 实现两个数码管秒表设计。
二、实验目的及原理
1.实验目的:了解数码管的分类、基本构造、显示原理、段码编排规则;掌握数码管的常用驱动方式、动态与静态显示原理;理解Proteus LED 数码管显示电路原理;掌握Keil C语言实现数码管0-9的编程思路。
2、实验原理:数码管由8个发光二极管组成,通过控制这8个灯的亮灭显示不同的数字。
三、实验中使用的仪器与材料
Keil、PZ-ISP、普中科技51单片机、数码管、发光二极管
四、实验方案、步骤及原始记录(数据、图表、计算等)
1.任务一:实现两个数码管同时显示0-9,间隔时间为1s
(1)用keil编写程序,输出hex文件
(2)将输出的hex文件烧录到开发板上
2.任务二:实现两个数码管秒表设计
(1)用keil编写程序,输出hex文件
#include<reg52.h>
#define GPIO_DIG P0
void Delay10ms(unsigned int c); //延时函数声明
//控制数码管显示0-9数字
unsigned char code DIG_CODE[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//主函数
void main(void)
{
unsigned char i = 7; //个位
unsigned char j = 0;
unsigned char t = 5; //十位
while(1)
{
for(j=0;j<50;j++) //多次循环,利用“余晖效应”产生两个数码管同时亮的效果
{
P2=0xe3; //P2_4,P2_3,P2_2控制哪个数码管亮
GPIO_DIG = ~DIG_CODE[i]; //选择亮哪个数字
Delay10ms(1); //延时
//清屏
GPIO_DIG = 0x00;
P2=0xe7;
GPIO_DIG = ~DIG_CODE[t];
Delay10ms(1);
//清屏
GPIO_DIG = 0x00;
}
i++;
if(i==10) //控制个位0-9的数字循环
{
i=0;
t++; //个位满10向十位进1
if(t==6) //控制十位0-5循环
{
t=0;
}
}
}
}
//延时函数
void Delay10ms(unsigned int c)
{
unsigned char a,b;
for( ;c>0;c--)
{
for(b=38;b>0;b--)
{
for(a=130;a>0;a--);
}
}
}
(2)将输出的hex文件烧录到开发板上
五、实验结果及分析、实验过程中遇到问题及处理过程说明
1.任务一结果:
2.任务二结果:
3.遇到的问题及处理过程
在完成任务1时将程序烧录在开发板上,只能实现1个数码管的数字显示,不知该如何选择数码管,从原理图入手却又看不懂,于是结合网上资料和原理图,发现74HC138译码器可用于控制数码管的选择,增补P2=0x..后,又出现两个灯无法同时亮的问题,网上查资料得可利用余晖效应,通过两个数码管不断地短时间内交替亮,使人产生两个数码管同时亮的错觉,反映到编程上即可用循环+延时。
六、实验总结及心得体会
通过本次实验,我了解了数码管的显示原理,学会了用C语言实现数码管显示0-9的编程思路及数码管的位选。编程时一定要软硬结合,依据原理图编程,会看原理图上的标签,都是一一对应的。