用数码管设计的可调式电子钟
基于数码管的电子时钟设计
2012~ 2013 学年第2 学期《单片机原理及应用》课程设计报告题目:基于数码管的电子时钟设计专业:自动化班级:电气工程系2013年5月1日1、任务书摘要随着人类科技文明的发展,人们对于时钟的要求在不断地提高。
时钟已不仅仅被看成一种用来显示时间的工具,在很多实际应用中它还需要能够实现更多其它的功能。
本设计主要基于单片机技术原理,设计制作出一个电子时钟系统。
6位LED 数码管显示,使用按键扫描进行时间校准。
这种实现方法的优点是电路简单,性能可靠,实时性好,时间精确,操作简单,编程容易。
最后将设计的时钟系统在Protues仿真软件上进行仿真验证所设计的时钟系统稳定可靠。
关键词: AT89C51单片机;电子时钟;数码管;按键扫描基于数码管的电子时钟设计目录摘要........................................................................................ 错误!未定义书签。
第一章绪论................................................................................ 错误!未定义书签。
1.1 单片机的应用和特点............................................................ 错误!未定义书签。
1.2 单片机的发展趋势......................................................... 错误!未定义书签。
1.3 电子时钟简介及其基本特点......................................... 错误!未定义书签。
第二章控制系统的硬件设计...................................................... 错误!未定义书签。
LED数码管设计的可调式电子钟说明说
LED数码管设计的可调式电子钟说明说可调式电子钟的设计理念是提供用户多样化的时间显示和闹钟设定选项,以满足用户不同的需求和喜好。
以下是对设计的详细说明:1.数码管显示:LED数码管采用7段共阳极连接方式,每个数码管由7个LED灯组成,通过控制各个LED灯的点亮与否,可以显示0-9的数字。
数码管的显示仿真效果要清晰、鲜明,确保用户可以轻松辨认时间。
2.时间调节功能:可调式电子钟具备时间调节的功能,用户可以通过按钮或旋钮调整时间。
其中旋钮可以实现小时和分钟的调节,而按钮可以实现小时和分钟的增加或减少。
设计时需考虑人机交互的便利性,确保时间调节操作简单明了。
3.闹钟设定:可调式电子钟还具备闹钟功能,用户可以设定一个或多个闹钟时间点。
用户可以通过按钮或旋钮设置闹钟的小时和分钟,还可以设定是否重复响铃。
闹铃可以通过声音、震动或LED灯闪烁等方式提醒用户。
为了避免误操作,设计时需要考虑设置闹钟的过程,确保用户能够轻松设置闹钟。
4.电源供应:可调式电子钟可采用外部电源或内置电池供电。
设计时需考虑到电源的稳定性和可靠性,确保时钟长时间准确运行。
当外部电源断开时,内置电池可以提供备用电源,防止时间设置的丢失。
5.背光功能:可调式电子钟还可以考虑添加背光功能,在光线不好的情况下,用户可以通过按下按钮或通过传感器自动点亮背光。
背光的亮度可以根据用户偏好进行调节。
6.美观设计:除了功能性,可调式电子钟的外观设计也很重要。
设计时可以考虑采用简约设计风格,以及时尚的外壳材料。
同时,数字显示的对齐和间距,以及按钮和旋钮的位置、大小都需要细致推敲,确保整体外观美观大方。
总之,可调式电子钟的设计需要满足用户对时间显示和闹钟功能的需求。
通过合理的控制功能,人性化的设计以及简洁好看的外观,可为用户提供一台方便、易用的电子钟。
四位数码管秒闪烁可调时钟
四位数码管可调时钟(1)
/****本程序中,晶振为12MHz, ****/
/****时间控制采用定时中断控制方式。****/
P21=1;
P22=1;
P23=1;
P0=table[hour/10];
P23=0;
delay500us(5);
P20=1;
P21=1;
P22=1;
P23=1;
P0=table[hour%10];
P22=0;
delay500us(5);
P20=1;
P21=1;
P22=1;
P23=1;
P0=table[min/10];
void init();//初始化子程序声明
void delay500us(unsigned char X);//延时子程序声明
void display();//显示子程序声明
void display001();//显示子程序声明
void display002();//显示子程序声明
void keyscan();//按键识别子程序声明
while(key0==0)display();//等待按键释放。
}
if(key1==0)
{
display002();
if(key1==0)
{
min++;
if(min>=60)min=0;
while(key1==0)display002();
}
}
自制可调式数字时钟完整版
《综合设计实训I》可调式数字时钟姓名:学号:班级:实训地点:指导教师:通信与电子学院编制年月日一、设计要求数字时钟是采用数字电路实现对年,月,日,时,分,秒数字显示的计时装置,广泛用于个人,家庭,车站,码头,办公室等公共场所,成为人们日常生活中的必需品。
1,、设计时可以利用单片机内部定时器,也可以利用外部实时时钟芯片。
(I/O,I2C总线)2、有年,月,日,时,分,秒功能,而且要能够校正前面五项。
3、显示时可以用8位数码管,也可以用LCD液晶屏。
(年只需显示后2位)4、可选功能:闹钟功能。
二、设计方案1、芯片分析AT89C51引脚图管脚说明:VCC:供电电压。
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P0口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
可调数字电子钟设计
综合案例项目1 可调数字电子钟设计一、设计目的1.掌握六十进制,二十四进制计数器的设计方法。
2.掌握用元件例化语句实现多位计数器相连的设计方法。
3.掌握多位共阳数码管动态扫描显示驱动及编码。
4.掌握CPLD技术的层次化设计方法。
5.学习VHDL基本单元电路的综合设计应用二、设计要求1.设计功能要求:图1(Clock.gdf)如图所示,具有:1)具有时、分、秒计数显示功能,以二十四小时循环计时。
2)具有清零,使能,调节小时,分钟的功能。
2.设计内容(1) 根据电路特点,用层次设计概念。
将此设计任务分成若干模块,规定每一模块的功能和各模块之间的接口。
可以多人分别编程和调试,然后再将各模块联机联试。
以培养同事之间的合作精神,同时加深层次化的设计概念。
(2) 了解软件的元件管理深层含义,以及模块元件之间的连续概念。
3.设计步骤(1) 根据系统设计要求,采用自顶向下设计方法,由秒计数模块、分计数模块、时计数模块、动态扫描显示模块和7段译码模块五部分组成。
画出系统的原理框图,说明系统中各主要组成部分的功能。
(2) 选用QuartusⅡ软件编写各个模块的VHDL源程序。
(3) 根据选用的软件编好用于系统的仿真测试文件。
(4) 根据选用的软件及选用的硬件芯片编好用于硬件验证的管脚锁定文件。
(5) 记录系统仿真、硬件测试结果。
(6)记录实验过程中出现的问题及解决办法。
三.硬件要求:1.主芯片Altera Cyclone II EP2C35F672C6N。
2.6位8段共阳数码管动态扫描显示。
3.四个按键开关(清零、使能、调小时、调分钟)。
4.组合时钟源模版。
5.电源模版。
四.相关知识点:1.静态和动态显示原理:点亮LED显示器有静态和动态两种方法。
所谓静态显示,就是显示某一字符时,相应的发光二极管恒定得导通或截止,这种方法,每一显示位都需要一个8位的输出口控制,占用的硬件较多,一般仅用于显示位数较少的场合。
而动态就是一位一位地轮流点亮各位显示器,对每一位显示器而言,每隔一段时间点亮一次,利用人的视觉留感达到显示的目的。
任务三 数码管电子钟制作
主机模块
P2.5
蜂鸣器端口
软件编程
1、主程序流程图 2、参考程序 3、程序知识点
1、主程序流程图
2、参考程序
#include <reg52.h> //头文件 unsigned char xdata DM _at_ 0x5fff;//定义总线P2_7 unsigned char xdata PX _at_ 0x9fff;//定义总线P2_6 sbit SB1 = P1^0;//定义SB1于P1_0; sbit SB2 = P1^1;//定义SB2于P1_1; sbit SB3 = P1^2;//定义SB3于P1_2; sbit SB4 = P1^3;//定义SB4于P1_3; sbit FMQ =P2^5;//定义蜂鸣器位置 bit cskg1;//初始开关 bit cskg2=1;//初始开关 unsigned char flag1,flag2;//调时变量与闹钟设置变量 unsigned char S=23,F=30,M=15;//定义初始时间 unsigned char SS=0,FF=0,MM=0;//定义闹钟时间 unsigned char code smg[]= { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf //0-9、暗、-段码 }; unsigned char str[8]= { 10,10,10,10,10,10,10,10//片选 }; void KEY(void);//按键程序声明
定时器中断 重置定时器 初值 是否到 一秒 是 秒+1 是否到 60 是 分+1,秒=0 是否到 60 是 时+1,分=0 是否到 24 是 小时=0 中断结束返 回主程序 否 否 否 否
LED数码管时钟程序 电路时间可调
LED数码管时钟程序+电路-时间可调自上次数码管时钟为完善版本(玩了几天后,懒啊不想动,汗)终于解决了不能进入调试的BUG不来废话上程序:/************************************************ **************** 程序名称:51单片机数码管电子钟+定时闹钟晶振:12.00* 实验对象:51hei单片机学习开发板* 单片机:AT89S52或STC89C52 闹钟时间:7:10分(程序自定义)*使用定时器方式,数码管显示24小时“00-00-00”(增加中断进入对时功能P1为按键,P2为段选,P0为位选,************************************************* ***************//***使用定时器方式,数码管显示24小时“00-00-00”(增加进入对时功能)P1为按键,P2为段选,P0为位选,{闹钟暂时不可调待完善})***/#include ;#define uchar unsigned char /*宏定义 */#define uint unsigned int /*宏定义 */uchar hour,hour_h,hour_l; /*定义小时,小时的高位,小时的低位*/uchar min,min_h,min_l; /*分*/uchar sec,sec_h,sec_l; /*秒*/uchar int_num; /*定时溢出作用标号*/sbit key_secadd=P1^1; /*定义了 p1.1为秒增1键,用在调时中断里*/sbit key_minadd=P1^2; /*定义了 p1.2为分增1键,用在调时中断里*/sbit key_houradd=P1^3; /*定义了 p1.3为时增1键,用在调时中断里*/sbit key_intime=P1^0; //按P1.0进入调时sbit key_quit=P1^5; //P1.5退出调时sbit bell=P1^5; //小喇叭void delay(uchar time); /*延时子函数声明*/void display(); /*显示子函数声明*/void inter_init(); /*定时器初始化子函数声明*/ void time24();/****专用数码管显示表***/uchar codeduma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; /*0x40显示“一”符号*/ uchar codewema[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x00};/*小时hour 分min 秒sec*///---------------------延时子函数--------------------------------void delay(uchar time) /*延时子函数*/{uchar time_1;for (;time>;0;time--)for (time_1=100;time_1>;0;time_1--);}//---------------------初始化T0函数--------------------------void time0(void) interrupt 1 /*定时器T0服务子程序*/{TH0=(65535-50000)/256;TL0=(65535-50000)%256;int_num++;}//---------------------定时器函数--------------------------void inter_init() /*定时器初始化子函数*/{EA=1; /*开总中断*/EX0=1; /*开外部中断0*/ET0=1; /*打开定时器T0*/TMOD=0x01; /*工作方式1*/TCON = 0x00; /*触发方式*/IP = 0x01; /*中断优先级别,T0优先*/TH0=(65535-50000)/256; /*置初值,大约50ms一个中断 */TL0=(65535-50000)%256;TR0=1; /*置位TR0,启动定时器0*/}//---------------------24小时时间自加--------------------------void time24() /*时间递增*/{if(int_num==20) /*值满20,大约就是一秒的时间。
用1602LCD设计的可调式电子钟
单片机应用课程设计说明书用1602LCD设计的可调式电子钟专业自动化学生姓名班级自动化142学号 14100指导教师蒋完成日期 20年1 月23 日目录1 概述 (3)2 课题研究背景与意义 (3)2.1 课题研究背景 (3)2.2 课题研究意义 (3)3 系统方案设计与主要设计工作 (3)3.1 设计任务 (3)3.2 功能要求说明 (4)4设计课题总体方案 (4)4.1硬件设计方案 (5)4.2系统软件设计 (7)5. 软件仿真及实物设计调试 (9)5.1PROTUES仿真软件介绍 (9)5.2仿真运行结果说明 (10)5.3实物设计结果与调试 (11)6课程设计实验总结 (11)参考文献 (13)附录 (14)附录1:程序清单 (14)附录2:系统电路原理图 (21)附录3:元器件清单 (22)用1602LCD设计电子钟1 概述数字钟是采用数字电路实现对“时”、“分”、“秒”数字显示的计时装置。
数字钟的精度、稳定度远远超过老式机械钟。
在这次设计中,我们采用LED数码管显示时、分、秒,以24小时计时方式,根据数码管动态显示原理来进行显示,用12MHz的晶振产生振荡脉冲,定时器计数。
在此次设计中,电路具有显示时间的其本功能,还可以实现对时间的调整。
数字钟是其小巧,价格低廉,走时精度高,使用方便,功能多,便于集成化而受广大消费的喜爱,因此得到了广泛的使用。
2 课题研究背景与意义2.1 课题研究背景20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。
下面是单片机的主要发展趋势。
单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。
数码管电子钟
摘要20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
现代生活的人们越来越重视起了时间观念,可以说是时间和金钱划上了等号。
对于那些对时间把握非常严格和准确的人或事来说,时间的不准确会带来非常大的麻烦,所以以数码管为显示器的时钟比指针式的时钟表现出了很大的优势。
数码管显示的时间简单明了而且读数快、时间准确显示到秒。
而机械式的依赖于晶体震荡器,可能会导致误差。
数字钟是采用数字电路实现对“时”、“分”、“秒”数字显示的计时装置。
数字钟的精度、稳定度远远超过老式机械钟。
数字钟是其小巧,价格低廉,走时精度高,使用方便,功能多,便于集成化而受广大消费的喜爱,因此得到了广泛的使用。
目录摘要..............................................................................................................................................目录....................................................................................................................................................第一章绪论......................................................................................................................................1.1数字电子钟的背景.................................................................................................................1.2数字电子钟的意义.................................................................................................................1.3电子时钟简介 ........................................................................................................................1.4电子时钟的基本特点...........................................................................................................1.5电子时钟的原理...................................................................................................................1.6数字电子钟的应用.................................................................................................................第二章数字钟的软件设计................................................................................................................2.1系统软件设计流程图 ............................................................................................................第三章控制系统的软件设计............................................................................................................3.1程序设计...............................................................................................................................3.2数字钟的原理图 ....................................................................................................................第四章系统仿真............................................................................................................................4.1PROTUES软件介绍 .................................................................................................................4.2电子钟系统PROTUES仿真 ....................................................................................................第五章调试与功能说明....................................................................................................................5.1硬盘调试 ................................................................................................................................5.2系统性能测试与功能说明 ....................................................................................................5.3系统时钟误差分析 ................................................................................................................5.4软件调试问题及解决 ............................................................................................................总结....................................................................................................................................................参考文献............................................................................................................................................第一章绪论1.1数字电子钟的背景20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
用1602LCD设计的可调式电子钟
单片机应用课程设计说明书用1602LCD 设计的可调式电子钟专业 自动化学生 班级 自动化142 学号 14100 指导教师完成日期 20年1月23 日目录1 概述 (3)2 课题研究背景与意义 (3)2.1 课题研究背景 (3)2.2 课题研究意义 (3)3 系统方案设计与主要设计工作 (3)3.1 设计任务 (3)3.2 功能要求说明 (4)4设计课题总体方案 (4)4.1硬件设计方案 (5)4.2系统软件设计 (7)5. 软件仿真及实物设计调试 (9)5.1PROTUES仿真软件介绍 (9)5.2仿真运行结果说明 (10)5.3实物设计结果与调试 (11)6课程设计实验总结 (11)参考文献 (13)附录 (14)附录1:程序清单 (14)附录2:系统电路原理图 (21)附录3:元器件清单 (22)用1602LCD设计电子钟1 概述数字钟是采用数字电路实现对“时”、“分”、“秒”数字显示的计时装置。
数字钟的精度、稳定度远远超过老式机械钟。
在这次设计中,我们采用LED数码管显示时、分、秒,以24小时计时方式,根据数码管动态显示原理来进行显示,用12MHz的晶振产生振荡脉冲,定时器计数。
在此次设计中,电路具有显示时间的其本功能,还可以实现对时间的调整。
数字钟是其小巧,价格低廉,走时精度高,使用方便,功能多,便于集成化而受广大消费的喜爱,因此得到了广泛的使用。
2 课题研究背景与意义2.1 课题研究背景20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路装化等几个方面发展。
下面是单片机的主要发展趋势。
单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。
数码管电子钟(可调时)程序
TR1=1;//开t1
TR0=0;//关t0
}
/**********以下延时程序***********/
void Delayms(uint xms)
{
uint i,j;
for(i=0;i<=xms;i++)
for(j=115;j>0;j--);
{
if(k2==0)
{
Delayms(10);//延时去抖
if(k2==0)//确定k2键按下
{
while(!k2);//等待k2释放
sec++;
if(sec==60)sec=0;
}
}
if(k3==0)
{ sec=0,min++;
if(min>=60)
{ min=0;hour++;
if(hour>=M)hour=0;
}
}
}
}
/*********以下是按键检查函数**********/
void keyplay()
{
P3=0xff;//读取数据前要先写1
{
key=0;
TR1=1;
TR0=0;
}
}
/*********以下是主程序**********/
void main()
{
Timert();
while(1)
{
keyplay();
timerpaly();
Dispaly();
}
{
if(k2==0)
设置8个闹钟时间的智能时钟
可设置8个闹钟时间的智能时钟普通的家用时钟一般只能设置一个闹钟时间,但很多人均需为工作日、周末、早晨、午休等不同时段设置不同的闹钟时间。
如果是使用普通的闹钟,只好每次休息前重新设置,很不方便,有时甚至会出现忘记更改闹钟设置而睡过头的情况。
针对这种情况,本人利用89C51单片机设计了一款有8种闹钟设置的时钟,通过一段时间的使用,情况良好。
1、元件清单共阴极数码管8个4511七段译码芯片1片ATMEL89C51单片机1片24C08EEPROM 1片24M晶振1个9V变压器(3V A)1个LM317输出可调稳压IC 1个整流桥堆1个470uF电容1个100uF电容1个10uF电容1个0.1uF电容1个33pF电容2个蜂鸣器1个9014(或其它NPN管)8个ksp92(或其它PNP管)1个二极管2个1K欧电阻16个470欧电阻1个10K欧可调电阻1个按钮开关4个可装四节电池的电池盒1个万能板(约12CM*17CM)1块所有元件按以下的电路图焊接在一块万能板上。
注意LM317的输出应由低调高,以免烧IC。
1、电路图1、功能简介该时钟以24小时制显示时间,并可显示2000年至2049年之间的任何日期及星期,日期与时间经按键可相互切换,可输入8个闹钟时间设置,每个闹钟设置包括响铃的时间(小时与分钟)、对工作日有效还是对周末有效的标志,以及本项设置是否启用的标志等三部分。
这8个闹钟设置均保存在EEPROM中,即使掉电也不用重新输入。
当然使用者可通过按钮对任何一个设置作修改。
数码管可经按钮关闭显示,避免夜间刺眼、影响睡眠。
调节LM317输出电压,可改变数码管亮度,但电压不能低于后备电池的电压,否则后备电池供电。
用四节1.5V电池串联作后备电源,保证市电停电时时钟继续走时。
时钟的精度取决于晶振频率的精度。
2、程序清单本程序用C语言编写,经Keil C51编译成二进制码后写入89C51内的EPROM内即可。
#include "atmel\at89x51.h"#include "intrins.h"unsigned char hour,min,sec,year,month,day,weekday; //当前时间、日期、星期unsigned int count_down; //1秒钟计时用bit led_on; //数码管是否点亮的标志unsigned char display[8]; //8位数码管要显示的数据unsigned char attr; //八个数码管的闪烁控制字节,当为0时,对应数码管闪bit flash; //LED闪烁开关,与attr共同决定数码管是否闪烁unsigned char show_status; //LED显示状态标志// 0:设置闹钟数据// 1:显示当前日期及星期// 2:显示当前时间// 3:设置当前日期// 4:设置当前时间bit km; //按键已去抖动标志bit kp; //按键已处理标志bit sound; //蜂鸣器响标志bit alarm_stop; //蜂鸣器响后用户手工按停标志struct { unsigned char h; //小时unsigned char m; //分钟} alarm[8]; //8个闹钟项unsigned char alarm_en; //闹钟项启用标志unsigned char alarm_wk; //闹钟项周末启用标志unsigned char cur_alarm_set; //当前设置的闹钟项unsigned char cur_alarm_active; //当前到点的闹钟项bit new_alarm_info; //闹钟项内容已修改标志sbit sound_output = P1^5; //蜂鸣器驱动端口,输出0时蜂鸣器响sbit SDA_PIN = P1^6; //EEPROM数据线端口sbit SCL_PIN = P1^7; //EEPROM时钟线端口void I2cDelay() //EEPROM操作时需要的延时函数{ _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();}void DelayX1ms(unsigned char count) //延迟函数,参数为毫秒数{unsigned char i,j;for(i=0;i<count;i++)for(j=0;j<240;j++) ;}void Start() //I2C启动,24C08使用I2C方式{ SDA_PIN=1; I2cDelay();SCL_PIN=1; I2cDelay();SDA_PIN=0; I2cDelay();SCL_PIN=0;}void Stop() //I2C停止{ I2cDelay(); SDA_PIN=0;I2cDelay(); SCL_PIN=1;I2cDelay(); SDA_PIN=1;I2cDelay();}bit SendByte(unsigned char value) //发送1字节数据给EEPROM {unsigned char i;bit no_ack=0;for(i=0;i<8;i++) //发送8位数据{ I2cDelay();if(value&0x80) SDA_PIN=1;else SDA_PIN=0;value=value<<1;I2cDelay(); SCL_PIN=1;I2cDelay();I2cDelay(); SCL_PIN=0;}I2cDelay(); SDA_PIN=1; //确认脉冲周期,等待EEPROM的确认I2cDelay(); SCL_PIN=1;I2cDelay();if(SDA_PIN==1) no_ack=1;I2cDelay(); SCL_PIN=0;return no_ack;}void mywrite(unsigned char address,unsigned char value) //向EEPROM写1字节{ Start(); SendByte(0xa0); SendByte(address);SendByte(value); Stop(); DelayX1ms(10);}unsigned char ReadByte() //从EEPROM接收1字节{unsigned char i,bval;bval=0;for(i=0;i<8;i++) //接收8位数据{ I2cDelay();SDA_PIN=1; //从P1输入数据时,先往P1输入“1”I2cDelay(); SCL_PIN=1;I2cDelay(); bval=bval<<1; if(SDA_PIN) bval=bval|0x01;I2cDelay(); SCL_PIN=0;}I2cDelay(); SDA_PIN=1; //确认脉冲周期,不送出确认I2cDelay(); SCL_PIN=1;I2cDelay();I2cDelay();return(bval);}unsigned char myread(unsigned char address) //从EEPROM读入1字节数据{unsigned char tmp;Start(); SendByte(0xa0); SendByte(address);Start(); SendByte(0xa1); tmp=ReadByte();Stop(); DelayX1ms(2);return(tmp);}void Timer0ISR(void) interrupt 1 using 3 //定时器0中断程序,用于走时,1/8000秒一次{unsigned char tmp,tmp_days;count_down--;if(count_down==1 || count_down==2001 || count_down==4001 || count_down==6001){ flash=~flash; //数码管闪烁的开关量if(sound && flash) sound_output=0; //驱动蜂鸣器else sound_output=1; //关闭蜂鸣器return;}/***计算当前日期为星期几***/if(count_down==3000){ if(year==0) weekday=5; //2000年1月1日为星期六else { tmp=(year-1)/4+1; tmp=(year-tmp)+tmp*2;weekday=(tmp+5)%7; //计算出当前年的1月1日为星期几}tmp_days=0;for(tmp=1;tmp<month;tmp++)if(tmp==1 || tmp==3 || tmp==5 || tmp==7 || tmp==8 || tmp==10)tmp_days=tmp_days+31;else if(tmp==4 || tmp==6 || tmp==9 || tmp==11)tmp_days=tmp_days+30;else if(tmp==2){ if(year%4==0) tmp_days=tmp_days+29;else tmp_days=tmp_days+28;}tmp_days=tmp_days+day-1; weekday=(weekday+tmp_days%7)%7+1;return;}/*** 查询是否有闹钟时间项符合触发条件***/if(count_down==5000){ if((alarm_stop || sound) && alarm[cur_alarm_active].m!=min) //触发后1分钟{ alarm_stop=0; sound=0; } //自动关蜂鸣器if(sound==0 && alarm_stop==0) //没有已触发的闹钟项for(tmp=0;tmp<8;tmp++) //则查询8个闹钟项内是否有符合条件的{ if(((alarm_en>>tmp)&1)==0) continue; //该闹钟项不启用if(((alarm_wk>>tmp)&1)==1) //该闹钟项周末有效{ if(weekday!=6 && weekday!=7) continue; } //当前不是星期六或星期天else{ if(weekday==6 || weekday==7) continue; }if(alarm[tmp].h==hour && alarm[tmp].m==min) //比较当前时间与该{ sound=1; cur_alarm_active=tmp; break; } //闹钟项的时间}return;}if(count_down==0) //过了一秒钟{ count_down=8000;sec++;if(sec==60){ sec=0;min++;if(min==60){ min=0;hour++;if(hour==24){ hour=0; day++;switch(day){ case 29: if(month==2 && year%4) { day=1; month=3; }break;case 30: if(month==2 && year%4==0) { day=1; month=3; }break;case 31: if(month==4 || month==6 || month==9 || month==11){ day=1; month++; }break;case 32: day=1; month++;if(month==13) { month=1; year++; }}}}}}}void Timer1ISR(void) interrupt 3 using 2 //定时器2中断,用于按键扫描{unsigned char keytmp;char tmp;TH1=0x15; TL1=0xa0; //每30ms中断一次/*** 当前显示的内容***/if(show_status==0) //当前正在设置闹钟项{ display[0]=cur_alarm_set; display[1]=0xf;display[2]=alarm[cur_alarm_set].h/10; display[3]=alarm[cur_alarm_set].h%10;display[4]=alarm[cur_alarm_set].m/10; display[5]=alarm[cur_alarm_set].m%10;display[6]=(alarm_wk>>cur_alarm_set)&1; display[7]=(alarm_en>>cur_alarm_set)&1;}if(show_status==1 || show_status==3) //当前显示或设置日期{ display[0]=year/10; display[1]=year%10; display[2]=month/10;display[3]=month%10; display[4]=day/10; display[5]=day%10;display[6]=0xf; display[7]=weekday;}if(show_status==2 || show_status==4) //当前显示或设置时间{ display[0]=hour/10; display[1]=hour%10; display[2]=min/10;display[3]=min%10; display[4]=sec/10; display[5]=sec%10;display[6]=0xf; display[7]=0xf; //最后两后无显示}/*** 按键扫描及处理***/keytmp=~(P1) & 0x0f;if(keytmp==0) { km=0; kp=0; }else{ if(km==0) km=1;else{ if(kp==0){ kp=1;if(keytmp==1) //第一个按钮{ if(sound) { alarm_stop=1; sound=0; } //如果闹钟正响,按此键停止else if((show_status==1 || show_status==2) && led_on) //正显示日期或时间{ show_status=0; cur_alarm_set=0; attr=0x3f; } //进入闹钟设置else if(show_status==0) //如正在设置闹钟时间项{ show_status=2; new_alarm_info=1; attr=0xff; } //返回当前时间显示return;}if(keytmp==2 && led_on) //第二个按钮,仅当数码管打开时有效{ switch(attr){ case 0xff: if(show_status==1) show_status=2; //在显示时间与日期间切换else if(show_status==2) show_status=1;break;case 0x3f: if(show_status==0) cur_alarm_set=(cur_alarm_set+1)%8;else if(show_status==3)year=(year+1)%50; //当前日期的“年”加1else if(show_status==4)hour=(hour+1)%24; //当前时间的“时”加1break;case 0xcf: if(show_status==0) //闹钟设置的“时”加1 alarm[cur_alarm_set].h=(alarm[cur_alarm_set].h+1)%24;else if(show_status==3){ month++; //当前日期的“月”加1if(month==13) month=1; }else if(show_status==4)min=(min+1)%60; //当前时间的“分”加1break;case 0xf3: if(show_status==0)alarm[cur_alarm_set].m=(alarm[cur_alarm_set].m+1)%60;else if(show_status==3){day++; //当前日期的“日”加1if(day==32) day=1; }else if(show_status==4){count_down=8000;sec=(sec+1)%60; } //当前时间的“秒”加1break;case 0xfd: if(show_status==0)alarm_wk^=0x1<<cur_alarm_set; //周末标志位切换break;case 0xfe: if(show_status==0)alarm_en^=0x1<<cur_alarm_set; //启用标志位切换} //end of switch(attr)return;} //end of if(keytmp==1)if(keytmp==4) //第三个按钮{ switch(attr){ case 0xff: if(show_status==1 || show_status==2)led_on=~led_on; //打开或关闭数码管显示break;case 0x3f: if(show_status==0) //如果正在设置闹钟{ if(cur_alarm_set==0) cur_alarm_set=7;else cur_alarm_set--;}else if(show_status==3) //当前日期的“年”减1{ if(year==0) year=49; else year--; }else if(show_status==4) //当前时间的“时”减1{ tmp=hour-1; if(tmp<0) hour=23; else hour=tmp; }break;case 0xcf: if(show_status==0) //闹钟设置的“时”减1{ tmp=alarm[cur_alarm_set].h-1;if(tmp<0) alarm[cur_alarm_set].h=23;else alarm[cur_alarm_set].h=tmp;}else if(show_status==3){ month--; //当前日期的“月”减1if(month==0) month=12; }else if(show_status==4){ tmp=min-1; //当前时间的“分”减1if(tmp<0) min=59; else min=tmp; }break;case 0xf3: if(show_status==0) //闹钟设置的“分钟”减1{ tmp=alarm[cur_alarm_set].m-1;if(tmp<0) alarm[cur_alarm_set].m=59;else alarm[cur_alarm_set].m=tmp;}else if(show_status==3){ day--; //当前日期的“日”减1if(day==0) day=31; }else if(show_status==4){ tmp=sec-1; //当前时间的“秒”减1count_down=8000;if(tmp<0) sec=59; else sec=tmp; }break;case 0xfd: if(show_status==0) //切换周末标志alarm_wk^=0x1<<cur_alarm_set;break;case 0xfe: if(show_status==0) //切换启用标志alarm_en^=0x1<<cur_alarm_set;} //end of switch(attr)return;} //end of if(keytmp==2)if(keytmp==8 & led_on) //第四个按钮,仅当数码管打开时有效{ switch(attr){ case 0xff: if(show_status==1) //如果当前显示日期show_status=3; //切换到调准日期状态else if(show_status==2) //如果当前显示时间show_status=4; //切换到调准时间状态attr=0x3f; break; //第一、二个数码管闪烁case 0x3f: attr=0xcf; break; //第三、四个数码管闪烁case 0xcf: attr=0xf3; break; //第五、六个数码管闪烁case 0xf3: if(show_status==0) attr=0xfd; //第七个数码管闪烁else if(show_status==3){ show_status=1; attr=0xff; } //恢复正常显示日期else if(show_status==4){ show_status=2; attr=0xff; } //恢复正常显示时间break;case 0xfd: if(show_status==0) attr=0xfe; //第八个数码管闪烁break;case 0xfe: if(show_status==0) attr=0x3f; //第一、二个数码管闪烁}} // end of if(keytmp==4)} // end of if(kp==0)} // end of if(km==0)} // end of if(keytmp!=0)}main(){unsigned char i;hour=23; min=58; sec=30; year=2; month=4; day=25;count_down=8000;flash=0; attr=0xff; led_on=1;km=0; kp=0; show_status=2; //加电后显示当前时间new_alarm_info=0; sound=0; alarm_stop=0;for(i=0;i<8;i++) //从EEPROM中读入8个闹钟设置{ alarm[i].h=myread(i*2); alarm[i].m=myread(i*2+1); }alarm_en=myread(i*2); alarm_wk=myread(i*2+1);IE=0; IP=0; //disable all interrupt and lower priorityTMOD=0x12; //timer 0 is set to mode 2,auto_reloading,timer1,mode 1TH0=6; TL0=6; //timer0 parameters for 0.125msTH1=0x15; TL1=0xa0; //timer1 parameters for 30msTR0=1; TR1=1; //timer0 interrupt most importantET0=1; ET1=1; EA=1; //enable interrupt functionwhile(1){ if(led_on)for(i=0;i<8;i++){ P2=0;if(flash || attr&(0x80>>i)){ P0=display[i]; P2=0x80>>i; DelayX1ms(1); }}else P2=0;if(new_alarm_info){ P2=0; //暂时关闭数码管new_alarm_info=0; //写入EEPROMfor(i=0;i<8;i++) { mywrite(i*2,alarm[i].h); mywrite(i*2+1,alarm[i].m); } mywrite(i*2,alarm_en); mywrite(i*2+1,alarm_wk);}}}。
用数码管设计的可调式电子钟
用数码管设计的可调式电子钟Last revision on 21 December 2020用数码管设计的可调式电子钟经营课题名称:用数码管设计的可调式电子钟班级:B电气102学生姓名:刘佳琨学号:指导教师:陆广平完成日期:目录1、引言:课题研究意义与目的此次设计是单片机内部的定时/计数器来实现电子时钟的方法以及借助键盘直接控制整时的调整,本设计根据STC89C52单片机系统扩展的基本原理和方法,由单片机STC89S52芯片,数码管和键盘为核心,辅以必要的电路,构成了一个单片机电子时钟。
一块单片机芯片就是一台计算机,由于单片机以其集成度高、体积小、可靠性高、控制功能强、低电压、低功耗等特点使它应用于智能仪器仪表、机电一体化、实时程控、人类生活中。
除此之外还广泛应用办公自动化领域、商业营销领域、汽车及通信系统、计算机外部设备等各领域中,并且单片机已成为计算机发展和应用的一个重要方面。
由此可见掌握单片机的使用方法和利用单片机解决实际问题具有重要的意义。
而此次的设计刚好用到单片机相关的知识可以说这是这次设计的重要意义和目的所在。
再者,此设计的数码管电子时钟主要是显时间的,是时钟用途。
在此设计的基础上人们还可根据不同的需求和不同的设计水平做出不同的设计项目。
也可以加上日期,温度的显示和闹钟的功能。
如果设计水平还更高的话还可以设计LED电子显示屏。
因此说,数码管电子时钟设计是最简单和基础的。
而且电子时钟很实用,准确性也很好,也容易调节,若有毁坏更换元器件也简单,制作原理和过程也很易懂易做,成本也不高。
在此设计间也包含了很多的知识,跟我所学专业又对口,所以,做这个LED电子时钟是个很用很好很值得做的设计。
背景20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高。
目前,单片机正朝着高性能和多品种方向发展,发展趋势将进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。
数码管电子钟的设计及实现
编号:201234140115 本科毕业设计数码管电子钟的设计及实现院系:信息工程学院姓名:学号:0835140115专业:通信工程年级:2008级指导教师:职称:完成日期:2012年5月摘要电子钟主要是利用电子技术将时钟电子化、数字化,拥有时钟精确、体积小、可拓展性能强等特点,被广泛用于生活和工作中去。
本文主要为实现一款可正常显示时间、带有24h/12h制调整、带有AM/PM显示以及时间校准功能的一款基于单片机仿真的多功能电子钟。
本文对设计要求的功能进行了分析和比较,确定了提供电源、界面显示、输入等方案。
本设计采用AT80C51芯片作为核心,以时钟电路、复位电路为辅助电路,用Proteus软件自带的电子钟组件实现高度仿真的显示结果。
软件部分主要采用简单且应用广泛的C51语言编写实现。
这种仿真的电子钟具有电路简单、读取方便、显示直观、功能多样、时间精度较高、操作简单、编程容易、成本低廉等很多优点。
设计主要是用Proteus电路软件实现电子管的仿真。
经过改装,添加部分功能所生产出的产品即可应用于一般的生活和工作中,从而给人们的生活和生产带来便利,符合电子仪器仪表的发展趋势,具有广阔的市场前景。
关键词:单片机;电子钟;控制器AbstractElectronic clock is the use of electronic technology to make clock electronic and digital. With a precise clock, small size and can be able to develop strong performance characteristics, so are widely used to live and work.In this paper, to achieve a normal display time with 24h/12h system adjustments, with the AM/PM display and time calibration function of a simulation based on single chip multi-function electronic clock.In his paper the design requirements of the function are analyzed and compared, determined to provide power, interface display, input program. This design adopts AT80C51 chip as the core, with a clock circuit, reset circuit, using Proteus Software comes with the electronic clock assembly to achieve a high degree of simulation result. Software part mainly uses a wide range of C51 language. This simulation electronic clock has the advantages of simple circuit, convenient reading, visual display, multiple functions, high precision ,simple operation, time programming is easy, low cost and many other advantages.The design is mainly use Proteus software to realize the electronic tube simulation circuit. After modification, adding some functions to produce products that can be applied to people’s life and production,in line with the development trend of electronic instrumentation, and has broad market prospects.Keywords:SCM;electronic clock;controller目录1 绪论 (1)1.1 数字电子钟的背景和意义 (1)1.2 本设计研究的主要内容 (2)2 系统总体设计及方案论证 (3)2.1 提供方案 (3)2.2 显示界面方案 (3)2.3 输入方案 (4)3 系统硬件设计及实现 (5)3.1 整体方案设计 (5)3.2 单片机的基本结构 (6)3.3 其它电路设计 (8)3.3.1 时钟电路 (8)3.3.2 复位电路 (9)3.3.3 数码管显示电路 (10)4 系统软件设计及实现 (14)4.1 主程序流程图 (14)4.2 时间调整程序流程图 (15)5 Proteus软件仿真 (17)5.1 Proteus软件简介 (17)5.2 仿真步骤 (17)5.3 仿真过程中出现的错误及解决措施 (17)5.4 仿真结果 (18)总结 (20)参考文献 (21)致谢 (22)附录 (23)1绪论1.1数字电子钟的背景和意义20世纪末电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
数码管电子钟的设计及实现
数码管电子钟的设计及实现数码管电子钟是现代化的电子钟表,由多个数码管、时钟芯片和电源等部件组成。
它可以实现精准的时间显示和多种功能设置。
本文将介绍数码管电子钟的设计及实现。
一、电子钟的原理和组成电子钟的原理是利用时钟芯片脉冲输出的特性,通过计时和刷新数码管来实现时间的精确显示。
它由以下几个部分组成:1. 外壳:一般用于装置电子钟部件和显示时刻的数码管。
2. 时钟芯片:它是电子钟的“控制中心”,负责计时和发出信号。
3. 数码管:用于显示小时,分钟和秒钟数值。
4. 开关按钮:用于设置和调整时间以及各种功能。
5. 电源:用于提供电子钟所需的电力。
二、数码管电子钟的设计数码管电子钟的设计过程需要进行以下步骤:1. 选择合适的时钟芯片:时钟芯片是至关重要的部件,它需要有较高的精度和稳定性,同时需要满足所需功能,如时刻、日历、闹钟等。
一般常用的时钟芯片有DS1302、DS1307、DS3231等。
2. 确定数码管的数量和颜色:数码管一般包括7段数码管、8段数码管或者16段数码管,根据具体需求选择合适的数码管数量和颜色。
3. 绘制电路图和PCB板:根据设计需求,绘制电路图,然后制作PCB板,以便组装各个部件。
4. 安装各个部件:安装时钟芯片、数码管、开关按钮等电子钟所需的部件。
5. 调试电路:接通电源开关,调试电路以保证电子钟正常工作。
6. 加入更多功能:根据需求加入更多功能,如闹钟、日历、天气预报等。
三、数码管电子钟的实现数码管电子钟的实现需要进行以下步骤:1. 编程:根据设计电路和时钟芯片的型号,编程控制时钟芯片的信号输出和数码管的闪烁和显示。
2. 调试:在完成编程后,需要进行调试以确保电子钟的准确性和稳定性,同时需要根据实际需求进行功能增加或调整。
3. 组装:处理好所有电路和程序调试后,就可以将所有部件在外壳里组装起来,组装完成后就可以进行正常使用。
四、数码管电子钟的应用数码管电子钟在日常生活中有很多应用,主要体现在以下几个方面:1. 办公场所:用于显示时间,提醒工作时间,并且设有闹钟功能。
基于AT89C51单片机的数字电子时钟设计
/安徽工程大学机电学院单片机课程设计题目:数字电子时钟设计指导老师:***制作人员:范超学号:************班级:自动化2132日期:7月13日-7月24日总评成绩:课程任务设计书设计题目:数字电子时钟的设计设计任务:1.设计一款时,分,秒可调数字电子时钟可整点报时;2.设计三个按键K1,K2和K3,用于调节时钟的时间;3.用8个、七段LED数码管作为显示设备,开机显示00-00-00;本设计采用AT89C51单片机为核心器件。
具有电子钟显示,时间调整,整点报时等功能。
此数字钟是一个将“时”、“分”、“秒”显示于人的视觉器官的计时装置。
根据60秒为一分、60分为1小时的计数周期,构成秒、分、时的计数,实现计时的功能。
而且能显示清晰、直观的数字符号。
针对数字钟会产生误差的现象,就设计有校准时间的功能。
AT89C51单片机控制的数字钟的硬件结构与软件设计,给出了汇编语言源程序。
此数字钟是一个将“时”、“分”、“秒”显示于人的视觉器官的计时装置。
它的计时周期为24小时,显示满刻度为24时00分00秒,另外应有校时功能。
电路由时钟脉冲发生器、时钟计数器、译码驱动电路和数字显示电路以及时间调整电路组成。
用晶体振荡器产生时间标准信号,这里采用石英晶体振荡器。
根据60秒为1分、60分为1小时、24小时为1天的计数周期,分别组成两个60进制(秒、分)、一个24进制(时)的计数器。
显示器件选用LED八段数码管。
在译码显示电路输出的驱动下,显示出清晰、直观的数字符号。
针对数字钟会产生走时误差的现象,在电路中就设计有有校准时间功能的电路。
关键字:Proteus,Keil uVision,AT89C51,电子钟,整点报时摘要 (3)第1章概述 (5)1.1 设计背景 (5)1.2系统方案论证与设计 (5)第2章系统硬件设计 (7)2.1 系统总电路的设计 (7)2.1.1系统的总框图 ................................................................................................2.1.2芯片的选择 (7)2.2最小系统设计 (9)2.2.1时钟电路的选择与设计 (10)2.2.2复位电路的选择与设计 .............................................. 错误!未定义书签。
单片机课程设计 基于数码管的电子钟
摘要AT89S52单片机是一款应用广泛、功能强大的八位单片机。
本设计是由单片机AT89S52作为核心,通过单片机使电子钟具有调节显示时分秒的功能,电子钟是一种利用数字电路来显示秒、分、时的计时装置,与传统的机械钟相比,它具有走时准确、显示电子钟直观、无机械传动装置等优点。
它的计时周期为24小时,显示满刻度为23时59分59秒,另外应有校时功能。
本设计在原来电子钟的基础上,增加了年月日显示、闹铃、整点提示等功能。
使用时S8键为控制键,控制运行的调时,S4键为翻页查看键,S5、S6、S7键为调时状态下的控制键,分别为减一、加一、移格功能。
关键词电子钟;单片机;定时;闹铃;ABSTRACTAT89S52 SCM is a eight bit microcontroller of wided applicationan and powerful. Core’s this design is by monolithic AT89S52 SCM . it has adjust display by that electric clock.electric clock is a device that use of digital circuit to display seconds, points and the timer. compare of the tradition, , display electric clock intuitive, no mechanical transmission device etc. its timing cycle be for 24 hour, the full scale is hour of 23,minutes of 59, second of 59, another reset function is also the function. The foundation of clock display year month day and other functions. S8 keys control tone. S4 keys scroll view. On the state of adjust, S5、S6、S7control functions of minus one,plus one, move lattice function.Key words :electronic clock; single-chip; timing;alarm目录。
基于数码管的电子时钟设计
基于数码管的电子时钟设计电子时钟是一种通过电子控制来显示时间的设备,它通常使用数码管来显示时间。
数码管是一种特殊的显示器件,它由七段LED组成,可以显示数字和一些特殊字符。
在设计基于数码管的电子时钟时,需要考虑如何获取时间信号、如何控制数码管显示以及如何进行时钟的设置和调整。
首先,我们需要确定使用哪种类型的数码管来显示时间。
常见的数码管有共阳极和共阴极两种类型,它们的工作原理有所不同。
共阳极数码管的LED为高电平时亮,共阴极数码管的LED为低电平时亮。
在本设计中,我们选择使用共阳极数码管。
其次,我们需要确定使用哪种类型的时钟芯片来获取时间信号。
常见的时钟芯片有DS1302、DS3231等,它们能够提供准确的时间信号。
在本设计中,我们选择使用DS3231时钟芯片。
接下来,我们需要设计电路来连接数码管和时钟芯片。
首先,我们将数码管的七个LED分别连接到控制芯片的七个IO口。
其次,我们将时钟芯片的时钟信号、数据信号和使能信号分别连接到控制芯片的IO口。
通过控制芯片的IO口,我们可以控制数码管的亮灭,实现数字的显示。
在电路设计完成后,我们需要编写程序来控制数码管的显示。
首先,我们需要初始化时钟芯片,获取当前时间。
然后,我们需要设计一个循环,不断读取当前时间并显示在数码管上。
为了让数字在数码管上切换显示,我们可以使用定时器中断来实现,定时器中断可以每隔一段时间触发一次,通过改变显示的位数或者数码管的亮灭状态来实现数字显示的切换。
最后,我们需要设计一些按键来实现时钟的设置和调整功能。
通过按键,我们可以改变时钟的小时、分钟和秒数,实现时间的调整功能。
另外,我们还可以设计一些按键来切换时间的显示模式,例如切换显示日期或者闹钟等。
综上所述,基于数码管的电子时钟设计需要考虑数码管的选择、时钟芯片的选择、电路设计、程序编写以及按键设计等方面。
通过合理的设计和实现,我们可以制作出一个功能完善、稳定可靠的电子时钟。
多功能电子钟程序(完全好使)
/*设计功能:1.时钟功能(上排数码管)每秒更新一次时钟显示,显示方式为MM.SS,其中M为分钟,S为秒。
可以通过按键调整当前时间,调整时间时需要闪烁调整位置的数值。
2.秒表功能(下排数码管)按开始按键开始走秒,按停止按键停止走秒,按清除按键秒表归零,显示方式为:SSS.U,其中S为秒,U为0.1秒。
3.闹钟功能(下排数码管)用按键设置闹钟时间,显示格式为MM.SS。
闹钟时间到达后,闪烁一个指示灯。
可以用按键设置闹钟、取消闹钟。
各个按键功能可以自行定义,每按一次任何按键,D2灯会翻转一次状态*//*硬件连接:一个有上下两个4位共阳数码管,4个按键,2个LED指示灯P2高四位控制上排数码管位选,低4位控制下排数码管位选,P0控制段选四个按键为独立按键,与P2高4位相连,与数码管复用LED0接P34,LED1接P35*//*使用方法:第一步:设定系统时间,在上排的4位数码管显示,注意系统时间设定确认后就不得修改了第二步:选择秒表模式或闹钟模式,在下排的4位数码管显示。
两种模式只能选择一种,并且不能切换。
1.设定系统时间此时按键定义:S5 移位,S6 加,S7 减,S8确认一开始上电时数字全0不闪烁,默认从第一位开始设置,按下加减进行调节,如此要更换调节位置,每按一次S5会右移一位,移到第四位再按会重新移回第一位。
设置完系统时间,按下S8确认,跳出设定环节,进入秒表和闹钟模式选择环节。
2。
秒表和闹钟模式选择此时按键定义:S5 改变模式标志,S6 S7未用,S8确认进入该模式设置完系统时间,进入秒表和闹钟模式选择环节。
此时第一位为0 。
然后按S5,第一位会在1和2之间来回切换,在显示1时按S8进入秒表模式,在显示2时按S8进入闹钟模式,2.1秒表模式此时按键定义:S5 未用,S6 开始,S7停止,S8清除2.2闹钟模式此时按键定义:S5 移位,S6 加,S7 减,S8按一次确认,等报警到了,再按S8停止报警如设定系统时间的步骤,设定好闹钟时间,按S8确认设定(S8只能按一次哦),等时间到了D1灯会不断闪烁表示报警,按S8停止报警*/#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charsbit keysource= P1^7;sbit S5= P2^4;sbit S6= P2^5;sbit S7= P2^6;sbit S8= P2^7;sbit led0=P3^4; //每按一次任何按键,D2灯会翻转一次状态sbit led1=P3^5; //闹钟报警用的灯uint shuju_1;uint shuju_2;uint count;uint stopwatch_count;int miao;int fen;int warn_miao;int warn_fen;uint shanshuo; //1 2 3 4bit shanshuo1,shanshuo2,shanshuo3,shanshuo4;uint num_settime_cnt; //标识按键5设置时间时,按下的次数uint num_setmode_cnt; //1 or 2uint stopwatch_miao;uint stopwatch_Umiao;uint stopwatch_miao_1;uint stopwatch_Umiao_1;uint mode_flag;uint warn_flag;uint stopflag = 1; //初始时先让秒表停止uchar code shuma[] = {0xC0,/*0*/0xF9,/*1*/0xA4,/*2*/0xB0,/*3*/0x99,/*4*/0x92,/*5*/0x82,/*6*/0xF8,/*7*/0x80,/*8*/0x90,/*9*/}; // 共阳数码管void delay(uint z) // 1ms{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void display_1() // 上排{uchar qian,bai,shi,ge;qian = shuju_1/1000;bai = shuju_1%1000/100;shi = shuju_1%100/10;ge = shuju_1%10;////xianshi 1////P2 |= 0xf0; //高4位全部置1P2 &= 0xef; //改变高4位,低4位不变if(shanshuo1 == 1)P0= 0xff;elseP0= shuma[qian];delay(1);////xianshi 2////P2 |= 0xf0;P2 &= 0xdf;if(shanshuo2 == 1)P0= 0xff;elseP0=shuma[bai]&0x7f; //要点亮小数点delay(1);////xianshi 3////P2 |= 0xf0;P2 &= 0xbf;if(shanshuo3 == 1)P0= 0xff;elseP0=shuma[shi];delay(1);////xianshi 4////P2 |= 0xf0;P2 &= 0x7f;if(shanshuo4 == 1)P0= 0xff;elseP0=shuma[ge];delay(1);P2 = 0xff; //解除位选}void display_2() // 下排{uchar qian,bai,shi,ge;qian = shuju_2/1000;bai = shuju_2%1000/100;shi = shuju_2%100/10;ge = shuju_2%10;////xianshi 1////P2 |= 0x0f; //低4位全部置1P2 &= 0xfe; //改变低4位,高4位不变if(shanshuo1 == 1)P0= 0xff;elseP0= shuma[qian];delay(1);////xianshi 2////P2 |= 0x0f;P2 &= 0xfd;if(shanshuo2 == 1)P0= 0xff;else if (mode_flag == 2){P0=shuma[bai]&0x7f;}else{P0=shuma[bai] ;}delay(1);////xianshi 3////P2 |= 0x0f;P2 &= 0xfb;if(shanshuo3 == 1)P0= 0xff;else if (mode_flag == 1){P0=shuma[shi]&0x7f;}else{P0=shuma[shi] ;}delay(1);////xianshi 4////P2 |= 0x0f;P2 &= 0xf7;if(shanshuo4 == 1)P0= 0xff;elseP0=shuma[ge];delay(1);P2 = 0xff; //解除位选}void check_ledflash() //判断哪一位正在设置中,让该位闪烁{switch(shanshuo) //利用shanshuo标志来判断,当前正在在哪一位设定{case 1:shanshuo1 = ~shanshuo1; //如果为第一位,则第一位闪烁,其它位不闪烁shanshuo2 =0;shanshuo3 =0;shanshuo4 =0;break;case 2:shanshuo2 = ~shanshuo2;//如果为第二位,则第一位闪烁,其它位不闪烁shanshuo1 =0;shanshuo3 =0;shanshuo4 =0;break;case 3:shanshuo3 = ~shanshuo3;//如果为第三位,则第一位闪烁,其它位不闪烁shanshuo1 =0;shanshuo2 =0;shanshuo4 =0;break;case 4:shanshuo4 = ~shanshuo4;//如果为第四位,则第一位闪烁,其它位不闪烁shanshuo1 =0;shanshuo2 =0;shanshuo3 =0;break;default:shanshuo1 =0;shanshuo2 =0;shanshuo3 =0;shanshuo4 =0;break;}}void settime()//设定系统时间,时间格式:分-分。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机原理及应用课程设计题目:基于T89C51设计可调式的电子钟学院:信息工程学院专业:计算机科学与技术班级:专升本班*名:***学号: **********指导老师:**1概述 (4)1.1课题研究的目的和意义 (4)2 课题方案论证 (4)2.1系统总体设计要求 (4)2.2系统模块结构论证 (5)3 系统硬件设计 (5)3.2最小单片机系统 (6)3.3按键电路 (7)3.4显示电路 (8)4软件设计 (9)4.1 主程序 (9)5软硬件联调及调试结果 (18)5.1调试步骤 (18)结束语 (18)参考文献 (18)附录 (19)附录3 proteus仿真图 (19)基于T89C51设计可调式的电子钟摘要:数字电子时钟电路设计系统,以AT89C51单片机为控制核心,由开关显示、LED 共阴极数码管和LED灯显示等功能模块组成。
基于题目基本要求,本系统对时间显示和定时报警进行了重点设计。
本系统大部分功能由软件来实现,吸收了硬件软件化的思想,大部分功能通过软件来实现,使电路简单明了,系统稳定性大大提高。
本系统不仅成功的实现了要求的基本功能,而且有一定的创新功能。
关键字:单片机;AT89C51;数字钟1概述1.1课题研究的目的和意义此次设计是单片机内部的定时/计数器来实现电子时钟的方法以及借助键盘直接控制整时的调整,本设计根据AT89C51单片机系统扩展的基本原理和方法,由单片机AT89S51芯片,LED数码管和键盘为核心,辅以必要的电路,构成了一个单片机电子时钟。
一块单片机芯片就是一台计算机,由于单片机以其集成度高、体积小、可靠性高、控制功能强、低电压、低功耗等特点使它应用于智能仪器仪表、机电一体化、实时程控、人类生活中。
除此之外还广泛应用办公自动化领域、商业营销领域、汽车及通信系统、计算机外部设备等各领域中,并且单片机已成为计算机发展和应用的一个重要方面。
由此可见掌握单片机的使用方法和利用单片机解决实际问题具有重要的意义。
而此次的设计刚好用到单片机相关的知识可以说这是这次设计的重要意义和目的所在。
再者,此设计的LED电子时钟主要是显时间的,是时钟用途。
在此设计的基础上人们还可根据不同的需求和不同的设计水平做出不同的设计项目。
也可以加上日期,温度的显示和闹钟的功能。
如果设计水平还更高的话还可以设计LED 电子显示屏。
因此说,LED电子时钟设计是最简单和基础的。
而且电子时钟很实用,准确性也很好,也容易调节,若有毁坏更换元器件也简单,制作原理和过程也很易懂易做,成本也不高。
在此设计间也包含了很多的知识,跟我所学专业又对口,所以,做这个LED电子时钟是个很用很好很值得做的设计。
2 课题方案论证2.1系统总体设计要求本次设计中的LED数码管电子时钟电路采用24小时制记时方式。
本次设计采用AT89C51单片机的扩展芯片和1个74LS04做驱动,由八块LED数码管构成的显示系统,与传统的基于8/16位普通单片机的LED显示系统相比较,本系统在不显著地增加系统成本的情况下,可支持更多的LED数码管稳定显示。
设计采用AT89C51单片机,配备12MHz晶振,复位电路为上电复位。
采用软件译码动态显示,考虑直接用单片机I/O口作为位选时可能驱动功率不够,可采用三极管作驱动共阳极数码管显示。
8位8段LED数码管作正常、调时显示,时间按时分秒排列,时钟误差:24小时误差3~5秒,并且在按键的作用下可以进行调时,调分,复位功能。
本电路采用直流5V电源供电。
同时为了限流保护电路也用了若干个阻值不等的电阻。
在本文一开始做了一些概述主要说明此设计的目的和意义,并会对这类设计项目发展情况做个简介。
这是对这次设计很重要的一个认识是前提和设计者必须明确和了解的。
然后本文对此设计做了一些简要分析,这对理清设计思想很重要。
然后还对设计中用到的元器件进行比较全面的介绍。
只有真正了解了元器件的特性和功能才能让这些元器件在设计中起到作用。
电子整个设计第一步是电路原理图,它直接关系着后续的工作。
紧接着就是程序了,如果只有硬件电路而没有程序,那么这个设计将一文不值,也就是说是一堆破铜烂铁。
所以这部分也是非常重要的。
最后结合整个设计总结了一些心得体会为这次的设计画上完满的句号。
也为以后更好的设计提供经验。
2.2系统模块结构论证按照系统设计功能的要求,确定系统由4个模块组成:主控制器、扫描驱动、调节电路和显示电路。
数码管电子钟电路结构框图如图2-2所示图2-2 电路结构图3 系统硬件设计电子钟的原理框图如图3-1所示。
它由以下几个部件组成:单片机AT89C51、电源、时分秒显示部件。
时分秒显示采用动态扫描,以降低对单片机端口数的要求,同时也降低系统的功耗。
时分显示模块以及显示驱动都通过AT89C51的I/O口控制。
电源部分:整流稳压来得到+5V电压,维持系统的正常工作。
电子钟系统原理框图如图3-1所示:图3-1电子钟系统原理框图3.2最小单片机系统51单片机最小系统复位电路的极性电容C1的大小直接影响单片机的复位时间,一般采用10~30uF ,51单片机最小系统容值越大需要的复位时间越短。
51单片机最小系统晶振Y1也可以采用6M H Z 或者12MHz ,在正常工作的情况下可以采用更高频率的晶振,51单片机最小系统晶振的振荡频率直接影响单片机的处理速度,频率越大处理速度越快。
51单片机最小系统起振电容C2、C3一般采用15~33pF ,并且电容离晶振越近越好,晶振离单片机越近越好4.P0口为开漏输出,作为输出口时需加上拉电阻,阻值一般为10k 。
设置为定时器模式时,加1计数器是对内部机器周期计数(1个机器周期等于12个振荡周期,即计数频率为晶振频率的1/12)。
计数值N 乘以机器周期Tcy 就是定时时间t 。
设置为计数器模式时,外部事件计数脉冲由T0或T 1引脚入到计数器。
在每个机器周期的S5P2期间采样T0、T1引脚电平。
当某周期采样到一高电平输入,而下一周期又采样到一低电平时,则计数器加1,更新的计数值在下一个机器周期的S3P1期间装入计数器。
由于检测一个从1到0的下降沿需要2个机器周期,因此要求被采样的电平至少要维持一个机器周12MHz 时,最高计数频率不超过1/2MHz ,即计数脉冲的周期要大于2 ms最小系统如图3-2所示:图3-2最小系统3.3按键电路按键电路使用的是AT89C51单片机的P1和P2管脚,可调试电子中的按键总共为二个,按键功能分别为分钟,小时的加减。
通过按键电路,我们可以随意调整电子钟的时间,使单片机发挥它的作用。
按键电路图如图3-3所示:图3-3:按键电路图3.4显示电路可调试电子钟的显示电路采用8位数码管,显示出时间的时,分,秒。
使用的是AT89C51单片机的P0和P2管脚,显示电路中还将用到一块74LS245。
显示电路图如图3-4所示:图3-4显示电路4软件设计4.1 主程序Q0000: LJMP Q00DBNOPNOPNOPNOPNOPNOPNOPNOPLJMP Q0167INC R0INC R1NOPNOPCJNE R7,#00H,Q0015 Q0015: CJNE R7,#00H,Q0018 Q0018: NOPNOPNOPLJMP Q01A1Q001E: MOV P0,#0FFHMOV P3,#0FFHMOV TMOD,#11HMOV TH0,#0FCHMOV TL0,#18HMOV TH1,#0DCHCLR AMOV TL1,AMOV TCON,#01HSETB EASETB ET0SETB ET1MOV 14H,#0CHMOV 08H,AMOV 16H,AMOV 15H,AMOV A,14HMOV B,#0AHDIV ABMOV DPTR,#024DH MOVC A,@A+DPTR MOV 09H,AMOV A,14HMOV B,#0AHDIV ABMOV A,BMOVC A,@A+DPTR MOV 0AH,AMOV A,15HMOV B,#0AHDIV ABMOVC A,@A+DPTR MOV 0CH,AMOV A,15HMOV B,#0AHDIV ABMOV A,BMOVC A,@A+DPTR MOV 0DH,AMOV A,16HMOV B,#0AHDIV ABMOVC A,@A+DPTR MOV 0FH,AMOV A,16HMOV B,#0AHDIV ABMOV A,BMOVC A,@A+DPTR MOV 10H,AMOV 13H,#0FEH CLR AMOV 12H,ASETB TR0MOV 11H,#0FFHQ0091: MOV A,P1XRL A,11HJZ Q0091MOV R7,#0AHLCALL Q023BMOV A,P1XRL A,11HJZ Q0091MOV 11H,P1CLR EAMOV A,11HJB ACC.0,Q00B1LCALL Q0217SJMP Q00D7Q00B1: MOV A,11HQ00B3: JB ACC.1,Q00D7MOV A,15HINC AMOV B,#3CHDIV ABMOV 15H,BMOV A,15HMOV B,#0AHDIV ABMOV DPTR,#024DHMOVC A,@A+DPTRMOV 0CH,AMOV A,15HMOV B,#0AHDIV ABMOV A,BMOVC A,@A+DPTRMOV 0DH,AQ00D7: SETB EASJMP Q0091Q00DB: MOV R0,#7FHQ00DE: MOV @R0,ADJNZ R0,Q00DEMOV SP,#16HLJMP Q0122Q00E7: LJMP Q001EQ00EA: CLR AMOVC A,@A+DPTRINC DPTRMOV R0,AQ00EE: CLR AMOVC A,@A+DPTRINC DPTRJC Q00F6MOV @R0,ASJMP Q00F7Q00F6: MOVX @R0,AQ00F7: INC R0DJNZ R7,Q00EESJMP Q0125Q00FC: CLR AMOVC A,@A+DPTRINC DPTRMOV R0,AANL A,#07HADD A,#0CHXCH A,R0CLR CRLC ASWAP AANL A,#0FHORL A,#20HXCH A,R0MOVC A,@A+PCJC Q0114CPL AANL A,@R0SJMP Q0115Q0114: ORL A,@R0Q0115: MOV @R0,ADJNZ R7,Q00FCSJMP Q0125AJMP Q0002INC AINC R0JBC 24H.0,Q0161SJMP Q00B3NOPINC R6Q0125: CLR AMOV R6,#01HMOVC A,@A+DPTRJZ Q00E7INC DPTRMOV R7,AANL A,#3FHJNB ACC.5,Q013BANL A,#1FHMOV R6,ACLR AMOVC A,@A+DPTRINC DPTRJZ Q013BINC R6Q013B: XCH A,R7ANL A,#0C0HADD A,ACCJZ Q00EAJC Q00FCCLR AMOVC A,@A+DPTRINC DPTRMOV R2,ACLR AMOVC A,@A+DPTRINC DPTRMOV R0,AQ014C: CLR AMOVC A,@A+DPTRINC DPTRXCH A,R0XCH A,DPLXCH A,R0XCH A,R2XCH A,DPHXCH A,R2MOVX @DPTR,AINC DPTRXCH A,R0XCH A,DPLXCH A,R0XCH A,R2XCH A,DPHXCH A,R2Q0161: DJNZ R7,Q014CDJNZ R6,Q014CSJMP Q0125Q0167: PUSH ACCPUSH PSWMOV PSW,#00HPUSH 00HPUSH 07HMOV TH0,#0FCHMOV TL0,#18HMOV P3,13HMOV A,#09HADD A,12HMOV R0,AMOV A,@R0CPL AMOV P0,AMOV R7,13HMOV R0,#01HMOV A,R7INC R0SJMP Q018DQ018C: RL AQ018D: DJNZ R0,Q018CMOV 13H,AMOV A,12HINC AANL A,#07HMOV 12H,APOP 07HPOP 00HPOP PSWPOP ACCRETIQ01A1: PUSH ACCPUSH BPUSH DPHPUSH DPLPUSH PSWMOV TH1,#3CHMOV TL1,#0B0HINC 08HMOV A,08HCJNE A,#14H,Q01BEMOV 08H,#00HLCALL Q01F0Q01BE: POP PSWPOP DPLPOP DPHPOP BPOP ACCRETIQ01C9: INC 15HMOV A,15HSETB CSUBB A,#3BHJC Q01D8CLR AMOV 15H,ALCALL Q0217Q01D8: MOV A,15HMOV B,#0AHDIV ABMOV DPTR,#024DHMOVC A,@A+DPTRMOV 0CH,AMOV A,15HMOV B,#0AHDIV ABMOV A,BMOVC A,@A+DPTRMOV 0DH,ARETQ01F0: INC 16HMOV A,16HSETB CSUBB A,#3BHJC Q01FFCLR AMOV 16H,ALCALL Q01C9Q01FF: MOV A,16HMOV B,#0AHDIV ABMOV DPTR,#024DHMOVC A,@A+DPTRMOV 0FH,AMOV A,16HMOV B,#0AHDIV ABMOV A,BMOVC A,@A+DPTRMOV 10H,ARETQ0217: INC 14HMOV A,14HSETB CSUBB A,#17HJC Q0223CLR AMOV 14H,AQ0223: MOV A,14HMOV B,#0AHDIV ABMOV DPTR,#024DHMOVC A,@A+DPTRMOV 09H,AMOV A,14HMOV B,#0AHDIV ABMOV A,BMOVC A,@A+DPTRMOV 0AH,ARETQ023B: MOV R5,07HDEC R7MOV A,R5JZ Q024CCLR AMOV R6,AQ0243: MOV A,R6CLR CSUBB A,#78HJNC Q023BINC R6SJMP Q0243Q024C: RETPUSH 0F9HMUL ABANL C,/TIMOV P0.2,CMOV R0,ASJMP Q01E7MOV R7,A5软硬件联调及调试结果5.1调试步骤(1)在KEIL软件中编写程序,完成后,单击“项目”下的“编译”,产生“.hex”文件。