你好,请问51单片机怎么编写程序让8个数码管显示时间(时分秒)的程序可以让我看看么??
发布网友
发布时间:2022-05-09 19:52
我来回答
共1个回答
热心网友
时间:2023-10-16 05:28
//*******时间程序**************//
//*******2010-7-14 00:31:39 *******//
//******* Z X C ******************//
//*******晶体振荡器 12.000MHZ 共阳数码管***//
//*******头文件*********************//
#include <AT89X52.H>
#define uchar unsigned char
#define uint unsigned int
sbit H_KEY=P1^0; //时调整键
sbit M_KEY=P1^1; //分调整键
sbit S_KEY=P1^2; //秒调整键
void sec_tiao(); //秒调整函数
void min_tiao(); //分调整函数
void hou_tiao(); //时调整函数
//********数码管显示与数组关系******//
char DATA_sled[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
/* 0 1 2 3 4 5 6 7 8 9 */
uchar hour=21, min=00, sec=00; //时间初始化
uchar deda=0;
void delay(uchar count); //延时模块
void zhh(); //走时模块
void disp(); //十进制转换模块
/***采用定时器0中断,50MS更新一次***/
void init_timer()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
IE=0x82;
TR0=1;
}
//**************************//
void T0_srv(void) interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
deda++;
}
/*************************
函 数 名:hou_tiao
功 能:时调整
说 明:
入口参数:无
返 回 值:无 ************/
//*******秒调整模块 S***********//
void sec_tiao()
{
while(!S_KEY) disp(); //等待秒调整键松开
deda=0;sec++; //毫秒清零、秒加1
if(sec==60) sec=0; //如果秒等于60,秒变0
}
//*******分调整模块 M***********//
void min_tiao()
{
while(!M_KEY) disp(); //等待分调整键松开
sec=0;min++; //秒清零、分加1
if(min==60) min=0; //如果分等于60,分变0
}
//*******时调整模块 H***********//
void hou_tiao()
{
while(!H_KEY) disp(); //等待时调整键松开
sec=0;hour++; //秒清零,时加1
if(hour==24) hour=0; //如果时等于24,时变0
}
/*********程序**************/
void zhh()
{
if(deda>=20){sec++;deda=0;}
if(sec==60){min++;sec=0;}
if(min==60){hour++;min=0;}
if(hour==24){hour=0;}
}
//******十进制转换模块*****//
void disp()
{
P0=DATA_sled[hour/10]; P2=0xfe; delay(1);
P0=DATA_sled[hour%10]; P2=0xfd; delay(1);
P0=DATA_sled[min/10]; P2=0xfb; delay(1);
P0=DATA_sled[min%10]; P2=0xf7; delay(1);
P0=DATA_sled[sec/10]; P2=0xef; delay(1);
P0=DATA_sled[sec%10]; P2=0xdf; delay(1);
}
//*******延时模块************//
void delay(uchar count)
{
uchar i,j;
for(i=0;i<count;i++)
for(j=0;j<120;j++);
}
//*******主程序*************//
void main()
{
init_timer(); //定时模块
while(1) //无限循环
{
if(!H_KEY) hou_tiao(); //时调整模块
if(!M_KEY) min_tiao(); //分调整模块
if(!S_KEY) sec_tiao(); //秒调整模块
zhh(); //走时模块
disp(); //十进制转换模块
}
}
此程序已经硬件调试通过,希望采纳!