c8051f410实时时钟,万年历

合集下载

带温度显示的万年历_数码管显示(附电路图和源代码)

带温度显示的万年历_数码管显示(附电路图和源代码)

设计报告设计任务:设计一个智能化万年历时钟电路,LED数码管作为电路的显示部分,按钮开关作为调时部分,通过与单片机连接数码管动态显示年、月、日、时、分、秒、星期、温度。

并能准确计算闰年闰月的显示。

设计要求:通过与单片机连接数码管动态显示年、月、日、时、分、秒、星期等功能,并能准确计算闰年闰月的显示,三个个按钮连接P3.0、P3.1、P3.2可以精确调整每一个时间数值,通过对所设计的万年历时钟电路进行实验测试,达到了动态显示时间,随时调整时间等技术所连线路和单片机接口仿真图如图3所示:图3 仿真按键4)温度采集部分:DS18B20温度传感器,测温范围-55℃~+125℃,固有测温分辨率0.5℃。

独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。

DS18B20的采集数据通过DQ传入单片机,单片机读取数据后将数据输出!如图所示:程序如下:ReadOneChar(void){unsigned char i=0;// 定义i用于循环unsigned char dat = 0;// 读取的8位数据for (i=8;i>0;i--)//8次循环{DQ = 0;// 拉低DQ总线开始读时序dat>>=1;// dat左移一位DQ = 1; //释放DQ总线if(DQ)// 如果DQ=1,执dat|=0x80;(0x80即第7位为1,如果DQ为1,即读取的数据为1,将dat的第7为置1,然后dat>>=1,循环8次结束,dat 即为读取的数据)//DQ=0,就跳过dat|=0x80;Tdelay(4);// 延时以完成此次读时序,之后再读下一数据}return(dat); 返回读取的dat}//写一个字节WriteOneChar(unsigned char dat){unsigned char i=0;//for (i=8; i>0; i--)//{DQ = 0;//DQ = dat&0x01;//Tdelay(5);//延时以完成此次读时序,之后再读下一数据DQ = 1;//dat>>=1;//}}//读取温度ReadTemperature(void){unsigned char a=0;unsigned char b=0;unsigned int t=0;float tt=0;//Init_DS18B20();WriteOneChar(0xCC);// 写指令,跳过ROM,WriteOneChar(0x44);// 启动温度转换Init_DS18B20();WriteOneChar(0xCC);// 写指令,跳过ROM,WriteOneChar(0xBE);// 写指令,读暂存存储器a=ReadOneChar();//读低8位b=ReadOneChar();//读高8位t=b;//t<<=8;//t=t|a;//tt=t*0.0625;//t= tt*10+0.5;//return(t); //获得0.01°C 的精度并返回}LED数码管的选择LED数码管分为共阴和共阳两种,以利用STC89C51的P0口作为LED显示的数据部分,以P2口的七个口作为显示部分的位选,通过三八译码器和4-16译码器扩展为17位的位选分别接在一个四位数码管和13个数码管的位选部分。

基于单片机的万年历课程设计说明书剖析

基于单片机的万年历课程设计说明书剖析

郑州工业应用技术学院课程设计说明书题目:基于单片机控制的电子万年历设计姓名:许颖福院(系):机电工程学院专业班级:13电气工程1班学号:1302120118指导教师:祁瑞敏、杨坤漓成绩:时间:2015 年12月21 日至2015 年12 月30 日郑州工业应用技术学院课程设计任务书题目: 基于单片机控制的电子万年历设计专业、班级 13电气工程1班学号1302120118姓名许颖福主要内容、基本要求、主要参考资料等:主要内容:设计一个基于单片机的电子万年历,能够显示时间、日期、温度等信息。

并且具备调整时间、日期、定时等功能。

基本要求:1.利用单片机、时钟芯片、温度传感器、显示模块等实现日期、时间、温度的显示即一个简单的万年历;2.万年历的设计是几个简单模块的组合,硬件上是这样,软件上也是这样,要熟悉相关模块的设计思路;3.通过Proteus仿真设计的使用,完成万年历的设计与仿真;4.通过万年历的设计熟练掌握单片机的各个功能,并且能对单片机有一个总体的把握,在设计的过程中能够凭借对单片机各功能的了解,达到理想的设计效果;5.通过该设计掌握时钟芯片DS1302、温度传感器DS18B20和LCD1602等芯片的使用方法。

主要参考资料:[1]李全利,单片机原理及接口技术[M],高等教育出版社[2]王文杰,单片机应用技术[M],冶金工业出版社[3]朱清慧,PROTEUS教程——电子线路设计、制版与仿真[M],清华大学出版社[4]单片机实验指导书,天煌教仪[5]彭伟,单片机C语言程序设计实训100例[M],电子工业出版社完成期限:指导教师签名:课程负责人签名:年月日摘要电子万年历是一种非常广泛的日常计时工具,它不仅能够对时间技术,还能够对日期、温度、湿度等进行显示,所以在现代社会受到广泛应用。

本设计是一个基于AT89C52单片机的多功能日历显示设计,能够显示公历年、月、日,以及时、分、秒、温度等信息,而且还具有日期调整、时间校准以及温度采集等功能。

51单片机电子万年历设计电路图及程序

51单片机电子万年历设计电路图及程序

摘要:之南宫帮珍创作电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。

它可以对年、月、日、周日、时、分、秒进行计时,还具有闰年抵偿等多种功能,而且DS1302的使用寿命长,误差小。

对于数字电子万年历采取直观的数字显示,可以同时显示年、月、日、周日、时、分、秒和温度等信息,还具有时间校准等功能。

该电路采取AT89S52单片机作为核心,功耗小,能在3V的低压工作,电压可选用3~5V电压供电。

本设计是基于51系列的单片机进行的电子万年历设计,可以显示年月日时分秒及周信息,具有可调整日期和时间功能。

在设计的同时对单片机的理论基础和外围扩展知识进行了比较全面准备。

在硬件与软件设计时,没有良好的基础知识和实践经验会受到很大限制,每项功能实现时需要那种硬件,程序该如何编写,算法如何实现等,没有一定的基础就不成能很好的实现。

在编写程序过程中发现以现有的相关知识要独自完成编写任务困难重重,在老师和同学的帮忙下才完成了程序部分的编写。

万年历的设计过程在硬件与软件方面进行同步设计。

硬件部分主要由AT89C52单片机,LED显示电路,以及调时按键电路等组成。

在单片机的选择上自己使用了AT89C52单片机,该单片机适合于许多较为复杂控制应用场合。

显示器使用2片7SEG-MPX8-CA和一片7SEG-MPX4-CA。

7SEG-MPX8-CA是一种八个共阳二极管显示器,7SEG-MPX4-CA是一种四个共阳二极管显示器。

为了能更轻松的控制这三片显示器,自己使用了3片74HC164来驱动。

74HC164 是 8 位边沿触发式移位寄存器,串行输入数据,然后并行输出。

软件方面主要包含日历程序、时间调整程序,公历转阴历程序,显示程序等。

程序采取汇编语言编写,以便更简单地实现调整时间及阴历显示功能。

所有程序编写完成后,在wave 软件中进行调试,确定没有问题后,在Proteus软件中嵌入单片机内进行仿真。

最后总在老师同学的帮忙以及自己的努力下完成了此次电子万年历的设计。

C8051F系列单片机的初始化

C8051F系列单片机的初始化

C8051F系列单片机的初始化C8051F系列单片机是由美国Silicon Laboratories公司研发的一款8位微控制器,它具有强大的功能和灵活的性能,是一种广泛应用于各种电子设备中的微控制器。

在使用C8051F系列单片机之前,需要进行初始化操作,以确保单片机能够正常工作。

下面将介绍C8051F系列单片机的初始化过程。

1. 系统时钟初始化在初始化单片机之前,需要先配置它的系统时钟。

C8051F系列单片机的系统时钟可从外部晶体振荡器或内部RC振荡器提供。

通过设置相关的寄存器,可以选择使用哪一种时钟源,并配置其频率。

2. 系统时钟分频器初始化对于大多数应用程序而言,操作系统时钟的速度往往太快,因此需要对其进行分频,减少操作速度。

C8051F系列单片机提供了一个系统时钟分频器,通过设置相关的寄存器,可以选择分频比例,将操作速度减慢。

3. I/O端口初始化C8051F系列单片机具有多个I/O端口,用于输入和输出数据。

在初始化单片机时,需要设置每个I/O端口的输入和输出模式,以及电平状态和电流限制等参数。

4. 中断初始化C8051F系列单片机支持多种中断模式,可以在程序执行期间随时中断当前任务,处理新的事件。

在初始化单片机时,需要配置中断引脚和中断向量表等参数。

5. 定时器初始化C8051F系列单片机具有多个定时器,用于计时和延时等功能。

在初始化单片机时,需要设置每个定时器的计数模式、频率、触发条件和计时范围等参数。

6. 串口初始化C8051F系列单片机支持串口通信,可以与其他设备进行数据交换。

在初始化单片机时,需要设置串口的通信协议、波特率和数据格式等参数。

7. ADC/DAC初始化C8051F系列单片机具有模拟转换模块,可以对模拟信号进行采样和变换。

在初始化单片机时,需要设置ADC/DAC的采样率、分辨率和参考电压等参数。

通过以上步骤,就可以完成C8051F系列单片机的初始化。

在开发具体应用程序时,还需要根据实际需求对各个模块进行进一步配置和编程。

基于51单片机GPS自动校时的万年历设计方案

基于51单片机GPS自动校时的万年历设计方案

3 硬件设计
HARDWARE DESIGN
3.1 系统概述
本系统由51单片机、DS1302时钟芯片、1062液晶显示器、DS18B20温度测量、键盘、蜂鸣器 系统等部分构成。软件部分在keil环境下用C51语言编写,包括时间设置、时间显示、定时设置、 定时闹钟、温度显示。原理框图如下:
3.2 系统框图
蜂鸣器设置:蜂鸣器报警时,设置响100毫秒,停100毫秒,循环响应,产生滴滴的声音。
液晶显示的设置:写入指令码write_com(0x38),设置功能16*2显示,5*7点阵,8位数据接口显 示/开关及光标设置8)写入指令码write_com(0x0c),设置开显示,不显示光标,光标不闪烁。 16)写入指令码write_com(0x06),设置当读或写一个字符后地址指针加一,且光标加一。当写 一个字符,整屏显示不移动。显示清屏,写入指令码write_com(0x01)。
写入指令码函数write_com()写指令过程 :输入:rs=0,D0-D7=指令码,E=高脉冲写入数据 函数 write_date() 写指令过程: 输入:rs=1,D0-D7=数据,E=高脉冲写入指令和数据时rw 端已经接地。数据指针设置 指令码80H+地址码(0-27H)显示第一行的字符指令码80H+地址码 (40H-67H)显示的第二行字符
本时钟还具有环保、走时无噪音、低功耗等非实时时钟不具有的功能。该实时时钟不但可以作 为家用,而且更可以在公共场合使用,如车站、码头、商场等场所。
2 总体方案
GENERAL PLANNING
本方案所研究的电子万年历是单片机控制技术的一个具体应用,主要研究内容
包括以下几个方面: (1)选用电子万年历芯片时,应重点考虑功能实在、使用方便、单片存储、低功 耗、抗断电的器件。 (2)根据选用的电子万年历芯片设计外围电路和单片机的接口电路。

