51单片机万年历实验原理解析

合集下载

基于51单片机控制的语音报时万年历课程设计

基于51单片机控制的语音报时万年历课程设计

基于51单片机控制的语音报时万年历一.实验要求运用单片机及相关外设实现以下功能:1)万年历及时钟显示2)时间日期可调3)可对时间进行整点报时和随机报时二.方案分析根据实验要求,选用STC公司的8051系列,STC12C5A16S2增强型51单片机。

此单片机功能强大,具有片内EEPROM、1T分频系数、片内ADC转换器等较为实用功能,故选用此款。

实验中,对日期和时间进行显示,显示的字符数较多,故选用12864LCD屏幕。

该屏幕操作较为便捷,外围电路相对简单,实用性较强。

为了实现要求中的时间日期可调,故按键是不可缺少的,所以使用了较多的按键。

一方面,单片机的I/O口较为充足;另一方面,按键较多,选择的余地较大,方便编程控制。

实验中,并未要求对时间和日期进行保存和掉电续运行,所以并未添加EEPROM和DS12C887-RTC芯片。

实际上,对万年历来说,这是较为重要的,但为了方便实现和编程的简单,此处并未添加,而是使用单片机的定时器控制时间,精度有差别。

且上电默认时间为2014-01-01 09:00:00 之后需要手动调整为正确时间。

要求中的语音报时功能,这里选用ISD1760芯片的模块来帮助实现。

此模块通过软件模拟SPI协议控制。

先将所需要的声音片段录入芯片的EEPROM区域,之后读出各段声音的地址段,然后在程序中定义出相应地址予以控制播放哪一声音片段。

