用C语言编写AT89C51单片机程序,设计一个智能数字钟。10
发布网友
发布时间:2024-02-09 04:45
我来回答
共2个回答
热心网友
时间:2024-03-04 10:13
这是我的课程设计,6个数码管,显示时分秒,三个按钮P0.0、P0.1、P0.2可以调时,有8个彩灯(可以不要),没闹钟、倒计时之类的。呵呵。
#include<AT89X52.H>
#define uchar unsigned char
int i;
//**********************************************************************时钟的
uchar one[10]={0xbf,0xb0,0xdb,0xcf,0xe6,0xed,0xfd,0x07,0xff,0xef}; //NPN,阿拉伯数码(共阳数码管专用)
//uchar one[10]={0x40,0x4f,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //PNP三极管,低电平使能
uchar three[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //扫描
int num[6]={2,3,5,9,3,6};
uint a,t,d;
void time(); //计时
void turn(); //调时
void delay(int); //延时
//***********************************************************************彩灯的
uchar light[24]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,
0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,
0x7e,0xbd,0xdb,0xe7,0xe7,0xdb,0xbd,0x7e};
int n,m=6,h;
void go();
//====================================主函数========================================
void main()
{
TMOD=0x02;
TH0=0x06;
TL0=0x06;
TR0=1; //允许计数
ET0=1; //允许中断
EA=1;
for(;;) //主循环
{
time();
for(a=0;a<6;a++)
{
P3=three[a]; //扫描
P1=one[num[a]];
delay(1);
}
turn();
go();
}
}
//=====================================中断函数=================================
void work()interrupt 1 using 0
{
t++; //时钟时间
h++;
}
//=====================================计时子函数================================
void time()
{
if(t>=4000) //中断了4000次,一秒
{
t=0;
num[5]++;
if(num[5]>9) //1
{
num[5]=0;
num[4]++;
}
if(num[4]>5) //2
{
num[4]=0;
num[3]++;
}
if(num[3]>9) //3
{
num[3]=0;
num[2]++;
}
if(num[2]>5) //4
{
num[2]=0;
num[1]++;
}
if(num[1]>9) //5
{
num[1]=0;
num[0]++;
}
if(num[0]>1) //6
if(num[1]>3)
{
num[0]=0;
num[1]=0;
}
}
}
//====================================调时子程序===========================================
void turn()
{
if(P0_0==0) //小时
{
delay(5);
if(P0_0==0)
{
num[1]++;
if(num[1]>9)
{
num[1]=0;
num[0]++;
}
if(num[0]>1)
if(num[1]>3)
{
num[0]=0;
num[1]=0;
}
}
while(P0_0==0);
}
if(P0_1==0) //分钟
{
delay(5);
if(P0_1==0)
{
num[3]++;
if(num[3]>9)
{
num[3]=0;
num[2]++;
}
if(num[2]>5)
{
num[2]=0;
}
}
while(P0_1==0);
}
if(P0_2==0)
{
delay(5);
if(P0_2==0)
{
num[5]++;
if(num[5]>9)
{
num[5]=0;
num[4]++;
}
if(num[4]>5)
num[4]=0;
}
while(P0_2==0);
}
}
//========================================彩灯===========================================
void go()
{
if(h>=500*m) //1000=0.125秒
{
h=0;
P2=light[n];
n++;
}
if(n==24)
{
n=0;
m--;
}
if(m==0)
m=6;
}
//=====================================延时子程序==========================================
void delay(int c)
{
for(i=0;i<30*c;i++);
}
热心网友
时间:2024-03-04 10:15
http://hi.baidu.com/%D0%A1%B5%F1lns/blog/item/27b4fb5208ec6d0b0df3e373.html