C8051F410-GDI中文资料

C8051F410-GDI中文资料
Package
Wafer Thickness
元器件交易网
C8051F410-GDI
2. Pin Definitions
Table 2.1 lists the pin definitions for the C8051F410-GDI. For a full description of each pin, refer to the C8051F410/1/2/3 data sheet.
A In for a crystal or resonator.
D I/O or Port 1.1. A In
15 A O or External Clock Output. This pin is the excitation driver for an D In external crystal or resonator, or an external clock input for CMOS, capacitor, or RC oscillator configurations.
元器件交易网
C8051F410-GDI
1. Ordering Information
Table 1.1. Product Selection Guide
C8051F410-GDI 50 32 2368 1 1 1 4 24 10 1 Tested 12 mil
Table 2.1. Pin Definitions for C8051F410-GDI (Continued)
Physical Pad Number 27
28
29 30
Type Description
D I/O or Port 0.4. A In
UART TX Pin. D Out D I/O or Port 0.5. A In

51单片机c语言电子万年历完整程序

51单片机c语言电子万年历完整程序

该程序为51单片机c语言电子万年历#include"reg52.h"//#include<stdio.h>#define uchar unsigned char#define uint unsigned intsbit lcden=P3^4;sbit lcdrs=P3^5;sbit DATA=P0^7;sbit RST=P0^5;sbit SCLK=P0^6;sbit menu=P3^0; //菜单sbit add=P3^1; //加一sbit dec=P3^7; //减一sbit led0=P1^0;sbit led1=P1^1;sbit led2=P1^2;sbit led3=P1^3;sbit ds=P3^2;//sbit beep=P3^3;uint temp;float f_temp;uint warn_l1=270;uint warn_l2=250;uint warn_h1=300;uint warn_h2=320;uint get_temp();void delayms(uint x);void write_com(uchar com);void write_data(uchar date);void init();void dis_temp(uint t);void Write1302(uchar dat);void WriteSet1302(uchar Cmd,uchar dat);uchar Read1302(void);uchar ReadSet1302(uchar Cmd);void Init_DS1302(void);void DisplaySecond(uchar x);void DisplayMinute(uchar x);void DisplayHour(uchar x);void DisplayDay(uchar x);void DisplayMonth(uchar x);void DisplayYear(uchar x);void DisplayWeek(uchar x);void dis_temp(uint t);void read_date(void);void turn_val(char newval,uchar flag,uchar newaddr,uchar s1num);void key_scan(void);char code table[]="0123456789" ;uchar code table2[]= "TUEWESTHUFRISATSUNMON"; uchar second,minute,hour,day,month,year,week,count=0; uchar ReadValue,num,time;void delayms(uint x){uint i,j;for(i=x;i>0;i--)for(j=110;j>0;j--);}////////////////////////////////////////////////////////////void write_com(uchar com){lcdrs=0;P2=com;delayms(5);lcden=1;delayms(5);lcden=0;}void write_data(uchar date){lcdrs=1;P2=date;delayms(5);lcden=1;delayms(5);lcden=0;}void init(){lcden=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);}/////////////////////////////////////////////////////////////////void Write1302(uchar dat){uchar i;SCLK=0; //拉低SCLK,为脉冲上升沿写入数据做好准备 delayms(2); //稍微等待,使硬件做好准备for(i=0;i<8;i++) //连续写8个二进制位数据DATA=dat&0x01; //取出dat的第0位数据写入1302delayms(2); //稍微等待,使硬件做好准备SCLK=1; //上升沿写入数据delayms(2); //稍微等待,使硬件做好准备SCLK=0; //重新拉低SCLK,形成脉冲dat>>=1; //将dat的各数据位右移1位,准备写入下一个数据位 }}void WriteSet1302(uchar Cmd,uchar dat){RST=0; //禁止数据传递SCLK=0; //确保写数居前SCLK被拉低RST=1; //启动数据传输delayms(2); //稍微等待,使硬件做好准备Write1302(Cmd); //写入命令字Write1302(dat); //写数据SCLK=1; //将时钟电平置于已知状态RST=0; //禁止数据传递}uchar Read1302(void){uchar i,dat;delayms(2); //稍微等待,使硬件做好准备for(i=0;i<8;i++) //连续读8个二进制位数据dat>>=1; //将dat的各数据位右移1位,因为先读出的是字节的最低位if(DATA==1) //如果读出的数据是1dat|=0x80; //将1取出,写在dat的最高位SCLK=1; //将SCLK置于高电平,为下降沿读出delayms(2); //稍微等待SCLK=0; //拉低SCLK,形成脉冲下降沿delayms(2); //稍微等待}return dat; //将读出的数据返回}uchar ReadSet1302(uchar Cmd){uchar dat;RST=0; //拉低RSTSCLK=0; //确保写数居前SCLK被拉低RST=1; //启动数据传输Write1302(Cmd); //写入命令字dat=Read1302(); //读出数据SCLK=1; //将时钟电平置于已知状态RST=0; //禁止数据传递return dat; //将读出的数据返回}void Init_DS1302(void){WriteSet1302(0x8E,0x00); //根据写状态寄存器命令字,写入不保护指令WriteSet1302(0x80,((0/10)<<4|(0%10))); //根据写秒寄存器命令字,写入秒的初始值WriteSet1302(0x82,((59/10)<<4|(59%10))); //根据写分寄存器命令字,写入分的初始值WriteSet1302(0x84,((23/10)<<4|(23%10))); //根据写小时寄存器命令字,写入小时的初始值WriteSet1302(0x86,((28/10)<<4|(28%10))); //根据写日寄存器命令字,写入日的初始值 WriteSet1302(0x88,((2/10)<<4|(2%10))); //根据写月寄存器命令字,写入月的初始值WriteSet1302(0x8c,((14/10)<<4|(14%10))); //nian//WriteSet1302(0x8a,((4/10)<<4|(4%10)));}/////////////////////////////////////////////////////////////////void DisplaySecond(uchar x){uchar i,j;i=x/10;j=x%10;write_com(0x80+0x46);write_data(i+0x30);write_com(0x80+0x47);write_data(j+0x30);write_com(0x80+0x48);write_data(' ');dis_temp(get_temp());}void DisSecond(uchar x){uchar i,j;ReadValue = ReadSet1302(0x81);second=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);i=x/10;j=x%10;write_com(0x80+0x46);write_data(i+0x30);write_com(0x80+0x47);write_data(j+0x30);}void DisplayMinute(uchar x) {uchar i,j;i=x/10;j=x%10;write_com(0x80+0x43);write_data(i+0x30);write_com(0x80+0x44);write_data(j+0x30);write_com(0x80+0x45);write_data(':');}void DisplayHour(uchar x){uchar i,j;i=x/10;j=x%10;write_com(0x80+0x40);write_data(i+0x30);write_com(0x80+0x41);write_data(j+0x30);write_com(0x80+0x42);write_data(':');}void DisplayDay(uchar x) {uchar i,j;i=x/10;j=x%10;write_com(0x89);write_data(i+0x30);write_com(0x8a);write_data(j+0x30); }void DisplayMonth(uchar x) {uchar i,j;i=x/10;j=x%10;write_com(0x86);write_data(i+0x30); write_com(0x87);write_data(j+0x30);write_com(0x88);write_data('/');}void DisplayYear(uchar x) {uchar i,j;i=x/10;j=x%10;write_com(0x81);write_data(2+0x30);write_com(0x82);write_data(0+0x30);write_com(0x83);write_data(i+0x30);write_com(0x84);write_data(j+0x30);write_com(0x85);write_data('/');}void DisplayWeek(uchar x){ uchar i;x=x*3;// write_com(0x8c);write_data(table2[x]);// write_com(0x8d);write_data(table2[x+1]);// write_com(0x8e);write_data(table2[x+2]);write_com(0x8c);for(i=0;i<3;i++){write_data(table2[x]);x++;}}void read_date(void){ReadValue = ReadSet1302(0x81);second=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue = ReadSet1302(0x83);minute=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = ReadSet1302(0x85);hour=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = ReadSet1302(0x87);day=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = ReadSet1302(0x89);month=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = ReadSet1302(0x8d);year=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue=ReadSet1302(0x8b); //读星期week=ReadValue&0x07;DisplayYear(year);DisplayMonth(month);DisplayDay(day);DisplayWeek(week);DisplayHour(hour);DisplayMinute(minute);DisplaySecond(second);dis_temp(get_temp()); ///温度显示key_scan(); ///按键检测}void turn_val(char newval,uchar flag,uchar newaddr,uchar s1num){newval=ReadSet1302(newaddr); //读取当前时间newval=((newval&0x70)>>4)*10+(newval&0x0f); //将bcd码转换成十进制 if(flag) //判断是加一还是减一{newval++;switch(s1num){ case 1: if(newval>99) newval=0;DisplayYear(newval);break;case 2: if(newval>12) newval=1;DisplayMonth(newval);break;case 3: if(newval>31) newval=1;DisplayDay(newval);break;case 4: if(newval>6) newval=0;DisplayWeek(newval);break;case 5: if(newval>23) newval=0;DisplayHour(newval);break;case 6: if(newval>59) newval=0;DisplayMinute(newval);break;case 7: if(newval>59) newval=0;DisplaySecond(newval);break;default:break;}}else{newval--;switch(s1num){ case 1: if(newval==0) newval=99;DisplayYear(newval);break;case 2: if(newval==0) newval=12;DisplayMonth(newval);break;case 3: if(newval==0) newval=31;DisplayDay(newval);break;case 4: if(newval<0) newval=6;DisplayWeek(newval);break;case 5: if(newval<0) newval=23;DisplayHour(newval);break;case 6: if(newval<0) newval=59;DisplayMinute(newval);break;case 7: if(newval<0) newval=59;DisplaySecond(newval);break;default:break;}}WriteSet1302((newaddr-1),((newval/10)<<4)|(newval%10)); //将新数据写入寄存器}//////////////////////////////////////void dsreset(void){uint i;ds=0;i=103;while(i>0)i=4;while(i>0)i--;}bit tempreadbit(void){uint i;bit dat;ds=0;i++;ds=1;i++;i++;dat=ds;i=8;while(i>0)i--;return(dat);}uchar tempread(void){uchar i,j,dat;dat=0;for(i=1;i<=8;i++){j=tempreadbit();dat=(j<<7)|(dat>>1); }return(dat);}void tempwritebyte(uchar dat) {bit testb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb){ds=0;i++;i++;ds=1;i=8;while(i>0)i--;}else{ds=0;i=8;while(i>0)i--;ds=1;i++;i++;}}}void tempchange(void) {dsreset();delayms(1);tempwritebyte(0xcc);tempwritebyte(0x44);key_scan(); //////按键函数}uint get_temp(){uchar a,b;tempchange(); //////温度函数dsreset();delayms(1);tempwritebyte(0xcc);tempwritebyte(0xbe);a=tempread();b=tempread();temp=b;temp<<=8;temp=temp|a;f_temp=temp*0.0625;temp=f_temp*10+0.5;f_temp=f_temp+0.05;return temp;}//////void dis_temp(uint t){uchar n1,n2,n3;n1=t/100;n2=t%100/10;n3=t%100%10;DisSecond(second); ///秒显示 write_com(0x80+0x49);write_data(table[n1]);//delayms(5);write_com(0x80+0x4a);write_data(table[n2]);//delayms(5);write_com(0x80+0x4b);write_data('.');// delayms(5);write_com(0x80+0x4c);write_data(table[n3]);//delayms(5);write_com(0x80+0x4d);write_data('^');//delayms(5);write_com(0x80+0x4e);write_data('C');//delayms(5);DisSecond(second); ////秒显示}/*********************液晶显示*****************/ void warn(uint s,uchar led){uchar i;i=s;// beep=0;P1=~(led);while(i--){dis_temp(get_temp());}// beep=1;P1=0xff;i=s;while(i--){dis_temp(get_temp());}}void deal(uint t){uchar i;if((t>warn_l2)&&(t<=warn_l1)){warn(40,0x01);}else if(t<=warn_l2){warn(10,0x03);}else if((t<warn_h2)&&(t>=warn_h1)) {warn(40,0x04);}else if(t>=warn_h2){warn(10,0x0c);}else{i=40;while(i--){dis_temp(get_temp());DisSecond(second);}}}///////////////////////////////////////void main(){init();Init_DS1302();while(1){tempchange();read_date();deal(temp);key_scan();}}////******************************************* void key_scan(void){// uchar miao,s1num=0;uchar s1num=0;if(menu==0){delayms(5);if(menu==0){while(!menu);s1num++;while(1){if(menu==0){delayms(5);if(menu==0){while(!menu);s1num++;}}// miao=ReadSet1302(0x81);// second=miao;// WriteSet1302(0x80,miao|0x80);write_com(0x0f);//光标闪射if(s1num==1){ //year=ReadSet1302(0x8d);write_com(0x80+4); //年光标if(add==0){delayms(3);if(add==0){ while(!add);turn_val(year,1,0x8d,1);}}if(dec==0){delayms(3);if(dec==0){ while(!dec);turn_val(year,0,0x8d,1);}}}if(s1num==2){//month=ReadSet1302(0x89);write_com(0x80+7); //月光标if(add==0){delayms(3);if(add==0){ while(!add);turn_val(month,1,0x89,2);}}if(dec==0){delayms(3);if(dec==0){ while(!dec);turn_val(month,0,0x89,2);}}}if(s1num==3){ //day=ReadSet1302(0x87);write_com(0x80+10);//日光标{delayms(3);if(add==0){ while(!add);turn_val(day,1,0x87,3);}}if(dec==0){delayms(3);if(dec==0){ while(!dec);turn_val(day,0,0x87,3); //写入日寄存器 }}}if(s1num==4){ //week=ReadSet1302(0x8b);write_com(0x80+14); //星期光标if(add==0){delayms(3);if(add==0){ while(!add);turn_val(week,1,0x8b,4);}}if(dec==0){delayms(3);{ while(!dec);turn_val(week,0,0x8b,4);}}}if(s1num==5){// hour=ReadSet1302(0x85)write_com(0x80+0x40+1); //时光标if(add==0){delayms(3);if(add==0){ while(!add);turn_val(hour,1,0x85,5);}}if(dec==0){delayms(3);if(dec==0){ while(!dec);turn_val(hour,0,0x85,5);}}}if(s1num==6)//调时间分{ // minute=ReadSet1302(0x83);write_com(0x80+0x40+4);if(add==0){delayms(5);if(add==0){ while(!add);turn_val(minute,1,0x83,6); //写入分寄存器}}if(dec==0){delayms(3);if(dec==0){ while(!dec);turn_val(minute,0,0x83,6); //写入分寄存器}}}if(s1num==7)//调时间秒{// second=ReadSet1302(0x81);write_com(0x80+0x40+7);//秒光标if(add==0){delayms(3);if(add==0){ while(!add);if(second==0x60)second=0x00;turn_val(second,1,0x81,7);}}if(dec==0){delayms(3);if(dec==0){ while(!dec);turn_val(second,0,0x81,7);}}}if(s1num==8){// miao=ReadSet1302(0x81);// second=miao;// WriteSet1302(0x80,second&0x7f);s1num=0;//s1num清零//write_com(0x0c);//光标不闪烁//break;}}}}}。