三.电路硬件设计实际效果图四.程序代码部分Main.h#ifndef _MAIN_H#define _MAIN_H#include "reg52.h"#include "INTRINS.H"#include "math.h"#include "string.h"#include "key.h"#include "led.h"#include "12864.h"#include "main.h"#include "isd1700.h"#include "sound.h"extern unsigned int count;extern unsigned int key_time[8]; extern unsigned char key_new; extern unsigned char key_old; extern unsigned char stop_flag; extern unsigned char key_follow[8]; extern unsigned int key_num[8];sbit BEEP=P3^7;sbit ISD_SS=P0^7;sbit ISD_MISO=P0^4;sbit ISD_MOSI=P0^5;sbit ISD_SCLK=P0^6;extern unsigned char date_show[]; extern unsigned char time_show[]; extern unsigned char sec;extern unsigned char min;extern unsigned char hour;extern unsigned char day;extern unsigned char month; extern unsigned char year_f; extern unsigned char year_l; extern unsigned char leap_year_flag;extern unsigned char update_flag;extern unsigned char adjust_flag;extern unsigned char key;unsigned char report();#endifMain.c#include "main.h"unsigned int count=0;unsigned int key_num[8]=0;unsigned char key_new=0;unsigned char key_old=0;unsigned char stop_flag=0;unsigned char key_follow[8]=0;unsigned char sec=1;unsigned char min=0;unsigned char hour=9;unsigned char day=1;unsigned char month=1;unsigned char year_f=20;unsigned char year_l=14;unsigned char leap_year_flag=0;unsigned char date_show[]="2014-01-01"; unsigned char time_show[]="09:00:00";unsigned char update_flag=1;unsigned char key=0;unsigned char adjust_flag=0;unsigned char adjust_pos=0;unsigned char report_flag=0;void main(){unsigned char i;P2=0XFF;BEEP=0;init();initinal(); //调用LCD字库初始化程序TMOD=0x01; //使用定时器T0TH0=(65536-1000)/256; //定时器高八位赋初值TL0=(65536-1000)%256; //定时器低八位赋初值*/ EA=1; //开中断总允许ET0=1; //允许T0中断TR0=1; //启动定时器T0while(1){if(update_flag){lcd_pos(1,0);for(i=0;i<10;i++)write_dat(date_show[i]);lcd_pos(2,4);for(i=0;i<8;i++)write_dat(time_show[i]);update_flag=0;}if(key!=keyscan_nor()){key=keyscan_nor();if(key==8&&!adjust_flag)adjust_flag=1;if(key&&adjust_flag){if(key==1){adjust_pos++;if(adjust_pos==14)adjust_pos=0;}else if(key==2){if(!adjust_pos)adjust_pos=13;elseadjust_pos--;}else if(key==6){if(!adjust_pos)sec++;else if(adjust_pos==1)sec=sec+10;else if(adjust_pos==2)min++;else if(adjust_pos==3)min=min+10;else if(adjust_pos==4)hour++;else if(adjust_pos==5)hour=hour+10;else if(adjust_pos==6)day++;else if(adjust_pos==7)day=day+10;else if(adjust_pos==8)month++;else if(adjust_pos==9)month=month+10;else if(adjust_pos==10)year_l++;else if(adjust_pos==11)year_l=year_l+10;else if(adjust_pos==12)year_f++;else if(adjust_pos==13)year_f=year_f+10; }else if(key==7){if(!adjust_pos)sec--;else if(adjust_pos==1)sec=sec-10;else if(adjust_pos==2)min--;else if(adjust_pos==3)min=min-10;else if(adjust_pos==4)hour--;else if(adjust_pos==5)hour=hour-10;else if(adjust_pos==6)day--;else if(adjust_pos==7)day=day-10;else if(adjust_pos==8)month--;else if(adjust_pos==9)month=month-10;else if(adjust_pos==10)year_l--;else if(adjust_pos==11)year_l=year_l-10;else if(adjust_pos==12)year_f--;else if(adjust_pos==13)year_f=year_f-10;}else if(key==3)adjust_flag=0;if(key==6||key==7){if(sec>=80)sec=0;if(min>=80)min=0;if(hour>=40)hour=0;if(month>30)month=1;if(day>50)day=0;if(year_f>=120)year_f=0;if(year_l>=120)year_l=0;}}}if(key==3)report_flag=1;if(report_flag){clrram();Dingwei(2,1);lcd_mesg("REPORTING!!!");report();clrram();}}}void time0() interrupt 1{static unsigned char timer=0;TH0=(65536-50000)/256; //定时器高八位赋初值TL0=(65536-50000)%256; //定时器低八位赋初值timer++;if(timer==20){sec++;time_show[6]=sec/10+48;time_show[7]=sec%10+48;if(sec>=60){sec=0;min++;time_show[6]=sec/10+48;time_show[7]=sec%10+48;time_show[3]=min/10+48;time_show[4]=min%10+48;}if(min>=60){min=0;hour++;time_show[3]=min/10+48;time_show[4]=min%10+48;time_show[0]=hour/10+48;time_show[1]=hour%10+48;}if(hour>=24){hour=0;day++;time_show[0]=hour/10+48;time_show[1]=hour%10+48;date_show[8]=day/10+48;date_show[9]=day%10+48;}if((day>=29&&!leap_year_flag&&month==2)||(day==30&&leap_year_flag&&month==2)||(day==31&&(month==4||month==6||month==9||month==11))||(month==32)){day=1;month++;date_show[8]=day/10+48;date_show[9]=day%10+48;date_show[5]=month/10+48;date_show[6]=month%10+48;}if(month>=13){month=1;year_l++;date_show[5]=month/10+48;date_show[6]=month%10+48;date_show[0]=year_f/10+48;date_show[1]=year_f%10+48;date_show[2]=year_l/10+48;date_show[3]=year_l%10+48;}if(year_l>=100){year_l=0;year_f++;if(((!((year_f*100+year_l)%4))&&((year_f*100+year_l)%100))||(!((year_f*100+year_l)%40 0)))leap_year_flag=1;elseleap_year_flag=0;date_show[0]=year_f/10+48;date_show[1]=year_f%10+48;date_show[2]=year_l/10+48;date_show[3]=year_l%10+48;}timer=0;update_flag=1;if(adjust_flag){time_show[7]=sec%10+48;time_show[6]=sec/10+48;time_show[4]=min%10+48;time_show[3]=min/10+48;time_show[1]=hour%10+48;time_show[0]=hour/10+48;date_show[9]=day%10+48;date_show[8]=day/10+48;date_show[6]=month%10+48;date_show[5]=month/10+48;date_show[3]=year_l%10+48;date_show[2]=year_l/10+48;date_show[1]=year_f%10+48;date_show[0]=year_f/10+48;}}if(adjust_flag&&timer==10){if(!adjust_pos)time_show[7]=' ';else if(adjust_pos==1)time_show[6]=' ';else if(adjust_pos==2)time_show[4]=' ';else if(adjust_pos==3)time_show[3]=' ';else if(adjust_pos==4)time_show[1]=' ';else if(adjust_pos==5)time_show[0]=' ';else if(adjust_pos==6)date_show[9]=' ';else if(adjust_pos==7)date_show[8]=' ';else if(adjust_pos==8)date_show[6]=' ';else if(adjust_pos==9)date_show[5]=' ';else if(adjust_pos==10)date_show[3]=' ';else if(adjust_pos==11)date_show[2]=' ';else if(adjust_pos==12)date_show[1]=' ';else if(adjust_pos==13)date_show[0]=' ';update_flag=1;}if(!min&&!sec&&!adjust_flag)report_flag=1;}unsigned char report(){PlaySoundTick(11);long_delay();if(!min){if(hour<=10){PlaySoundTick(hour);short_delay();PlaySoundTick(12);short_delay();PlaySoundTick(14);short_delay();}else if(hour>10&&hour<20){PlaySoundTick(10);short_delay();PlaySoundTick(hour-10);short_delay();PlaySoundTick(12);short_delay();PlaySoundTick(14);short_delay();}else if(hour==20){PlaySoundTick(2);short_delay();PlaySoundTick(10);short_delay();PlaySoundTick(12);short_delay();PlaySoundTick(14);short_delay();}else{short_delay();PlaySoundTick(10);short_delay();PlaySoundTick(hour-20);short_delay();PlaySoundTick(12);short_delay();PlaySoundTick(14);short_delay();}}else{if(hour<=10){PlaySoundTick(hour);short_delay();PlaySoundTick(12);short_delay();}else if(hour>10&&hour<20){PlaySoundTick(10);short_delay();PlaySoundTick(hour-10);short_delay();PlaySoundTick(12);short_delay();}else if(hour==20){PlaySoundTick(2);short_delay();PlaySoundTick(10);short_delay();PlaySoundTick(12);short_delay();}else{PlaySoundTick(2);short_delay();short_delay();PlaySoundTick(hour-20);short_delay();PlaySoundTick(12);short_delay();}if(min<=10){PlaySoundTick(min);short_delay();PlaySoundTick(13);short_delay();}else if(min>10&&min%10){PlaySoundTick(min/10);short_delay();PlaySoundTick(10);short_delay();PlaySoundTick(min-10*(min/10));short_delay();PlaySoundTick(13);short_delay();}else{PlaySoundTick(min/10);short_delay();PlaySoundTick(10);short_delay();PlaySoundTick(13);short_delay();}}report_flag=0;time_show[7]=sec%10+48;time_show[6]=sec/10+48;time_show[4]=min%10+48;time_show[3]=min/10+48;time_show[1]=hour%10+48;time_show[0]=hour/10+48;date_show[9]=day%10+48;date_show[8]=day/10+48;date_show[6]=month%10+48;date_show[5]=month/10+48;date_show[3]=year_l%10+48;date_show[2]=year_l/10+48;date_show[1]=year_f%10+48;date_show[0]=year_f/10+48;return 0;}Isd1700.h#ifndef _ISD1760_H#define _ISD1760_H#include "main.h"#define ISD1700_PU 0x01#define ISD1700_STOP 0X02 #define ISD1700_REST 0x03 #define ISD1700_CLR_INT 0x04 #define ISD1700_RD_STAUS 0x05 #define ISD1700_RD_PLAY_PTR 0x06 #define ISD1700_PD 0x07#define ISD1700_RD_REC_PTR 0x08 #define ISD1700_DEVID 0x09#define ISD1700_PLAY 0x40 #define ISD1700_REC 0x41 #define ISD1700_ERASE 0x42 #define ISD1700_G_ERASE 0x43 #define ISD1700_RD_APC 0x44 #define ISD1700_WR_APC1 0x45 #define ISD1700_WR_APC2 0x65#define ISD1700_WR_NVCFG 0x46 #define ISD1700_LD_NVCFG 0x47 #define ISD1700_FWD 0x48 #define ISD1700_CHK_MEM 0x49 #define ISD1700_EXTCLK 0x4A #define ISD1700_SET_PLAY 0x80 #define ISD1700_SET_REC 0x81 #define ISD1700_SET_ERASE 0x82 #define NULL 0x00 #define ISD_LED 0x10extern unsigned char data ISD_COMM_RAM_C[7];extern void init(void);extern void delay_isd(int x);extern void comm_sate(void);extern void rest_isd_comm_ptr(void);extern unsigned char T_R_comm_byte(unsigned char comm_data );extern void isd1700_par2_comm(unsigned char comm_par, unsigned int data_par);extern void isd1700_Npar_comm(unsigned char comm_par,comm_byte_count);extern void isd1700_7byte_comm(unsigned char comm_par, unsigned int star_addr, unsigned int end_addr);extern void spi_pu (void);extern void spi_stop (void);extern void spi_Rest ( void );extern void spi_CLR_INT(void);extern void spi_RD_STAUS(void);extern void spi_RD_play_ptr(void);extern void spi_pd(void);extern void spi_RD_rec_ptr(void);extern void spi_devid(void);extern void spi_play(void);extern void spi_rec (void);extern void spi_erase (void);extern void spi_G_ERASE (void);extern void spi_rd_apc(void);extern void spi_wr_apc1 (void);extern void spi_wr_apc2 (void);extern void spi_wr_nvcfg (void);extern void spi_ld_nvcfg (void);extern void spi_fwd (void);extern void spi_chk_mem(void);extern void spi_CurrRowAddr(void);extern void seril_back_sate(unsigned char byte_number);extern void spi_set_opt(unsigned char spi_set_comm);void init(void);#endifIsd1700.c//#pragma src#include "isd1700.h"#include "sound.h"#define uchar unsigned char#define uint unsigned intsbit DAC_sync=P2^0;sbit DAC_sclk=P2^1;sbit DAC_din =P2^2;bit re_fig;uchar data comm_temp;uchar data ISD_COMM_RAM[7];uchar data ISD_COMM_RAM_C[7];uchar data *isd_comm_ptr;uchar data *back_data_ptr;void init(void);void isd_delay(int x);void comm_sate(void);void rest_isd_comm_ptr(void);uchar T_R_comm_byte( uchar comm_data );void isd1700_par2_comm(uchar comm_par, uint data_par);void isd1700_Npar_comm(uchar comm_par,comm_byte_count); //no parameter comm void isd1700_7byte_comm(uchar comm_par, uint star_addr, uint end_addr);void spi_pu (void);void spi_stop (void);void spi_Rest ( void );void spi_CLR_INT(void);void spi_RD_STAUS(void);void spi_RD_play_ptr(void);void spi_pd(void);void spi_RD_rec_ptr(void);void spi_devid(void);void spi_play(void);void spi_rec (void);void spi_erase (void);void spi_G_ERASE (void);void spi_rd_apc(void);void spi_wr_apc1 (void);void spi_wr_apc2 (void);void spi_wr_nvcfg (void);void spi_ld_nvcfg (void);void spi_fwd (void);void spi_chk_mem(void);void spi_CurrRowAddr(void);void seril_back_sate(uchar byte_number); void spi_set_opt(uchar spi_set_comm);void comm_sate(void){uchar sate_temp;uint apc_temp;if(RI){ sate_temp=SBUF;if(sate_temp==0x09){ spi_devid();}if(sate_temp==0x44){spi_rd_apc();}if(sate_temp==0x40){spi_play();}if(sate_temp==0x04){spi_CLR_INT();}if(sate_temp==0x05){spi_RD_STAUS();}if(sate_temp==0x43){ spi_G_ERASE();}if(sate_temp==0x01){ spi_pu ();}if(sate_temp==0x02){ spi_stop();}if(sate_temp==0x03){ spi_Rest ();}if(sate_temp==0x06){spi_RD_play_ptr();}if(sate_temp==0x07){spi_pd();}if(sate_temp==0x08){ spi_RD_rec_ptr();}if(sate_temp==0x41){ spi_rec();}if(sate_temp==0x42){ spi_erase();}if(sate_temp==0x45){spi_wr_apc1 ();}if(sate_temp==0x65){ spi_wr_apc2 ();}if(sate_temp==0x46){ spi_wr_nvcfg ();}if(sate_temp==0x47){ spi_ld_nvcfg ();}if(sate_temp==0x48){ spi_fwd ();}if(sate_temp==0x49){ spi_chk_mem();}if(sate_temp==0x60){ spi_CurrRowAddr();}if(sate_temp==0x80){spi_set_opt(ISD1700_SET_PLAY|ISD_LED);//spi_set_opt(ISD1700_SET_PLAY);}if(sate_temp==0x81){spi_set_opt(ISD1700_SET_REC|ISD_LED);//spi_set_opt(ISD1700_SET_REC);ISD_COMM_RAM_C[0]=ISD1700_SET_REC ;seril_back_sate(1);}if(sate_temp==0x82){spi_set_opt(ISD1700_SET_ERASE|ISD_LED);//spi_set_opt(ISD1700_SET_ERASE);}if(sate_temp==ISD1700_WR_APC2){RI=0;while(!RI);apc_temp=SBUF;apc_temp=apc_temp<<8;RI=0;while(!RI);apc_temp|=SBUF;RI=0;ISD_SS=0;isd1700_par2_comm(ISD1700_WR_APC2,apc_temp);ISD_SS=1;}RI=0;}if(re_fig){rest_isd_comm_ptr();sate_temp=0;do{SBUF=*back_data_ptr++;while(!TI);TI=0;}while(++sate_temp<=2);re_fig=0;}}void spi_set_opt(uchar spi_set_comm){uint start_addr,end_addr;RI=0;while(!RI);start_addr=SBUF;start_addr=start_addr<<8;RI=0;while(!RI);start_addr|=SBUF;RI=0;while(!RI);end_addr=SBUF;end_addr=start_addr<<8;RI=0;while(!RI);end_addr|=SBUF;RI=0;ISD_SS=0;isd1700_7byte_comm(spi_set_comm, start_addr, end_addr);ISD_SS=1;}void spi_pu (void){ISD_SS=0;isd1700_Npar_comm(ISD1700_PU,2);ISD_SS=1;}void spi_stop (void){ISD_SS=0;isd1700_Npar_comm(ISD1700_STOP,2);ISD_SS=1;ISD_COMM_RAM_C[0]=ISD1700_STOP ;seril_back_sate(1);}void spi_Rest (void){ISD_SS=0;isd1700_Npar_comm(ISD1700_REST,2);ISD_SS=1;}void spi_CLR_INT(void){ISD_SS=0;isd1700_Npar_comm(ISD1700_CLR_INT,2);ISD_SS=1;}void spi_RD_STAUS(void){ uchar i;ISD_SS=0;isd1700_Npar_comm(ISD1700_RD_STAUS,3);ISD_SS=1;i=ISD_COMM_RAM_C[1];//j=ISD_COMM_RAM_C[2];ISD_COMM_RAM_C[1]=ISD_COMM_RAM_C[0];ISD_COMM_RAM_C[0]=i;seril_back_sate(3);}void spi_CurrRowAddr(void){ uchar i;ISD_SS=0;isd1700_Npar_comm(ISD1700_RD_STAUS,3);ISD_SS=1;i=ISD_COMM_RAM_C[1];ISD_COMM_RAM_C[1]=ISD_COMM_RAM_C[0]>>5|ISD_COMM_RAM_C[1]<<3;ISD_COMM_RAM_C[0]= i >>5;seril_back_sate(3);}void spi_RD_play_ptr(void){ uchar i;ISD_SS=0;isd1700_Npar_comm(ISD1700_RD_PLAY_PTR,4);ISD_SS=1;i=ISD_COMM_RAM_C[3]&0x03;ISD_COMM_RAM_C[3]=ISD_COMM_RAM_C[2];ISD_COMM_RAM_C[2]=i;seril_back_sate(4);}void spi_pd(void){ISD_SS=0;isd1700_Npar_comm(ISD1700_PD,2);ISD_SS=1;}void spi_RD_rec_ptr(void){ uchar i;ISD_SS=0;isd1700_Npar_comm(ISD1700_RD_REC_PTR,4);ISD_SS=1;i=ISD_COMM_RAM_C[3]&0x03;ISD_COMM_RAM_C[3]=ISD_COMM_RAM_C[2];ISD_COMM_RAM_C[2]=i;seril_back_sate(4);}void spi_devid(void){ISD_SS=0;isd1700_Npar_comm(ISD1700_DEVID,3);ISD_SS=1;ISD_COMM_RAM_C[2]=ISD_COMM_RAM_C[2]&0xf8;seril_back_sate(3);}void spi_play(void){ISD_SS=0;isd1700_Npar_comm(ISD1700_PLAY|ISD_LED,2);ISD_SS=1;}void spi_rec (void){ISD_SS=0;isd1700_Npar_comm(ISD1700_REC|ISD_LED,2);ISD_SS=1;ISD_COMM_RAM_C[0]=ISD1700_REC ;seril_back_sate(1);}void spi_erase (void){ISD_SS=0;isd1700_Npar_comm(ISD1700_ERASE|ISD_LED,2);ISD_SS=1;}void spi_G_ERASE (void){ISD_SS=0;isd1700_Npar_comm(ISD1700_G_ERASE|ISD_LED,2);ISD_SS=1;}void spi_rd_apc(void){ISD_SS=0;isd1700_Npar_comm(ISD1700_RD_APC,4);ISD_SS=1;seril_back_sate(4);}void spi_wr_apc1 (void){}void spi_wr_apc2 (void){ISD_SS=0;isd1700_par2_comm(ISD1700_WR_APC2, 0x0400);ISD_SS=1;}void spi_wr_nvcfg (void){ISD_SS=0;isd1700_Npar_comm(ISD1700_WR_NVCFG,2);ISD_SS=1;}void spi_ld_nvcfg (void){ISD_SS=0;isd1700_Npar_comm(ISD1700_LD_NVCFG ,2);ISD_SS=1;}void spi_fwd (void){ISD_SS=0;isd1700_Npar_comm(ISD1700_FWD,2);ISD_SS=1;}void spi_chk_mem(void){ISD_SS=0;isd1700_Npar_comm(ISD1700_CHK_MEM,2);ISD_SS=1;}void seril_back_sate(uchar byte_number){uchar sate_temp;rest_isd_comm_ptr();sate_temp=0;do{SBUF=*back_data_ptr++;while(!TI);TI=0;}while(++sate_temp<byte_number);}void rest_isd_comm_ptr(void){isd_comm_ptr=ISD_COMM_RAM;back_data_ptr=ISD_COMM_RAM_C;}void isd1700_Npar_comm (uchar comm_par,comm_byte_count) {uchar i;i=0;ISD_COMM_RAM[0]=comm_par;isd_comm_ptr=&ISD_COMM_RAM[1];do{*isd_comm_ptr++=NULL;}while(++i<comm_byte_count-1);rest_isd_comm_ptr();i=0;do{*back_data_ptr++=T_R_comm_byte(*isd_comm_ptr++);i++;}while(i<comm_byte_count);}void isd1700_par2_comm(uchar comm_par, uint data_par){uchar i;ISD_COMM_RAM[0]=comm_par;ISD_COMM_RAM[1]=data_par;ISD_COMM_RAM[2]=data_par>>8;rest_isd_comm_ptr();i=0;do{*back_data_ptr++=T_R_comm_byte(*isd_comm_ptr++);i++;}while(i<3);}void isd1700_7byte_comm(uchar comm_par, uint star_addr, uint end_addr) {uchar i;ISD_COMM_RAM[0]=comm_par;ISD_COMM_RAM[1]=NULL;ISD_COMM_RAM[2]=star_addr;ISD_COMM_RAM[3]=star_addr>>8;ISD_COMM_RAM[4]=end_addr;ISD_COMM_RAM[5]=end_addr>>8;ISD_COMM_RAM[6]=NULL;rest_isd_comm_ptr();i=0;do{*back_data_ptr++=T_R_comm_byte(*isd_comm_ptr++);i++;}while(i<=7);}uchar T_R_comm_byte( uchar comm_data ){uchar bit_nuber;uchar temp;bit_nuber=0;temp=0;do{ISD_SCLK=0;isd_delay(1);if((comm_data>>bit_nuber&0x01)!=0){ISD_MOSI=1;}else{ISD_MOSI=0;}if(ISD_MISO){temp=(temp>>1)|0x80;}else{temp=temp>>1;}ISD_SCLK=1;isd_delay(1);}while(++bit_nuber<=7);ISD_MOSI=0;return (temp);}void isd_delay(int x){uchar i;for(; x>=1; x--){for(;i<=20;i++);}}void init(void){TMOD=0x21;SCON=0x50;TL0=0x00; //25msTH0=0x70; //25msTH1=0xE8;TL1=0xE8; //波特率:1200bps(12MHz:0xE6 11.0592MHz:0xE8)ET0=1;EA=1;TR1=1;IT0 = 0;EX0 = 0;spi_pu();spi_devid();}12864.h#ifndef _12864_H#define _12864_H#include "main.h"sbit RS =P3^2;sbit RW=P3^3;sbit EN=P3^4;void buzy();void TransferData(char data1,bit DI);void Dingwei(unsigned char line,unsigned char row);void delayms(unsigned int n);void delay(unsigned int m);void lcd_mesg(unsigned char code *adder1);void displayonechar(unsigned int data2);void initinal(void) ; //LCD字库初始化程序void clrram(void);void lcd_pos(unsigned char ,unsigned char );void write_dat(unsigned char);extern unsigned char time_show[];extern unsigned int aaa;#endif12864.c#include "12864.h"#define DataPort P1void initinal(void) //LCD字库初始化程序{TransferData(0x30,0); //8BIT设置,RE=0: basic instruction setTransferData(0x08,0); //Display on ControlTransferData(0x10,0); //Cursor Display Control光标设置TransferData(0x0C,0); //Display Control,D=1,显示开TransferData(0x01,0); //Display Clear}void buzy(){DataPort=0xff;RW=1;RS=0;EN=1;while(DataPort&0x80);EN=0;}void Dingwei(unsigned char line,unsigned char row) //定位在哪行哪列显示{unsigned int i;switch(line){case 1: i=0x80+row;break;case 2: i=0x90+row;break;case 3: i=0x88+row;break;case 4: i=0x98+row;break;default: i=0x80;break;}TransferData(i,0);delay(1);}void lcd_mesg(unsigned char code *addr) //传送一个字符串{while(*addr>0){TransferData(*addr,1);addr++;}}void TransferData(char data1,bit DI) //传送数据或者命令,当DI=0,传送命令,当DI=1,传送数据.{buzy();RW=0;RS=DI;DataPort=data1;EN=1;EN=0;}void delayms(unsigned int n) //延时10×n毫秒程序{unsigned int i,j;for(i=0;i<3*n;i++)for(j=0;j<2000;j++);}void delay(unsigned int m) //延时程序,微妙级{while(m--){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}}void write_cmd(unsigned char cmd){RS=0;RW=0;EN=0;P1=cmd;delayms(1);EN=1;delayms(1);EN=0;}void write_dat(unsigned char dat){RS=1;RW=0;EN=0;P1=dat;delayms(1);EN=1;delayms(1);EN=0;}void lcd_pos(unsigned char x,unsigned char y){unsigned char pos;if(x==0)x=0x80;else if(x==1)x=0x90;else if(x==2)x=0x88;else if(x==3)x=0x98;pos=x+y;write_cmd(pos);}void clrram(void){write_cmd(0x30);write_cmd(0x01);}Sound.h#ifndef _SOUND_H#define _SOUND_H#include "main.h"//以下为语音信息对应播放起始地址定义,A为开始,B为结束#define sound_0A 0x0012#define sound_0B 0x0017#define sound_1A 0x0019#define sound_1B 0x0025#define sound_2A 0x0027#define sound_2B 0x002e#define sound_3A 0x002f#define sound_3B 0x0039#define sound_4A 0x003b#define sound_4B 0x0048#define sound_5A 0x004a#define sound_5B 0x004f#define sound_6A 0x0052#define sound_6B 0x0159#define sound_7A 0x005c#define sound_7B 0x0062#define sound_8A 0x0065#define sound_8B 0x0131#define sound_9A 0x006f#define sound_9B 0x015F#define sound_10A 0x0079#define sound_10B 0x015E#define sound_11A 0x0082#define sound_11B 0x018A#define sound_12A 0x0091#define sound_12B 0x0100#define sound_13A 0x009f#define sound_13B 0x0100#define sound_14A 0x00ac#define sound_14B 0x0100void GetSound(unsigned char soundtick); void PlaySoundTick(unsigned char number); void delay_isd(unsigned int time);void short_delay();void long_delay();#endifSound.c#include "sound.h"void GetSound(unsigned char soundtick){ISD_SS=0;switch(soundtick){case 0:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_0A, sound_0B); }break;case 1:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_1A, sound_1B); }break;case 2:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_2A, sound_2B); }break;case 3:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_3A, sound_3B); }break;case 4:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_4A, sound_4B); }break;case 5:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_5A, sound_5B); }break;case 6:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_6A, sound_6B); }break;case 7:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_7A, sound_7B); }break;case 8:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_8A, sound_8B); }break;case 9:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_9A, sound_9B); }break;case 10:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_10A, sound_10B); }break;case 11:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_11A, sound_11B); }break;case 12:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_12A, sound_12B); }break;case 13:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_13A, sound_13B); }break;case 14:{ isd1700_7byte_comm(ISD1700_SET_PLAY|ISD_LED, sound_14A, sound_14B); }break;default: break;}ISD_SS=1;}void PlaySoundTick(unsigned char number) {spi_stop ();delay_isd(30000);GetSound(number);}void delay_isd(unsigned int time){while(time--!=0);}void short_delay(){delay_isd(30000);delay_isd(30000);delay_isd(30000);delay_isd(30000);delay_isd(30000);delay_isd(30000);delay_isd(30000);delay_isd(30000);delay_isd(30000);}void long_delay(){short_delay();short_delay();short_delay();short_delay();}Key.h#ifndef _KEY_H#define _KEY_H#include "main.h"sbit KEY1=P2^0;sbit KEY2=P2^1;sbit KEY3=P2^2;sbit KEY4=P2^3;sbit KEY5=P2^4;sbit KEY6=P2^5;sbit KEY7=P2^6;sbit KEY8=P2^7;sbit KEY_SURE=P3^6;void key_delay(unsigned char z); unsigned char keyscan_nor();#endifKey.c#include "key.h"unsigned char keyscan_nor() {if(!KEY1){key_delay(20);if(!KEY1){LED1=0;return 1;}}if(!KEY2){key_delay(20);if(!KEY2){LED2=0;return 2;}}if(!KEY3){key_delay(20);if(!KEY3){LED3=0;return 3;}}if(!KEY4){key_delay(20);if(!KEY4){LED4=0;return 4;}}if(!KEY5){key_delay(20);if(!KEY5){LED5=0;return 5;}}if(!KEY6){key_delay(20);if(!KEY6){LED6=0;return 6;}}if(!KEY7){key_delay(20);if(!KEY7){LED7=0;return 7;}}if(!KEY8){key_delay(20);if(!KEY8){LED8=0;return 8;}}return 0;}void key_delay(unsigned char z) {unsigned char x,y;for(x=z;x>0;x--)for(y=110;y>0;y--); }五.参与制作人员ZYL毕业设计(论文)原创性声明和使用授权说明原创性声明本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。

