|
#include<reg51.h> //头文件 定义单片机内部寄存器#define uchar unsigned char //宏定义 缩写成uchar#define uint unsigned int//宏定义 缩写成uint//数码管位端口定义sbit w1=P2^2;sbit w2=P2^3;sbit w3=P2^4;sbit w4=P2^5;sbit w5=P2^6;sbit w6=P2^7;////////按键/////////////////////sbit key1=P3^4;//设置时间sbit key2=P3^5;//加sbit key3=P3^6;//减 sbit key4=P3^7;//闹钟sbit beep=P1^0;//蜂鸣器/////共阴数码管段信号编码////////uchar code table[10]=//0---9{0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6};//uchar num,miao,fen,shi;//计时 时分秒变量uchar fen1,shi1;//闹钟变量uchar d1,d2,d3,d4,d5,d6;//显示拆分数据void delay(uint ms)//1ms 延时函数 数据保持用的 括号里面是几大概就延时多少ms{ uchar x; for(ms;ms>0;ms--) for(x=110;x>0;x--);}void display()//显示函数{ d1=shi/10;//小时 d2=shi%10;// d3=fen/10;// d4=fen%10;//分钟 d5=miao/10;// d6=miao%10;//秒 w1=0;P0=table[d1];delay(10);//第1位显示数据 P0=0x00;w1=1;//关闭显示消除动态扫描阴影 w2=0;P0=table[d2]|0x01;delay(10);//第2位显示数据 P0=0x00;w2=1;//关闭显示消除动态扫描阴影 w3=0;P0=table[d3];delay(10);//第3位显示数据 P0=0x00;w3=1;//关闭显示消除动态扫描阴影 w4=0;P0=table[d4]|0x01;delay(10);//第4位显示数据 P0=0x00;w4=1;//关闭显示消除动态扫描阴影 w5=0;P0=table[d5];delay(10);//第5位显示数据 P0=0x00;w5=1;//关闭显示消除动态扫描阴影 w6=0;P0=table[d6];delay(10);//第6位显示数据 P0=0x00;w6=1;//关闭显示消除动态扫描阴影}void disp_set()//显示函数{ d1=shi1/10;//小时 d2=shi1%10;// d3=fen1/10;// d4=fen1%10;//分钟 w1=0;P0=table[d1];delay(10);//第1位显示数据 P0=0x00;w1=1;//关闭显示消除动态扫描阴影 w2=0;P0=table[d2]|0x01;delay(10);//第2位显示数据 P0=0x00;w2=1;//关闭显示消除动态扫描阴影 w3=0;P0=table[d3];delay(10);//第3位显示数据 P0=0x00;w3=1;//关闭显示消除动态扫描阴影 w4=0;P0=table[d4]|0x01;delay(10);//第4位显示数据 P0=0x00;w4=1;//关闭显示消除动态扫描阴影 w5=0;P0=table[0];delay(10);//第5位显示数据 P0=0x00;w5=1;//关闭显示消除动态扫描阴影 w6=0;P0=table[0];delay(10);//第6位显示数据 P0=0x00;w6=1;//关闭显示消除动态扫描阴影}void didi()//滴滴声 设置时间时调用{ uchar i; beep=0;for(i=0;i<5;i++)display(); //开启蜂鸣器 保持响声 beep=1;for(i=0;i<5;i++)display(); //关闭蜂鸣器 保持关闭}void didi1()//滴滴声 设置闹钟时调用{ uchar i; //在括号里调用显示函数也是起到延时作用 为了防止下响声音的时候数码管抖动 beep=0;for(i=0;i<5;i++)disp_set();//开启蜂鸣器 保持响声 beep=1;for(i=0;i<5;i++)disp_set();//关闭蜂鸣器 保持关闭}void keyscan()//调时按键扫描函数{ uchar k_flag,set_flag; if(key1==0)//按键按下 一下所有按键执行的模式都是一样的 { delay(10);//延时消除按键抖动 if(key1==0)//确定按键按下 { k_flag=1; didi();//滴滴声 } while(key1==0)display();//等待按键松手 } while(k_flag==1)//开始调整小时数据 { display(); if(key1==0) { delay(10);//延时消抖 if(key1==0) { k_flag=2; didi();//滴滴声 } while(key1==0)display(); } if(key2==0) { delay(10); if(key2==0) { shi++;didi();//滴滴声 if(shi==24)shi=0; } while(key2==0)display(); } if(key3==0) { delay(10); if(key3==0) { if(shi==0)shi=24; shi--;didi();//滴滴声 } while(key3==0)display(); } } while(k_flag==2)//开始调整分钟数据 { display(); if(key1==0) { delay(10);//延时消抖 if(key1==0) { k_flag=3; didi();//滴滴声 } while(key1==0)display(); } if(key2==0) { delay(10); if(key2==0) { fen++;didi();//滴滴声 if(fen==60)fen=0; } while(key2==0)display(); } if(key3==0) { delay(10); if(key3==0) { if(fen==0)fen=60; fen--;didi();//滴滴声 } while(key3==0)display(); } } while(k_flag==3)//开始调整秒数据 { display(); if(key1==0) { delay(10);//延时消抖 if(key1==0) { didi();//滴滴声 didi();//滴滴声 k_flag=0; } while(key1==0)display(); } if(key2==0) { delay(10); if(key2==0) { didi();//滴滴声 miao++; if(miao==60)miao=0; } while(key2==0)display(); } if(key3==0) { delay(10); if(key3==0) { didi();//滴滴声 if(miao==0)miao=60; miao--; } while(key3==0)display(); } }///////设置定时时间/////////////////////////////////////////////// if(key4==0) { delay(10); if(key4==0) { didi1();//滴滴声 set_flag=1; } while(key4==0)disp_set(); } while(set_flag==1) { disp_set(); if(key2==0) { delay(10); if(key2==0) { didi1();//滴滴声 shi1++; if(shi1==24)shi1=0; } while(key2==0)disp_set(); } if(key3==0) { delay(10); if(key3==0) { didi1();//滴滴声 if(shi1==0)shi1=24; shi1--; } while(key3==0)disp_set(); } if(key4==0) { delay(10); if(key4==0) { didi1();//滴滴声 set_flag=2; } while(key4==0)disp_set(); } } while(set_flag==2) { disp_set(); if(key2==0) { delay(10); if(key2==0) { didi1();//滴滴声 fen1++; if(fen1==60)fen1=0; } while(key2==0)disp_set(); } if(key3==0) { delay(10); if(key3==0) { didi1();//滴滴声 if(fen1==0)fen1=60; fen1--; } while(key3==0)disp_set(); } if(key4==0) { delay(10); if(key4==0) { didi1(); didi1();//滴滴声 set_flag=0; } while(key4==0)disp_set(); } }}void b_s()//报时{ uchar i; if((shi>=7)&&(shi<=20)) ////七点到晚上八点//整点报时,蜂鸣器提示音 { if((fen==0)&&(miao<=15)) //整点报时15S 需要更改 可以自己下载程序改动 { beep=0;for(i=0;i<5;i++)display();//开启蜂鸣器 保持响声 beep=1;for(i=0;i<5;i++)display(); } } if((shi1!=0)||(fen1!=0))//都等于0的时候不是闹钟时间 { if((shi1==shi)&&(fen1==fen)&&(miao<=15))////闹钟报时15S 需要更改 可以自己下载程序改动 { beep=0;for(i=0;i<5;i++)display();//开启蜂鸣器 保持响声 beep=1;for(i=0;i<5;i++)display();//关闭蜂鸣器 保持关闭 } }}void main(){ TMOD=0x01;//定时器0 16位计时模式 TH0=(65536-50000)/256; //50ms定时 TL0=(65536-50000)%256; //50ms定时 EA=1;//开启总中断 ET0=1;//开启定时器中断 TR0=1;//开启定时器 while(1) { display();//显示函数 keyscan();//按键扫描函数 b_s();//报时 }}void T0_time() interrupt 1{ TH0=(65536-50000)/256; //50ms定时 TL0=(65536-50000)%256; //50ms定时 num++;//加一次50ms定时 if(num==20)//1S { num=0; miao++; if(miao==60) { miao=0; fen++; if(fen==60) { fen=0; shi++; if(shi==24)shi=0; } } }}
|
|