我相信电工类的专业,对于单片机这个老东西是很熟悉的。下面。是我YID的一个电子时钟,包含了一个时钟的基本功能,定时和报时。(如果没有C51和单片机的基础知识可以先看看)话不多说。这来上来了:
资料清单:
(1)原件:
(2) 控制流程图:
(3)电路图(由于电路截图比较大,这里就不贴出来了。需要的朋友可以点击上面的下载地址下载)
(4)最关键的地方来了,(电子时钟的c代码实现):
#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; } } } }
代码绝对是本人测试过的,绝对准确无误。
上面不涉及到一些电子元件的特性。如不过了解的可以百度,上面多的是。要电路图的。请到上面的下载地址下载哈。转载请说明出处。代码可是写了好久的,这就无偿奉献给大家了。
本文出自 “11630228” 博客,请务必保留此出处http://11640228.blog.51cto.com/11630228/1782306
原文地址:http://11640228.blog.51cto.com/11630228/1782306