基于51单片机的液晶显示万年历设计

基于51单片机的液晶显示万年历设计

基于51单片机的液晶显示万年历设计摘要随着社会的进步和发展,电子万年历作为日常计时工具被广泛地应用。

此电子万年历在硬件方面主要采用STC89C51单片机作为主控核心,由DS1302时钟芯片提供时钟及1602LCD液晶显示屏显示。

STC89C51单片机是由宏晶公司公司生产的,功耗小,电压可选用3.4v~5.5v电压供电;DS1302时钟芯片是美国DALLAS公司推出的低功耗实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,而且DS1302的使用寿命长,误差小;对于数字电子万年历采用直观的数字显示,数字显示是采用的1602LCD液晶显示屏来显示,可以同时显示年、月、日、星期、时、分、秒、温度等信息。

此外,该电子万年历在软件方面主要包括日历程序、时间调整程序,显示程序等。

所有程序编写完成后,在Keil软件中进行调试,确定没有问题后,烧写到单片机上进行测试。

本次课程设计主要由时钟芯片DS1302和温度传感器DS18B20采集数据到单片机进行处理再通过LCD1602显示出来,本设计主要研究了液晶显示器LCD及时钟芯片DS1302,温度传感器DS18B20与单片机之间的硬件互联及通信,对数种硬件连接方案进行了详尽的比较。

