基于C51的万年历语音温度计的设计

合集下载

基于单片机C51的万年历设计课程设计

基于单片机C51的万年历设计课程设计

课程设计说明书设计题目:基于单片机的万年历设计毕业设计(论文)原创性声明和使用授权说明原创性声明本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。

尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。

对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。

作者签名:日期:指导教师签名:日期:使用授权说明本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。

作者签名:日期:学位论文原创性声明本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。

除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。

对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。

本人完全意识到本声明的法律后果由本人承担。

作者签名:日期:年月日学位论文版权使用授权书本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。

本人授权大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。

涉密论文按学校规定处理。

作者签名:日期:年月日导师签名:日期:年月日注意事项1.设计(论文)的内容包括:1)封面(按教务处制定的标准封面格式制作)2)原创性声明3)中文摘要(300字左右)、关键词4)外文摘要、关键词5)目次页(附件不统一编入)6)论文主体部分:引言(或绪论)、正文、结论7)参考文献8)致谢9)附录(对论文支持必要时)2.论文字数要求:理工类设计(论文)正文字数不少于1万字(不包括图纸、程序清单等),文科类论文正文字数不少于1.2万字。

基于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毕业设计(论文)原创性声明和使用授权说明原创性声明本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。

基于C51的万年历语音温度计的设计

基于C51的万年历语音温度计的设计

基于C51的万年历语音温度计的设计汪桂珍(宿迁泽达职业技术学院江苏宿迁223800)【摘要】:本文阐述了由单片机AT89C2051控制I2C按键扫描与数码管驱动芯片ZLG7290、I2C万年历芯片PCF8563、1-Wire数字温度传感器DS18B20、语音芯片ZY1420A实现万年历显示的语音温度计的方案,并给出了电路原理图。

【关键词】:单片机;I2C总线;万年历PCF8563;1-Wire总线;DS18B20;语音控制;数字温度计;自INTEL公司的MCS-51系列单片机问世以来,单片机以其体积小、集成度高、应用灵活、运行可靠、价格低廉等特点,在工业控制、工业测量、家用电器、智能仪器仪表、安全系统、信息系统、通信等诸多领域具有广泛的用途。

本文论述了一种多功能的温度计的实现方案。

1、系统功能及硬件设计万年历语音温度计具有年、月、日、小时、分钟、秒的显示和当前环境温度的显示及温度语音提示功能,成品体积小巧,可置于室内或随身携带。

当系统运行时,数码管显示时间(时/分/秒),按下K1键数码管显示日期(年/月/日),K1键负责时间和日期的显示切换,按下K2键显示当前温度,并有语音播报当前温度。

51单片机AT89C2051在工业生产控制、智能仪表、信息家电等诸多领域中都有着广泛的应用,AT89C2051引脚只有20个,适用于并不需要较多端口的场合,万年历语音温度计中单片机与外围器件都是采用串行通信,一共所需要的端口只有13个,所以选用只有20个引脚的AT89C2051单片机。

万年历语音温度计共有四大功能模块组成:温度采集模块(核心芯片DS18B20)、时钟/日期模块(核心芯片PCF8563)、按键与数码显示模块(核心芯片ZLG7290)、语音模块(核心芯片ISD1402)。

1.1温度采集模块DALLAS公司生产的1-Wire(即单总线器件)DS18B20数字温度计负责温度的采集。

DS18B20的DQ引脚连单片机的P3.3引脚。

简易设计基于单片机的语音温度计

简易设计基于单片机的语音温度计

简易设计基于单片机的语音温度计全文共四篇示例,供读者参考第一篇示例:在日常生活中,温度计是一种常用的测量温度的工具。

而随着科技的发展,基于单片机的温度计设计也成为了一种新的趋势。

今天,我们就来介绍一种简易设计基于单片机的语音温度计。

一、设计思路我们的语音温度计设计思路是利用单片机来读取温度传感器所采集到的温度值,并通过语音模块来将温度值转换成语音输出。

用户可以直接通过语音来获取当前温度,从而实现便捷的测温功能。

二、硬件设计在硬件设计方面,我们使用温度传感器来采集环境温度,并将采集到的数据传输给单片机进行处理。

我们还需要加入语音模块,将处理后的温度数据转换成语音输出。

整个设计中,单片机起着核心的作用,负责数据的处理和控制。

三、软件设计在软件设计方面,我们需要编写单片机的程序来实现温度数据的读取和处理,以及语音输出的控制。

具体来说,我们需要编写温度传感器的驱动程序和数据处理程序,以及语音模块的控制程序。

还需要考虑用户的交互设计,使得用户可以通过简单的语音指令来获取所需的温度信息。

四、功能实现通过以上的硬件和软件设计,我们实现了一款简易的基于单片机的语音温度计。

用户只需要触发语音模块,就可以通过语音输出得知当前的温度。

这种设计不仅减轻了用户的操作负担,还提升了测温的便捷性。

五、应用价值这种基于单片机的语音温度计具有广泛的应用价值。

在家庭生活中,用户可以轻松地获取室内外的温度信息,为生活提供便利。

在工业领域,可以用于监控生产环境的温度变化,保障生产的质量和安全。

这种设计还可以用于医疗领域,帮助医生和护士及时监测病人的体温。

基于单片机的语音温度计在实现简单的功能的也带来了便捷和实用的用户体验。

未来,随着科技的不断发展,更多基于单片机的智能温度计设计将不断涌现,为人们的生活和工作带来更多的便利和安全。

第二篇示例:简易设计基于单片机的语音温度计随着科技的不断发展,智能设备在人们生活中扮演着越来越重要的角色。

智能家居设备、智能手机等产品在人们的日常生活中起到了极大的便利作用。

基于51单片机的电子日历+温度显示设计

基于51单片机的电子日历+温度显示设计

2 电子日历设计与实现2.1 任务分析一、功能本设计要求具有显示生肖、年、月、日、星期、时、分、秒等功能;阳历与阴历能够自动关联;具有温度计功能;具备年、月、日、星期、时、分、秒校准功能;设计最终达到效果如图2-1。

图2-1 设计效果图二、系统原理按照系统设计功能的要求,系统由单片机、时钟模块DS1302、显示模块12864、键盘以及温度采集模块DS18B20共5部分电路组成,电路构成框图如图2-2所示。

图2-2 系统设计原理框图三、系统硬件要求本设计电路采用AT89S51单片机为控制核心,AT89S51具有在线编程功能,低功耗,能在3V超低压工作。

时钟电路由DS1302提供,它是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。

DS1302内部有一个用于临时性存放数据的31*8RAM寄存器。

器件在加电情况下,可自动生成年、月、日、周、时、分、秒时间数据,该器件具有使用寿命长,精度高和低功耗等特点,同时具有掉电自动保存功能。

