目录
一、要求
1.引脚定义与程序设计
2.数码管封装(共阳)
3.流程图
二、设计思路
1.数码管显示译码
数码管各管段 | |||||||||||
数码管显示 | 显示数字需要的管段 | d | e | c | dp | f | g | a | b | 十六进制译码 | |
0 | a b c d e f | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0x14 | |
1 | b c | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0xde | |
2 | a b g e d | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0x38 | |
3 | a b g c d | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0x58 | |
4 | f g b c | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0xd2 | |
5 | a f g c d | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0x51 | |
6 | a f e d c g | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0x11 | |
7 | a b c | 1 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 0xdc | |
8 | a b c d e f g | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0x10 | |
9 | g f a b c d | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0x50 |
2.最小系统板与控制电路
3.proteus仿真
三、代码
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit KA=P1^0;
sbit KB=P1^1;
uchar code table[]={0x14,0xde,0x38,0x58,0xd2,0x51,0x11,0xdc,0x10,0x50,0xfd};//自己改 {0123456789-}
uint count=0;
uchar num[5]={0};
void delay(uint c) //延时程序
{
uchar a,b;
for(;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
void time0_init()
{
TMOD|=0X01;
TH0=0xfc;//(65536-1000)/256; 1ms
TL0=0x66;//(65536-1000)%256;
EA=1;
ET0=1;//允许定时器中断
}
void transfer()//位数的转换
{
uchar t=0; //count: 0 0 0 0 0
while(count!=0)
{
num[t]=count%10;
count=count/10;
t++;
} //num[x] x x x x x
t=0;
count=0;
}
void display() //显示到数码管
{
uchar i=4;
uchar t=5; //显示5位数
while(t--)
{
P0=table[num[i--]];
delay(300); //延时慢慢调,差不多就行了
P0=0xff; //关闭数码管
delay(80);
}
}
void KEY_passing() //KA按下开始计时,KB按下结束,然后数码管显示
{
while(1)
{
if (KA==0)
{
P0=0xff;
TR0=1;//开启定时器 //计时效果需要好的,开启定时就放这,至于为什么,自己慢慢体会!!!!
delay(5);//软件消抖
if (KA==0)
{
// TR0=1;//开启定时器 //另个方案就是开启定时放这
break;//结束while
}
}
}
while(1)
{
if (KB==0)
{
delay(5);//软件消抖
if (KB==0)
{
while(!KB); //是否松开
TR0=0; //关闭定时器
break; //结束while
}
}
}
transfer();
display();
}
void main()
{
time0_init();
P0=table[10];//a段亮
while(1)
{
KEY_passing();
P0=table[10];//a段亮
}
}
void time0() interrupt 1
{
TH0=0xfc;//(65536-1000)/256; 1ms
TL0=0x66;//(65536-1000)%256;
count++;
}
现实计时效果差多0.2s左右吧
仿真计时就应该是多0.5s那样子的
个人建议:如果要十分精确就手动加计时补偿吧,因人而异。
至于为什么存在误差,软件与硬件都存在一定的影响,手动测量的话,无疑人为因素导致的误差更大。
1.附加资料
嘉立创原理图(json)和仿真工程(Proteus 8 Professional)