关键词:单片机;DS1302;DS18B20;LCD1602ABSTRACTWith the social progress and development, Electronic calendar is widely used as a daily timing tool. The electronic calendar in hardware using STC89C51 microcontroller as the main control center, provided by the DS1302 clock chip and 1602LCD LCD display. STC89C51 microcontroller is produced by the macro crystal company, small power consumption, the voltage can be choosen among 3.4V ~ 5.5V for power supply; DS1302 clock chip is a low power real-time clock chip produced by DALLAS, it can be a time of years,months,days,weeks,hours,minutes,seconds, and DS1302 has a long service life. The error is small; for the digital electronic calendar using visual digital display, 1602LCD digital display is used to display LCD screen that can display years, months, days, weeks, hours, minutes and seconds, temperature and other information. In addition, the electronic calendar mainly includes calendar program,time to adjust procedures,display program etc in sofeware. After the completion of all the procedures, in the Keil software debugging, determine no problem after, and burning to the microcontroller test.The curriculum design mainly by the clock chip DS1302 and temperature sensor DS18B20 collecting data to the microcontroller for processing and then through the LCD1602 display, this design mainly studies the liquid crystal display LCD and the clock chip DS1302, the hardware connection and communication between the temperature sensor DS18B20 and the MCU, a number of hardware connection scheme for a detailed comparison.Key words:SCM,DS1302,DS18B20,LCD1602目录第一章绪论 ------------------------------------------------------------------------------------------------------------ - 1 -1.1 单片机的概述------------------------------------------------------------------------------------------------- - 1 -1.1.1 单片机的概念 --------------------------------------------------------------------------------------- - 1 -1.1.2 单片机的特点 --------------------------------------------------------------------------------------- - 1 -1.2 课题背景 ------------------------------------------------------------------------------------------------------- - 1 -1.3 课题内容 ------------------------------------------------------------------------------------------------------- - 2 - 第二章设计要求和方案 --------------------------------------------------------------------------------------------- - 3 -2.1 设计要求 ------------------------------------------------------------------------------------------------------- - 3 -2.2 设计方案 ------------------------------------------------------------------------------------------------------- - 3 -2.2.1 单片机芯片的选择--------------------------------------------------------------------------------- - 3 -2.2.2 各模块方案选择 ------------------------------------------------------------------------------------ - 3 -2.3 工作原理 ------------------------------------------------------------------------------------------------------- - 4 - 第三章系统的硬件设计及实现------------------------------------------------------------------------------------ - 7 -3.1 电路设计原理框图 ------------------------------------------------------------------------------------------ - 7 -3.2 STC89C51单片机的介绍 ----------------------------------------------------------------------------------- - 7 -3.2.1 主要功能及性能参数 ----------------------------------------------------------------------------- - 7 -3.2.2单片机的引脚功能说明 --------------------------------------------------------------------------- - 8 -3.3 各模块电路的设计及原理图 ----------------------------------------------------------------------------- - 9 -3.3.1 时钟电路模块的设计 ----------------------------------------------------------------------------- - 9 -3.3.2 温度采集模块的设计及原理图 --------------------------------------------------------------- - 11 -3.3.3 显示模块的设计及原理 ------------------------------------------------------------------------- - 11 - 第四章系统的软件设计 -------------------------------------------------------------------------------------------- - 13 -4.1 程序流程框图------------------------------------------------------------------------------------------------ - 13 -4.2 时间调整程序流程图 -------------------------------------------------------------------------------------- - 14 - 第五章系统测试 ------------------------------------------------------------------------------------------------------ - 15 -5.1 硬件测试 ------------------------------------------------------------------------------------------------------ - 15 -5.2 软件测试 ------------------------------------------------------------------------------------------------------ - 15 - 第六章总结与致谢 --------------------------------------------------------------------------------------------------- - 17 -6.1 总结------------------------------------------------------------------------------------------------------------- - 17 -6.2 致谢------------------------------------------------------------------------------------------------------------- - 18 - 参考文献 ------------------------------------------------------------------------------------------------------------------- - 19 - 附录 ------------------------------------------------------------------------------------------------------------------------ - 21 - 附录一:实物图 --------------------------------------------------------------------------------------------------- - 21 - 附录二:源程序 --------------------------------------------------------------------------------------------------- - 23 -第一章绪论1.1 单片机的概述1.1.1 单片机的概念单片机即单片微型计算机,是把中央处理器、存储器、定时/计数器、输入输出接口都集成在一块集成电路芯片上的微型计算机。