温度的采集采用数字式温度传感器DS18B20,此类传感器为数字式传感器而且仅需要一条数据线进行数据传输,易于与单片机连接,可以去除A/D模块,降低硬件成本,简化系统电路。

另外,温度传感器DS18B20还具有测量精度高、测量范围广等优点。

显示部分用12864LED液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字、图形,显示多样,清晰可见,能够达到较好的显示效果。

2.2电路设计一、单片机主控制模块的设计AT89S51单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3,MCS-51单片机共有4个8位的I/O口(P0、P1、P2、P3),每一条I/O线都能独立地作输出或输入。

单片机的最小系统如图3-1所示,18引脚和19引脚接时钟电路,XTAL1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出。

单片机c51万年历设计

单片机c51万年历设计

1. 综述本课题要求设计一个常用的万年历。

该电路是用于反应年、月、日、时、分、秒、星期的实时状态,液晶显示屏上显示第一排显示“湖南工学院”第二排显示“年、月、日”第三排显示“时、分、秒”第四排显示“星期”。

当接通时液晶屏上一次显示,并且可以通过矩阵键盘调节年、月、日、时、分、秒、星期的实时状态。

假设液晶显示屏显示的是2008年8月1日,要求是:通过矩阵键盘的调节可以实时时间。

经过以上所述的设计内容及要求的分析,可以将电路分为以下几部分:首先,通过晶振电路产生频率为32.768KH z的脉冲信号,该脉冲信号用于提供给DS1302的时钟脉冲信号。

接通电源时,液晶屏上显示“湖南工学院”“电气与信息工程系”“电信0901”“蒋赞荣”。

当按下第一个按键时进入“欢迎进入万年历”界面。

按下第二个按键时进入显示经典万年历界面。

理论部分已用protues软件进行仿真,并且达到设计要求。

实际部分在电子实验室和同组的成员在老师的指导下一进行模拟,能够达到理论设计要求。

在设计的过程中应该本着元件通用化,成品化,程序的精简化,以满足大规模生产的要求,以便在日后产品的更新维护能够更好的方便的进行。

同时也要尽量减少设计过程中掉电现象和不稳定现象。

使产品在使用过程中能够稳定的运行,达到良好的无故障率。

二者必须达到一定的标准,才能在工厂进行量产。

2. 方案设计与分析方案通过DS1302时钟芯片产生时钟数据信息,通过读写该芯片内的时钟信号通过单片机的控制将其显示在液晶屏幕上。

该芯片的三总线SCLK、I/O、CE分别接在单片机的P3^2、P3^3、P3^4三端效果是最好的,因为P3^0、P3^1位接在液晶屏的RS、RW,P3^5接在液晶屏的E端,其它的三态数据线接在P0口,矩阵键盘可以通过跳线接P1口或P2口,在使程序设计起来比较简单,可以很好的利用者一点,设计的复杂程度适中,而且达到了预期的设计目的。

在此电路中由于P0口用于液晶电路的三态八根数据线了,而P3口也用作了特殊作用,所以矩阵键盘的跳线只能是在P1口或者是P2口作为键盘的输入信号。

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

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

基于51单片机的万年历设计一、系统设计方案本万年历系统主要由 51 单片机、时钟芯片、液晶显示屏、按键等部分组成。

51 单片机作为核心控制器,负责整个系统的运行和数据处理。

时钟芯片用于提供精确的时间信息,液晶显示屏用于显示万年历的相关内容,按键则用于设置时间和功能切换。

二、硬件设计1、单片机选型选用常见的 51 单片机,如 STC89C52 单片机,它具有性能稳定、价格低廉、易于编程等优点。

2、时钟芯片选择 DS1302 时钟芯片,该芯片能够提供高精度的实时时钟,具有闰年补偿功能,并且可以通过串行接口与单片机进行通信。

3、液晶显示屏采用 1602 液晶显示屏,能够清晰地显示字符和数字,满足万年历的显示需求。

4、按键电路设计四个按键,分别用于时间设置、功能切换、加和减操作。

三、软件设计1、主程序流程系统上电后,首先进行初始化操作,包括单片机端口初始化、时钟芯片初始化、液晶显示屏初始化等。

然后读取时钟芯片中的时间数据,并在液晶显示屏上显示出来。

接着进入循环,不断检测按键状态,根据按键操作执行相应的功能,如时间设置、功能切换等。

2、时钟芯片驱动程序通过单片机的串行接口向 DS1302 发送命令和数据,实现对时钟芯片的读写操作,获取准确的时间信息。

3、液晶显示屏驱动程序编写相应的函数,实现对1602 液晶显示屏的字符和数字显示控制。

4、按键处理程序采用扫描方式检测按键状态,当检测到按键按下时,执行相应的按键处理函数,实现时间设置和功能切换等操作。

四、时间设置功能通过按键操作进入时间设置模式,可以分别设置年、月、日、时、分、秒等信息。

在设置过程中,液晶显示屏会显示当前设置的项目和数值,并通过加、减按键进行调整。

设置完成后,将新的时间数据保存到时钟芯片中。

五、显示功能万年历的显示内容包括年、月、日、星期、时、分、秒等信息。

通过合理的排版和显示控制,使这些信息在液晶显示屏上清晰、直观地呈现给用户。

六、系统调试在完成硬件和软件设计后,需要对系统进行调试。

基于51单片机电子温度计台历_毕业设计

基于51单片机电子温度计台历_毕业设计

国家示范性高等职业院校电子温度计台历专业:电子信息工程技术志当高学当勤能必强技必精学院毕业设计(论文)任务书电子信息工程系(部)电子信息工程技术专业2010电子信息工程技术班学生XXX学号xxxxxxxxxx一、毕业设计(论文)题目:电子温度计台历二、毕业设计(论文)工作规定进行的日期:2012年11月1日起至2013年5月20 日止三、毕业设计(论文)进行地点:四、任务书的内容:设计目的:电子台历是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,节省了电能。

因此得到了广泛的使用。

数字钟是一种典型的数字电路,包括了组合逻辑电路和时序电路。

通过设计加深对数字电子技术的认识。

我们此次设计电子台历是为了了解时钟芯片DS1302和12864液晶的原理,加深对我们所学知识的了解和认识、以及知识迁移的能力。

而且通过数字钟的制作进一步的了解各种在制作中用到的中小规模集成电路的作用及实用方法。

且由于数字钟包括组合逻辑电路和时序电路,通过它可以进一步学习与掌握各种组合逻辑电路与时序电路的原理与使用方法,以及各种电路之间是怎样联系起来的。

设计任务:⑴设计指标1.时间以24小时为一个周期;2.显示时、分、秒;3.具有校时功能,可以分别对时及分进行单独校时,使其校正到标准时间;4.计时过程具有报时功能,当时间到达整点进行蜂鸣报时;5.为了保证计时的稳定及准确须由晶体振荡器提供表针时间基准信号。