万年历语音报时时钟

万年历语音报时时钟

Xxxxxxxx毕业设计题目基于MCS51单片机的语音万年历设计专业班级姓名指导教师姓名职称起止日期摘要本设计是基于51系列的单片机的电子万年历及语音报时设计,万年历可以显示年、月、日、时、分、秒、星期等,具有日期和时间校准、闰年补偿、温度显示、闹钟、光控开关,秒表等多种功能。

在设计的同时对单片机、语音芯片和外围扩展知识进行了比较全面准备。

本设计由万年历控制模块,显示模块,发声模块四个部分组成。

控制模块由单片机89C52,按键模块,DS1302时钟模块,温度感应模块等组成,其中89C52单片机作为核心,功耗小,电压可选用3~5V电压供电。

显示模块由12864液晶模块组成。

发声模块由喇叭和三极管组成。

利用单片机可以大大减小硬件的复杂程度。

综合以上各优点可知道该设备的确是一款经济、适用、多功能的万年历。

关键字: 51单片机 lcd12864液晶显示器语音报时目录1 电子万年历概述 (4)1.1 问题的提出和研究背景 (4)1.2 国内外研究现状及发展趋势 (4)1.3 本设计的任务和要求 (5)1.4 章节内容安排 (6)2 系统功能与元器件选择 (7)2.1 系统的主要功能 (7)2.1.1 时钟显示功能 (7)2.1.2 显示功能 (7)2.1.3 温度检测功能 (7)2.1.4 报时功能 (7)2.2 元器件选择 (7)2.2.1单片机芯片的选择 (7)2.2.2显示模块选择 (7)2.2.3时钟芯片的选择 (7)2.2.4 温度检测功能 (8)2.2.5 语音播报功能 (8)2.2.6元器件最终确定 (8)3 系统的硬件结构设计 (8)3.1 总体设计 (8)3.2 系统的模块电路设计 (9)3.2.1单片机最小应用系统电路 (9)3.2.2 DS1302时钟模块设计 (10)3.2.3 LCD显示电路设计 (11)3.2.4 按键电路设计 (11)3.2.5 语音电路设计 (12)3.3 电子万年历的硬件电路设计 (13)4 系统软件的设计 (13)4.1 阳历主程序流程图 (13)4.2 阳历天数程序流程图 ........................................................... 错误!未定义书签。

电子时钟加日历显示

电子时钟加日历显示

电子时钟加日历显示一、任务和要求设计制作一个电子表并且能够显示日历,用LED数码管直接显示,并且能够通过按键调整时间、年月日,功能为按第一个键被调整的相应调整区域开始闪烁,第二个键加一,第三个减一,第四个确认,最后一个在时分秒和年月日中间相互切换。

二、方案论证我们在这里选用了C8051F单片机,它是完全集成的混合信号系统级芯片(SoC),具有与8051兼容的高速CIP-51内核,与MCS-51指令集完全兼容,片内集成了数据采集和控制系统中常用的模拟、数字外设及其他功能部件;内置FLASH程序存储器、内部RAM,大部分器件内部还有位于外部数据存储器空间的RAM,即XRAM。

C8051F单片机具有片内调试电路,通过4脚的JTAG接口可以进行非侵入式、全速的在系统调试。

三、系统硬件电路设计该系统分为两个部分,主控电路和扫描电路,其中键盘扫描和LED扫描为今后节省I/O口线,我将键盘的扫描和LED的扫描共用,在扫描LED的同时也扫描键盘,这样不但方便,而且为今后的扩展留下了相当大的余地。

3.1主控制器单片机使用c8051f310,并且使用它的开发板易于烧录,改变程序和外围电路。

3.2显示电路显示板因为常用,是我自己画出来交给工厂做的,采用4个两位共阳数码管,从P0口输出,8位段码分别和P0相接,通过定时器实现秒钟的加一,又因为310有推挽输出,所以不必再加外部电路对数码管进行驱动,直接将它们与P0口相连就可以3.3键盘电路键盘是是与数码管的位选相连,通过二极管使它们具有单向性,同时将开头最终通过三极管接单片机的P3.4,只要有按键按下,P3.4就一定会发生变化,通过这个变化在去扫描位就可以得出是哪个按键了。