STC51单片机DS130218b20实现万年历

STC51单片机DS130218b20实现万年历

STC51电子钟制作最近做了一件DIY 电子钟,自我感觉效果还不错,所以传到网上 与大家分享一下,大家如果喜欢可以尝试做一下,也可以用作毕业设 计。

这款电子钟可以显示年,月,日,小时,分,秒,星期,还有温 度,可以调节时间。

1,电路原理图:我的原理不是很清楚,大家可以看我的 PCB 图,我把每部分都截图 了,效果挺好的。

2,PCB板图:ntiiTRrSfT丄PPf DSL2Q2DSlflB2O \ 11;1M a a n H Z(1)蜂鸣器部分(2) DS1302部分和复位电路部分10pF10pFk5(3) 18B20部分,和单片机晶振部分-7k・DS18B20(4)调时按键部分Array(5) 1602 部分(6)电源部分4,源程序清单:#include<reg52 ・h>#include<stdi o.h>#define uint unsigned int #define uchar unsigned char sbit LCD_RS=P2A4;//1602知识改变命运,word精品文档! sbit LCD_RW=P2A5;sbit LCD_EN=P2A6;sbit rst=P1A7; //DS1302sbit io=P1A6;sbit sclk=P1A5;sbit ACC_7=ACCA7;sbit K1=P2A3;〃按键sbit K2=P2A2;sbit K3=P2A1;sbit K4=P2A0;sbit BEEP=P1A0;〃蜂鸣器sbit DQ=P3A1;〃温度传感器bit flag=0;bit flag1=0;ucharyes;//uchar code table2[|=" SONG you ";//uchar code table3[]=" zhan peng "; uchar code table4[|="0123456789"; char table5[7];uchar table6[2];char table7[2];char leap;〃延时函数部分void Delay_ms(uint xms)/延时{uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void Delayus(uchar t)/延时1 用于18b20{while(--t);}void Delayms(uchar t)/延时2 用于18b20while(t--){//大致延时1mSDelayus(245);Delayus(245);}}//18b20 部分bit init18b20(void)〃初始化18b20 {bit dat=0;DQ = 1;Delayus(5);DQ = 0;Delayus(200);Delayus(200);知识改变命运,word精品文档!}DQ = 1; Delayus(50); dat=DQ; Delayus(25); return dat;}uchar read18b20(void)/读卖18b20 函数{uchar i=0,dat=0;for (i=8;i>0;i--){DQ = 0; //给脉冲信号dat>>=1;DQ = 1; //给脉冲信号if(DQ)dat|=0x80;Delayus(25);}return(dat);void write18b20(uchar dat)/写18b20 函数{uchar i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;Delayus(25);DQ = 1;dat>>=1;}Delayus(25);}uint get_18b20(void)/读卖取温度函数{uchar a=0;uint b=0,t=0;init18b20();write18b20(0xCC); //跳过读序号列号的操作write18b20(0x44); // 启动温度转换Delayms(10);init18b20();write18b20(0xCC); //跳过读序号列号的操作前两write18b20(0xBE); //读取温度寄存器等(共可读9个寄存器)个就是温度a=read18b20(); 〃低位b=read18b20(); // 高位b<<=8;t=a+b;return(t);}〃蜂鸣器部分void beep(){BEEP=0;Delay_ms(100);BEEP=1;}//LCD1602 部分void write1602(uchar dat)//1602 写数据函数{ LCD_RS=1;LCD_RW=0;LCD_EN=0;P0=dat;LCD_EN=1;Delay_ms(1);LCD_EN=0;} void write1602c(uchar com)//1602写指令函数{LCD_RS=0;LCD_RW=0;LCD_EN=0;P0=com;LCD_EN=1;Delay_ms(1);}LCD_EN=0;void init1602()//1602 初始化{write1602c(0x38); //16*2 显示write1602c(0x0f); // 显示光标write1602c(0x06); 〃光标右移write1602c(0x01);//清屏write1602c(0x80); }//DS1302 部分void write1302(uchar addr,dat)//1302 写数据函数{ uchar i,temp;rst=0;sclk=0;rst=1;for(i=0;i<8;i++) // 写地址,写数据{sclk=0;temp=addr;io=(bit)(temp&0x01);addr>>=1;sclk=1;}for(i=0;i<8;i++) // 写地址,写数据{sclk=0;temp=dat;io=(bit)(temp&0x01);dat>>=1;sclk=1;}rst=0;}uchar read1302(uchar addr)//1302读数据函数{uchar i,temp,dat1,dat2;rst=0;sclk=0;rst=1;for(i=0;i<8;i++){sclk=0;temp=addr;io=(bit)(temp&0x01);addr>>=1;sclk=1;}for(i=0;i<8;i++){ACC_7=io;sclk=1;ACC>>=1;sclk=0;}rst=0;dat 仁ACC;dat2=dat1%16;dat 1= dat1/16;dat 1=dat1*10+dat2;return(dat1);void init1302()//1302 初始化函数{write1302(0x8e,0x00);write1302(0x80,0x00);//秒初始化write1302(0x8e,0x80); }/*void init1602B(){uchar i=0;write1602c(0x80+16);write1602(0xef);while(table2[i]!='\0'){write1602(table2[i]);i++;}write1602(0xef); write1602c(0x80+0x40+20); i=0;while(table3[i]!='\0')write1602(table3[i]);i++;} for(i=0;i<16;i++){write1602c(0x18);Delay_ms(800);}Delay_ms(2000); write1602c(0x01); write1602c(0x06); }*/〃显示部分void get_time()/获取时间函数{table5[5]=read1302(0x8d);table5[4]=read1302(0x89);table5[3]=read1302(0x87);table5[2]=read1302(0x85);table5[1]=read1302(0x83);table5[0]=read1302(0x81);table5[6]=read1302(0x8b);}void Display_time(uchar year,yue,day,hour,min,sec,xc显示函数{write1602c(0x80);write1602('2');write1602('0');write1602(table4[year/10]);write1602(table4[year%10]);write1602('-');write1602(table4[yue/10]);write1602(table4[yue%10]);write1602('-');write1602(table4[day/10]);write1602(table4[day%10]);write1602('');write1602('w');write1602('e');write1602('e'); write1602('k'); write1602(table4[xq]);write1602c(0x80+0x40); write1602(table4[hour/10]);write1602(table4[hour%10]); write1602(':');write1602(table4[min/10]); write1602(table4[min%10]);write1602(':'); write1602(table4[sec/10]);write1602(table4[sec%10]); write1602('');write1602(''); write1602('T');write1602(''); write1602(table7[0]); write1602(table7[1]);write1602(0xdf); write1602('c');}〃调时部分void Keyprocess(){static uchar num=0;uchar year1,yue1,day1,hour1,min1,xq1;write1302(0x8e,0x00);write1302(0x80,0x80);if(K3==0){Delay_ms(5);if(K3==0){while(!K3);beep();num++;}}if(num>6){num=0;} if(num){if(K1==0){Delay_ms(5);if(K1==0){while(!K1);beep();if(num==1){table5[1]++;if(table5[1]==60)table5[1]=0;min 仁table5[1]/10*16+table5[1]%10;write1302(0x82,min1);}if(num==2){table5[2]=0;hour 1= table5[2]/10*16+table5[2]%10;table5[2]++;if(table5[2]==24)table5[2]=0;hour 1= table5[2]/10*16+table5[2]%10;write1302(0x84,hour1);}if(num==3){table5[6]++;if(table5[6]==8)table5[6]=1;xq仁table5[6]/10*16+table5[6]%10;write1302(0x8a,xq1);}if(num==4){if(table5[5]==0){switch(table5[4]){case 1table5[3]++;if(table5[3]==32) table5[3]=1;break;case 2table5[3]++;if(table5[3]==30) table5[3]=1;break;table5[3]++;if(table5[3]==32) table5[3]=1;break;case 3 table5[3]++;if(table5[3]==33) table5[3]=1;break;知识改变命运,word精品文档!case 4table5[3]++;if(table5[3]==31) table5[3]=1;break;case 5table5[3]++;if(table5[3]==32) table5[3]=1;break;case 6table5[3]++;if(table5[3]==31) table5[3]=1;break;case 7table5[3]++;if(table5[3]==32)table5[3]=1;break; case 8 : table5[3]++;if(table5[3]==32) table5[3]=1;break; case 9 table5[3]++;if(table5[3]==31) table5[3]=1;break;case 10table5[3]++;if(table5[3]==32) table5[3]=1;break;case 11table5[3]++;if(table5[3]==31) table5[3]=1;break;case 12table5[3]++;if(table5[3]==32) table5[3]=1;break;}}else if(leap&&table5[4]==2)table5[3]++;知识改变命运,word精品文档!if(table5[3]==30) table5[3]=1;}else if(leap==0&&table5[4]==2) {table5[3]++; if(table5[3]==29)table5[3]=1;}elseswitch(table5[4]){case 1table5[3]++;if(table5[3]==32) table5[3]=1;break;case 3table5[3]++;if(table5[3]==32) table5[3]=1;break;case 4table5[3]++;if(table5[3]==31) table5[3]=1;break;case 5table5[3]++;if(table5[3]==32) table5[3]=1;break;case 6table5[3]++;if(table5[3]==31) table5[3]=1;break;case 7table5[3]++;if(table5[3]==32) table5[3]=1;break; case 8 : table5[3]++;if(table5[3]==32) table5[3]=1;break;case 9 : table5[3]++;if(table5[3]==31) table5[3]=1;break;case 10 : table5[3]++;if(table5[3]==32) table5[3]=1;break;case 11table5[3]++;if(table5[3]==31) table5[3]=1;break;case 12 : table5[3]++;if(table5[3]==32) table5[3]=1;break;}day仁table5[3]/10*16+table5[3]%10;write1302(0x86,day1);}if(num==5){table5[4]++;if(table5[4]==13)table5[4]=1;yue1=table5[4]/10*16+table5[4]%10;write1302(0x88,yue1);}if(num==6){table5[5]++;if(table5[5]==100)table5[5]=0;leap=table5[5]%4==0&&table5[5]%100!=0;year1=table5[5]/10*16+table5[5]%10;write1302(0x8c,year1);}}}if(K2==0){Delay_ms(5);if(K2==0){while(!K2);beep();if(num==1){table5[1]--;if(table5[1]==-1)table5[1]=59;min 仁table5[1]/10*16+table5[1]%10;write1302(0x82,min1);}if(num==2){table5[2]--;if(table5[2]==-1)table5[2]=23;hour 1= table5[2]/10*16+table5[2]%10;write1302(0x84,hour1);}if(num==3){table5[6]--;if(table5[6]==0)table5[6]=7;xq1=table5[6]/10*16+table5[6]%10;write1302(0x8a,xq1);xq1=table5[6]/10*16+table5[6]%10;}if(num==4) {if(table5[5]==0){switch(table5[4]){case 1 : table5[3]--;if(table5[3]==0) table5[3]=31;break;case 2 : table5[3]--;if(table5[3]==0) table5[3]=29;break;case 3 : table5[3]--;if(table5[3]==0) table5[3]=31;break;case 4 : table5[3]--;if(table5[3]==0) table5[3]=30;break;case 5 : table5[3]--;if(table5[3]==0) table5[3]=31;break;case 6 : table5[3]--;if(table5[3]==0) table5[3]=30;break;case 7 : table5[3]--;if(table5[3]==0)table5[3]=31;break;case 8 : table5[3]--;if(table5[3]==0) table5[3]=31;break;知识改变命运,word精品文档!case 9 : table5[3]--;if(table5[3]==0) table5[3]=30;break;case 10 : table5[3]--;if(table5[3]==0) table5[3]=31;break;case 11 : table5[3]--;if(table5[3]==0) table5[3]=30;break;case 12 : table5[3]--;if(table5[3]==0) table5[3]=31;break;}}else if(leap&&table5[4]==2){table5[3]--;if(table5[3]==0)table5[3]=29;}else if(leap==0&&table5[4]==2){table5[3]--;if(table5[3]==0)table5[3]=28;知识改变命运,word精品文档!elseswitch(table5[4]){case 1 : table5[3]--; if(table5[3]==0) table5[3]=31;break;case 3 : table5[3]--;if(table5[3]==0) table5[3]=31;break;case 4 : table5[3]--;if(table5[3]==0) table5[3]=30;break;case 5 : table5[3]--;if(table5[3]==0) table5[3]=31;break;case 6 : table5[3]--;if(table5[3]==0) table5[3]=30;break;case 7 : table5[3]--;if(table5[3]==0) table5[3]=31;break;case 8 : table5[3]--;if(table5[3]==0) table5[3]=31;break;table5[3]=30;break; case 9 : table5[3]--;if(table5[3]==0)table5[3]=31;break;case 11 : table5[3]--;if(table5[3]==0) table5[3]=30;break;知识改变命运,word精品文档!case 12 : table5[3]--;if(table5[3]==0)table5[3]=31;break;}day仁table5[3]/10*16+table5[3]%10; write1302(0x86,day1);}if(num==5){table5[4]--;if(table5[4]==0)table5[4]=12;yue 仁table5[4]/10*16+table5[4]%10;write1302(0x88,yue1);}if(num==6){table5[5]--;if(table5[5]==-1)table5[5]=79;知识改变命运,word精品文档! Ieap=(table5[5]%4==0&&table5[5]%100!=0);year1=table5[5]/10*16+table5[5]%10;write1302(0x8c,year1);}}}}if(K4==0){Delay_ms(5);if(K4==0);{whiIe(!K4);beep();write1302(0x80,0x00);write1302(0x8e,0x80); flag=0;}}}void init_timer0(void)〃定时器初始化{ TMOD |= 0x01;TH0=(65536-2000)/256;TL0=(65536-2000)%256;EA=1;ET0=1;TR0=1;}void main(){float temp;init1602();//init1602B();init1302();init_timer0();while(1)if(K3==0){Delay_ms(10); if(K3==0){while(!K3);beep();flag=1;}}get_time();Display_time(table5[5],table5[4],table5[3],table5[2],table5[1],tabl e5[0],table5[6]);if(flag) Keyprocess();if(flag 仁=1){flag 1=0;temp=get_18b20();temp=temp*0.0625;sprintf(table7,"%2.0 f",temp);}void timer0() interrupt 1〃定时器函数{ static uint num2=0;TH0=(65536-2000)/256;TL0=(65536-2000)%256;num2++;if(num2==300){num2=0;flag 1=1;}}5,作品效果图知识改变命运,word精品文档!知识改变命运,word精品文档!知识改变命运,word精品文档!。

