我相信电工类的专业,对于单片机这个老东西是很熟悉的。下面。是我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;
}
}
}
}
代码绝对是本人测试过的,绝对准确无误。
上面不涉及到一些电子元件的特性。如不过了解的可以百度,上面多的是。要电路图的。请到上面的下载地址下载哈。转载请说明出处。代码可是写了好久的,这就无偿奉献给大家了。
转载于:https://blog.51cto.com/11640228/1782306