附电路图:四、系统程序设计系统和程序主要包括:显示程序,键盘扫描程序,自动加秒,分,时,日,月,年,附程序:/*************************************************************************** 从左至右键盘依次为key1——key5;key1:预制键key2:加1key3:减1key4:确认key5:时间和年月日相互切换段码备注:位码备注:(从右往左)a...........P0.5 一位...........P1.2b...........P0.7 二位 ..........P1.1c...........p0.2 三位...........P1.4d...........p0.1 四位...........P1.3e...........p0.4 五位 ..........P1.6f...........p0.3 六位...........P1.5g...........p0.8 七位 ..........P1.8按键........P3.4 八位...........P1.7******************************************************************************/ #include "c8051f310.h"#define uchar unsigned char#define unchar unsigned charuchar code duan[10] ={0xa0,0xbd,0x26,0x2c,0x39,0x68,0x60,0xad,0x20,0x28};//段码表 0 1 2 3 4 5 6 7 8 9uchar code wei[8]={0x02,0x01,0x08,0x04,0x20,0x10,0x80,0x40};//位码表uchar code week1[7]={0xbd,0x26,0x2c,0x39,0x68,0x60,0xad} ;//星期一到星期日uchar dataa,sec,min,hour,ymd,year,year1=9,year2=20,month=8,day=22,week=6;//初始值是7-00:00:00,日期是2009-08-22;uchar n,cnt,sw1=0,sw2,sw3,cnt1,sw5;uchar key1,key2,key3,key4=0,key5=0;sbit P3_4=P3^4;void scan_key(void);void delay(ms);/****************************开中断子函数***********************************************************************/void init(void){IE =0x8A;TCON =0x50;TMOD =0x11;IP =0x0A;TH0 =(65536-1270)/256;TH1 =(65536-500)/256;TL1 =(65536-500)%256;}void time0(void) interrupt 1{TH0 =(65536-1270)/256;TL0 =(65536-1270)%256;dataa++;if(sw1!=0&&key4==0) //第一个按键按下,且第四个没有按下{if(++cnt1==40){cnt=0;if(sw5==0&&sw1==1){for(n=0;n<20;n++){P1 =0x00;P1 =P1&0xf3; //闪烁程序P0 =duan[sec%10];P1 =wei[0];delay(8);P1 =0x00;P0 =duan[sec/10];P1 =wei[1];delay(8);P1 =0x00;P0 =duan[hour%10];delay(8);P1 =0x00;P0 =duan[hour/10]; P1 =wei[5];delay(8);P1=0x00;P0 =0x7f;P1 =wei[6];delay(8);P1=0x00;P0 =week1[week];P1 =wei[7];delay(8);}scan_key();}if(sw5==0&&sw1==2) {for(n=0;n<20;n++) {P1 =0x00;P1 =P1&0xcf;P0 =duan[sec%10];P1 =wei[0];delay(8);P1 =0x00;P0 =duan[sec/10];P1 =wei[1];delay(8);P0 =duan[min%10]; P1 =wei[2];delay(8);P1 =0x00;P0 =duan[min/10]; P1 =wei[3];delay(8);P1 =0x00;P0 =0x7f;P1 =wei[6];delay(8);P1 =0x00;P0 =week1[week]; P1 =wei[7];delay(8);}scan_key();}if(sw5==0&&sw1==3) {for(n=0;n<20;n++) {P1 =0x00;P1 =P1&0x7f;P0 =duan[sec%10]; P1 =wei[0];delay(8);P1 =0x00;P0 =duan[sec/10];delay(8);P1 =0x00;P0 =duan[min%10]; P1 =wei[2];delay(8);P1 =0x00;P0 =duan[min/10]; P1 =wei[3];delay(8);P1=0x00;P0=duan[hour%10]; P1=wei[4];delay(8);P1 =0x00;P0 =duan[hour/10]; P1 =wei[5];delay(8);P1 =0x00;P0 =0x7f;P1 =wei[6];delay(8);}scan_key();}if(sw5==1&&sw1==9) {for(n=0;n<20;n++) {P1 =0x00;P0 =duan[month%10]; P1 =wei[2];delay(8);P1 =0x00;P0 =duan[month/10]; P1 =wei[3];delay(8);P1 =0x00;P0 =duan[year1%10]; P1 =wei[4];delay(8);P1 =0x00;P0 =duan[year1/10]; P1 =wei[5];delay(8);P1 =0x00;P0 =duan[year2%10]; P1 =wei[6];delay(8);P1 =0x00;P0 =duan[year2/10]; P1 =wei[7];delay(8);}scan_key();}if(sw5==1&&sw1==8) {for(n=0;n<20;n++)P1 =0x00;P1 =P1&0xf3;P0 =duan[day%10];P1 =wei[0];delay(8);P1 =0x00;P0 =duan[day/10]; P1 =wei[1];delay(8);P1 =0x00;P0 =duan[year1%10]; P1 =wei[4];delay(8);P1 =0x00;P0 =duan[year1/10]; P1 =wei[5];delay(8);P1 =0x00;P0 =duan[year2%10]; P1 =wei[6];delay(8);P1 =0x00;P0 =duan[year2/10]; P1 =wei[7];delay(8);}scan_key();}if(sw5==1&&sw1==7)for(n=0;n<20;n++) {P1 =0x00;P1 =P1&0xc3;P0 =duan[day%10];P1 =wei[0];delay(8);P1 =0x00;P0 =duan[day/10]; P1 =wei[1];delay(8);P1 =0x00;P0 =duan[month%10]; P1 =wei[2];delay(8);P1 =0x00;P0 =duan[month/10]; P1 =wei[3];delay(8);P1 =0x00;P0 =duan[year2%10]; P1 =wei[6];delay(8);P1 =0x00;P0 =duan[year2/10]; P1 =wei[7];delay(8);}scan_key();if(sw5==1&&sw1==6) {for(n=0;n<20;n++) {P1 =0x00;P1 =P1&0xc3;P0 =duan[day%10];P1 =wei[0];delay(8);P1 =0x00;P0 =duan[day/10]; P1 =wei[1];delay(8);P1 =0x00;P0 =duan[month%10]; P1 =wei[2];delay(8);P1 =0x00;P0 =duan[month/10]; P1 =wei[3];delay(8);P1 =0x00;P0 =duan[year1%10]; P1 =wei[4];delay(8);P1 =0x00;P0 =duan[year1/10]; P1 =wei[5];delay(8);scan_key();}}}}void time1(void) interrupt 3 {TH1 =(65536-500)/256;TL1 =(65536-500)%256;if(++cnt>8) cnt=0;if(sw5==0) //显示时分秒{switch(cnt){case 0: P1 =0x00;P0 =duan[sec%10];P1 =wei[cnt]; break;case 1: P1 =0x00;P0 =duan[sec/10];P1 =wei[cnt];break;case 2: P1 =0x00;P0 =duan[min%10];P1 =wei[cnt]; break;case 3: P1 =0x00;P0 =duan[min/10];P1 =wei[cnt];scan_key(); break;case 4: P1 =0x00;P1 =wei[cnt];scan_key();break;case 5: P1 =0x00;P0 =duan[hour/10];P1 =wei[cnt];scan_key();break; case 6: P1 =0x00;P0 =0x7f;P1 =wei[cnt];scan_key(); break; case 7: P1 =0x00;P0 =week1[week];P1 =wei[cnt];scan_key();break; default: break;}}if(sw5==1) //显示年月日{switch(cnt){case 0: P1 =0x00;P0 =duan[day%10];P1 =wei[cnt]; break; case 1: P1 =0x00;P0 =duan[day/10];P1 =wei[cnt];break; case 2: P1 =0x00;P0 =duan[month%10];P1 =wei[cnt]; break;P0 =duan[month/10]; P1 =wei[cnt];scan_key(); break; case 4: P1 =0x00;P0 =duan[year1%10]; P1 =wei[cnt];scan_key();break; case 5: P1 =0x00;P0 =duan[year1/10]; P1 =wei[cnt];scan_key();break; case 6: P1 =0x00;P0 =duan[year2%10]; P1 =wei[cnt];scan_key(); break; case 7: P1 =0x00;P0 =duan[year2/10]; P1 =wei[cnt];scan_key();break; default: break;}}}void conv(void){if(dataa>=201) {dataa=0;sec++;}if(sec>=60)if(sw1==0&&min>=60){min=0;hour++;}if(sw1==0&&hour>=24){if(year%4==0){if(month==2){if(day==29){day =1;month++;}else day++;}else{if(month==4||month==6||month==9||month==11) {if(day==30){day =1;month++;}else day++;}else{if(day==31)month++;if(month==13){month =1;year++;}}else day++;}}}else{if(month==2){if(day==28){day =1;month++;}else day++;}else{if(month==4||month==6||month==9||month==11) {if(day==30){}else day++;}else{if(day==31){day =1;month++;if(month==13){month =1;year1++;if(year1==100){year2++;}}}else day++;}}}hour=0;week++;}if(sw1==0&&week>=7)}void delay(ms){uchar i, k;while(ms--)for(k=0;k<123;k++);for(i=0;i<123;i++);}void scan_key(void){if(cnt==7&&P3_4==0){delay(3);if(cnt==7&&P3_4==0){key4 =0;key1 =1; //检查是第一个键按下}}if(sw5==0&&key1==1&&cnt==7&&P3_4==1) //按键松手时表示真的按下,sw5判断此时是什么显示状态,时间还是年月日{sw1 =1; //闪烁分针}if(sw5==1&&key1==1&&cnt==7&&P3_4==1) //若为年月日则闪烁第一二位{sw1 =9;if(sw1==1&&P3_4==0&&cnt==7) //在时间状态第一个键又一次按下{delay(3);if(sw1==1&&P3_4==0&&cnt==7){key1 =2; //在时间状态第一个键的第二种状态}}if(sw1==9&&P3_4==0&&cnt==7) //在年月日状态第一个键第二次按下{delay(3);if(sw1==9&&P3_4==0&&cnt==7){key1 =9; //在年月日状态第一个键的第二种状态}}if(key1==2&&cnt==7&&P3_4==1) //在时间确认第一个键第二次按下{sw1 =2; // 并闪烁时针}if(key1==9&&cnt==7&&P3_4==1) //年月日状态确认第一个键第二次按下{sw1 =8; // 并闪烁月分}if(sw1==8&&P3_4==0&&cnt==7) //在年月日状态第一个键第三次按下{delay(3);if(sw1==8&&P3_4==0&&cnt==7){}}if(key1==8&&cnt==7&&P3_4==1) //年月日状态确认第一个键第三次按下{sw1 =7; // 并闪烁年的后两位 ///////////////////}if(sw1==2&&P3_4==0&&cnt==7){delay(3);if(sw1==2&&P3_4==0&&cnt==7){key1 =3;}}if(sw1==7&&P3_4==0&&cnt==7) //在年月日状态第一个键第四次按下{delay(3);if(sw1==7&&P3_4==0&&cnt==7){key1 =7; //在年月日状态第一个键的第四种状态}}if(key1==7&&cnt==7&&P3_4==1) //年月日状态确认第一个键第四次按下{sw1 =6; // 并闪烁年的前两位 ///////////////////}if(sw1==2&&P3_4==0&&cnt==7){delay(3);{key1 =3;}}if(key1==3&&cnt==7&&P3_4==1){sw1 =3; // 并闪烁星期}if(sw5==0&&P3_4==0&&cnt==6) //检查第二个键是否按下{delay(3);if(sw5==0&&P3_4==0&&cnt==6){key2 =1;}}if(key2==1&&cnt==6&&P3_4==1){key2 =0;sw2 =1; //在时间状态确认第二个键按下if(sw2==1&&sw1==1) //和sw1的值对比,加分{min++;if(min>=60)min =0;}if(sw2==1&&sw1==2) //和sw1的值对比,加时{hour++;if(hour>=24)hour =0;}if(sw2==1&&sw1==3){week++;if(week>6)week =0;}}if(sw5==1&&P3_4==0&&cnt==6) //在年月日检查第二个键是否按下{delay(3);if(sw5==1&&P3_4==0&&cnt==6){key2 =7;}}if(key2==7&&cnt==6&&P3_4==1){key2 =0;sw2 =1; //确认第二个键按下if(sw2==1&&sw1==9) //和sw1的值对比,加day{day++;if(day>31)day =0;}if(sw2==1&&sw1==8) //和sw1的值对比,加month{month++;month =0;}if(sw2==1&&sw1==7){year1++;if(year1>100)year1 =0;}if(sw2==1&&sw1==6){year2++;if(year2>100)year2 =20;}} //检查时间状态第三个键是否按下if(sw5==0&&P3_4==0&&cnt==5) //检查第三个键是否按下{delay(3);if(sw5==0&&P3_4==0&&cnt==5){key3 =1;}}if(key3==1&&cnt==5&&P3_4==1){key3 =0;sw3 =1;if(sw3==1&&sw1==1){min =60;min--; //分针减}if(sw3==1&&sw1==2){if(hour<=0)hour =24;hour--; //时针减}if(sw3==1&&sw1==3){if(week<=0)week =7;week--;}}if(sw5==1&&P3_4==0&&cnt==5) //在年月日检查第三个键是否按下{delay(3);if(sw5==1&&P3_4==0&&cnt==5){key3 =7;}}if(key3==7&&cnt==5&&P3_4==1){key3 =0;sw3 =7;if(sw3==7&&sw1==9)if(day<=0)day =32;day--; //day减}if(sw3==7&&sw1==8){if(month<=0)month =13;month--; //month减}if(sw3==7&&sw1==7){if(year1<=0)year1 =100; //year减year1--;}if(sw3==7&&sw1==6){if(year2<=20)year2 =100; //year减year2--;}}if(P3_4==0&&cnt==4&&sw1!=0&&sw5==0) {delay(3);if(P3_4==0&&cnt==4&&sw1!=0&&sw5==0) {sw1=0;sec=0;key4=1;key1=0;}if(P3_4==0&&cnt==4&&sw1!=0&&sw5==1) {delay(3);if(P3_4==0&&cnt==4&&sw1!=0&&sw5==1) {sw1=0;key4=1;key1=0;}}if(P3_4==0&&cnt==3){delay(3);if(P3_4==0&&cnt==3){key5 =1;}}if(key5==1&&P3_4==1&&cnt==3){sw5 =1;}if(P3_4==0&&sw5==1&&cnt==3){delay(3);if(P3_4==0&&sw5==1&&cnt==3){key5 =0;}}if(P3_4==1&&key5==0&&cnt==3){sw5 =0;}}void main(void){PCA0MD =0 ;XBR1 =0x40 ;P0MDOUT =0xFF ;P1MDOUT =0xFF ;init();while(1){conv();year=year1+year2*100;}}五、调试及性能分析5.1 硬件调试:主要检查电路的焊接,有无虚焊,漏焊,然后检查电路与单片机的联线,为了方便自己做了一根数据线,然后用万用表测试,全部导通后进行通电检测,上电后排查电路板的各点电平是否正常,测试完毕后进行软件调试。