基于51单片机的键盘盘可调万年历

基于51单片机的键盘盘可调万年历

开放性实验报告题目:基于80C51的万年历设计_院系:专业班级:学号:姓名:指导老师:________________________ 时间:2014年9月8号电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。

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

本系统选用DALLAS公司生产的日历时钟芯片DS1302来作为实时时数字万年历采用直观数字显示,可以同时显示年、月、日、周、时、分、秒等信息,还具有键盘时间校准等功能。

该电路采用AT89C52单片机作为核心,用以5V电压供电。

本系统硬件部分由AT89C52单片机、DS1302时钟芯片、LCD1602液晶显示环境下以C51语言编写,包括时间设置、时间显示、时间修正等功能。

在仿真的时候,以Proteus与Keil uVision4软件为基础,编写了MCS-51单片机对LCD1602显示控制的软件,绘制其原理图,并使用Proteus软件与Keil uVision4软件建立联合仿真。

本设计主要论述了原理图各个模块的作用,以及控制软件的各个模块的编程。

关键词:时钟芯片DS1302;单片机AT89C52;液晶显示1602;独立键盘等第1章绪论................................................ 错误!未定义书签。

1.1实时万年历的简介.................................... 错误!未定义书签。

1.2系统所实现的功能 .................................... 错误!未定义书签。

