码迷,mamicode.com
首页 > 其他好文 > 详细

基于单片机的电子时钟(有报时和定时)

时间:2016-05-24 10:38:28      阅读:574      评论:0      收藏:0      [点我收藏+]

标签:单片机   电子时钟   c51   

  我相信电工类的专业,对于单片机这个老东西是很熟悉的。下面。是我YID的一个电子时钟,包含了一个时钟的基本功能,定时和报时。(如果没有C51和单片机的基础知识可以先看看)话不多说。这来上来了:

    要资料点击这里:下载地址1下载地址2

    资料清单:

    技术分享

(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

基于单片机的电子时钟(有报时和定时)

标签:单片机   电子时钟   c51   

原文地址:http://11640228.blog.51cto.com/11630228/1782306

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!