基于单片机的万年历加温度显示设计

基于单片机的万年历加温度显示设计

本科毕业论文(设计)题目基于单片机的万年历加温度显示设计基于单片机的万年历加温度显示设计摘要本设计将制作一种基于单片机控制的带实时温度显示、具有定时功能的电子万年历。

传统的电子日历大都体积大,功耗大,显示不准确等特点。

为了缩小体积,减小功耗,使其变得小巧灵敏,本设计加入了时钟芯片DS1302,可对时间进行准确记时,同时可设置定时时间,实现定时功能。

另外本设计具有显示实时温度的功能。

传统的温度传感器系统大都采用放大、调理、A/D转换,转换后的数字信号送入计算机处理,处理电路复杂、可靠性相对较差,占用计算机的资源比较多。

本设计将采用DS18B20一线制数字温度传感器,可将温度信号直接转换成数字信号送给微处理器,电路简单,成本低,实现了时间温度同时显示的效果。

最后,温度和时间都将通过12864液晶显示器进行显示。

测试表明系统达到了设计要求的各项功能,各部分工作正常。

关键词时钟/温度检测/单片机/温度MICROCONTROLLER-BASHEDCALENDER AND TEMPERATURE DISPLAY DESIGNABSTRACTThis design creates an electronic calendar with real-time temperature display and timing function based on single chip control. Most of traditional calendars are characterized by large size, high power consumption and inaccurate display. In order to reduce volume and power consumption and make calendars become small and exquisite, the design adds a clock chip DS1302, which can accurately record the time and set a regular time to achieve timing function. In addition, this design displays real-time temperature function. Traditional temperature sensor system is mostly amplified, recuperated and A / D converted. The converted digital signal is input the computer to be processed, but the processing circuit is complicated with relatively poor reliability and occupies more resources of the computer. This design uses the DS18B20 first-line system digital temperature sensor to directly convert the temperature signal into digital signal and send it the microprocessor, whose circuit is simple and low cost, achieving the displayed effect of time and temperature simultaneously. Finally, the temperature and time will be displayed through the 12864 liquid crystal display. The test indicates that the system has reached various functions of the design requirements and each part operates smoothly.KEY WORDS clock, temperature detection, SCM, temperature目录中文摘要 (I)英文摘要.................................................................................................... I I 1概论. (1)1.1万年历发展背景 (1)1.2电子万年历的特点 (1)1.3国内外现状、发展 (1)2系统基本方案选择和论证 (2)2.1单片机芯片的选择方案和论证 (2)2.2显示模块的选择方案和论证 (3)2.3时钟芯片的选择方案和论证 (4)2.4温度传感器的选择方案和论证 (4)2.5电路设计最终方案确定 (5)3系统硬件电路设计 (6)3.1系统功能模块划分 (6)3.2各单元模块功能分析及模块电路设计 (6)3.2.1时钟模块 (6)3.2.2 温度模块 (7)3.2.3显示模块 (10)3.2.5 独立键盘模块 (18)3.2.6蜂鸣器模块 (19)3.2.7单片机模块 (20)3.3电路原理图的绘制和电路的焊接 (23)3.3.1原理图绘制软件PROTEL (23)3.3.2 PCB制作 (23)3.3.3 元器件的焊接 (24)4 系统软件设计 (26)4.1 万年历软件系统的流程图 (26)4.2温度信息的采集 (27)4.3时钟的读取 (30)4.3.1 DS1302控制字节的说明 (30)4.3.2 DS1302时间日期寄存器及相应位定义 (31)4.3.3 DS1302数据的输入和输出 (31)4.3.4 DS1302读写部分(程序)部分 (32)4.4温度的显示控制 (32)4.5键盘模块 (34)4.6蜂鸣器模块 (34)5设计总结 (35)致谢 (36)参考文献 (37)附录 (38)1 概论1.1 万年历发展背景随着电子技术的发展,人类不断研究,不断创新纪录。

3 C8051F单片机的时钟系统

3 C8051F单片机的时钟系统

3 C8051F单片机的时钟系统3c8051f单片机的时钟系统c8051f340单片机的时钟系统一、综述计算机,包括单片机,来运行程序,都是在时钟的驱使下一步一步完成的,不同的是,不同的计算机,其时钟的频率有很大的不同。

c8051f340单片机的标称频率是48mhz,在8位单片机的范畴里,属于较高频率的单片机,但与cortexcm系列的32位单片机来比,它的频率实在是算不上高。

c8051f340单片机的时钟表示sysclk,中文表示系统时钟。

一个系统时钟的时钟周期,一般说来,程序可以运转一条指令。

二、时钟源sysclk从哪里去?当然从盘整电路去。

盘整电路,在单片机内部存有两套,一套就是高频的,就是12mhz,经过适度分频或不分频,可以作为sysclk。

另一套就是80k,经过适度分频或不分频,也可以作为sysclk去采用,但是频率太低了,就可以用在极低速度的检测场合,或低功耗场合,或休眠状态模式下。

在单片机外面,还可以加一套高精度的震荡电路,一般用石英晶体,该电路可以直接做为sysclk来使用。

单片机内部,除了一套频率乘法器(倍频器),存有4倍和2倍两种输入,都可以作为sysclk去采用。

频率乘法器的频率输出可以源自外部盘整电路,或外部盘整电路的一半,也可以源自片内高频震荡12mhz。

可以看出,单片机的sysclk的来源十分丰富,sysclk应该从哪里来?是多少?这些都是通过相关寄存器来配置的。

三、内部高频振荡器内部高频振荡器的频率是12mhz,单片机的sysclk可以从该频率适当分频或不分频来得到,分频系数由内部高频振荡器控制寄存器oscicn来设定。

可以窥见,上电后的单片面,运转在8分频模式下,sysclk只有1.5mhz,适度布局这个寄存器,sysclk可以变为3m,6m,12m。

四、内部低频振荡器c8051f340含一个低频内部振荡器,该振荡器的标称频率为80khz。

该震荡器的频率输出,经过适当分频或不分频来,也可以做为sysclk,分频系数通过低频内部振荡器控制寄存器osclcn来设定。

PIC单片机学习笔记之万年历

PIC单片机学习笔记之万年历

PIC单片机自学笔记之万年历实验环境:Proteus编程语言:汇编编程环境:MPLAB IDE单片机:PIC16F877晶振:20MHz实验目的用的定时器定时扫描的方式消除键盘抖动的影响,提高了程序的运行速率;可对分钟、小时、日期、月份和年份进行调节。

