目录
概要
使用51单片机设计一个数字时钟,显示格式的如图所示:实验要求显示学号一段时间后然后再开始显示时钟,同时具备时分校准功能”
一.设计框架流程
1.先在proteus仿真软件把电路搭建好.
2.然后在KIEL5编程软件中编写时钟代码.
3.最后生成HEX文件将其导入proteus软件中的单片机中进行测试.
二.具体操作
1.仿真图绘制
(器件名称参考:)
74HC573芯片在此作用是提高I/O口的的驱动能力,输入和输出都是一样的。
74LS138芯片是一款三八译码器,简单理解就是三个输入端控制8个输出端,在此电路中起到的作用是节省I/O口:
74LS138真值表:
2.keil5软件编程
代码参考:
#include <reg52.h>//头文件
#define uchar unsigned char
#define uint unsigned int
uchar code seg[13]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40,0x7c};//段选数据(0-9,熄灭,—,b)
uchar code dis[]={0,1,2,3,4,5,6,7};//位选(8位数码管)
char hour=0,min=0,second=0,con=0;//时,分,秒,中断计数
sbit key1=P3^0;//定义管脚
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3;//定义管脚
void delayms(uint ms)//ms延时函数
{
uchar i;
while(ms--)
for(i=0;i<123;i++);
}
void ID_stu()//显示学号410B000函数
{
uchar i=200;
while(i--)
{
P0=seg[4];//数码管第一位显示“4”
P2=dis[0];
delayms(2);
P0=seg[10];//消影
P0=seg[1];//数码管第二位显示“1”
P2=dis[1];
delayms(2);
P0=seg[10];
P0=seg[0];//数码管第三位显示“0”
P2=dis[2];
delayms(2);
P0=seg[10];
P0=seg[12];//数码管第四位显示“b”
P2=dis[3];
delayms(2);
P0=seg[10];
P0=seg[0];//数码管第五位显示“0”
P2=dis[4];
delayms(2);
P0=seg[10];
P0=seg[0];//数码管第六位显示“0”
P2=dis[5];
delayms(2);
P0=seg[10];
P0=seg[0];//数码管第七位显示“0”
P2=dis[6];
delayms(2);
P0=seg[10];
P0=seg[0];//数码管第八位显示“0”
P2=dis[7];
delayms(2);
P0=seg[10];
}
}
void KEY_can()//按键处理函数
{
if(key1==0||key2==0||key3==0||key4==0)
{
delayms(20);
if(key1==0||key2==0||key3==0||key4==0)
{
if(key1==0)//时+1
{
hour++;
if(hour>23)
hour=0;
while(key1==0);
}
else if(key2==0) //时-1
{
hour--;
if(hour<0)
hour=23;
while(key2==0);
}
else if(key3==0) //分+1
{
min++;
if(min>59)
min=0;
while(key3==0);
}
else if(key4==0) //分-1
{
min--;
if(min<0)
min=59;
while(key4==0);
}
}
}
}
void Clock()//时钟显示函数
{
P0=seg[hour/10];//数码管第一位显示“时高位”
P2=dis[0];
delayms(2);
P0=seg[10];
P0=seg[hour%10];//数码管第二位显示“时低位”
P2=dis[1];
delayms(2);
P0=seg[10];
P0=seg[11];//数码管第三位显示“-”
P2=dis[2];
delayms(2);
P0=seg[10];
P0=seg[min/10];//数码管第四位显示“分高位”
P2=dis[3];
delayms(2);
P0=seg[10];
P0=seg[min%10];//数码管第五位显示“分低位”
P2=dis[4];
delayms(2);
P0=seg[10];
P0=seg[11];//数码管第六位显示“-”
P2=dis[5];
delayms(2);
P0=seg[10];
P0=seg[second/10];//数码管第七位显示“秒高位”
P2=dis[6];
delayms(2);
P0=seg[10];
P0=seg[second%10];//数码管第八位显示“秒高位”
P2=dis[7];
delayms(2);
P0=seg[10];
}
void T0_init()//T0定时器初始化”
{
TMOD=0x01;//设置定时器计数方式1
TH0=(65536-50000)/256;//12Mhz晶振 机器周期=12*(1/foc)
TL0=(65536-50000)%256;
TR0=1;//开启定时器
ET0=0;//中断允许位开启
EA=1;//开启总中断允许位
}
void main ()
{
uchar i;
T0_init();
ID_stu();
delayms(2000);
ET0=1;
while(1)
{
KEY_can();
Clock();
}
}
void T0_ET0()interrupt 1//T0定时器中断服务函数
{
TH0=(65536-50000)/256;//赋初值
TL0=(65536-50000)%256;
if(++con==20)//1s
{
con=0;
if(++second==60)//1min
{
second=0;
if(++min==60)//1hour
{ min=0;
if(++hour==24)//1day
hour=0;
}
}
}
}