⑵设计要求(1)显示室内温度,精度 0.5 度;(2) 显示实时时钟,可以对年、月、日、周、日、时、分、秒进行计时,且具有闰年补偿功能,可调整时间、日期;(3) 设置闹钟三个以上;(4)具有温度报警功能;说明:1.显示屏采用126*64规格2.时间和日期的显示格式可自定义工作日程安排:设计(论文)要求:要求提供以下设计资料,汇报设计与制作的全过程,附上有关资料和图纸,有设计心得体会并装订成册:1.摘要(所做的设计如有特别之处,一定要挑明);2.原理框图3.元器件明细表及参数选择4.各功能块电路图5. PCB文件生成与打印输出6.操作原理简要说明7.调试的结果是否满足设计要求学生开始执行任务书日期 200 年月日指导教师签名:年月日学生送交毕业设计(论文)日期: 200 年月日教研室主任签名:年月日学生签名:年月日目录1 绪论 (7)1.1 电子台历的背景 (7)1.2电子台历的意义 (8)1.3电子台历的应用 (8)2 整体设计方案选择 (8)2.1 555定时器方案 (8)2.2 单片机方案 (10)3 数字钟的硬件设计 (14)3.1 最小系统设计 (14)3.1.2 数据存储器(RAM) (15)3.1.3 程序存储器(ROM): (15)3.1.4 定时/计数器(ROM): (15)3.1.5 并行输入输出(I/O)口: (15)3.1.6 全双工串行口: (15)3.1.7 中断系统: (16)3.1.8 时钟电路: (16)3.2 显示器 (17)3.2.1 液晶显示模块概述 (17)3.2.2 外形尺寸 (17)3.2.3 模块引脚说明 (17)3.3 时钟芯片1302 (18)3.3.1 DS1302时钟芯片简介 (18)3.3.3 DS1302的工作原理 (19)3.3.4 DS1302的寄存器和控制命令 (19)3.3.5 DS1302内部寄存器列表 (20)3.4 DS18B20测温系统 (21)3.4.1 DS18B20简介 (21)3.4.2 DS18B20的内部结构及工作原理 (22)3.5 键盘控制电路 (23)3.6供电系统 (24)3.7语音报时系统 (24)3.8红外遥控设计 (27)4数字钟的软件设计 (27)4.1 系统软件设计流程图 (28)4.1.1主函数程序流程图和效果图 (28)4.1.2主函数程序编写: (29)4.2 12864LED显示函数 (29)4.2.1显示函数程序流程图 (30)4.2.2显示函数程序编写: (30)4.3 DS1302函数 (30)4.3.1 DS1302程序流程图 (31)4.4 DS18B20温度采集 (31)4.4.1 DS18B20温度采集流程图 (31)4.4.3 DS18B20函数编写 (32)4.5.2.1 时间设置菜单显示 (32)4.5.2.2 时间设置菜单显示函数编写: (32)4.5.3.1时间设置菜单显示 (33)4.5.3.2 闹钟设置菜单显示函数编写: (33)4.5.3.1 红外遥控 (33)4.5.3.2 红外遥控函数编写: (33)致谢 (35)附录 (37)电子温度计台历吴保林(柳州职业技术学院电子信息工程系)摘要随着科技的快速发展,时间的流逝,至从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。

基于C51单片机的简单万年历设计

基于C51单片机的简单万年历设计
3.2.系统硬件概述2
四、各模块功能及工作原理2
4.1.单片机主控制模块的设计2
4.2. LCD1602显示模块3
4.3.键盘模块6
五、实现结果9
六、系统的实用性及创新性9
七、调节中遇到的问题及心得体会10
八、程序设计11
8. 1.流程图11
8.2.源代码12
九、总结及感谢24
众所周知单片机是一种集成在电路芯片,是釆用超大规模集成电路技 术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱 动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一 块硅片上构成的一个小而完善的计算机系统。本设计要制作的就是单片机 于生活中最为常见的几种应用一一万年历。本设计以AT89S52单片机作为 核心,可以显示当前的日历和时间,时间也可以人为设定,显示格式为年 (四位),月(两位),日(两位),时(两位),分(两位),秒(两 位)。设置时间的位切换、设定数值、启动定时器、切换日历通过外部中 断來实现。万年历显示电路由LCD1602组成,制作该装置的材料需要有 软硬件的支持,硬件方面AT89C51单片机,晶振,电源,液晶屏LCD1602o
4.2. LCD1602
4.2.1LCD1602引脚介绍
LCD1602采用标准的14脚(无背光)或16脚(带背光)接口,引脚图
如图图4. 2.1:
各引脚接口说明如表4.2.2所示:
编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
数据
2
VDD
电源正极
10
D3

基于51单片机的万年历与温度检测报警系统

基于51单片机的万年历与温度检测报警系统

基于51单片机的万年历与温度检测报警系统摘要随着社会发展需求的改变,电子万年历是一个应用非常广泛的实用日常计时工具,带有显示世纪,年,月,日,星期,时,分,秒和按键可调时间及其按键设置闹钟的功能,同时具有月末自动更新,闰年补偿功能等多种功能。

温度检测报警系统也是在日常生活和工业应用非常广泛的工具,能实时采集周围的温度信息进行显示,程序内部设定有报警上下限,根据应用环境不同可设定不同的报警上下限。

此系统是基于STC89C52单片机设计的,包含液晶显示模块,DS12C887实时时钟模块,DS18B20温度采集模块,键盘扫描模块,报警模块,HX1838红外接收头模块。

STC89C52作为控制核心,具有功耗低,功能强等特点,电压可选5VUSB 供电。

显示模块采用12864液晶动态显示,相对数码管而言经济实用,占用空间小,对于显示数字、字母最为合适,而且与单片机连线简单,占用IO口相对较少。

实时时钟芯片DS12C887是一款与DS12C885实时时钟兼容的替代产品,该器件提供RTC/日历、定时闹钟等功能,如果检测到主电源故障,该器件可自动切换到备用电源供电,DS12C887将石英晶体与电池集成在一起,在断电后仍可精确走10年。

温度检测报警模块采用数字式温度传感器DS18B20,该芯片具有精度高,测量范围广等优点,易与单片机连接,模块电路组成简单并同时具有温度报警功能。

关键词:STC89C52,DS12C887,DS18B20,12864液晶显示,电子万年历,采集周围设备温度、温度报警一、设计要求与方案论证1.1设计要求设计一个能够实现世纪,年,月,日,星期,小时,分,秒显示附带温度检测显示的实时时钟电子万年历,同时具有时间调节和闹钟设置功能,以及时间预设报警、温度报警、报警解除等功能。

