用C语言编写AT89C51单片机程序,设计一个智能数字钟。

用C语言编写AT89C51单片机程序,设计一个智能数字钟。
基本要求:
1.C语言程序要求是模块化设计。
2.该闹钟基于AT89C51单片机及相关外围电路进行设计。
3.该闹钟有4个数码管(共阳极),可分别显示时间(时、分、秒)、及定时时间(分、秒)。
4.该闹钟有4个按钮,S1是切换显示按键,该键按下时可分别实现切换正常走时显示、设定走时显示、设置定时时间,启动定时,回到正常状态等功能。S2是设定键,即该键按下,将分别选中需要设定的选项。S3键是加键,即按下去表示相应选项加1。S4键是减键,即按下去表示相应的选项减1。
5.该闹钟可以定时时间到,LED将发出提示闪光,且持续30s。
发挥要求:
1.定时时间可被打断,即打断后恢复时继续计时。
2.设置闹钟报警功能;
3.能切换显示年月日等信息。
并实现分,秒倒计时,注意用c语言编写

这是我的课程设计,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++);
}
温馨提示:内容为网友见解,仅供参考

用C语言编写AT89C51单片机程序,设计一个智能数字钟。
sbit s2=P2^3; \/\/s2按键,设置调时 sbit s3=P2^2; \/\/s3按键,加1 sbit s4=P2^1; \/\/s4按键,减1 sbit led1=P0^0;sbit led2=P0^1;sbit led3=P0^2;uchar count;uchar sec,minu,hour,day,week,mon;uchar n_sec,n_minu,n_hour;uint year;uchar set_2=1,set_1=1;uchar hs,hg,...

以AT89C51单片机为核心,制作一个LCD显示的智能电子钟
bit)(io|=(1<<bit))\/\/1#define cbi(io,bit)(io&=~(1<<bit))\/\/0#define gbi(pin,bit)(pin&(1<<bit))\/\/读#define enableInterrupts() {_asm("rim\\n");

at89c51单片机实现电子时钟,不带闹铃。显示时分秒。求图求程序
} return(dat); \/\/将一个字节数据返回 } void tmpwritebyte(uchar dat) \/\/write a byte to ds18b20 { \/\/写一个字节到DS18B20里 uint i;uchar j;bit testb;for(j=1;j<=8;j++){ testb=dat&0x01;dat=dat>>1;if(testb) \/\/write 1 写1部分 ...

急求基于单片机AT89C51的多功能数字电子钟的汇编程序,高手进!~_百度知...
用89C51控制3个HC595,前两个595接8段数码显示管,显示“0”~“9”每秒跳动一次.第3个HC595接8个LED灯,每隔1秒闪烁1次.include<at89x52.h> include<intrins.h> define uchar unsigned char define uint unsigned int uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90...

求程序用AT89C51单片机...用六位数码管实现数字时钟,显示时分秒,用两个...
init();\/\/初始化子程序 miao=0;shi=0;fen=0;while(1){ display(miao,fen,shi);} }void delay(uint z){ uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void display(uchar miao,uchar fen,uchar shi) \/\/ 显示子函数 { P0=0x00;P0=table[miao%10];P2=0x7f;delay(...

用AT89C51单片机编写一个C语言程序实现2个数码管秒计数器,用4个按键...
void t0isr() interrupt 1 { TH0=(65536-50000)\/256;TL0=(65536-50000)%256;num++;if(num>=20){ num=0;sec++;} } main(){ TMOD=0x01;TH0=(65536-50000)\/256;TL0=(65536-50000)%256;TR0=1;ET0=1;EA=1;LED1=0;LED2=0;while(1){ key=P1;if((key&0x0f)!=0x0f){ delay...

单片机at89c51用C语言编写报警器
include<reg51.h>#define uchar unsigned charuchar time;sbit spk=P1^0;void t0isr() interrupt 1{TH0=t_h;TL0=t_l;spk=~spk;}void t1isr() interrupt 3{TH1=(65536-50000)\/256;TL1=(65536-50000)%256;time++;time%=6;if(time==0){t_h=(65536-500)\/256;t_l=(65536-500)%256;...

AT89C51单片机,定时器1,50ms中断,用c语言写出初始化程序和中断函数程序...
include <reg51.h> void InitTimer1(void){ TMOD = 0x10;TH1 = 0x3C;TL1 = 0x0B0;EA = 1;ET1 = 1;TR1 = 1;} void main(void){ InitTimer1();} void Timer1Interrupt(void) interrupt 3 { TH1 = 0x3C;TL1 = 0x0B0;\/\/add your code here!} ...

求用单片机设计一个秒表AT89C51
;汇编程序如下。;使用T0定时方式1,每隔50ms中断一次,用于修改时间及显示 ;使用外部中断0、1,用于控制启动和清零 ;=== ORG 0000H AJMP MAIN ORG 0003H AJMP X0_INT ORG 000BH AJMP T0_INT ORG 0013H AJMP X1_INT MAIN:MOV TMOD,#01H ;T0定时方式1 MOV TH0, #(65536-5000...

单片机 at89c51 6位数码管24小时倒计时程序
void timer0(void)interrupt 1 { TH0=0x00;TL0=0x38;counter--;if(counter==0){ sec--;if(sec==-1){ sec=59;min--;if(min==-1){ min=59;hour--;if(hour==-1){ hour=23;} } } } } \/***主函数***\/ void main(){ uchar i;uchar display[6];counter=5000;sec=min=59...

相似回答