基于STC89C52多功能电子时钟系统程序+原理图_第1页
基于STC89C52多功能电子时钟系统程序+原理图_第2页
基于STC89C52多功能电子时钟系统程序+原理图_第3页
基于STC89C52多功能电子时钟系统程序+原理图_第4页
基于STC89C52多功能电子时钟系统程序+原理图_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一、设计任务设计制作一台以控制器为核心的多功能电子时钟系统二、设计要求:系统具有3种工作模式状态(正常时钟显示模式、系统校准模式、秒表计时模式);系统所有功能,均能够通过上位PC机对其操作修改与实时动态显示。(PC主机端可利用高级语言进行人机界面设计)在正常时钟显示模式时,时钟具有显示年、月、日、时、分、秒的功能。在正常时钟显示模式时,系统具有整点报时的功能,在离整点前10秒时,自动发出鸣叫声,步长1秒,每间隔1秒鸣叫一次,前4响是低音,后1响为高音,共鸣叫5次,最后1响结束时为整点。高音频率为1KHz;在系统校准模式时,系统具有快速校准时间的功能。在秒表计时模式时,可兼做比赛时间记录表。秒表记时的精度为0.1秒,由3个键分别控制秒表的启动、清零、记录功能,可连续记录3组时间,并能够显示记录时间。系统显示器采用LCD液晶显示器1602或其它显示器件,并采用键盘对相关数据进行设置与操作。 原理图一、设计任务设计制作一台以控制器为核心的多功能电子时钟系统二、设计要求:系统具有3种工作模式状态(正常时钟显示模式、系统校准模式、秒表计时模式);系统所有功能,均能够通过上位PC机对其操作修改与实时动态显示。(PC主机端可利用高级语言进行人机界面设计)(注:此三种模式可以通过SET键盘来回切换,在正常时钟模式,第二排显示S:time,校准模式显示S:adjst,秒表模式,是TNT3:四个秒表模式);在正常时钟显示模式时,时钟具有显示年、月、日、时、分、秒的功能。(注:这个已经全部显示了,含星期)在正常时钟显示模式时,系统具有整点报时的功能,在离整点前10秒时,自动发出鸣叫声,步长1秒,每间隔1秒鸣叫一次,前4响是低音,后1响为高音,共鸣叫5次,最后1响结束时为整点。高音频率为1KHz;(注:这个都实现了,要验证的话就是将时钟调整到59分后验证即可 )在系统校准模式时,系统具有快速校准时间的功能。(注:按SET键进入校正模式可以对时钟进行校正,UP向上,DOWN键向下,按STOP键保存退出,遗憾的是,这个正在调节的参数无法反白显示)在秒表计时模式时,可兼做比赛时间记录表。秒表记时的精度为0.1秒,由3个键分别控制秒表的启动、清零、记录功能,可连续记录3组时间,并能够显示记录时间。(注:按SET键进入秒表模式,按0K键启动,STOP键清零,按UP键记录,可以对100ms的定时器开始计时,最大999.9秒,按下UP键盘,则记录一个,总共记3个,T1-T3,按SET键退出)系统显示器采用LCD液晶显示器1602或其它显示器件,并采用键盘对相关数据进行设置与操作。 乖乖,真的是1602显示的啊。/*/*File Name: main.c */*Function : The entrance of all fuctions */ /*Author : WuYingjian */*Version : V1.0 */*Date : 2012.11.03 */* All Rights Reserved. */*/#include#include#define uint unsigned int#define uchar unsigned char#define nop _nop_void write_command(uchar tempdata);/*引脚定义*/sbit BusyFlag=P07;sbit ALARM_BEEP = P24; /报警喇叭/LCD控制接口sbit E=P25; sbit RW=P26;sbit RS=P27;/DS1302数据接口sbit rst=P34;sbit sclk=P32;sbit io=P33;/KEY输入接口sbit KEY_OK=P10;sbit KEY_STOP=P11;sbit KEY_UP=P12;sbit KEY_SET=P13;sbit KEY_DOWN=P14;sbit bit7=ACC7; /单片机内部移位寄存器ACC声明;sbit bit0=ACC0;/显示界面 LCD1602uchar LCD_4,LCD_3,LCD_2,LCD_1,LCD_0;uchar code LCDData =; uchar code dot_tab =78899; uchar first_line16=2012-09-24 WEEK1; /LCD第一行显示缓存数组uchar second_line16=11:13:25 S:time; /LCD第二行显示缓存数组,正常显示时间。/函数等变量uchar set_sel;uint systimer_10ms,systimer1_10ms,systimer_1s,systimer_1m;uchar alarm_beep=0,alarm_flag=0; /设定报警标志.uint dingshi_timer,dingshi_flag_up=0,dingshi_flag_down,dingshi_flag;uint write_time1,write_time2,write_time3; /999.9秒。uchar time7; uchar ok_value,ii,ix,temp;/*/延时程序/*void delay(unsigned int N) unsigned int i; for(i=0;i=200)systimer_1s+;systimer_10ms=0;if(systimer1_10ms=20) /也为100ms,即0.1S的精度. if(set_sel=2) if(dingshi_flag)dingshi_timer+; if(dingshi_timer=9999)dingshi_timer=0; if(dingshi_flag_up=1)&(KEY_UP=0) write_time1 = dingshi_timer; if(dingshi_flag_up=2)&(KEY_UP=0) write_time2 = dingshi_timer-write_time1; if(dingshi_flag_up=3)&(KEY_UP=0) write_time3 = dingshi_timer-write_time2-write_time1; if(KEY_STOP=0)dingshi_flag=0;dingshi_timer=0;dingshi_flag_up=0;write_time1=write_time2=write_time3=0; /*/LCD1602测忙/*void check_busy(void)while(1)P0=0xff;E=0;_nop_();RS=0;_nop_();_nop_();RW=1;_nop_();_nop_();E=1;_nop_();_nop_();_nop_();_nop_();if(P0&0x80)=0)break;E=0;/*/LCD1602写命令/*void write_command(uchar tempdata) E=0;_nop_();_nop_();RS=0;_nop_();_nop_();RW=0;P0=tempdata;_nop_();_nop_();E=1;_nop_();_nop_(); E=0;_nop_();_nop_();check_busy();/*/LCD1602写数据/*void write_data(uchar tempdata) E=0;_nop_();_nop_();RS=1;_nop_();_nop_();RW=0;P0=tempdata;_nop_();_nop_();E=1;_nop_();_nop_(); E=0;_nop_();_nop_();check_busy();/*/初始化LCD1602/*void init_lcd1602() write_command(0x01);/清除屏幕 write_command(0x38);/功能设定(8位,2行,5*7点阵式) write_command(0x0c);/显示器ON,光标OFF,闪烁OFF write_command(0x06); /地址加1 delay(5);void display(void) uchar i; write_command(0x80); for(i=0;i16;i+) write_data(first_linei); write_command(0xc0); for(i=0;i16;i+) write_data(second_linei);/*DS1302的操作*/#define uint unsigned int#define uchar unsigned char#define nop _nop_#define SECOND 0#define MINUTE 1#define HOUR 2#define DAY 3#define MONTH 4#define WEEK 5#define YEAR 6/#includefont.h/#includeintrins.h/#include lcd12864.h/向DS1302某地址写1字节的数据/命令void write_B(uchar addr,uchar ucda)uchar i,temp;sclk=0;rst=0;nop();rst=1;/打开数据传送for(i=0;i=1; sclk=1;/上升沿写入nop();nop();for(i=0;i=1;sclk=1;/上升沿写入nop();nop();rst=0;/从ds1302某地址读数据/*在最后一个数据发送完了后,该脉冲的下降沿就会输出数据的第一位!*/uchar read_B(uchar addr)uchar i,temp,dat1,dat2;rst=0;sclk=0;rst=1;for(i=0;i=1;sclk=1; /上升沿写入nop();for(i=0;i=1;rst=0;dat1=ACC; /BCD与十六进制转化dat2=dat1/16;dat1=dat1%16;dat1=dat1+dat2*16;return dat1;/设置ds1302的时间/* 秒,分,时,日,月,周,年 注意顺序; sel= 0 1 2 3 4 5 6*/ /*void set_1302(uchar sel,uchar newdate) /newdate是十进制,要转化为BCD uchar temp,ge,shi;temp=newdate;shi=temp/10; ge=temp%10;newdate=(shi4)*10+(temp&0x0f);/num为十进制 shi=num/10;ge=num%10;if(sel=0) /秒LCD_0=LCDDatashi;LCD_1=LCDDatage;second_line6=LCD_0;second_line7=LCD_1; if(num49)&(alarm_flag) /时钟整点报时响应. if(num=50)|(num=52)|(num=54)|(num=56)|(num=58) ALARM_BEEP=0; if(num=51)|(num=53)|(num=55)|(num=57) ALARM_BEEP=1; if(num=59) ALARM_BEEP=0; delay(5); ALARM_BEEP=1; delay(5); if(sel=1) /分if(num=59)alarm_flag=1;elsealarm_flag=0;LCD_0=LCDDatashi;LCD_1=LCDDatage;second_line3=LCD_0;second_line4=LCD_1; if(sel=2)/时LCD_0=LCDDatashi;LCD_1=LCDDatage;second_line0=LCD_0;second_line1=LCD_1; if(sel=3)/日LCD_0=LCDDatashi;LCD_1=LCDDatage;first_line8=LCD_0;first_line9=LCD_1; if(sel=4)/月LCD_0=LCDDatashi;LCD_1=LCDDatage;first_line5=LCD_0;first_line6=LCD_1; if(sel=5)/周LCD_0=LCDDatage;first_line15=LCD_0-1; if(sel=6)/年LCD_0=LCDDatashi;LCD_1=LCDDatage;first_line2=LCD_0;first_line3=LCD_1; display();/WEEK15/在ds1302中读星期值/*void dis_1302_xingqi()uchar ge,temp,num;temp=read_B(0x81+WEEK*2); /读的是BCD码/BCD转化为十进制num=(temp&0x70)4)*10+(temp&0x0f);/num为十进制ge=num%10; /星期的十位是0,所以可以只考虑个位*/初始化DS1302void ds1302_init(void) write_B(0x8e,0x00); /禁止写保护/*初始化日期、月份等不能设为0;*/*write_B(0x80,0x00); /秒位初始化write_B(0x82,0x01); /分钟初始化write_B(0x84,0x01); /小时初始化write_B(0x86,0x01); /日数初始化 write_B(0x88,0x01); /月份初始化write_B(0x8a,0x04); /星期初始化write_B(0x8c,0x09); /年份初始化*/write_B(0x8e,0x80); /允许写保护void set_sys_param(void) /进行时钟校正模式或者秒表模式.switch(set_sel) case 1: /进入校正时间模式/以下是框架. first_line0=2; first_line1=0; first_line4=-; first_line7=-; first_line11=W; first_line12=E; first_line13=E; first_line14=K; second_line2=:; second_line5=:; second_line9=S; second_line10=:; second_line11=a; second_line12=d; second_line13=j; second_line14=s; second_line15=t; /从ds1302读出1字节的数据显示到屏幕x,y上; /* 秒,分,时,日,月,周,年 i = 0 1 2 3 4 5 6*/ for( ii=0;ii4)*10+(temp&0x0f);/转化为十进制 while(1) switch(ok_value) case 0: /miao LCD_0=LCDDatatime6/10%10; /年 LCD_1=LCDDatatime6%10; first_line2=LCD_0; first_line3=LCD_1; display(); break; case 1: LCD_0=LCDDatatime4/10%10; /月 LCD_1=LCDDatatime4%10; first_line5=LCD_0; first_line6=LCD_1; display(); break; case 2: LCD_0=LCDDatatime3/10%10; /日 LCD_1=LCDDatatime3%10; first_line8=LCD_0; first_line9=LCD_1; display(); break; case 3: LCD_0=LCDDatatime5%10; /周 first_line15=LCD_0; display(); break; case 4: LCD_0=LCDDatatime2/10%10; /hours LCD_1=LCDDatatime2%10; second_line0=LCD_0; second_line1=LCD_1; display(); break; case 5: LCD_0=LCDDatatime1/10%10; /minutes LCD_1=LCDDatatime1%10; second_line3=LCD_0; second_line4=LCD_1; display(); break; case 6: LCD_0=LCDDatatime0/10%10; /seconds LCD_1=LCDDatatime0%10; second_line6=LCD_0; second_line7=LCD_1; display(); break; /END OK_VALUE; if(KEY_UP=0)switch(ok_value) case 0: / 年time6+;if(time699)time6=0;break; case 1:/ 月time4+;if(time412)time4=1;break;case 2:/ 日time3+;if(time331)time3=1;break;case 3:/ 星期time5+;if(time57)time5=1;break;case 4:/ 时time2+;if(time223)time2=0;break; case 5:/ 分time1+;if(time159)time1=0;break; case 6:/ 秒time0+;if(time059)time0=0;break; while(!KEY_UP); /等待松手 if(KEY_DOWN=0)switch(ok_value) case 0: / 年time6-;if(time6=0)time6=99;break; case 1:/ 月time4-;if(time4=0)time4=12;break;case 2:/ 日time3-;if(time3=0)time3=31;break;case 3:/ 星期time5-;if(time51)time5=7;break;case 4:/ 时time2-;if(time2=0)time2=23;break; case 5:/ 分time1-;if(time1=0)time1=59;break; case 6:/ 秒time0-;if(time0=0)time0=59;break; while(!KEY_DOWN); /等待松手 if(KEY_STOP =0) set_sel=2; for(ix=0;ix7;ix+) /写新时间到1302temp=(timeix/10)6) ok_value=0; while(!KEY_SET); /END WHILEbreak;case 2: /进入秒钟计时模式,并使用KEY_OK启动,KEY_STOP清零,KEY_UP记录。KEY_SET退出.启动定时器0if(KEY_OK=0)dingshi_flag=1;while(!KEY_OK);if(KEY_UP=0)dingshi_flag_up+;while(!KEY_UP);/第一排显示字符first_line0=T;first_line1=N;first_line2=:;LCD_3=LCDDatadingshi_timer/1000%10;LCD_2=LCDDatadingshi_timer/100%10;LCD_1=LCDDatadingshi_timer/10%10;LCD_0=LCDDatadingshi_timer%10;first_line3=LCD_3;first_line4=LCD_2;first_line5=LCD_1;first_line6=.;first_line7=LCD_0;display();LCD_3=LCDDatawrite_time1/1000%10;LCD_2=LCDDatawrite_time1/100%10;LCD_1=LCDDatawrite_time1/10%10;LCD_0=LCDDatawrite_time1%10;first_line8=T;first_line9=1;first_line10=:;first_line11=LCD_3;first_line12=LCD_2;first_line13=LCD_1;first_line14=.;first_line15=LCD_0;display();LCD_3=LCDDatawrite_time2/1000%10;LCD_2=LCDDatawrite_time2/100%10;LCD_1=LCDDatawrite_time2/10%10;LCD_0=LCDDatawrite_time2%10;/第二排显示字符second_line0=T;second_line1=2;second_line2=:;second_line3=LCD_3;second_line4=LCD_2;second_line5=LCD_1;second_line6=.;second_line7=LCD_0;display();LCD_3=LCDDatawrite_time3/1000%10;LCD_2=LCDDatawrite_time3/100%10;LC

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论