第2章开发工具软件简介.. (5)2.1K EIL U V ISION4软件简介 (5)2.2P ROTEUS软件简介 (5)2.3K EIL U V ISION4与P ROTEUS软件联合仿真 (6)第3章 LCD1602显示控制技术.............................. 错误!未定义书签。

浅谈单片机万年历的工作原理

浅谈单片机万年历的工作原理

技术与应用A PPLICATION145OCCUPATION2014 01摘 要:本文介绍了由单片机STC89C52、时钟芯片DS1302、液晶显示器LCD1602、温度传感器DS18B20、按键电路、报警电路和复位电路等组成的单片机万年历,可同时显示年、月、日、星期、时、分、秒、闹铃时间和温度等信息,通过功能键和加1、减1键,对以上信息进行设置。

关键词:单片机 时钟芯片 液晶显示器 温度传感器浅谈单片机万年历的工作原理文/巢国强微型计算机向两个不同的方向发展,一个是向高速度、大容量、高性能的高档微机方向发展,另一个则是向单片机方向发展。

单片机功能完善、体积小、价格廉、易于嵌入,非常适合于对家用电器的控制。

嵌入单片机的家用电器实现了智能化,是传统型家用电器的更新换代,现已广泛应用于洗衣机、空调、电视机、微波炉、电冰箱、电饭煲以及各种智能电子钟等。

单片机万年历就是其中的应用之一。

它使用STC 89C 52单片机控制时钟芯片DS 1302,对年、月、日、星期、时、分、秒进行计时,采用温度传感器DS 18B 20检测实时温度,通过液晶显示器LCD 1602同时显示年、月、日、星期、闹铃时间、时、分、秒和当前实时温度等信息(图1)。

图1 系统框图一、系统功能一是时间设定由按键电路完成。

第一次按下功能键S 3后,使用加1键S 4、减1键S 5键可以调年,第二次按下功能键后调月,第三次按下功能键后调日,第四次按下功能键后调星期,第五次按下功能键后调温度上限,第六次按下功能键后调温度下限,第七次按下功能键后调时,第八次按下功能键后调分,第九次按下功能键后调秒,第十次按下功能键后调时结束,显示时间,万年历开始工作。

二是在LCD 1602液晶显示器上同时显示:年、月、日、星期、闹铃时间、时、分、秒及实时温度。

闹钟时间到或温度超过设定范围,蜂鸣器报警。

三是S 2为闹钟开启键,按一次开启,液晶上有个开启的图标,再按一次,闹钟关闭。

单片机万年历毕业设计

单片机万年历毕业设计

单片机万年历毕业设计单片机万年历是一种集成了日历、时钟、闹钟等功能的电子设备,它可以显示日期、时间,并能够提醒用户重要的日程安排。

在现代社会,随着人们生活节奏的加快和工作压力的增大,一个可靠的万年历设备变得尤为重要。

本文将介绍关于单片机万年历的设计原理、功能以及实现方法。

首先,我们来了解一下单片机万年历的设计原理。

单片机万年历的核心是一块单片机芯片,它可以通过内部的时钟电路来计算日期和时间。

通过与外部的LCD液晶显示屏和按键电路的连接,单片机可以将计算得到的日期和时间显示在屏幕上,并接受用户的输入来设置闹钟等功能。

此外,单片机还可以通过与电源电路的连接来实现长时间的运行。

接下来,我们来讨论一下单片机万年历的功能。

除了基本的日期和时间显示功能外,单片机万年历还可以实现一些实用的功能。

比如,它可以设置多个闹钟,提醒用户重要的会议、约会等事项。

闹钟可以通过按键来设置,并且在到达设定时间时会发出声音或者振动来提醒用户。

此外,单片机万年历还可以实现倒计时功能,用户可以设置一个特定的时间,然后单片机会自动倒计时,并在倒计时结束时发出提醒。

这些功能的实现都依赖于单片机芯片的计算和控制能力。

然后,我们来探讨一下单片机万年历的实现方法。

在设计单片机万年历时,首先需要选择合适的单片机芯片,根据芯片的规格书来了解它的功能和接口。

然后,需要设计电路板,将单片机芯片、LCD液晶显示屏、按键电路和电源电路等元件连接起来。

在电路板设计完成后,需要进行焊接和调试工作,确保各个元件之间的连接正确无误。

最后,需要编写单片机的程序代码,实现各个功能的逻辑控制。

在编写代码时,需要根据芯片的指令集和编程规范来进行,以确保程序的正确性和稳定性。

最后,我们来总结一下单片机万年历的优点和应用前景。

单片机万年历具有体积小、功耗低、功能丰富等优点,适合用于个人和家庭使用。

它可以帮助人们合理安排时间,提醒重要的日程安排,提高生活和工作的效率。

此外,单片机万年历还可以应用于学校、办公室等场所,帮助人们更好地管理时间和任务。

基于51单片机DS1302万年历课程设计报告

基于51单片机DS1302万年历课程设计报告

基于51单片机DS1302万年历课程设计报告课程名称:微机原理课程设计题目:基于DS1302芯片万年历摘要DS1302 是DALLAS 公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31 字节静态RAM,通过简单的串行接口与单片机进行通信实时时钟/日历电路.提供秒、分、时、日、日期.、月、年的信息,每月的天数和闰年的天数可自动调整时钟。

本次课程设计的是使用专门的时钟芯片DS1302在数码管上显示的数字电子钟,并能通过按键对其进行调时和校准以及实现年月日。

DS1302是一种高性能、低功耗、带RAM的实时时钟芯片,它能够对时,分,秒进行精确计时,它与单片机的接口使用同步串行通信,仅用3条线与之相连接,就可以实现STC-51单片机对其进行读写操作,把读出的时间数据送到数码管上显示。

程序运行时,数码管将从当前时间开始显示,通过调节K2键和K3键可以分别对小时和分钟进行调整,调整后,时钟以新的时间为起点继续刷新显示,通过调节K1键可以切换年月日和时钟显示。

