51单片机——时钟显示
一、硬件电路:AT89C51,上拉电阻,共阳数码管
1.整体电路图
(在这里我没有给单片机接晶振部分的时钟电路以及其他一些基本电路,因为在proteus里面不需要接也能正常工作,仿真就是仿真,但在实际电路中还是有些本质区别的,所以实际电路中一定要接,实际中显示与仿真还是有区别的。同时在实际中不会出现这种不亮的情况,只会亮度更低,如果亮度低了就加延时,如果肉眼分辨的出每位亮起的时间差就减少延时。)
2.八段式数码管
从数码管电极性质可分为共阳数码管(CA)和共阴数码管(CC),共阴接法(左)的com端接低电平,共阳接法(右)的com端接电高电平,a,b,c,d,e,f,g,dp分别对应数码管上的一段。
| 显示字符 | 段符号 | 十六进制 | |||||||||||||||
| dp | g | f | e | d | c | b | a | 共阴极 | 共阳极 | ||||||||
| 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 3F | C0 | |||||||
| 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 06 | F9 | |||||||
| 2 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 5B | A4 | |||||||
| 3 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 4F | B0 | |||||||
| 4 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 66 | 99 | |||||||
| 5 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 6D | 92 | |||||||
| 6 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 7D | 82 | |||||||
| 7 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 07 | F8 | |||||||
| 8 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 7F | 80 | |||||||
| 9 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 6F | 90 | |||||||
二、工程源码:
#include <REGX51.H>
#define uchar unsigned char
#define uint unsigned int
uchar data table_w[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//共阳数码管位码组
uchar data table_d[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管段码组
uchar count,shi=23,fen=59,miao=50;//定义时分秒
void delayms(uchar x)//延时函数
{ uchar i,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);}
void t0_init()
{
TMOD=0x01;//设置T0为方式1定时
TH0=15536/256;//装初值的高8位
TL0=15536%256;//装初值的低8位
ET0=1;//开启定时器中断允许
EA=1;//开启总中断
TR0=1;//T0运行控制位1,启动定时器0
}
void t0_break()interrupt 1//中断服务程序,1代表0003B入口
{ TH0=15536/256;
TL0=15536%256;
count++;//计数20次
if(count==20)//20*50=1000ms=1s,即每隔1s加1
{
miao++;
count=0;
}
if(miao==60)//miao=60时清零,分加1
{
fen=fen+1;
miao=0;
}
if(fen==60)
{
shi=shi+1;
fen=0;
}
if(shi==24)
{shi=0;}
}
void display(uchar wei,uchar duan)//定义P0,P2端口
{
P2=table_w[wei];
P0=table_d[duan];
delayms(5);
}
void main()
{
t0_init();
while(1)
{
display(0,shi/10);//shi/10高八位取整(十位)
delayms(10);
display(1,shi%10);//shi%10低八位取余(个位)
delayms(10);
display(3,fen/10);
delayms(10);
display(4,fen%10);
delayms(10);
display(6,miao/10);
delayms(10);
display(7,miao%10);
delayms(10);
}
}