该产品共设有四个按键,每个按键具有多种功能,充分利用各个按键。

也可利用红外遥控来进行实时调节,体现时尚方便的特性,并且通过编程还可以控制12864液晶显示,随心所欲。

基于单片机C51的万年历课程设计报告

基于单片机C51的万年历课程设计报告

课程设计说明书课程名称:《单片机技术》设计题目:基于单片机的万年历设计院(部):电子信息与电气工程学院学生:学号:专业班级:电子信息工程10-1指导教师:2013年 05 月 17 日课程设计任务书万年历设计摘要:以AT89S52为主控芯片设计了一个带温度显示的万年历电路系统,该电路具有年、月、日、星期、时、分、秒、闹钟显示和调整,并且还能显示温度和按键提示音、整点鸣叫、定时闹钟鸣叫等功能。

本设计由数据显示模块、温度采集模块、时间处理模块和调整设置模块四个模块组成。

温度采集选用DS18B20芯片,数据显示采用1602A液晶显示模块,主芯片利用定时中断产生时间,控制着液晶的显示更新、温度的实时变化以及按键的读取处理,而对于闹钟,实际上就是时间里的一个嵌套程序。

时间和闹钟的值由按键调整设置,采用通用的二十四小时制。

关键词:单片机;液晶显示屏;温度传感器;时钟芯片目录1. 设计背景 (1)1.1 概述 (1)1.2 万年历设计目的 (1)2.设计方案 (2)2.1 按键控制模块设计与论证 (2)2.2 时钟模块设计与论证 (2)2.3 显示模块模块设计与论证 (3)3. 方案实施 (4)3.1系统整体框图 (4)3.2原理图设计 (4)3.2.1 单片机最小系统模块 (4)3.2.2 电源模块 (5)3.2.3 时钟芯片DS1302模块 (6)3.2.4温度采集DS18B20模块 (6)3.2.5 闹钟模块 (7)3.2.6 LCD1602显示模块 (8)3.2.7 按键模块 (9)3.3 软件设计 (9)3.4 系统仿真 (10)3.5系统制作 (11)4. 结果与结论 (12)4.1 结果 (12)4.2 结论 (12)5. 收获与致 (13)6. 参考文献 (14)7. 附件 (15)7.1 原理图 (15)系统电路图如图7.1所示: (15)7.2 元器件清单 (15)7.3 实物图 (16)7.3.1 正常工作 (16)7.3.2 调试状态 (17)7.3.3 闹钟设置状态 (18)1. 设计背景1.1 概述如今万年历已经在人们生活中广泛的使用,它不仅是记录日期和时间的工具,而且也成为了一种装饰品。

基于51单片机的电子万年历毕业设计论文

基于51单片机的电子万年历毕业设计论文
表4.1 DS1302引脚功能
引脚号
引脚名称
功能
1
Vcc2
主电源
2,3
X1,X2
振荡源,外界32.768kHz晶振
4
GND
地线
5
RST
复位/片选线
6
I/O
串行数据输入/输出端(双向)
7
SCLK
串行数据输入端
8
Vcc1
后备电池
76 5 4 3210
1
RAM
A4
A3
A2
A1
A0
RAM
图4.2 DS1302的控制字
实时时钟,可对秒、分、时、日、周、月以及带闰年补偿的年进行计数;
用于高速数据暂存的31×8位RAM;
最少引脚的串行I/O;
2.5~5.5V电压工作范围;
2.5V时耗电小于300nA;
用于时钟或RAM数据读/写的单字节或多字节(脉冲方式)数据传送方式;
简单的3线接口;
可选的慢速充电(至Vcc1)的能力。
2.用凌阳16位单片机设计。凌阳16位单片机有丰富的中断源和时基,方便本实验的设计。它的准确度相当高,并且C语言和汇编兼容的编程环境也很方便来实现一些递归调用。I/O口功能也比较强大,方便使用。用凌阳16位单片机做控制器最有特色的就是它的可编程音频处理,可完成语音的录制播放和识别。这些都方便对设计进行扩展,使设计更加完善。成本也相对低一些。但是,在控制与显示的结合上有些复杂,显示模组资源相对有限,而且单片机的稳定性不是很高。
Keywords:Electronicperpetual calendar;single-chip processor;temperature sensor;clock;digital display

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

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

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

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

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

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

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

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

基于单片机C51的万年历设计课程设计

基于单片机C51的万年历设计课程设计