关键字:STC-51单片机,DS1302,数码管,动态扫描,调时,切换,秒闪;目录一、设计任务与要求 (4)1.1设计任务 (4)1.2设计要求 (4)1.3发挥部分 (4)1.4创新部分 (4)二、方案总体设计 (5)2.1设计目的 (5)2.2硬件功能描述 (5)2.3设计方案选择 (5)2.4总体设计 (6)2.5总体方案及基本工作原理 (6)三、硬件设计 (7)3.1 STC89C51芯片 (7)3.2电源模块及晶振模块 (7)3.3 DS1302 (8)3.4数码管显示模块 (9)3.5蜂鸣器部分 (10)3.6按键部分 (11)四、软件设计 (13)4.1软件流程图 (13)4.2 软件设计 (13)主函数部分: (13)五、系统仿真和调试 (15)5.1 仿真软件简介 (15)5.2硬件调试 (15)5.3软件调试 (15)5.4使用说明 (16)六、设计总结与体会 (18)6.1学习方面 (18)6.2工作方面 (18)七、参考文献 (19)一、设计任务与要求1.1设计任务DS1302万年历;1.2设计要求利用DS1302生成万年历,时钟可调,通过四位数码管显示,并可实现秒闪功能,同时蜂鸣器闹铃;1.3发挥部分设置按键K3用来切换显示时钟和年月日;1.4创新部分只设置了两个按键K1和K2来调节时分,时钟到24归零,分钟到60归零,分钟有长按迅速调节功能。

基于51单片机的万年历设计

基于51单片机的万年历设计

洛阳理工学院课程设计报告课程名称单片机原理与应用设计题目基于STC89C51万年历得设计与实现专业物联网工程班级学号姓名完成日期大约在冬季目录摘要 (1)一、设计目标与内容 (2)1、1设计目标 (2)1、2 设计内容 (2)1、3设计要求 (2)1、4 本章小结 (2)二、系统设计 (3)2、1 电路设计框图 (3)2、2 系统硬件概述 (3)2、3 主要单元电路得设计 (4)2、3、1 时钟电路模块得设计 (4)2、3、2温度传感器电路设计 (5)2、3、3显示模块得设计 (7)2、4本章小结 (7)三、系统得软件设计 (7)3、1程序流程图 (7)3、1、1 系统总流程图 (7)3、1、2 温度程序流程图 (8)3、1、3 DS1302时钟程序流程图 (8)3、1、4 LCD显示程序流程图 (9)3、2程序得设计 (10)3、2、1 DS18B20测温程序 (10)3、2、2 DS1302读写程序 (11)3、2、3液晶显示程序 (13)3、3本章小结 (13)四、仿真与调试 (14)4、1 Keil软件调试流程 (14)4、2 Proteus软件运行流程 (16)4、3本章小结 (16)总结 (16)基于STC89C51万年历得设计与实现摘要古人依靠日冕、漏刻记录时间,而随着科技得发展,电子万年历已经成为日渐流行得日常计时工具。

本文研究得万年历系统拟用STC89C52单片机控制,以DS1302时钟芯片计时、DS18B20采集温度、1602液晶屏显示。

系统主要由温度传感器电路,单片机控制电路,显示电路以及校正电路四个模块组成。

本文阐述了系统得硬件工作原理,所应用得各个接口模块得功能以及其工作过程,论证了设计方案理论得可行性。

系统程序采用C语言编写,经Keil软件进行调试后在Proteus软件中进行仿真,可以显示年、月、日、星期、时、分、秒与温度并具有校准功能与与即时时间同步得功能。

实验结果表明此万年历实现后具有读取方便、显示直观、功能多样、电路简洁等诸多优点,符合电子仪器仪表得发展趋势,具有广阔得市场前景。

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

51单片机万年历实验原理解析
51单片机万年历(Real-time Clock)是一种集成电路,可以提供精
确的日期和时间信息。

它是基于包含计时器和日历的时钟电路设计的。

本文将深入解析51单片机万年历实验的原理和实现过程。

1. 引言
在现代科技领域中,人们对时间的准确性和精确度要求越来越高。

而万年历是一种可靠的工具,能够提供准确的日期和时间信息,因此
被广泛应用在各种领域,如电子设备、通信系统和科学研究等。

51单片机万年历作为一种常用的设计方案,本文将对其原理和实验进行解析。

2. 51单片机概述
51单片机是一种基于哈佛架构的芯片,常应用于嵌入式系统开发。

它具有易于编程、高性能和低功耗的特点,因此在电子行业中得到广
泛应用。

而51单片机万年历则是在该芯片上实现的一种功能,它通过连接外部时钟电路和定时器模块,实现了精确的时间显示和日期计算。

3. 51单片机万年历实验原理
我们需要连接一个可靠的时钟电路到51单片机上,以提供准确的时间基准。

这个时钟电路可以是一个晶体振荡器,它会产生一个稳定的
频率信号,用来驱动定时器模块。

我们需要配置定时器模块,以便实现时间的计算和显示功能。

定时
器可以设置定时时间和工作模式,例如计时模式和计数模式。

通过定
时器中断,我们可以精确地控制和记录时间的变化。

接下来,我们需要编写一段程序来读取定时器的计数值,并将其转
换为具体的日期和时间。

这个过程涉及到将计数值分解为年、月、日、时、分、秒,然后进行相应的转换和计算。

我们将通过数码管、液晶显示屏或其他输出设备来显示转换后的日
期和时间。

这些输出设备可以根据需要进行相应的驱动和控制,以实
现清晰和直观的显示效果。

4. 实验结果和应用
通过上述步骤,我们成功实现了51单片机万年历的原理和功能。

该实验可以应用于各种领域,如电子产品、智能家居和计时设备等。

在电子产品中,51单片机万年历可以作为一个重要的功能模块,为
用户提供准确的日期和时间信息。

它还可以和其他模块进行联动,实
现更复杂的功能,如定时开关、闹钟和事件提醒等。

在智能家居中,51单片机万年历可以作为时间管理的核心模块。


可以与传感器、控制器和网络设备等进行连接,实现智能化的时间控
制和调度,提供更舒适和便捷的生活体验。

在计时设备中,51单片机万年历可以作为一个高精度的时钟源。


提供了稳定的时钟信号,可以为其他设备提供精确的时间基准,如计
时器、定时器和报时器等。

5. 结论
本文深入解析了51单片机万年历实验的原理和实现过程。

通过连接外部时钟电路和定时器模块,并编写相应的程序,我们成功实现了精
确的日期和时间显示功能。

我们还探讨了该实验在电子产品、智能家
居和计时设备等领域的应用前景。

通过本文的介绍,读者可以对51单片机万年历有更全面、深刻和灵活的理解。

1. 51单片机万年历的重要功能
51单片机万年历在电子产品中扮演着一个重要的功能模块,为用户提供了准确的日期和时间信息。

作为一个简单而实用的模块,它可以与
其他模块进行联动,实现更复杂的功能。

它可以与定时开关模块结合,实现定时控制电器的开关;与闹钟模块结合,实现准点提醒;还可以
与事件提醒模块结合,帮助用户记住重要的事情。

2. 51单片机万年历在智能家居中的应用
在智能家居中,时间管理是一个重要且基础的模块。

而51单片机万年历正好可以作为时间管理的核心模块来实现智能化的时间控制和调度。

它可以与传感器、控制器和网络设备等进行连接,通过设置定时任务
和时间策略,实现智能家电的自动控制。

可以通过设置定时开关来控
制灯光、空调等设备的开关时间;还可以通过设置闹钟来提醒用户起
床或做其他重要的事情。

这些功能的实现可以提供更舒适和便捷的生
活体验。

3. 51单片机万年历在计时设备中的应用
除了在智能家居中的应用,51单片机万年历还可以作为一种高精度的时钟源,为计时设备提供精确的时间基准。

它通过提供稳定的时钟信号,可以实现计时器、定时器和报时器等设备的精确计时功能。

可以
将51单片机万年历作为计时器的时钟源,保证计时的准确性;还可以将其作为报时器的时钟源,实现准点报时的功能。

这些应用可以广泛
运用于实验室、工厂和日常生活中的各种计时场景。

4. 结论
通过本文的解析,我们可以看到51单片机万年历在电子产品、智能家居和计时设备等领域有广泛的应用前景。

它作为一个简单而实用的功
能模块,不仅可以为用户提供准确的日期和时间信息,还可以与其他
模块进行联动,实现更复杂的功能。

在智能家居中,它作为时间管理
的核心模块,可以实现智能化的时间控制和调度,提供更舒适和便捷的生活体验。

在计时设备中,它可以作为高精度的时钟源,为其他设备提供精确的时间基准。

通过本文的介绍,读者可以对51单片机万年历有更全面、深刻和灵活的理解。

相关文档
最新文档