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

我相信电工类的专业,对于单片机这个老东西是很熟悉的。下面。是我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;
			}
		}
	}
}

代码绝对是本人测试过的,绝对准确无误。

上面不涉及到一些电子元件的特性。如不过了解的可以百度,上面多的是。要电路图的。请到上面的下载地址下载哈。转载请说明出处。代码可是写了好久的,这就无偿奉献给大家了。

时间: 2024-10-19 12:58:07

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

电子时钟万年历+51单片机+1602液晶屏+DS1302+DS18B20+按键

这次课程设计要完成的是制作一个基于51单片机的电子时钟的万年历(protues仿真),需要用到1602液晶屏+DS1302+DS18B20+按键等模块.各个的模块就不在一一介绍,直接讲解这个系统的功能,首先是四个按键,第一个按键是选中需要修改时间位置,在按一次选中下一个,依次类推,第二个按键是对数值进行加一,第三个按键对数值进行减一,第四个按键确认. 先放仿真图 然后是代码: main.c #include <REG52.H> #include <intrins.h> #defin

单片机课程设计——《基于AT89S52单片机和DS1302时钟芯片的电子时钟(可蓝牙校准)》

引言 本设计以AT89S52单片机为控制核心,时钟芯片DS1302提供时钟源,配合LCD1602液晶显示模块,组成基本硬件系统,同时利用HC-05嵌入式蓝牙串口通讯模块,可在手机端进行日期.时间的校准.具有走时精确,功耗低,显示直观,调整简单方便等优点. 功能描述 基本显示: 第一行为日期,依次为:年-月-日-星期 第二行为时间,依次为:时:分:秒 说明: 每月的天数,闰年的天数可自动调整 蓝牙校准日期: 命令d+年月日星期+#,如设置2016年12月8日星期四,手机发送命令:d16120804

利用51单片机制作的电子时钟

最近研究起来了单片机,用的是国产STC98C52芯片. STC89C52是STC公司生产的一种低功耗.高性能CMOS8位微控制器,具有 8K 在系统可编程Flash存储器.STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能.在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活.超有效的解决方案. 买了很长时间了可是一直在那里放着,今天重新拿出来写了一段电子时钟的C++程序,利用充电宝供

基于单片机的光控路灯设计含程序和仿真图

基于单片机的光控路灯设计含程序和仿真图本设计是以光敏电阻对于外界光线强弱的感应能力为基础进行的路灯自动化控制系统设计. 当光线强度弱到一定程度的时候, 路灯就会自动灭掉: 当光线强到一定程度的时候, 路灯就会自动开启. 本设计以当外界光线强度弱到使光敏电阻阻值大于等于 200 欧的时候, LED 灯会自动开启:小于 200 欧的时候,自动关闭.完整的资料在闯客网技术论坛可以免费下载,资料群:613377058下载地址:https://bbs.usoftchina.com/thread-21051

基于FPGA的跨时钟域信号处理——亚稳态(V3-FPGA学院)

(V3-FPGA学院教你学习FPGA) 基于FPGA的跨时钟域信号处理--亚稳态 基于FPGA的跨时钟域信号处理--亚稳态 什么是亚稳态? 所有数字器件(例如FPGA)的信号传输都会有一定的时序要求,从而保证每 个寄存器将捕获的输入信号正确输出.为了确保可靠的操作,输入寄存器的信号必须在时钟沿的某段时间(寄存器的建立时间Tsu)之前保持稳定,并且持续到时钟沿之后的某段时间(寄存器的保持时间Th)之后才能改变.而该寄存器的输入反映到输出则需要经过一定的延时(时钟到输出的时间Tco).如果数据信号的

JavaScript电子时钟+倒计时

JavaScript时间类 获取时分秒: getHours() getMinutes(); getSeconds(); 获取年月日: getFullYear(); getMonth() + 1;//获取的月份需要+1: getDate(); //日期 getDay(); //获取的是星期,0-->星期天 实例:(效果图) <!DOCTYPE html> <html lang="en"> <head> <meta charset="

PyQt5用QTimer编写电子时钟

[说明] 本文用 PyQt5 的QTimer类的两种方式实现电子时钟 [效果图] [知识点] QTimer类提供了定时器信号/槽和单触发定时器. 它在内部使用定时器事件来提供更通用的定时器. QTimer很容易使用:创建一个QTimer,使用start()来开始并且把它的timeout()连接到适当的槽.当这段时间过去了,它将会发射timeout()信号. [实现] 1.定时器信号/槽方式 1 class MyTimer(QWidget): 2 def __init__(self, parent

4-2电子时钟中的运算符重载

4-2 电子时钟中的运算符重载 Time Limit: 1000MS Memory limit: 65536K 题目描述 通过本题目的练习可以运算符重载的方法: 设计一个时间类Time,私有数据成员有hour(时).minute(分).second(秒): 公有成员函数有:setHour(int)设置数据成员hour的值,非法的输入默认为12:setMinue(int)设置数据成员minute的值,非法输入默认为0:setSecond(int)设置数据成员second的值,非法输入默认为0:se

一款纯JavaScript的圆形电子时钟

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>一款纯JavaScript的圆形电子时钟丨