实验效果图如图1和图2.图1—系统开机效果图图2—调整时间后的显示状态PCF8563芯片概述:PCF8563 有16 个位寄存器:一个可自动增量的地址寄存器,一个内置32.768KHz的振荡器(带有一个内部集成的电容)一个分频器(用于给实时时钟RTC 提供源时钟)一个可编程时钟输出,一个定时器,一个报警器,一个掉电检测器和一个400KHz I2C 总线接口。

所有16 个寄存器设计成可寻址的8 位并行寄存器,但不是所有位都有用。

前两个寄存器(内存地址 00H,01H)用于控制寄存器和状态寄存器,内存地址 02H~08H 用于时钟计数器(秒~年计数器),地址09H~0CH 用于报警寄存器(定义报警条件),地址 0DH 控制CLKOUT 管脚的输出频率,地址0EH 和 0FH 分别用于定时器控制寄存器和定时器寄存器。

秒、分钟、小时、日、月、年、分钟报警、小时报警、日报警寄存器,编码格式为BCD,星期和星期报警寄存器不以 BCD 格式编码。

当一个RTC 寄存器被读时,所有计数器的内容被锁存,因此,在传送条件下,可以禁止对时钟日历芯片的错读。

MAX7219概述:MAX7219/MAX7221是一种集成化的串行输入/输出共阴极显示驱动器,它连接微处理器与8位数字的7段数字LED显示,也可以连接条线图显示器或者64个独立的LED。

其上包括一个片上的B型BCD编码器、多路扫描回路,段字驱动器,而且还有一个8*8的静态RAM用来存储每一个数据。

只有一个外部寄存器用来设置各个LED的段电流。

MAX7221与SPI™QSPI™以及MICROWIRE™相兼容,同时它有限制回转电流的段驱动来减少EMI(电磁干扰)。

C8051F系列单片机的初始化共5页文档

C8051F系列单片机的初始化共5页文档

C8051F系列单片机的初始化Silicon Labs公司出品的C8051F系列单片机是高集成度的混合信号系统级(SoC)芯片,它具有基于增强的CIP-51内核,其指令集与MCS-51完全兼容,采用流水线结构,70%的指令执行时间为1到2个系统时钟周期,是标准8051指令执行速度的12倍,具有大量的中断源(可达22个),集成了丰富的资源和外部设备接口,能够满足绝大部分场合的复杂功能要求,在嵌入式领域的各个场合都得到了广泛的应用。

1、初始化的基本流程C8051F系列单片机系统时钟源多样且控制灵活,采用交叉开关配置方式实现了I/O端口的灵活配置,内部特殊功能寄存器SFR种类数量多且采用分页管理方式,因为这些特点C8051F系列单片机的初始化工作不同于标准8051单片机,其初始化工作流程基本如下:看门狗初始化配置→交叉开关初始化配置→I/O端口初始化配置→系统时钟初始化配置→功能模块初始化配置。

2、初始化的要点2.1 特殊功能寄存器(SFR)C8051F系列单片机具有标准8051中的全部SFR,还增加了一些用于配置和访问专有子系统的SFR,SFR采用分页机制,允许器件将很多SFR映射到0x80-0xFF存储器地址空间,最多可达256页。

在使用相应的特殊功能寄存器时,需先利用页选择寄存器(SFRPAGE)转换到相应的SFR页,再对其进行操作。

当中断发生时,SFR页寄存器会自动切换到引起中断的标志位所在页,这减轻了从中断服务程序切换SFR页的负担,在执行RETI指令时,中断前使用的SFR页会被自动恢复。

SFR结构如图1所示:2.2 可编程数字I/O和交叉开关C8051F系列单片机使用优先权交叉开关译码器实现了I/O端口的灵活配置,允许将内部系统资源映射到P0-P3的端口,用户根据自己的特定应用选择通用端口I/O和所需资源的组合。

优先权交叉开关译码器是通过交叉开关配置寄存器XBR0、XBR1、XBR2 和XBR3(复位后均为0)来进行配置的,当外设对应使能位被置为1时,外设可以通过端口进行访问,反之则不能。

万年历单片机原理

万年历单片机原理

万年历单片机原理万年历单片机原理是基于单片机技术的一种应用,用于实现日期、时钟等功能。

单片机是一种集成了处理器、存储器、输入输出和定时器等功能的集成电路。

万年历单片机是通过编程控制单片机的各个功能模块完成日期和时钟的计算和显示。

万年历单片机的原理主要包括以下几个方面:时钟模块、存储器模块、输入输出模块和编程控制模块。

时钟模块是实现精确时间的关键模块,它通常由一个晶振和相应的电路组成。

晶振会产生一个固定频率的震荡信号,通过计数器和分频器等电路将震荡信号转换为与实际时间相关的时钟信号。

时钟信号提供给其他功能模块,用于同步各个模块的工作。

存储器模块用于保存日期、时间等信息。

其中,时间的存储通常使用寄存器或者变量来保存时、分、秒等数据。

日期的存储则需要考虑年、月、日等信息,可以使用寄存器、RAM等储存器进行保存。

输入输出模块用于与外部设备进行数据的输入和输出。

通常,万年历单片机的输入可以通过按键、触摸屏等方式实现,而输出可以通过液晶显示器、LED数码管等方式显示日期、时间等信息。

编程控制模块是实现万年历功能的核心部分,通过对单片机的编程控制,可以实现日期、时间的计算、显示以及闹钟、定时器等特殊功能的实现。

编程控制模块通常包括中断控制、定时器控制、显示控制等子模块。

在编程控制模块中,中断控制用于实现按键输入的响应,当按下按键时,中断控制模块会检测到中断信号,然后调用相应的处理函数进行处理。

定时器控制则可以实现循环计时、闹钟、定时器等功能。

显示控制则负责将计算出来的日期、时间格式化并输出到显示屏上。

万年历单片机的工作流程通常是:通过输入设备获取外部输入的日期、时间等信息,然后通过编程控制模块进行相应的计算和处理,最后再通过输出设备将结果显示出来。

总结来说,万年历单片机通过时钟模块提供准确的时钟信号,通过存储器模块保存日期、时间等信息,通过输入输出模块与外部设备交互,通过编程控制模块实现日期、时间的计算和显示。

一种基于C8051F410芯片带校时功能的时钟

一种基于C8051F410芯片带校时功能的时钟

登峰杯论文题目:一种基于C8051F410芯片带校时功能的时钟班级: _________09电科___________姓名:________胡科迪_____________学号:________0911*******________一种基于C8051F410芯片带校时功能的时钟胡科迪(温州大学物理与电子信息工程学院,09电科)摘要:本文主要介绍一种通过微处理器C8051F410来实现的、带有校时功能的时钟的设计和实现。

它借助四个8段数码管来显示当前时间,包括分、秒以及分隔符号。

该时钟工作稳定,误差较小。

关键词:单片机,C8051F410,时钟,校时A Clock with the Function of Timing Based on Chip C8051F410Kedi Hu(Physics and electronic information Engineering College of Wenzhou University,Electronic Information Scienceand Technology of 09)Abstract:This paper mainly introduce the design and realization of a clock with function of timing which is based on MCU C8051F410.It displays current time including minute,second and separator with four eight-segment nixietubes.This clock works steadily with a low error.Keywords: single chip microcomputer,C8051F410,clock,timingⅠ.引言C8051F41x器件是完全集成的低功耗混合信号片上系统型MCU,它具有一下主要特性:1、高速、流水线结构的8051兼容的微控制器核(可达50MIPS)2、高精度可编程的24.5MHz内部振荡器3、4个通用的16位定时器4、硬件实时时钟(smaRTClock),工作电压可低至1V,带64字节电池后备RAM和后备稳压器由于它内部有高精度可编程的振荡器,我们可以通过对其特殊功能寄存器(SFR)的配置,完成计数定时,配合中断系统,设计出一个可以校正时间的电子时钟。

51单片机实现万年历程序

51单片机实现万年历程序

51单片机实现万年历程序51单片机实现万年历利用AT89S52单片机的P0口来和另外几个口来控制1602液晶的显示和P1口还有其它口来控制ds12887时钟芯片。

设置四个按键,1个定义为时间设置功能键,一个定义为闹钟设置功能键,另外两个用来调节时间的增减。

