㈠ 谁能告诉我51单片机简单的led数码管时钟程序 24小时制的(c语言版的)
#include "reg52.h"
#define uint unsigned int
#define uchar unsigned char
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar shi,fen,miao;
uchar time;
void delay(uint x)
{
uint y;
for(;x>0;x--)
{
for(y=0;y<124;y++);
}
}
void display(uchar shi,uchar fen,uchar miao)
{
P2=0; //位码
P0=(tab[shi/10]); //段码
delay(2);
P2=1;
P0=(tab[shi%10]);
delay(2);
P2=2; //位码
P0=0x40; //段码
delay(2);
P2=3; //位码
P0=(tab[fen/10]); //段码
delay(2);
P2=4;
P0=(tab[fen%10]);
delay(2);
P2=5; //位码
P0=0x40; //段码
delay(2);
P2=6; //位码
P0=(tab[miao/10]); //段码
delay(2);
P2=7;
P0=(tab[miao%10]);
delay(2);
}
void main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
if(time==20)
{
time=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
shi=0;
}
}
}
display(shi,fen,miao);
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
time++;
}
/*还有什么不明白继续追加*/
㈡ 求助单片机汇编语言:在LED上实现时钟功能
程序就不写了,因为每个人有每个人的写作风格,我给你的程序,你不一定能理解我的思路,拿一个现成的程序让你看,那最终不是你自己的,所以要让自己弄懂,就给你一个思路,你就把程序做出来,那才是自己的东西,这里就给你一个思路
把0……9的数码显示代码存在ROM里,用tab:db……(字型码)来存,做一段1秒的定时程序,在程序的初始化时要做几个计数器,分别对时分秒计数,先从秒开始,设初始值为10,然后是“分”60个,最后一个是“时”也是60,开中断,启动1秒定时器,一秒到了以后,把1的字型码发送到串行口,然后秒计数器减1,在启动1秒定时,到了后,把2字型码发送出去……直到减为0,个位进1,将秒的“十”位字型码发送到出去,分计数器从60开始减计数,这里要注意,定时器不能停,要一直的循环执行1秒定时,采用中断方式,分进位后,再对时计数器减计数,就象这样,不停的减计数,直至溢出后将相应的代码发送出去,基本思路就是这样,关键的就是几个计数器的控制,要主要完成了一个周期后,要重新赋值
㈢ 求一段用51单片机来实现60个led灯循环点亮的程序,没过一秒点亮一盏(就是模拟时钟的秒针)
51单片机来实现60个led灯循环点亮的程序://************************************汇编程序:
#include<at89x51.h>
#define uchar unsigned char
#define uint unsigned int
uchar data count=0;
bit flag=0;
//*********主函数*****************
void main(void)
{
uchar i=0,k=0xfe;
TMOD=0x01;
TH0=0x4c;TL0=0x00;//定时50ms
EA=1;ET0=1;TR0=1;
while(1)
{
if(flag==1){k=k<<1|0x01;flag=0;i++;}
if(i==8){i=0;k=0xfe;}
P1=k;
}
}
//*********中断函数*****************//0111 1111
void dy1s(void) interrupt 1 using 1
{
TH0=0x4c;TL0=0x00;//定时50ms
count++;
if(count==20){flag=1;count=0;} //1s到了
}。C语言程序编写。
void main() { P1=0XFF; /*定义初始状态为全灭*/while(1) { delay(2000); P1=0X7e; delay(2000); P1=0Xbd; delay(2000);P1=0Xdb;delay(2000); P1=0Xe7; delay(2000); P1=0Xdb;delay(2000); P1=0Xbd;delay(2000); P1=0X7e; delay(2000); P1=0XFF; /********此循环使得发光二极管按照07,16,25,34,43,52,61,70的顺序循环交替两两点亮*******/} /*end while*/}/*end main*/
㈣ 用proteus仿真做LED点阵屏幕时钟的时候,时间不真实,过七八秒,秒位才跳一次,CPU过载,请问怎么解决
是用延时子程序计时得到的秒吗?这样就不准确,最好采用定时器并中断的方扒纯式还比较准点,但是仿真运行,这时间肯定是不准裂型的,与电脑的性能有关,如果电脑CPU的频度不高,会影响仿真春源咐速度的。如果是采用定时器及中断方式,就要优化程序了。
㈤ 用51单片机做一个LED显示的电子钟
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="ME-400-A clock";
uchar code table1[]=" --:--:-- ";
uchar code table2[]="ALL:00:00:-- ";
uchar code table3[]=" ";
uchar clk_time[3]; //秒,分,时寄存器初始值
sbit T_RST=P2^2;//ds1302-5
sbit T_IO=P2^3;//ds1302-6
sbit T_CLK=P2^4;//ds1302-7
sbit en=P2^5; //参照LCD1602说明档,使能信号
sbit rw=P2^6; //。。。。。。。。,读写信号端(输入高电频时为读,低电为写)
sbit rs=P2^7; //。。。。。。。。,数据/命令选择端(H/L)
sbit led=P1^0;
sbit la=P1^1;
sbit wela=P1^2;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit up=P3^3;
sbit down=P3^4;
sbit set=P3^2;
sbit did=P1^4;
uchar num,clock_ss,clock_sg,clock_fs,clock_fg,clock_ms,clock_mg,b,clock_s,clock_g;
char hour,mie,sei,c,nhour,nmie,shour,smie;
/******************DS1302:写入操作(上升沿)*********************/
void write_byte(uchar da)
{
uchar i;
ACC=da;
for(i=8;i>0;i--)
{
T_IO=ACC0;
T_CLK=0;
T_CLK=1;
ACC=ACC>>1;
}
}
/******************DS1302:读取操作(下降沿)*****************/
uchar read_byte(void)
{
uchar i;
for(i=0;i<8;i++)
{
ACC=ACC>>1;
T_CLK = 1;
T_CLK = 0;
ACC7 = T_IO;
}
return(ACC);
}
/******************DS1302:写入数据(先送地址,再写数据)***************************/
void write_1302(uchar addr,uchar da)
{
T_RST=0; //停止工作
T_CLK=0; //只有在CLK为低电平时,才能将RST置为高电平,然后才能传输数据
T_RST=1; //重新工作
write_byte(addr); //写入地址
write_byte(da);
T_RST=0;
T_CLK=1;
}
/******************DS1302:读取数据(先送地址,再读数据)**************************/
uchar read_1302(uchar addr)
{
uchar temp;
T_RST=0; //停止工作
T_CLK=0;
T_RST=1; //重新工作
write_byte(addr); //写入地址
temp=read_byte();
T_RST=0;
T_CLK=1; //停止工作
return(temp);
}
/***********************延时程序=a*1ms**************************************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void fn()
{
did=0;
delay(120);
did=1;
delay(120);
did=0;
delay(120);
did=1;
delay(120);
did=0;
delay(120);
did=1;
delay(120);
did=0;
delay(320);
did=1;
delay(400);
}
void write_com(uchar com)
{
led=1;
wela=1;
P0=0xff;
delay(1);
led=0;
wela=0;
P0=0x00;
la=1;
delay(1);
la=0;
rs=0;
P0=com;
delay(5);
en=1;
delay(5);
en=0;
}
void write_data(uchar date)
{
led=1;
wela=1;
P0=0xff;
delay(1);
led=0;
wela=0;
P0=0x00;
la=1;
delay(1);
la=0;
rs=1;
P0=date;
delay(5);
en=1;
delay(5);
en=0;
}
void morning()
{ shour=clock_ss*10+clock_sg;
smie=clock_fs*10+clock_fg;
if(b==0)
{
if(nhour==shour)
{
if(smie>=nmie)
{
fn();
}
}
}
}
void init()
{
b=0;
P0=0xff;
delay(5);
led=1;
delay(5);
P0=0xff;
led=0;
la=0;
wela=1;
delay(5);
wela=0;//关ME-400开发板数码管
nhour=0;
nmie=0;
rw=0;
en=0;
write_com(0x38);//设置液晶
write_com(0x0c);//设光标等
write_com(0x06);//写一个字符地址指针加1且光标加1
write_com(0x01);//清屏
write_com(0x80);//设置s地址指针
}
void display(uchar add,date)
{
if(b==0)
{
clock_ms=clk_time[0]/ 16; clock_mg=clk_time[0]%16;
led=0;
clock_fs=clk_time[1]/ 16; clock_fg=clk_time[1]%16;
led=0;
clock_ss=clk_time[2]/ 16; clock_sg=clk_time[2]%16;
write_com(0x80+0x44);
write_data(0x30+clock_ss);
write_com(0x80+0x45);
write_data(0x30+clock_sg);
write_com(0x80+0x47);
write_data(0x30+clock_fs);
write_com(0x80+0x48);
write_data(0x30+clock_fg);
write_com(0x80+0x4a);
write_data(0x30+clock_ms);
write_com(0x80+0x4b);
write_data(0x30+clock_mg);
}
if(b!=0)
{
clock_s=date/ 10; clock_g=date%10;
write_com(0x80+0x40+add);
write_data(0x30+clock_s);
write_data(0x30+clock_g);
}
}
void key()
{
uchar clock_s1, clock_s2, clock_f1, clock_f2;
rw=0;
if(set==0)
{
delay(10);
if(set==0)
{
did=0;
delay(10); did=1;
b++;
}
while(!set);
if(b==1)
{
hour=clock_ss*10+clock_sg;
mie=clock_fs*10+clock_fg;
write_com(0x80+0x45);
write_com(0x0f);
}
if(b==2)
{
write_com(0x80+0x48);
}
if(b==3)
{
write_com(0x80+0x40);
for(num=0;num<13;num++)
{
write_data(table2[num]);
}
write_com(0x80+0x45); display(4,nhour);write_com(0x80+0x45);
}
if(b==4)
{
write_com(0x80+0x48);
display(7,nmie); write_com(0x80+0x48);
}
if(b==5)
{
write_com(0x80+0x40);
for(num=0;num<4;num++)
{
write_data(table3[num]);
}
write_com(0x80+0x45);
write_com(0x0c);
b=0;
clock_s1=hour/10;//十进制转十六进制
clock_s2=hour%10;//十进制转十六进制
clock_s1=clock_s1&0xff;//十进制转十六进制
clock_s2=clock_s2&0xff;//十进制转十六进制
clock_s1<<=4;//十进制转十六进制
clock_s1=clock_s1|clock_s2;//十进制转十六进制
clock_f1=mie/10;//十进制转十六进制
clock_f2=mie%10;//十进制转十六进制
clock_f1=clock_f1&0xff; //全1出1 与运算
clock_f2=clock_f2&0xff;//十进制转十六进制
clock_f1<<=4;//十进制转十六进制
clock_f1=clock_f1|clock_f2;//十进制转十六进制
write_1302(0x8e,0x00); //WP=0 写操作
write_1302(0x80,0x00);//写秒
write_1302(0x82,clock_f1);//写分
write_1302(0x84,clock_s1);//写时
write_1302(0x86,0x14);//写日
write_1302(0x88,0x02);//写月
write_1302(0x8a,0x06);//写星期
write_1302(0x8c,0x09);
write_1302(0x8e,0x80); //WP=1 写保护
}
}
if(b!=0)
{
if(up==0)
{
delay(10);
if(up==0)
{
did=0;
delay(10);
did=1;
while(!up);
if(b==1)
{
hour++;
if(hour>=24)
{
delay(1);
hour=0;
}
display(4,hour);
write_com(0x80+0x45);
}
if(b==2)
{
mie++;
if(mie>=60)
{
mie=0;
}
display(7,mie);
write_com(0x80+0x48);
}
if(b==3)
{
nhour++;
if(nhour>=24)
{
delay(1);
nhour=0;
}
display(4,nhour);
write_com(0x80+0x45);
}
if(b==4)
{
nmie++;
if(nmie>=60)
{
nmie=0;
}
display(7,nmie);
write_com(0x80+0x48);
}
}
}
if(down==0)
{
delay(10);
if(down==0)
{
did=0;
delay(10);
did=1;
while(!down);
if(b==1)
{
hour--;
if(hour<0)
{
hour=23;
}
display(4,hour);
write_com(0x80+0x45);
}
if(b==2)
{
mie--;
if(mie<0)
{
mie=59;
}
display(7,mie);
write_com(0x80+0x48);
}
if(b==3)
{
nhour--;
if(nhour<0)
{
nhour=23;
}
display(4,nhour);
write_com(0x80+0x45);
}
if(b==4)
{
nmie--;
if(nmie<0)
{
nmie=59;
}
display(7,nmie);
write_com(0x80+0x48);
}
}
}
}
}
void main()
{
uchar temp=0x80;
uchar i;
init();
for(num=0;num<14;num++)
{
write_data(table[num]);
delay(100);
}
write_com(0x80+0x40); // 设置数据地址指针为0X40
for(num=0;num<15;num++)
{
write_data(table1[num]);
}
/*for(num=0;num<16;num++)
{
write_com(0x18);
delay(20);
}*/
write_1302(0x8e,0x00);
write_1302(0x90,0xa4);
write_1302(0x8e,0x80);
while(1)
{
if(b==0)
{ temp=0x81;
for(i=0;i<3;i++)
{
clk_time[i]=read_1302(temp);
temp+=2;
}
display(0x4b,0x00);
}
morning();
key();
}
}
1602做的时钟
㈥ 如何做一个单片机电子时钟
这个很简单啊,两种思路:1,用单片机定时器来做,优点是外围电路简单,只需要一个单片机最小系统,和一个显示模块(1602液晶比较好);缺点是:定时不是很准,跑的时间长了会有误差,而且主要是程序,要写很多,不过程序不是很难。2,用时钟芯片,一般都用DS1302,还需要单片机最小系统和显示模块,优点是:定时准确,误差很小,在有备用电池的情况下,即使单片机掉电,也可以维持很长时间,程序相对简单。缺点是:外围电路比前者相对复杂一点。如果想做个实际的东西拿来用,建议使用第二种方法,如果是想锻炼自己的编程能力的话,选第一种吧。祝成功!
㈦ 单片机制作电子时钟用DS1302做时钟源,一个16X16LED点阵显示屏滚动显示,可通过按键调节时间。
这要是仿真,还省点事。要做实物,费时了,用万能电路板焊能快些。
㈧ 51单片机多功能LED点阵显示数字时钟
数字时钟
这段程序是在PRTUES上完全好使
你可以根据 程序自己在PROTUES上画图
#include<reg51.h>
#define uint unsigned int
char code tab[]=;
char code table[]=;
sbit an=P2^5;
sbit wei=P2^6;
sbit button1=P1^0;
sbit button2=P1^1;
sbit button3=P1^2;
sbit button4=P1^3;
sbit button5=P1^4;
sbit button6=P1^5;
sbit button7=P1^6;
sbit button8=P1^7;
void delay(uint z);
void start();
void display();
static char a,b,c,d,k,e,f,g,h;
static char num1,num2,num3,num4;
void main()
{ start();
while(1)
if(button2==0)
if(button3==0)
if(button4==0)
{ delay(10);
if(button4==0)
}}
while(button4==0)
}
if(button5==0)
{ delay(10);
if(button5==0)
}
while(button5==0)
}
if(button6==0)
{ delay(10);
if(button6==0)
}
while(button6==0)
}
if(button7==0)
{delay(10);
if(button7==0)
{num3--;
if(num3<0)
}
while(button7==0)
}
if(button8==0)
{delay(10);
if(button8==0)
while(button8==0)
}
display();
} }
void start()
{ EA=1;
TMOD=0x01;ET0=1;
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;}
void delay(uint z )
{ uint x,y;
for(x=z;x>0;x--)
for(y=120;y>0;y--);}
void timer1() interrupt 1
{ TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
k++;
if(k==2) //总忘k把清零
{k=0;num1++;
if(num1==100)
{num1=0;num2++;
if(num2==60){num2=0;num3++;
if(num3==60){num3=0;num4++;
if(num4==24)}
}} }}
void display()
{a=num1/10;b=num1%10;c=num2/10;d=num2%10;
e=num3/10;f=num3%10;g=num4/10;h=num4%10;
wei=1;P0=0x80;wei=0;
an=1;P0=tab[b];an=0;delay(1);
P0=0x00;
wei=1;P0=0x40;wei=0;
an=1;P0=tab[a];an=0;delay(1);
P0=0x00;
wei=1;P0=0x20;wei=0;
an=1;P0=tab[d];an=0;
an=1;P0=table[d];an=0;delay(1);
P0=0x00;
wei=1;P0=0x10;wei=0;
an=1;P0=tab[c];an=0;delay(1);
P0=0x00;
wei=1;P0=0x08;wei=0;
an=1;P0=table[f];an=0;delay(1);
an=1;P0=tab[f];an=0;delay(1);
P0=0x00;
wei=1;P0=0x04;wei=0;
an=1;P0=tab[e];an=0;delay(1);
P0=0x00;
wei=1;P0=0x02;wei=0;
an=1;P0=tab[h];an=0;
an=1;P0=table[h];an=0;delay(1);
P0=0x00;
wei=1;P0=0x01;wei=0;
an=1;P0=tab[g];an=0;delay(1);
P0=0x00;
}
㈨ 利用AT89C51单片机设计简易电子钟(六位),通过8位LED数码管实现时间显示;系统可以通过三个按键实现时间
程序设计思路:1.利用单片机内部定时器作为计时器,调用timer函数;2、设计一套按键子程序;(3)设计一套数码显示管子程序。下列提供一套程序供参考。
#include<iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
const uchar table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9对应字符
const uchar key_value[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
uchar data[4]={0}; //显示初始值为0
uint count=0; //初始计数值为0
uchar keynum;
void port_init() //端口初始化函数
{DDRA=0XFF; //端口A为推挽1输出
PORTA=0XFF;
PORTB=0XFF; //端口B为推挽1输出
DDRB=0XFF;
DDRC=0XFF; //端口C为不带上拉电阻的输入
PORTC=0XFF;
DDRD=0XFF; //端口D低4位为输出
PORTD=0X0F;
}
void delay(uint j) //延时函数
{uint k;
while(j--)
{for(k=1000;k>0;k--) ;}
}
void display(uchar *p) //显示函数
{uchar i,sel=0x01;
for(i=0;i<4;i++)
{PORTA=sel; //选通最右边的数码管
PORTB=table[p[i]]; //送字型码
delay(1);
sel=sel<<1; //左移一位
}
}
uchar get_key(void)
{if((PIND&0X0F)!=0X0F) delay(3);
{
PORTD=0XEF;
switch(PIND&0X0F)
{case 0x0e: keynum=key_value[0];break;
case 0x0d: keynum=key_value[4];break;
case 0x0b: keynum=key_value[8];break;
case 0x07: keynum=key_value[12];break;
default:break;
}
PORTD=0xdf;
switch(PIND&0X0F)
{case 0x0e:keynum=key_value[1];break;
case 0x0d:keynum=key_value[5];break;
case 0x0b:keynum=key_value[9];break;
case 0x07:keynum=key_value[13];break;
default:break;
}
PORTD=0xbf;
switch(PIND&0X0F)
{case 0x0e:keynum=key_value[2];break;
case 0x0d:keynum=key_value[6];break;
case 0x0b:keynum=key_value[10];break;
case 0x07:keynum=key_value[14];break;
default:break;
}
PORTD=0x7f;
switch(PIND&0X0F)
{case 0x0e:keynum=key_value[3];break;
case 0x0d:keynum=key_value[7];break;
case 0x0b:keynum=key_value[11];break;
case 0x07:keynum=key_value[15];break;
default:break;
}
while((PIND&0x0f)!=0x0f);
}
return keynum;
}
void process(uint i,uchar *q) //拆分BCD码函数,显示千、百、十、个位
{ q[0]=i/1000;
i=i%1000;
q[1]=i/100;
i=i%100;
q[2]=i/10;
i=i%10;
q[3]=i;
}
void main(void)
{port_init();
PORTB=0xff;
PORTA=0X00;
delay(50);
PORTA=0xff;
while(1)
{get_key();
count=keynum;
process(count,data);
display(data);
}
}
㈩ 谁有proteus LED点阵时钟仿真,最好proteus图形,单片机是c51的哦,程序是c语言的哦急急急!!!
#include<reg51.h>
unsignedcharseven_seg[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};
unsignedcharflash,mode=0;
charmin=50,hour=12,hour_rom,min_rom,sec=25;
unsignedcharj,k;
unsignedinti;
unsignedcharkey_set_s,key_up_s,key_down_s,key_reset_s;
sbitP0_7=P0^7;
sbitkey_set=P3^4;
sbitkey_up=P3^5;
sbitkey_down=P3^6;
sbitkey_reset=P3^7;
sbitbuzzer=P1^0;
bitdop,bb;//声明
voiddelay(unsignedintx)//延时
{
while(x--);
}
voidtimer0_isr(void)interrupt1//中断枯瞎基服务函数
{
TH0=0xf8;//为65535-2000=63535转化为16进制取高八位
TL0=0x2f;//取低八位
i++;
bb=!bb;
if(i>=250)//半秒,五百一秒
{
i=0;
k++;
flash=~flash;
dop=!dop;
}
if(k>=2)//大于二归零
{
k=0;
sec++;
}
if(sec>=60)//秒
{
sec=0;
min++;
}
if(min>=60)//分
{
min=0;
hour++;
}
if(hour>=24)//小时
hour=0;
P0=0xff;//P0初始化为全111111111
if(mode==0)//正常显示
{
switch(j)//控制语句
{
case0:P0=seven_seg[sec%10];P2=0xfe;break;//秒个位
case1:P0=seven_seg[sec/10];P2=0xfd;break;//秒十位
case2:P0=seven_seg[min%10];P0_7=dop;P2=0xfb;break;
case3:P0=seven_seg[min/10];P2=0xf7;break;
case4:P0=seven_seg[hour%10];P0_7=dop;P2=0xef;break;//dop为小数点
case5:P0=seven_seg[hour/10];P2=0xdf;break;
}
}
////////////////////
if(mode==1)//模式一C1状态
{
switch(j)
{
case0:P0=seven_seg[min%10];P2=0xfe;break;
case1:P0=seven_seg[min/10];P2=0xfd;break;
case2:P0=seven_seg[hour%10]|没谨flash;P2=0xfb;break;//flash为闪烁
case3:P0=seven_seg[hour/10]|flash;P2=0xf7;break;
case4:P0=seven_seg[1];P2=0xef;break;//1为C1状态
case5:P0=0xc6;P2=0xdf;break;//0xc6为显示C
}
}神闷
////////////////////
if(mode==2)//模式二C1状态
{
switch(j)
{
case0:P0=seven_seg[min%10]|flash;P2=0xfe;break;
case1:P0=seven_seg[min/10]|flash;P2=0xfd;break;
case2:P0=seven_seg[hour%10];P2=0xfb;break;
case3:P0=seven_seg[hour/10];P2=0xf7;break;
case4:P0=seven_seg[1];P2=0xef;break;
case5:P0=0xc6;P2=0xdf;break;
}
}
////////////////////
if(mode==3)//模式三C2状态
{
switch(j)
{
case0:P0=seven_seg[min_rom%10];P2=0xfe;break;
case1:P0=seven_seg[min_rom/10];P2=0xfd;break;
case2:P0=seven_seg[hour_rom%10]|flash;P2=0xfb;break;
case3:P0=seven_seg[hour_rom/10]|flash;P2=0xf7;break;
case4:P0=seven_seg[2];P2=0xef;break;
case5:P0=0xc6;P2=0xdf;break;
}
}
////////////////////
if(mode==4)//模式四C2状态
{
switch(j)
{
case0:P0=seven_seg[min_rom%10]|flash;P2=0xfe;break;
case1:P0=seven_seg[min_rom/10]|flash;P2=0xfd;break;
case2:P0=seven_seg[hour_rom%10];P2=0xfb;break;
case3:P0=seven_seg[hour_rom/10];P2=0xf7;break;
case4:P0=seven_seg[2];P2=0xef;break;
case5:P0=0xc6;P2=0xdf;break;
}
}
j++;
if(j>=6)
j=0;
}
voidkey(void)//调用开关函数
{
////////////////
if(key_set==0)//设置
{
delay(300);
if(key_set==0)
key_set_s=1;
}
if(key_set==1&&key_set_s==1)
{
mode++;
if(mode>=5)
mode=1;
key_set_s=0;
}
/////////
if(key_up==0)//上调
{
delay(300);
if(key_up==0)
key_up_s=1;
}
if(key_up==1&&key_up_s==1)
{
if(mode==1)hour++;
if(mode==2)min++;
if(mode==3)hour_rom++;if(hour_rom>=24)hour_rom=0;
if(mode==4)min_rom++;if(min_rom>=60)min_rom=0;
key_up_s=0;
}
/////////////////
if(key_down==0)//下调
{
delay(300);
if(key_down==0)
key_down_s=1;
}
if(key_down==1&&key_down_s==1)
{
if(mode==1)hour--;if(hour<0)hour=23;
if(mode==2)min--;if(min<0)min=59;
if(mode==3)hour_rom--;if(hour_rom<0)hour_rom=23;
if(mode==4)min_rom--;if(min_rom<0)min_rom=59;
key_down_s=0;
}
/////////////////
if(key_reset==0)//复位
{
delay(300);
if(key_reset==0)
key_reset_s=1;
}
if(key_reset==1&&key_reset_s==1)
{
key_reset_s=0;
mode=0;
}
}
voidtimer0_init(void)//timero初始化函数
{
TMOD=0x01;//方式1
TH0=0xf8;
TL0=0x2f;
EA=1;//中断开关
ET0=1;//中断小开关
TR0=1;//开始计数
}
voidmain(void)//主函数
{
timer0_init();
while(1)
key();
{
if(hour==hour_rom&&min==min_rom)
buzzer=bb;//buzzer为蜂鸣器
}
}