课程名称:《单片机技术》设计题目:基于单片机地万年历设计院(部):电子信息与电气工程学院学生姓名:学号:专业班级:电子信息工程10-1指导教师:2013年 05 月 17 日课程设计任务书万年历设计摘要:以AT89S52为主控芯片设计了一个带温度显示地万年历电路系统,该电路具有年、月、日、星期、时、分、秒、闹钟显示和调整,并且还能显示温度和按键提示音、整点鸣叫、定时闹钟鸣叫等功能.本设计由数据显示模块、温度采集模块、时间处理模块和调整设置模块四个模块组成. 温度采集选用DS18B20芯片,数据显示采用1602A液晶显示模块,主芯片利用定时中断产生时间,控制着液晶地显示更新、温度地实时变化以及按键地读取处理,而对于闹钟,实际上就是时间里地一个嵌套程序.时间和闹钟地值由按键调整设置,采用通用地二十四小时制.关键词:单片机;液晶显示屏;温度传感器;时钟芯片目录1. 设计背景 01.1 概述 01.2 万年历设计目地 02.设计方案 (1)2.1 按键控制模块设计与论证 (1)2.2 时钟模块设计与论证 (1)2.3 显示模块模块设计与论证 (2)3. 方案实施 (2)3.1系统整体框图 (2)3.2原理图设计 (3)3.2.1 单片机最小系统模块 (3)3.2.2 电源模块 (4)3.2.3 时钟芯片DS1302模块 (4)3.2.4温度采集DS18B20模块 (5)3.2.5 闹钟模块 (6)3.2.6 LCD1602显示模块 (6)3.2.7 按键模块 (7)3.3 软件设计 (8)3.4 系统仿真 (8)3.5系统制作 (9)4. 结果与结论 (10)4.1 结果 (10)4.2 结论 (10)5. 收获与致谢 (11)6. 参考文献 (12)7. 附件 (13)7.1 原理图 (13)系统电路图如图7.1所示: (13)7.2 元器件清单 (13)7.3 实物图 (14)7.3.1 正常工作 (14)7.3.2 调试状态 (15)7.3.3 闹钟设置状态 (16)1. 设计背景1.1 概述如今万年历已经在人们生活中广泛地使用,它不仅是记录日期和时间地工具,而且也成为了一种装饰品.现在地万年历可以说是多种多样,外观精美.放在家里既可以计时也可作为风景壁画,因此越来越受到大众消费者地喜爱.1.2万年历设计目地随着电子技术地发展,人类不断研究,不断创新纪录.万年历目前已经不再局限于以书本形式出现.以电脑软件或者电子产品形式出现地万年历被称为电子万年历.与传统书本形式地万年历相比,电子万年历得到了越来越广泛地应用,采用电子时钟作为时间显示已经成为一种时尚.目前市场上各式各样地电子时钟数不胜数,但多数是只针对时间显示,功能单一不能满足人们日常生活需求.本文提出了一种基于A T89S52单片机地万年历设计方案,利采用一个LCD显示.本方案以A T89S52单片机作为主控核心,与时钟芯片DS1302、温度芯片DS18B20、闹钟模块、按键、LCD显示等模块组成硬件系统.在硬件系统中设有5个独立按键和一个LCD显示器,能显示丰富地信息,根据使用者地需要可以随时对时间进行校准、选择时间、温度显示、综上所述此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表地发展趋势,具有广阔地市场前景.2.设计方案2.1 按键控制模块设计与论证方案一:直接加减:使用7按键,1按键切换闹钟,6按键对时分秒分别加减,控制方式相当简单,但需要较多按键与I/O口,功能一般,成本较高.方案二:矩阵键盘:使用16按键对时分秒直接设置,能最为灵活地对数字钟进行设置,功能强大,但控制方式相对困难,成本较高,需要较多按键与I/O口.方案三:换位调整:使用4按键,1设置闹钟,1键设置调整时间,1键调整,1键确定,此种控制方式相对简单,占用I/O口少,成本低廉,但功能一般.经过反复比较,在3种方案中选取了第3种——换位调整,此方案成本低,功能已经足够满足数字钟地需要,而且硬件软件均比较简单.2.2 时钟模块设计与论证方案一:不使用芯片,采用单片机地定时计数器这种方法原理是利用单片机芯片地定时器来产生固定地时间,模拟时钟地时, 分,秒.如:利用A T80C52芯片,定时器用工作方式1,每50ms产生一个中断,循环20次,即1s周期.每一个周期加1,那么1min为60个周期,1h就是60*60=3600个周期,一天就是3600*24=86400个周期.此方法优点是可以省去一些外围地芯片,但这种方法只能适用于一些要求不是十分精确,不做长期保留地场合.方案二:并行接口时钟芯片 DS12887特点:采用单片机应用系统并行总线(三总线)扩展地接口电路,采用这种接口电路具有操作速度快,编程方便地优点.但是对于80C52单片机来说,低位地址线要通过锁存器输出,还要地址译码器,而且并行口芯片地体积相对较大,会占用较多地空间.方案三:串行接口时钟芯片DS1302芯片主特性:(1)实时时钟具有能计算2100 年之前地秒分时日日期星期月年地能力,还有闰年调整地能力(2) 8 位暂存数据存储RAM(3)串行 I/O 口方式使得管脚数量最少(4)宽范围工作电压2.0~5.5V(5)工作电流 2.0V 时,小于300nA(6)读/写时钟或RAM 数据时有两种传送方式单字节传送和多字节传送字符组方式(7)8 脚DIP 封装或可选地8 脚SOIC 封装根据表面装配(8)简单 3 线接口(9)与 TTL 兼容V cc=5V(10)可选工业级温度范围-40~+85优点:串行接口地日历时钟芯片,使用简单,接口容易,与微型计算机连线较少等特点,在单片机系统尤其是手持式信息设备中己得到了广泛地应用.比较以上三种方案地优缺点,综合考虑最终选择串行时钟芯片DS1302.2.3 显示模块模块设计与论证方案一:采用静态显示方法,静态显示模块地硬件制作较复杂及功耗大,要用到多个移位寄存器,但不占用端口,只需两根串口线输出.方案二:采用动态显示方法,动态显示模块地硬件制作简单,段扫描和位扫描各占用一个端口,总需占用单片机14个端口,采用间断扫描法功耗小、硬件成本低及整个硬件系统体积相对减小.方案三:采用LCD地方法,具有硬件制作简单可直接与单片机接口,显示内容多,功耗小,成本低等优点,LCM1602可显示32个字符,采用LCD地缺点是亮度不够.比较以上三种方案:方案一硬件复杂体积大、功耗大;方案二硬件简单、功耗小;方案三硬件简单,显示内容多,功耗小,成本低等.本系统设计要求达到功耗小、体积小、成本低,显示信息多等要求,权衡三种方案,选择方案三.3.方案实施3.1系统整体框图按照系统设计地要求,初步确定系统由电源模块、复位电路、时钟模块、显示模块、按键模块、温度采集模块和蜂鸣器组成,电路系统构成责整体框图如图3.1所示:图3.1 整体框图3.2原理图设计3.2.1 单片机最小系统模块单片机最小系统设计为如图3.2:图3.2 单片机最小系统本设计中选择了内部时钟方式和按键电平复位电路,来构成单片机地最小电路.复位是单片机地初始化操作,单片机在启动运行时,都需要先复位,其作用是使CPU和系统中其他部件都处于一个确定地初始状态,并从这个状态开始工作.此设计中P0口做为输出口用来驱动LCD显示,而P0口内部又没有上拉电阻,所以加上10K上拉电阻.复位电路本设计中地复位电路集手动复位及上电自动复位于一体.1)上电自动复位通过外部复位电路地电容C3地充电来实现,只要电源VCC地上升时间不超过1ms,就可以实现自动上电复位.2)按键手动复位是通过使复位端经电阻与VCC接通而实现地.时钟振荡电路考虑系统运行速度,采用12MHZ地石英晶振,并使用两个小电容作为微调电容.3.2.2 电源模块3.2.3 时钟芯片DS1302模块时钟芯片电路设计如图3.4:图3.4 时钟芯片电路如图3.4所示,其中Vcc1为后备电源,Vcc2为主电源.VCC1在单电源与电池供电地系统中提供低电源并提供低功率地电池备份.VCC2在双电源系统中提供主电源,在这种运用方式中VCC1连接到备份电源,以便在没有主电源地情况下能保存时间信息以及数据.DS1302由VCC1或VCC2 两者中较大者供电.当VCC2大于VCC1+0.2V时,VCC2给DS1302供电.当VCC2小于VCC1时,DS1302由VCC1供电.DS1302在每次进行读、写程序前都必须初始化,先把SCLK端置“0”,接着把RST端置“1”,最后才给予SCLK脉冲;DS1302地控制字地位7必须置1,若为0则不能对DS1302进行读写数据.对于位6,若对时间进行读/写时,CK=0,对程序进行读/写时RAM=1.位1至位5指操作单元地地址.位0是读/写操作位,进行读操作时,该位为1;进行写操作时,该位为0.控制字节总是从最低位开始输入/输出地.DS1302地日历、时间寄存器内容:“CH”是时钟暂停标志位,当该位为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位为0时,时钟开始运行.“WP”是写保护位,在任何地对时钟和RAM地写操作之前,“WP”必须为0.当“WP”为1时,写保护位防止对任一寄存器地写操作.3.2.4温度采集DS18B20模块温度采集电路设计如图3.5所示:图3.5 温度采集电路如3.5图所示,该系统中采用数字式温度传感器DS18B20,具有测量精度高,电路连接简单特点,此类传感器仅需要一条数据线进行数据传输,用P3.7与DS1802地DQ端口连接,V cc接电源,GND接地.DS18B20地读写时序和测温原理与DS1820相同,只是得到地温度值地位数因分辨率不同而不同,且温度转换时地延时时间由2s减为750ms. DS18B20测温原理如图3.6所示.图中低温度系数晶振地振荡频率受温度影响很小,用于产生固定频率地脉冲信号送给计数器1.高温度系数晶振随温度变化其振荡率明显改变,所产生地信号作为计数器2地脉冲输入.计数器1和温度寄存器被预置在-55℃所对应地一个基数值.计数器1对低温度系数晶振产生地脉冲信号进行减法计数,当计数器1地预置值减到0时,温度寄存器地值将加1,计数器1地预置将重新被装入,计数器1重新开始对低温度系数晶振产生地脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值地累加,此时温度寄存器中地数值即为所测温度.3.2.5 闹钟模块闹钟电路如图3.6所示:3.6 闹钟电路我们采用地有源蜂鸣器,由于单片机地输出电流较小所以我们采用PNP形地三极管作为驱动电路,来驱动蜂鸣器发声,当单片机给低电平时蜂鸣器响.3.2.6 LCD1602显示模块显示电路如图3.7所示:图3.7 显示电路LCD1602是指显示地内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字).第1脚:VSS为电源地.第2脚:VDD接5V电源正极.第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高.第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器.第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作.第6脚:E(或EN)端为使能(enable)端.第7~14脚:D0~D7为8位双向数据端.第15~16脚:空脚或背灯电源.15脚背光正极,16脚背光负极.LCD地D0~D7分别接单片机地地P0口,作为数据线,因为P0口内部没有上拉电阻,所以外部另外加上10K地上拉电阻;P2.4—P2.6分别接LCD地RS、RW、E三个控制管脚.3.2.7 按键模块按键电路设计如图3.8所示:图3.8 按键电路本系统用到了5个按键,其中一个用作系统手动复位,另外4个采用独立按键,该种接法查询简单,程序处理简单,可节省CPU资源,按键电路如图3.18所示,4个独立按键分别与AT89S52地P3.0、P3.1、P3.2、P3.3接口相连.对以上4个按键作简要说明:S2——SET 键,S3——UP键,S4——DOWN键,S5——OUT/STOP键.SET 键:按下SET键进入时间校准状态,按一下进入秒调整,两下分调整,依此类推可进行各年月日,时分秒以及星期地校准;UP键:当SET键按下时,UP进行SET选定项(如:小时)地加操作。