原理图:pcb图:源程序:#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit beep=P2^0;//蜂鸣器控制口sbit timeadd=P2^1;//调节时间加sbit timesub=P2^2;//调节时间减sbit timeclk=P2^3;//闹钟设定键sbit timefun=P2^4;//时间设定键sbit lcdrs=P2^5;//液晶的命令和数据控制口sbit ledrw=P2^6;//液晶的写数据口sbit lcden=P2^7;//液晶显示模块的使能端sbit timeds=P3^3;//时钟芯片地址闸sbit timerw=P3^4;//时钟芯片读写sbit timeas=P3^5;//时钟芯片地址闸sbit timeen=P3^6;//时钟芯片片选uchar code table[]="20 - - week ";uchar code table1[]=" : : ";//要显示的字符串char num,shi,fen,miao,nian=2000,yue,ri,week,numfun,anumfun,flag,flag1; uchar leap;write_com(0x80+add);write_date(0x30+shi);write_date(0x30+ge);}void write_zhou(uchar add,uchar date) {write_com(0x80+add);write_date(0x30+date);}void write_ds(uchar add,uchar date){ timeen=0;timeas=1;timeds=1;timerw=1;P1=add;timeas=0;timerw=0;P1=date;timerw=1;timeas=1;timeen=1;}uchar read_ds(uchar add){uchar ds_date;timeas=1;timeds=1;timerw=1;timeen=0;P1=add;timeas=0;timeds=0;P1=0xff;ds_date=P1;timeds=1;timeas=1;timeen=1;return ds_date;}void keyscan(){if(flag1==1)//用来关闭闹钟铃声{if(timeadd==0){delay(5);if(timeadd==0){while(!timeadd==0);flag1=0;}}if(timesub==0){delay(5);if(timesub==0){while(!timesub==0);flag1=0;}}}if(timefun==0){delay(5);if(timefun==0){while(!timefun);flag=1;numfun++;if(numfun==1){write_com(0x80+0x40+0x0a);write_com(0x0f);}if(numfun==2){write_com(0x80+0x40+0x07);write_com(0x0f);}if(numfun==3){write_com(0x80+0x40+0x04);write_com(0x0f);}if(numfun==4){write_com(0x80+0x0f);write_com(0x0f);}if(numfun==5){write_com(0x80+0x09);write_com(0x0f);}if(numfun==6){write_com(0x80+0x06);write_com(0x0f);}if(numfun==7){write_com(0x80+0x03);write_com(0x0f);}if(numfun==8){numfun=0;flag=0;}}}if(numfun!=0){if(timeadd==0){delay(5);while(!timeadd);if(numfun==1){miao++;if(miao==60)miao=0;write_sfm(9,miao);write_com(0x80+0x40+9);write_ds(0,miao);}if(numfun==2){fen++;if(fen==60)fen=0;write_sfm(6,fen);write_com(0x80+0x40+6);write_ds(2,fen);}if(numfun==3){shi++;if(shi==24)shi=0;write_sfm(3,shi);write_com(0x80+0x40+3);write_ds(4,shi);}if(numfun==4){week++;if(week==8)week=1;write_zhou(0x0f,week);write_com(0x80+0x0f);write_ds(6,week);}if(numfun==5){if(nian==0){switch(yue){case 1:ri++;if(ri==32) ri=1;break;case 2:ri++;if(ri==30) ri=1;break;case 3:ri++;if(ri==32) ri=1;break;case 4:ri++;if(ri==31) ri=1;break;case 5:ri++;if(ri==32) ri=1;break;case 6:ri++;if(ri==31) ri=1;break;case 7:ri++;if(ri==32) ri=1;break;case 8:ri++;if(ri==32) ri=1;break;case 9:ri++;if(ri==31)ri=1;break;case 10:ri++;if(ri==32)ri=1;break;case 11:ri++;if(ri==31)ri=1;break;case 12:ri++;if(ri==32)ri=1;break;}}else if(leap&&yue==2){ri++;if(ri==30)ri=1;}else if(yue==2&&leap==0){ri++;if(ri==29)ri=1;}elseswitch(yue){case 1:ri++;if(ri==32) ri=1;break;case 3:ri++;if(ri==32) ri=1;break;case 4:ri++;if(ri==31) ri=1;break;case 5:ri++;if(ri==32) ri=1;break;case 6:ri++;if(ri==31) ri=1;break;case 7:ri++;if(ri==32) ri=1;break;case 8:ri++;if(ri==32) ri=1;break;case 9:ri++;if(ri==31) ri=1;break;case 10:ri++;if(ri==32) ri=1;break;case 11:ri++;if(ri==31) ri=1;break;case 12:ri++;if(ri==32) ri=1;break;}write_nyr(8,ri);write_com(0x80+0x08);write_ds(7,ri);}if(numfun==6){yue++;if(yue==13)yue=0;write_nyr(5,yue);write_com(0x80+0x05);write_ds(8,yue);}if(numfun==7){nian++;if(nian==100)nian=0;leap=nian%4==0&&nian%100!=0;write_nyr(2,nian);write_com(0x80+2);write_ds(9,nian);}}if(timesub==0){delay(5);while(!timesub);if(numfun==1){miao--;if(miao==-1)miao=59;write_sfm(9,miao);write_com(0x80+0x40+9);write_ds(0,miao);}if(numfun==2){fen--;if(fen==-1)fen=59;write_sfm(6,fen);write_com(0x80+0x40+6);write_ds(2,fen);}if(numfun==3){shi--;if(shi==-1)shi=23;write_sfm(3,shi);write_com(0x80+0x40+3);write_ds(4,shi);}if(numfun==4){week--;if(week==0)week=7;write_zhou(0x0f,week);write_com(0x80+0x0f);write_ds(6,week);}if(numfun==5){if(nian==0){switch(yue){case 1:ri--;if(ri==0) ri=31;break;case 2:ri--;if(ri==0) ri=29;break;case 3:ri--;if(ri==0) ri=31;break;case 4:ri--;if(ri==0) ri=30;break;case 5:ri--;if(ri==0) ri=31;break;case 6:ri--;if(ri==0) ri=30;break;case 7:ri--;if(ri==0) ri=31;break;case 8:ri--;if(ri==0) ri=31;break;case 9:ri--;if(ri==0) ri=30;break;case 10:ri--;if(ri==0) ri=31;break;case 11:ri--;if(ri==0) ri=30;break;case 12:ri--;if(ri==0) ri=31;break;}}else if(leap&&yue==2){ri--;if(ri==0)ri=29;}else if(yue==2&&leap==0){ri--;if(ri==0)ri=28;}elseswitch(yue){case 1:ri--;if(ri==0) ri=31;break;case 3:ri--;if(ri==0) ri=31;break;case 4:ri--;if(ri==0) ri=30;break;case 5:ri--;if(ri==0) ri=31;break;case 6:ri--;if(ri==0) ri=30;break;case 7:ri--;if(ri==0) ri=31;break;case 8:ri--;if(ri==0) ri=31;break;case 9:ri--;if(ri==0) ri=30;break;case 10:ri--;if(ri==0) ri=31;break;case 11:ri--;if(ri==0) ri=30;break;case 12:ri--;if(ri==0) ri=31;break;}write_nyr(8,ri);write_com(0x80+0x08);write_ds(7,ri);}if(numfun==6){yue--;if(yue==-1)yue=12;write_nyr(5,yue);write_com(0x80+0x05);write_ds(8,yue);}if(numfun==7){nian--;if(nian==-1)nian=99;leap=nian%4==0&&nian%100!=0;write_nyr(2,nian);write_com(0x80+2);write_ds(9,nian);}}}}void set_alarm(){uchar ashi,afen,amiao;if(timeclk==0)//判断是否按下闹钟设定键{delay(5);//延时消抖if(timeclk==0){while(!timeclk);anumfun++;//按键次数加1if(anumfun==1){flag=1;write_com(0x80+0x40+0x0a);write_com(0x0f);}if(anumfun==2){flag=1;write_com(0x80+0x40+0x07);write_com(0x0f);}if(anumfun==3){flag=1;write_com(0x80+0x40+0x04);write_com(0x0f);}if(anumfun==4){flag=0;anumfun=0;}}}if(anumfun!=0){if(timeadd==0)//如果加功能键按下{delay(5);while(!timeadd);if(anumfun==1) //设定秒{amiao++;if(amiao==60)amiao=0;write_sfm(9,amiao);write_com(0x80+0x40+9);write_ds(1,amiao);}if(anumfun==2){afen++;if(afen==60)afen=0;write_sfm(6,afen);write_com(0x80+0x40+6);write_ds(3,afen);}if(anumfun==3){ashi++;if(ashi==24)ashi=0;write_sfm(3,ashi);write_com(0x80+0x40+3);write_ds(5,ashi);}}}if(anumfun!=0){if(timesub==0){delay(5);while(!timesub);if(anumfun==1){amiao--;if(amiao==-1)amiao=59;write_sfm(9,amiao);write_com(0x80+0x40+9);write_ds(1,amiao);}if(anumfun==2){afen--;if(afen==-1)afen=59;write_sfm(6,afen);write_com(0x80+0x40+6);write_ds(3,afen);}if(anumfun==3){ashi--;if(ashi==-1)ashi=23;write_sfm(3,ashi);write_com(0x80+0x40+3);write_ds(5,ashi);}}}}void init(){EA=1;//开总中断EX0=1;//开外部中断0IT0=1;//设定触发方式为负跳变沿有效lcden=0;//选通液晶显示屏ledrw=0;//设定液晶显示屏的读写方式为读write_com(0x38);//设置液晶显示模式为16*2显示,5*7点阵,8位数据接口 write_com(0x0c);//打开显示,并使光标不显示也不闪烁write_com(0x06);//光标指针每次自动加1write_com(1);//清屏write_com(0x80);//送地址指针for(num=0;num<16;num++){write_date(table[num]);delay(5);}write_com(0x80+0x40);//写到第二行for(num=0;num<11;num++){write_date(table1[num]);delay(5);}write_ds(0x0a,0x20);//开启时钟芯片振荡器write_ds(0x0b,0x26);//开启闹钟read_ds(0x0c);//读取时钟芯片c寄存器}void main(){init();while(1){keyscan();set_alarm();if(flag1==1)didi();if(flag==0){//读取时间miao=read_ds(0x00);fen=read_ds(0x02);shi=read_ds(0x04);yue=read_ds(0x08);ri=read_ds(0x07);nian=read_ds(0x09);week=read_ds(0x06);//写入液晶显示屏write_sfm(9,miao);write_sfm(6,fen);write_sfm(3,shi);write_nyr(2,nian);write_nyr(5,yue);write_nyr(8,ri);write_zhou(0x0f,week);}}}void exter() interrupt 0{flag1=1;read_ds(0x0c);//读时钟芯片c寄存器。

基于单片机的电子万年历带计算器

基于单片机的电子万年历带计算器

基于单片机的电子万年历带计算器单片机课程设计题目: 基于单机的电子万年历带计算器专业: 电气工程及其自动化班级: 姓名: 学号: 指导老师:小组成员:成绩:第一章内容摘要随着科技的快速发展,电子万年历是一种非常广泛日常计时工具,在现代社会越来越流行。

它可以对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能。

本次设计选用DALLAS公司生产的日历时钟芯片DS1302来作为实时时钟芯片,为本系统提供详细的年、月、日和小时、分钟、秒等时间信息,而且DS1302的使用寿命长,误差小,功耗低等优点。

电子万年历采用直观数字显示,可以同时显示年、月、日、时、分、秒等信息,还具有定时和时间校准等功能。

该电路采用STC89C52RC单片机作为核心,功耗小,电压可选用3.3,5.5V电压供电。

本次设计在电子万年历的基础上加上了计算器,通过切换键来实现两个功能的互换。

计算器可以进行7位数的加、减、乘、除,但是最大有效显示结果为9位数。

本系统硬件部分由STC89C52RC单片机、DS1302时钟芯片、1602液晶显示器、4*4键盘等部分构成;拥有时间设置、时间显示、计算器、功能切换等功能。

