用51单片机开发板实现电子数字时钟功能,整点报时蜂鸣器发出响声,显示效果如图,用按键调时,调整时间时秒表不跳
sbit key0=P3^0; //定义按键
sbit key1=P3^2;
sbit key2=P3^3;
sbit key3=P3^1;
sbit L1=P2^2; //定义数码管位驱运位
sbit L2=P2^3;
sbit L3=P2^4;
sbit beep=P1^5;
uc min,hour,sec,num,set,x_min,x_hour,x_sec,n_min,n_hour,n_sec,xx,kk; //变量
bit bdata zhi,sz,nl;
uc code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/0,1,2,3,4,5,6,7,8,9,./ //显示数码
void clock();
void delay(ui x) //延时
{
ui i,j;
for(i=0;i<x;i++)
for(j=0;j<100;j++);
}
void delayn(unsigned int i) //延时
{
while(i--);
}
void display() //显示程序
{
if(set==0)
{
x_hour=hour;
x_min=min;
x_sec=sec;
xx=0;
}
else if((set>0)&&(set<4)){
x_hour=hour;
x_min=min;
x_sec=sec;
}
else
{
x_hour=n_hour;
x_min=n_min;
x_sec=0;
}
if((sz==0)&&(xx==1))
P0=0;
else P0=tab[x_hour/10];
L1=1;
L2=1;
L3=1;
delay(1);
P0=0;
L1=1;
L2=1;
L3=1;
if((sz==0)&&(xx==1))
P0=0;
else P0=(tab[x_hour%10]);
L1=0;
L2=1;
L3=1;
delay(1);
P0=0;
L1=1;
L2=1;
L3=1;
P0= 0x40;
L1=1;
L2=0;
L3=1;
delay(1);
P0=0;
L1=1;
L2=1;
L3=1;
if((sz==0)&&(xx==2))
P0=0;
else P0=tab[x_min/10];
L1=0;
L2=0;
L3=1;
delay(1);
P0=0;
L1=1;
L2=1;
L3=1;
if((sz==0)&&(xx==2))
P0=0;
else P0=(tab[x_min%10]);
L1=1;
L2=1;
L3=0;
delay(1);
P0=0;
L1=1;
L2=1;
L3=1;
P0= 0x40;
L1=0;
L2=1;
L3=0;
delay(1);
P0=0;
L1=1;
L2=1;
L3=1;
if((sz==0)&&(xx==3))
P0=0;
else P0=tab[x_sec/10];
L1=1;
L2=0;
L3=0;
delay(1);
P0=0;
L1=1;
L2=1;
L3=1;
if((sz==0)&&(xx==3))
P0=0;
else P0=tab[x_sec%10];
L1=0;
L2=0;
L3=0;
delay(1);
P0=0;
L1=1;
L2=1;
L3=1;
}
void keyscan() //按键处理程序
{
if(key0==0)
{
delay(5);;
while(key0==0);
set++;
if(set>5)
set=0;
}
if(key3==0)
{
delay(5);;
while(key3==0);
nl=1;
}
switch(set)
{
case 1:{
xx=1;
if(key1==0)
{
delay(5);;
while(key1==0);
hour++;
if(hour==24)
hour=0;
}
if(key2==0)
{
delay(5);;
while(key2==0);
hour--;
if(hour==0)
hour=24;
}
};break;
case 2:{
xx=2;
if(key1==0)
{
delay(5);;
while(key1==0);
min++;
if(min==60)
min=0;
}
if(key2==0)
{
delay(5);;
while(key2==0);
min--;
if(min==0)
min=59;
}
};break;
case 3:{
xx=3;
if(key1==0)
{
delay(5);;
while(key1==0);
sec=0;
}
if(key2==0)
{
delay(5);;
while(key2==0);
sec=0;
}
};break;
case 4:{
xx=1;
if(key1==0)
{
delay(5);;
while(key1==0);
n_hour++;
if(n_hour==24)
n_hour=0;
}
if(key2==0)
{
delay(5);;
while(key2==0);
n_hour--;
if(n_hour==0)
n_hour=24;
}
};break;
case 5:{
xx=2;
if(key1==0)
{
delay(5);;
while(key1==0);
n_min++;
if(n_min==60)
n_min=0;
}
if(key2==0)
{
delay(5);;
while(key2==0);
n_min--;
if(n_min==0)
n_min=59;
}
};break;
case 0:
break;
}
}
void init() //初始货程序
{
sec=50;
min=0;
hour=12;
n_min=1;
n_hour=12;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void clock() //蜂鸣器程序
{
unsigned int i;
for(i=20;i>0;i--)
{
beep=~beep;
delayn(80); //延时大约1ms 通过修改此延时时间达到不同的发声效果
}
}//蜂鸣器发声函数
void main() //主程序
{
init();
set=0;
nl=1;
while(1)
{
// display();
keyscan();
if((min==n_min)&&(hour==n_hour)&&sec==0)
{
nl=0;
}
if((nl==0)&&(sz==0))
clock();
}
}
void time0() interrupt 1 //中断计时程序
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
num++;
kk++;
display();
if(kk>20)
{
sz=~sz;
kk=0;
}
if(num==100)
{
num=0;
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
hour++;
}
}
}
}
/*定时1s*/
void timer0()interrupt 1
{
TH0=15536/256;
TL0=15536%256;
i--;
if(i==0){
i=20;
rel_sec++;
if(rel_sec==60){
rel_sec=0;
rel_min++;
if(rel_min==60)
{
rel_min=0;
rel_hour++;
if(rel_hour==24){
rel_hour=0;
}
}
}
Key();
comp();
baoshi();
dis();
}
}
void dis(){
rel_time[0]=rel_hour/10;
rel_time[1]=rel_hour%10;
rel_time[2]='-'-0x30;
rel_time[3]=rel_min/10;
rel_time[4]=rel_min%10;
rel_time[5]='-'-0x30;
rel_time[6]=rel_sec/10;
rel_time[7]=rel_sec%10;
set_time[0]=set_hour/10;
set_time[1]=set_hour%10;
set_time[2]='-'-0x30;
set_time[3]=set_min/10;
set_time[4]=set_min%10;
set_time[5]='-'-0x30;
set_time[6]=set_sec/10;
set_time[7]=set_sec%10;
write_com(0x80+6);
for(j=0;j<8;j++){
write_data(rel_time[j]+0x30);
LCDdelay(5);
}
write_com(0x80+0x40+6);
for(j=0;j<8;j++){
write_data(set_time[j]+0x30);
LCDdelay(5);
}
}
void Key(){
if(keymode==0){
mode++;
if(mode==4)
mode=1;
}
if(mode==1){
ledsec=1;
ledmin=0;
ledhour=0;
}
if(mode==2){
ledsec=0;
ledmin=1;
ledhour=0;
}
if(mode==3){
ledsec=0;
ledmin=0;
ledhour=1;
}
if(cho==0){
choose=0;
}
else{
choose=1;
}
if(keyadd==0){
if(mode==1){
if(choose==0){
rel_sec++;
if(rel_sec==60){
rel_sec=0;
}
}
else{
set_sec++;
if(set_sec==60){
set_sec=0;
}
}
}
else if(mode==2){
if(choose==0){
rel_min++;
if(rel_min==60){
rel_min=0;
}
}
else{
set_min++;
if(set_min==60){
set_min=0;
}
}
}
if(mode==3){
if(choose==0){
rel_hour++;
if(rel_hour==24){
rel_hour=0;
}
}
else{
set_hour++;
if(set_hour==24){
set_hour=0;
}
}
}
}
if(keysub==0){
if(mode==1){
if(choose==0){
if(rel_sec==0){
rel_sec=59;
}
else
rel_sec--;
}
else{
if(set_sec==0){
set_sec=59;
}
else
set_sec--;
}
}
else if(mode==2){
if(choose==0){
if(rel_min==0){
rel_min=59;
}
else
rel_min--;
}
else{
if(set_min==0){
set_min=59;
}
else
set_min--;
}
}
if(mode==3){
if(choose==0){
if(rel_hour==0){
rel_hour=23;
}
else
rel_hour--;
}
else{
if(set_hour==0){
set_hour=23;
}
else
set_hour--;
}
}
}
}
void delay(uint x) //该延时大约100us
{
uchar j;
while(x--)
for(j=0;j<120;j++);
}
void baoshi(){
if(rel_min==0&&rel_sec==1){
bee=1;
delay(500);
bee=0;
}
}
void comp(){
if(rel_hour==set_hour&&rel_min==set_min&&rel_sec==set_sec+1)
{bee=1;
delay(1000);
bee=0;}
}
用下面的代码
//该程序使用两个四位共阴数码管,10.0592Mhz晶振,STC89C52RC单片机,三个轻触开关
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
//单独控制某个引脚的电平不能直接写P3^0=1,必须先定义引脚
sbit key0 = P3^0 ;
sbit key1 = P3^2 ;
sbit key2 = P3^3 ;
uchar s[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //共阴数码管0~9
uchar a = 0 ,hour = 0 , min = 0 , sec = 0 ;
uchar b = 0 , c = 0 , d = 0;
void time0_server_() interrupt 1 // interrupt 0表示外部中断0 , 1表示定时器中断0 , 2表示外部中断1 , 3表示定时器中断1 , 4表示串口中断
{
TH0 = 0x4c ;
TL0 = 0x00 ;
a++;
if(a == 20) //20 * 50 = 1000ms = 1s 即每隔1s“秒”加1
{
a = 0 ;
sec = sec + 1 ;
}
if(sec == 60) //sec=60时清空,“分”加1
{
min = min + 1 ;
sec = 0 ;
}
if(min == 60) //min=60时清空,“时”加1
{
hour = hour + 1 ;
min = 0 ;
}
if(hour == 24) //hour=24时清空
{
hour = 0 ;
}
}
void init_t0()
{
TMOD = 0x01 ; //采用16位定时器
TH0 = 0x4C ; //50ms (65536-50000)/256
TL0 = 0x00 ; // (65536-50000)%256
EA = 1 ; //开启定时器0的中断
ET0 = 1 ; //开启总中断
TR0 = 1 ; //启动定时器0
}
void delay(uint n) //延时函数(运行空项目以达到延迟时间的效果)
{
uint i,j;
for(i = 0 ; i < n ; i ++)
{
for(j = 0 ; j < 120 ; j ++);
}
}
void display1() //在数码管上显示
{
uchar t0 = 0 ,t1 = 0 , t2 = 0 , t3 = 0 , t4 = 0 , t5 = 0 ;
t0 = hour / 10 ; //t0表示时针的十位
t1 = hour % 10 ; //t1表示时针的个位
t2 = min / 10 ; //t2表示分针的十位
t3 = min % 10 ; //t3表示分针的个位
t4 = sec / 10 ; //t4表示秒针的十位
t5 = sec % 10 ; //t5表示秒针的个位
P2 = 0x7f ; //P2^7低电平 0111 1111 控制第一个数码管
P0 = s[t0] ; //用来显示“时”的十位
delay(1) ; //延时大约1ms
P2 = 0xbf ; //P2^6低电平 1011 1111 控制第二个数码管
P0 = s[t1] ; //用来显示“时”的个位
delay(1) ;
P2 = 0xdf ; //P2^5低电平 1101 1111 控制第三个数码管
P0 = 0x40 ; //显示“—”来分割“时”与“分”
delay(1) ;
P2 = 0xef ; //P2^4低电平 1110 1111 控制第四个数码管
P0 = s[t2] ; //用来显示“分”的十位
delay(1) ;
P2 = 0xf7 ; //P2^3低电平 1111 0111 控制第五个数码管
P0 = s[t3] ; //用来显示“分”的个位
delay(1) ;
P2 = 0xfb ; //P2^2低电平 1111 1011 控制第六个数码管
P0 = 0x40 ; //显示“—”来分割“分”与“秒”
delay(1) ;
P2 = 0xfd ; //P2^1低电平 1111 1101 控制第七个数码管
P0 = s[t4] ; //用来显示“秒”的十位
delay(1) ;
P2 = 0xfe ; //P2^0低电平 1111 1110 控制第八个数码管
P0 = s[t5] ; //用来显示“秒”的个位
delay(1) ;
}
void KEY0() //开关0控制“时”加1
{
if(key0 == 0 && c == 0)
{
c = 1 ;
}
if(key0 == 1 && c == 1)
{
c = 0 ;
hour = hour + 1 ;
}
}
void KEY1() //开关1控制“分”加1
{
if(key1 == 0 && d == 0)
{
d = 1 ;
}
if(key1 == 1 && d == 1)
{
d = 0 ;
min = min + 1 ;
}
}
void KEY2() //开关2控制“秒”加1
{
if(key2 == 0 && b == 0)
{
b = 1 ;
}
if(key2 == 1 && b == 1)
{
b = 0 ;
sec = sec + 1 ;
}
}
void main() //主函数
{
init_t0();
while(1)
{
KEY0();
KEY1();
KEY2();
display1();
}
}
把程序贴出来别人才好给你查毛病啊