做一个6位数码管电子时钟c语言程序,51单片机的六位数码管时钟表仿真及C程序
时间: 2023-08-11 18:05:10 浏览: 80
好的,下面是一个简单的6位数码管电子时钟的C语言程序,可以在51单片机上运行:
```c
#include <reg51.h> // 导入51单片机头文件
#define uchar unsigned char // 定义无符号字符类型
sbit DIO=P1^0; // 定义数码管数据线
sbit CLK=P1^1; // 定义数码管时钟线
sbit LATCH=P1^2; // 定义数码管锁存线
uchar code NumTab[]={ // 数码管显示数字编码数组
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
};
uchar hour=0,min=0,sec=0; // 定义小时、分钟、秒钟变量
void delay_ms(unsigned int ms) // 延时函数,单位毫秒
{
unsigned int i,j;
for(i=0;i<ms;i++)
for(j=0;j<110;j++);
}
void WriteData(uchar dat) // 向数码管写入数据
{
uchar i;
for(i=0;i<8;i++)
{
CLK=0;
DIO=dat&0x01;
dat>>=1;
CLK=1;
}
}
void Display(uchar *p) // 在数码管上显示时间
{
uchar i;
LATCH=0;
for(i=0;i<6;i++)
{
WriteData(NumTab[*(p+i)]);
}
LATCH=1;
}
void InitTimer() // 初始化定时器
{
TMOD=0x01; // 定时器1,工作模式1
TH0=0x4c; // 初始值,每50ms中断一次
TL0=0x00;
TR0=1; // 启动定时器
ET0=1; // 允许定时器1中断
EA=1; // 允许总中断
}
void Timer0() interrupt 1 // 定时器1中断处理函数
{
TH0=0x4c; // 重新赋初值
TL0=0x00;
sec++; // 秒加1
if(sec==60) // 如果秒钟达到60
{
sec=0;
min++; // 分钟加1
if(min==60) // 如果分钟达到60
{
min=0;
hour++; // 小时加1
if(hour==24) // 如果小时达到24
{
hour=0; // 回到0点
}
}
}
}
void main() // 程序入口
{
InitTimer(); // 初始化定时器
while(1) // 无限循环
{
uchar time[6]={hour/10,hour%10, // 将时间转换成数码管显示的数字
min/10,min%10,
sec/10,sec%10};
Display(time); // 在数码管上显示时间
delay_ms(5); // 延时5ms
}
}
```
这个程序使用了定时器中断来实现时间的计时和更新,在每秒钟定时器中断处理函数中将秒、分、时加1,然后将时间转换成数码管显示的数字,最后在数码管上显示。程序中使用了一个延时函数来控制数码管的刷新频率,可以根据需要调整该延时时间。
关于仿真,您可以使用Proteus等仿真软件进行仿真。在仿真中,您需要添加51单片机、6位数码管等元件,并将单片机程序烧录到单片机中。然后运行仿真,观察数码管上的时间变化是否与预期一致。