c51设计的模拟数字万年历

c51设计的模拟数字万年历

Diap.c#include "reg52.h"#include "intrins.h"#define uchar unsigned charbit Display_Flag=0;sbit SH_CP=P1^4;sbit DS=P1^5;sbit ST_CP=P1^6;void write_74hc595(uchar *content){ uchar i=18,j;while(i--){ for(j=0;j<8;j++){ DS=(bit)(content[i]<<j&0x80);SH_CP=0;_nop_();SH_CP=1; //移位时钟脉冲上升沿移位}}ST_CP=0;_nop_();ST_CP=1; //上升沿将数据送到数据锁存器_nop_();ST_CP=0; //锁存显示数据}void show(uchar *content){ uchar code data_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};uchar Disp_CODE[18];uchar i;for(i=0;i<17;i++){ if(i==14&&content[14]==0){ Disp_CODE[14]=0x80;continue;}Disp_CODE[i]=data_code[content[i]];}Disp_CODE[17]=content[17];write_74hc595(Disp_CODE);}uchar Disp_temp[18]={2,0,1,2, 0,1, 2,0, 2,2, 0,9, 3,0, 5, 2,7, 0xff};ds18b20.c#include "reg52.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned int#define delayNOP() {_nop_();_nop_();_nop_();_nop_();}sbit DQ=P1^3; //DS18B20数据线bit DS18B20_IS_OK=1; //传感器正常标志bit DS18B20_Flag=0; //温度负数标志void delayus(uchar us){ while(us)--us;}//初始化DS18B20uchar initialize_ds18b20(void){ uchar status;DQ=1; delayus(8);DQ=0; delayus(90);DQ=1; delayus(8);status=DQ;delayus(100);DQ=1;return status; //初始化成功时返回0}//读一字节uchar readbyte(void){ uchar i,dat=0;DQ=1; _nop_();for(i=0;i<8;i++){ DQ=0; dat>>=1; DQ=1; _nop_(); _nop_();if(DQ)dat|=0x80; delayus(30); DQ=1;}return dat;}//写一字节void writebyte(uchar dat){ uchar i;for(i=0;i<8;i++){ DQ=0; DQ=dat&0x01; delayus(5); DQ=1; dat>>=1;}}void convert(void){ initialize_ds18b20();DS18B20_IS_OK=0;if(~initialize_ds18b20()){ writebyte(0xcc);writebyte(0x44);DS18B20_IS_OK=1;}}char readtemp(void){ uchar temp1,temp2,temp3;convert();if(DS18B20_IS_OK){ initialize_ds18b20();writebyte(0xcc);writebyte(0xbe);temp1=(readbyte()&0xf0)>>4;temp2=(readbyte()&0x07)<<4;temp3=temp1+temp2;DS18B20_Flag=0;if(temp2&0x80){ temp3=256-temp3;DS18B20_Flag=1;}return(temp3);}}Ds1302.c#include "reg52.h"#define uchar unsigned char#define uint unsigned intsbit SDA=P1^0;sbit CLK=P1^1;sbit RST=P1^2;uchar DateTime[7]; //所读取的日期时间//一年中每个月的天数,2月的天数由年份决定uchar MonthsDays[]={0,31,0,31,30,31,30,31,31,30,31,30,31}; //向DS1302写入一字节void Write_A_Byte_TO_DS1302(uchar x){ uchar i;for(i=0;i<8;i++){ SDA=x&1; CLK=1; CLK=0; x>>=1;}}//从DS1302读取一字节uchar Get_A_Byte_FROM_DS1302(void){ uchar i,b,t;for(i=0;i<8;i++){ b>>=1; t=SDA; b|=t<<7; CLK=1; CLK=0;}//BCD码转换return(b/16*10+b%16);}//从DS1302指定位置读数据uchar Read_Data(uchar addr){ uchar dat;RST=0; CLK=0; RST=1;Write_A_Byte_TO_DS1302(addr);dat=Get_A_Byte_FROM_DS1302();CLK=1; RST=0;return(dat);}//向DS1302某地址写入数据void Write_DS1302(uchar addr,uchar dat){ CLK=0; RST=1;Write_A_Byte_TO_DS1302(addr);Write_A_Byte_TO_DS1302(dat);CLK=0; RST=0;}//设置时间void SET_DS1302(void){ uchar i;//写控制字,取消写保护Write_DS1302(0x8e,0x00);//分时日月年依次写入for(i=1;i<7;i++){ //分的起始地址1000 0010(0x82),后面续依次是时,日,月,年,写入地址每次递增2Write_DS1302(0x80+2*i,(DateTime[i]/10<<4)|(DateTime[i]%10));}Write_DS1302(0x8e,0x80); //加保护}//读取当前日期时间void GetTime(void){ uchar i;for(i=0;i<7;i++){ DateTime[i]=Read_Data(0x81+2*i);}}//判断是否为闰年uchar isLeapYear(uint y){ return((y%4==0&&y%100!=0)||(y%400==0));}//--------------------------------------------//求自2000.1.1开始的任何一天是星期几//函数没有通过,求出总天数后在求出星期几//因为求总天数可能会月出uint的范围//--------------------------------------------void RefreshWeekDay(void){ uint i,d,w=5; //已知1999.12.31是周五for(i=2000;i<2000+DateTime[6];i++){ d=isLeapYear(i)?366:365;w=(w+d)%7;}d=0;for(i=1;i<DateTime[4];i++)d+=MonthsDays[i];d+=DateTime[3];//保存星期,0~6表示星期日,星期一,二,、、、六,为了与DS1302的星期格式匹配,返回值需要加1DateTime[5]=(w+d)%7+1;}//日期与时间转换为数字字符void Format_DateTime(uchar d,uchar *a){ a[0]=d/10; a[1]=d%10;}Main.c#include "disp.c"#include "DS1302.c"#include "string.h"#include "DS18B20.c"uchar tCount=0;uchar Adjust_Index=-1;sbit sb1=P3^3;sbit sb2=P3^4;sbit sb3=P3^5;sbit sb4=P3^6;//年月日时分秒++/--void DateTime_Adjust(char x){ switch(Adjust_Index){ case 6: //年00-99if(x==1&&DateTime[6]<99)DateTime[6]++;if(x==-1&&DateTime[6]>0)DateTime[6]--;//获取2月天数MonthsDays[2]=isLeapYear(2000+DateTime[6])?29:28;//如果年份变化后当前月份的天数大于上限则设为上限if(DateTime[3]>MonthsDays[DateTime[4]])DateTime[3]=MonthsDays[DateTime[4]];break;case 4: //月01-12if(x==1&&DateTime[4]<12)DateTime[4]++;if(x==-1&&DateTime[4]>1)DateTime[4]--;//获取2月份天数MonthsDays[2]=isLeapYear(2000+DateTime[6])?29:28;//如果月份变化后当前月份的天数大于上限则设为上限if(DateTime[3]>MonthsDays[DateTime[4]])DateTime[3]=MonthsDays[DateTime[4]];break;case 3: //日00-28/29/30/31;调节之前首先根据年份得出该年中2月的天数MonthsDays[2]=isLeapYear(2000+DateTime[6])?29:28;//根据当前月份决定调节日期的上限if(x==1&&DateTime[3]<MonthsDays[DateTime[4]])DateTime[3]++;if(x==-1&&DateTime[3]>1)DateTime[3]--;break;case 2: //时if(x==1&&DateTime[2]<23)DateTime[2]++;if(x==-1&&DateTime[3]>1)DateTime[2]--;break;case 1: //分if(x==1&&DateTime[1]<59)DateTime[1]++;if(x==-1&&DateTime[1]>1)DateTime[1]--;break;case 0: //秒if(x==1&&DateTime[0]<59)DateTime[0]++;if(x==-1&&DateTime[0]>1)DateTime[0]--;}}//键盘中断(INT0)void EX_INT0(void) interrupt 0{ if(sb1==0) //选择调整对象{ if(Adjust_Index==-1||Adjust_Index==0)Adjust_Index=7;Adjust_Index--;if(Adjust_Index==5)Adjust_Index=4; //跳过对星期的调整}else if(sb2==0)DateTime_Adjust(1); //加else if(sb3==0)DateTime_Adjust(-1); //减else if(sb4==0) //确定{ SET_DS1302(); //将调整后的时间写入DS1302Adjust_Index=-1; //操作索引重设为-1,时间继续正常显示}}//定时器0每秒刷新LCD显示void T0_INT(void) interrupt 1{ TH0=(65536-50000)/256;TL0=(65536-50000)%256;if(++tCount<10)return;tCount=0;Display_Flag=~Display_Flag;if(Adjust_Index==-1) //如果未执行调整操作则正常读取当前时间{ Disp_temp[17]=~Disp_temp[17]; GetTime(); }//更新星期RefreshWeekDay();//按指定格式生成待显示的日期时间串Format_DateTime(DateTime[6],Disp_temp+2);Format_DateTime(DateTime[4],Disp_temp+4);Format_DateTime(DateTime[3],Disp_temp+6);//星期Disp_temp[14]=DateTime[5]-1;//时分秒Format_DateTime(DateTime[2],Disp_temp+8);Format_DateTime(DateTime[1],Disp_temp+10);Format_DateTime(DateTime[0],Disp_temp+12);//读取温度if(DS18B20_IS_OK){ Disp_temp[15]=readtemp()/10;Disp_temp[16]=readtemp()%10;}if(Adjust_Index==6) //年if(Display_Flag==1)Disp_temp[2]=Disp_temp[3]=10;if(Adjust_Index==4) //月if(Display_Flag==1)Disp_temp[4]=Disp_temp[5]=10;if(Adjust_Index==3) //日if(Display_Flag==1)Disp_temp[6]=Disp_temp[7]=10;if(Adjust_Index==2) //时if(Display_Flag==1)Disp_temp[8]=Disp_temp[9]=10;if(Adjust_Index==1) //分if(Display_Flag==1)Disp_temp[10]=Disp_temp[11]=10;if(Adjust_Index==0) //秒if(Display_Flag==1)Disp_temp[12]=Disp_temp[13]=10;show(Disp_temp); //显示}void main(){ IE=0x83;IP=0x01;IT0=1;TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=1;while(1);}。

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

基于C51的万年历语音温度计的设计
汪桂珍
(宿迁泽达职业技术学院江苏宿迁223800)
【摘要】:本文阐述了由单片机AT89C2051控制I2C按键扫描与数码管驱动芯片ZLG7290、I2C万年历芯片PCF8563、1-Wire数字温度传感器DS18B20、语音芯片ZY1420A实现万年历显示的语音温度计的方案,并给出了电路原理图。

【关键词】:单片机;I2C总线;万年历PCF8563;1-Wire总线;DS18B20;语音控制;数字温度计;
自INTEL公司的MCS-51系列单片机问世以来,单片机以其体积小、集成度高、应用灵活、运行可靠、价格低廉等特点,在工业控制、工业测量、家用电器、智能仪器仪表、安全系统、信息系统、通信等诸多领域具有广泛的用途。

本文论述了一种多功能的温度计的实现方案。

1、系统功能及硬件设计
万年历语音温度计具有年、月、日、小时、分钟、秒的显示和当前环境温度的显示及温度语音提示功能,成品体积小巧,可置于室内或随身携带。

当系统运行时,数码管显示时间(时/分/秒),按下K1键数码管显示日期(年/月/日),K1键负责时间和日期的显示切换,按下K2键显示当前温度,并有语音播报当前温度。

51单片机AT89C2051在工业生产控制、智能仪表、信息家电等诸多领域中都有着广泛的应用,AT89C2051引脚只有20个,适用于并不需要较多端口的场合,万年历语音温度计中单片机与外围器件都是采用串行通信,一共所需要的端口只有13个,所以选用只有20个引脚的AT89C2051单片机。

万年历语音温度计共有四大功能模块组成:温度采集模块(核心芯片DS18B20)、时钟/日期模块(核心芯片PCF8563)、按键与数码显示模块(核心芯片ZLG7290)、语音模块(核心芯片ISD1402)。

1.1温度采集模块
DALLAS公司生产的1-Wire(即单总线器件)DS18B20数字温度计负责温度的采集。

DS18B20的DQ引脚连单片机的P3.3引脚。

见下图图1。

图1温度采集模块
1.2时钟/日期模块
时间、日期由PHILIPS公司推出的工业级内含I2C 总线接口功能的具有极低功耗的多功能时钟/日期芯片PCF8563提供。

SDA与AT89C2051的P3.4,SCL与P3.5相连即可。

电路见下图图2.
图2时钟/日历模块
图3主程序流程
1.3按键扫描与数码显示模块
万年历语音温度计需要按键扫描和数码管显示,使用I2C芯片ZLG7290,由ZLG7290连接按键、数码管。

SDA与AT89C2051的P3.4,SCL与P3.5,~INT与P3.0相连。

即控制按键与数码显示的ZLG7290只有3根线与单片机连,其中两根是I2C的时钟线SCL、数据线SDA,另一根是按键检测引脚~INT,当~INT为低电平,表示有健按下。

1.4语音模块
语音部分由广州致远电子有限公司出品的优质微型语音录放模块ZY1420A负责处理,(下接第150页

(上接第164页)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ZY1420A内部使用ISD1420作为主控芯片。

ZY1420A 的A0-A7与P1.0-P1.7相连,~PLAYL与P3.2相连,SP+、SP_与喇叭相连。

2、系统软件设计
单片机AT89C2051通过软件模拟I2C协议与ZLG7290、PCF8563通讯,通过软件模拟单总线协议与DS18B20通信。

将I2C协议模拟程序和单总线协议模拟程序设置为用户库文件,通过添加头文件的方法使用。

主程序流程图见图3。

3、总结
本系统功能丰富,采用C51语言编程,部分代码汇编实现,既考虑高级语言易用性、可读性,又不失汇编语言的精简和速度。

采用了工业控制总线I2C和单总线实现单片机与外围器件的通信,解决了单片机在很多场合下的引脚不够用的问题。

参考文献:
[1]杨金岩郑应强张振仁.8051单片机数据传输接口扩展技术与应用实例人民邮电出版社,2005.1
[2]万光毅严义.单片机实验与实践教程北京航空航天大学出版社2003.12
[3]马忠梅单片机的C语言应用程序设计北京航空航天大学出版社1999.1
[4]周立功单片机实验与实践北京航空航天大学出版社2004.8
[5]徐爱钧彭秀华单片机高级语言C51应用程序设计电子工业出版社2000.12
缴信息等。

3.3系统功能的实现
系统功能主要包括:图层显示、图层放大/缩小、使用鹰眼、缓冲区查询、距离/面积测量、面积测量、多边形选择、鼠标悬停提示、用户管理等。

图层显示功能:每个图层对应一个复选框,当需要显示某些图层时,则选中复选框,然后点击"显示图层"按钮即可实现。

图层放大/缩小功能:可以选择该功能对所见图层放大或者缩小操作。

在系统中根据图层的比例,某些图层只有在放大到一定的比例以后才可见。

如阀表、阀井等。

鹰眼功能:系统鹰眼功能为用户提供了整体图层的快速选择,用户也可以通过鹰眼功能了解当前浏览所在位置。

缓冲区查询:该功能可实现以某个对象为中心,查询在其周围一定距离内存在的目标对象。

目标对象和缓冲距离都可由用户动态设定。

距离/面积测量:系统可以通过该功能实现两点或多点之间的距离,而且可以测量任意边形围成的面积。

多边形选择:系统提供了矩形及多边形查询,可以查询一个矩形区域内目标对象的属性,以及可以查询多边形区域内目标对象的属性。

鼠标悬停:当使用该功能的时候,系统可以根据当前鼠标悬停的对象目标,来显示该对象的相关属性信息。

用户管理:系统将用户分为普通用户,和管理员用户两个权限。

普通用户可以查看或使用分析功能,而管理员用户可以对其后台进行相应的管理维护。

系统界面图2所示。

图2:系统界面图
4、结束语
基于Arc IMS小区GIS的实现,使得物业管理部门能够在该系统的帮助下准确、快捷地了解小区地理信息。

对于因特发事件造成的停水、停气、停暖、安防通信中断等提供了有力的地理信息支持。

提供了一般管理信息系统难以实现的空间数据分析、管理等功能。

参考文献:
[1]吴雪峰,刘厚泉.基于基于GIS的矿区救灾导航系统的应用研究[J]微计算机信息2008(5)
[2]朱恩利,李建辉等编著.地理信息系统基础及应用教程[M].北京:机械工业出版
社,2004,8
[3]龚健雅.地理信息系统基础[M].北京:科学出版社2002.3
[4]杨兆武,刘福江.Arc IMS技术在矿产地数据库中的应用[J].中国矿业2005(2)
[5]赵朋,刘刚,张喜杰.一种基于ArcIMS开发WebGIS的方法及应用[J].计算机应用研究
.2005,5。

相关文档
最新文档