具体实现功能如下:(1)显示年、月、日、时、分、秒等信息(2)具有可调整日期和时间功能(3)与即时时间同步(不接外部电源)(4)按切换键后可进行简单的四则运算第二章关键词时钟芯片DS1302;单片机STC89C52RC; 液晶显示器LCD1602; 晶振; 万年历;计算器;4*4键盘第 1 页目录第一章内容摘要 ..................................................................... ................................. 1 第二章关键词...................................................................... ........................................ 1 第三章引言...................................................................... .. (3)3.1、概述 ..................................................................... .. (3)3.2、设计任务及要求 ..................................................................... ..................... 3 第四章设计内容...................................................................... . (4)4.1、单片机的介绍...................................................................... . (4)4.1.1、STC89C52单片机 ..................................................................... (4)4.1.2、主要性能...................................................................... . (5)4.1.3、单片机的应用...................................................................... .. (5)、单片机的应用原理...................................................................... ...... 5 4.1.44.2、LCD1602的原理及其应用...................................................................... . (6)4.2.1、LCD1602的介绍...................................................................... (6)4.2.2 、LCD1602的引脚...................................................................... .. (7)4.2.3、LCD1602的引脚说明.......................................................................8、LCD1602主要技术参数 (9)4.2.44.3、时钟芯片DS1302的工作原理 (9)4.3.1、DS1302的简介 ..................................................................... (9)、DS1302的结构 ..................................................................... .......... 10 4.3.24.3.3、DS1302的特点 ..................................................................... . (10)4.3.4、DS1302的引脚功能 ..................................................................... .. 114.3.5、DS1302电路原理图: .................................................................... .. 11第五章整体设计...................................................................... . (12)5.1、设计方法 ..................................................................... . (12)5.2 、硬件设计 ..................................................................... (12)5.3、系统框架图...................................................................... (12)5.4、电路设计原理图...................................................................... . (13)5.5、各部分电路的说明...................................................................... (13)5.5.1 、复位电路...................................................................... . (13)5.5.2 、矩阵键盘...................................................................... . (13)5.5.3 、LCD1602的显示电路....................................................................145.5.4、DS1302时钟电路 ..................................................................... (14)5.6、元件清单...................................................................... ............................... 14 第六章测试结果及分析...................................................................... . (15)6.1、软件设计...................................................................... (15)6.2、软件仿真...................................................................... (15)6.3、硬件调试...................................................................... ............................... 16 第七章总结与体会 ..................................................................... .............................. 17 第八章致谢...................................................................... ........................................ 18 第九章参考文献 ..................................................................... ................................. 18 第十章附加程序...................................................................... . (19)第 2 页第三章引言3.1、概述众所周知单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。

用C8051FXXX系列芯片实现实时时钟功能

用C8051FXXX系列芯片实现实时时钟功能

用C8051FXXX系列芯片实现实时时钟功能
Cugnal Integrated Products, Inc
【期刊名称】《电子质量》
【年(卷),期】2001(000)011
【摘要】当系统时钟使用高频内置振荡器时,辅助振荡器可用来驱动石英作实时时钟(RTC).系统时钟信号可取自内置和辅助振荡器,改变RTC信号源时不会降低其精度,RTC使用定时器2,它是为给辅助输入信号下降沿计数而设置的.CPO用来把石英振荡波形转换成方波.
【总页数】3页(P69-71)
【作者】Cugnal Integrated Products, Inc
【作者单位】无
【正文语种】中文
【中图分类】TN4
【相关文献】
1.串行的多功能实时时钟芯片MC68HC68T1 [J], 罗杰;魏丰;龚洁
2.PIC系列单片机片内定时器实时时钟的实现 [J], 孙东胜;王继雄;王福源
3.实时时钟芯片x1226使用设计与功能实现 [J], 孙宏志;束杨;靳程;董其武;雷晨;孙艺玫
4.基于增强51芯片W77E516和RV8803-C7实时时钟的实现方法 [J], 韩霜
5.恩智浦推出射频芯片系列,用于实现长距离智能汽车钥匙功能 [J],
因版权原因,仅展示原文概要,查看原文内容请购买。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

才开始用410时看到实时时钟复杂的操作,感觉这个东西挺不错的,的确如果作为片上系统电源管理的话挺好的,但是用它做个万年历太鸡肋了,相对DS1302等等,它可能节省器件,但远远没有DS1302带闰年补偿来的好用,这些程序早已经到处都是,可是F410做时钟的太少了吧,我也百度不到,写后才发现一个原因,不过也给大家分享一下吧。

其中LCD1602的头文件就不上传了,毕竟电路不同个不相同#include "C8051F410.h"#include "LCD1602.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned int#define ulong unsigned long#define nop() _nop_(); _nop_();_nop_();_nop_();unsigned char sec,min,hour;unsigned char day,month,week;unsigned int year;unsigned int year1;unsigned char code mon[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; unsigned char code mon1[]={0,31,29,31,30,31,30,31,31,30,31,30,31};union tcfint32{ulong mydword;struct{uchar by4;uchar by3;uchar by2;uchar by1;}bytes;}mylongint;uchar month12[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; uchar by2;void delay(uint k){uint i;uchar j;for(i = 0; i < k ;i ++)for(j = 0; j < 10 ;j ++);}/**************************************************函数名:功能:RTC的解锁以及震荡方式的初始化输入参数:输出参数:说明:**************************************************/void rtcset(){RTC0KEY=0xa5;RTC0KEY=0xf1;//解锁关键字RTC0ADR=0x07;//0x07为智能时钟振荡器控制RTC0xcn寄存器RTC0DAT=0xf0;while((RTC0ADR&0x80)==0x80);//查忙等待写入完成}/**************************************************函数名:功能:向RTC寄存器写定时值数值输入参数:输出参数:说明:**************************************************/void setalar(){uchar i;uchar setalarbuf[]={0x00,0x00,0x00,0x00,0x00,0x00}; setalarbuf[0]=0;setalarbuf[1]=0;setalarbuf[2]=mylongint.bytes.by1;setalarbuf[3]=mylongint.bytes.by2;setalarbuf[4]=mylongint.bytes.by3;setalarbuf[5]=mylongint.bytes.by4;RTC0ADR=0x08;//0x08为ALARM0的存储区域地址会自动加1for(i=0;i<6;i++){RTC0DAT=setalarbuf[i];while((RTC0ADR&0x80)==0x80);//查忙}}/**************************************************函数名:功能:向RTC寄存器写时间值输入参数:输出参数:说明:**************************************************/ void settime(){uchar i;uchar settimebuf[]={0x00,0x00,0x00,0x00,0x00,0x00}; settimebuf[0]=0;settimebuf[1]=0;settimebuf[2]=mylongint.bytes.by1;settimebuf[3]=mylongint.bytes.by2;settimebuf[4]=mylongint.bytes.by3;settimebuf[5]=mylongint.bytes.by4;RTC0ADR=0x00;for(i=0;i<6;i++){RTC0DAT=settimebuf[i];while((RTC0ADR&0x80)==0x80);//查忙}RTC0ADR=0x06;RTC0DAT=0x9a;//向set里面写1等待硬件清零while((RTC0ADR&0x80)==0x80);//while((RTC0DAT&0x02)==0x02);//等待其被硬件清零,表示写入映像值delay(10);}/**************************************************函数名:功能:向RTC寄存器读取时间值输入参数:输出参数:说明:**************************************************/void gettime(){uchar tem;RTC0ADR=0x06;RTC0DAT=0x99; //向RTC0CAP位写1while((RTC0ADR&0x80)==0x80);//while((RTC0DAT&0x01)==0x01);//等待其被硬件清零,然后带回映像值delay(10);while((RTC0ADR&0x80)==0x80);RTC0ADR=0x02;RTC0ADR=RTC0ADR|0x80; //写1while((RTC0ADR&0x80)==0x80);tem=RTC0DAT;mylongint.bytes.by1=tem;RTC0ADR=RTC0ADR|0x80;while((RTC0ADR&0x80)==0x80);tem=RTC0DAT;mylongint.bytes.by2=tem;RTC0ADR=RTC0ADR|0x80;while((RTC0ADR&0x80)==0x80);tem=RTC0DAT;mylongint.bytes.by3=tem;RTC0ADR=RTC0ADR|0x80;while((RTC0ADR&0x80)==0x80);tem=RTC0DAT;mylongint.bytes.by4=tem; RTC0ADR=RTC0ADR|0x80; }void PCA_Init(){PCA0MD &= ~0x40; PCA0MD = 0x00;}void Port_IO_Init(){P2MDOUT = 0xFF;XBR1 = 0x40;}void Oscillator_Init(){OSCICN = 0x85;}void Init_Device(void) {PCA_Init();Port_IO_Init();Oscillator_Init();}//////////////////////////////////void comtime()//把数值转化为年月日时分秒{ulong temp;long date;temp=mylongint.mydword;sec=temp%60;min=(temp/60)%60;hour=(temp%86400)/3600;date=temp/86400;week=(date+6)%7;year=0;do{if (year%4==0)//&&year!=0year1=366;else year1=365;date=date-year1;year++;year--;date+=year1;month=1;if(year%4==0)//&&year!=0 {do{date=date-mon1[month]; month++;}while(date>0);month--;date+=mon1[month];}else{do{date=date-mon[month]; month++;month--;date+=mon[month];}year+=2000;day=date;}void ymdtime(uint year,uchar month,uchar day,uchar hour,uchar min ,uchar sec ){unsigned char i;unsigned long date,temp;date=0;if(year<2000)year=2000;else if(year>2099)year=2099;year-=2000;for (i=0;i<year;i++){if (i%4==0) year1=366; //&&i!=0else year1=365;date=date+year1;}if(year%4==0) //&&i!=0{for (i=1;i<month;i++){date=date+mon1[i];};}else{for (i=1;i<month;i++){date=date+mon[i];};}date+=day;year+=2000;temp=(ulong)date*86400+((ulong)hour*3600)+((uint)min*60)+sec; mylongint.mydword=temp;}main(){Init_Device(); //初始化LCD_Init();rtcset();delay(30);ymdtime(2013,7,29,15,26,57);settime();while(1){gettime();comtime();set_position(2,0);LCD_Write_Data(year/1000+0x30); LCD_Write_Data(year%1000/100+0x30);LCD_Write_Data(year%100/10+0x30); LCD_Write_Data(year%10+0x30); LCD_Write_Data('-');LCD_Write_Data(month/10+0x30); LCD_Write_Data(month%10+0x30); LCD_Write_Data('-');LCD_Write_Data(day/10+0x30); LCD_Write_Data(day%10+0x30); LCD_Write_Data('/');LCD_Write_Data(week+48);set_position(4,1);LCD_Write_Data(hour/10+48);LCD_Write_Data(hour%10+48);LCD_Write_Data('-');LCD_Write_Data(min/10+48);LCD_Write_Data(min%10+48);LCD_Write_Data('-');LCD_Write_Data(sec/10+48);LCD_Write_Data(sec%10+48);}}。

相关文档
最新文档