前面几篇我们说到了 LED灯,数码管,按键等内容,按键和数码管组合可以设计出简易秒表。
硬件组成:单片机最小系统+数码管显示电路+3个按键
功能:一个开始键,一个暂停键,一个复位键。数码管显示的精度是00:00--59:99
仿真图:
程序:
程序内容比较多,详细的参考源代码
源代码:
#include<reg52.h> //头文件
#define uint unsigned int
#define uchar unsigned char
uchar qian;
uchar bai;
uchar shi;
uchar ge;
//共阴数码管0-F 编码表
uchar smg_dm[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,};
uchar smg_dm1[]={0xbf,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,}; //0. 1. 2.----9.段码表
uchar smg_wm[]={0Xef,0Xdf,0xbf,0x7f}; //位选
uchar Display_buffer[4]={0,0,0,0}; //数码管显示缓存
sbit key1=P2^0; //开始键
sbit key2=P2^1; //暂停键
sbit key3=P2^2; //复位键
void delay_ms(uint z) //延时子程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void key(void)
{
if(key1==0)
{
delay_ms(10);
if(key1==0)
{
TR0=1;
}
while(!key1);
}
if(key2==0)
{
delay_ms(10);
if(key2==0)
{
TR0=0;
}
while(!key1);
}
if(key3==0)
{
delay_ms(10);
if(key3==0)
{
TR0=0;qian=0;bai=0;shi=0;ge=0;
}
while(!key1);
}
}
void msg_display(void)
{
uchar i;
Display_buffer[0]=qian;
Display_buffer[1]=bai;
Display_buffer[2]=shi;
Display_buffer[3]=ge;
for(i=0;i<=3;i++)
{
if(i==1)
{
P2=smg_wm[i];//选位码
P1=smg_dm1[Display_buffer[i]];//选段码
delay_ms(5);
// P2=0XFF; //消影 仿真这句加不加都一样
}
else
{
P2=smg_wm[i];//选位码
P1=smg_dm[Display_buffer[i]];//选段码
delay_ms(5);
// P2=0XFF; //消影
}
}
}
void main()
{
TMOD=0X01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
while(1)
{
key();
msg_display();
}
}
void time0() interrupt 1
{
uchar num;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
num++;
if(num==1)
{
num=0;
ge++;
if(ge==10)
{
ge=0;
shi++;
if(shi==10)
{
shi=0;
bai++;
if(bai==10)
{
bai=0;
qian++;
if(qian==6)
{
qian=0;
}
}
}
}
}
}
仿真结果: