简易万年历.doc_第1页
简易万年历.doc_第2页
简易万年历.doc_第3页
简易万年历.doc_第4页
简易万年历.doc_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

实验七 设计性实验1 实验题目: 简易万年历2 功能说明: 2014年06月12日 12 : 00 : 00 30C 液晶屏上显示即时的日期、时间和温度,且日期和时间可调节。3 编程思想:编程采用模块化思想,将程序分为几个模块,即液晶屏模块、数字温度传感器模块、定时器模块等。定义端口,使日期和时间各位可调。4 程序清单:LCD.c文件#include #include unsigned char code number_X= /宽x高=8x16,纵向字节倒序 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00, /0 0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00, 0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00, /1 0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00, 0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00, /2 0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00, 0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00, /3 0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00, 0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00, /4 0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00, 0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00, /5 0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00, 0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00, /6 0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00, 0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00, /7 0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00, 0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00, /8 0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00, 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00, /9 0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, / . 0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00, 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00, /- 0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /nop 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00, /: 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00;/* *函数:void LCD_WriteCommandE1(unsigned char com)*功能:写指令代码子程序(E1)*/void LCD_WriteCommandE1(unsigned char com)while(CRADD1 & 0x80);CWADD1 = com;/*函数:void LCD_WriteCommandE1(unsigned char com)*功能:写显示数据子程序(E1)*/void LCD_WriteDataE1(unsigned char dat)while(CRADD1 & 0x80);DWADD1 = dat;/*函数:void WriteCommandE2(unsigned char com)*功能:写指令代码子程序(E2)*/void LCD_WriteCommandE2(unsigned char com)while(CRADD2 & 0x80);CWADD2 = com;/*函数:void WriteCommandE2(unsigned char com)*功能:写显示数据子程序(E2)*/void LCD_WriteDataE2(unsigned char dat)while(CRADD2 & 0x80);DWADD2 = dat;/*函数:void LCD_Init()*功能:LCD初始化程序*/void LCD_Init()LCD_WriteCommandE1(0xe2);LCD_WriteCommandE2(0xe2);LCD_WriteCommandE1(0xa4);LCD_WriteCommandE2(0xa4);LCD_WriteCommandE1(0xa9);LCD_WriteCommandE2(0xa9);LCD_WriteCommandE1(0xa0);LCD_WriteCommandE2(0xa0);LCD_WriteCommandE1(0xc0);LCD_WriteCommandE2(0xc0);LCD_WriteCommandE1(0xaf);LCD_WriteCommandE2(0xaf);/*函数:void LCD_Clear()*功能:清屏*/void LCD_Clear(void)unsigned char i,j;for(i=0;i4;i+)LCD_WriteCommandE1(i+0xb8);LCD_WriteCommandE2(i+0xb8);LCD_WriteCommandE1(0x00);LCD_WriteCommandE2(0x00);for(j=0;j0x50;j+)LCD_WriteDataE1(0x00);LCD_WriteDataE2(0x00); /*函数:void display_cn(unsigned char lin,unsigned int col,unsigned int len,unsigned char *p)*功能:显示汉字*/void display_cn(unsigned char lin,unsigned int col,unsigned int len,unsigned char *p)unsigned int seg,i,j;unsigned char a,L,n;switch(lin)case 0: n=0xba;break;case 1: n=0xb8;break;for(i=0;ilen;i+)for(j=0;j2;j+)L=col;LCD_WriteCommandE1(n+j);LCD_WriteCommandE2(n+j);for(seg=0;seg16;seg+)if (L 61) / 为左半屏显示区域(E1)a = L;LCD_WriteCommandE1(a);LCD_WriteDataE1(*p+);elsea = L-61;LCD_WriteCommandE2(a);LCD_WriteDataE2(*p+);L+;col=col+16;/*函数:void display_number()*功能:显示数字*/void display_number(unsigned char lin,unsigned int col,unsigned char num)unsigned int seg,j;unsigned char a,L,n,k;switch(lin)case 0: n=0xba;break;case 1: n=0xb8;break;k=num*16;for(j=0;j2;j+)L=col;LCD_WriteCommandE1(n+j);LCD_WriteCommandE2(n+j);for(seg=0;seg8;seg+)if (L 61) / 为左半屏显示区域(E1)a = L;LCD_WriteCommandE1(a);LCD_WriteDataE1(number_Xk+);elsea = L-61;LCD_WriteCommandE2(a);LCD_WriteDataE2(number_Xk+);L+;/*函数:void display_unsigned_int(unsigned char lin,unsigned int col,unsigned int dat)*功能:显示显示无符号整型数*/void display_unsigned_int(unsigned char lin,unsigned int col,unsigned int dat)unsigned int seg;unsigned char k4;k3=dat%10;k2=(dat/10)%10);k1=(dat/100)%10);k0=(dat/1000)%10);if(k0=0) k0=12;if(k0=12)&(k1=0) k0=12;k1=12;if(k0=12)&(k1=12)&(k2=0)k0=12;k1=12;k2=12;for(seg=0;seg4;seg+)display_number(lin,col,kseg);col=col+10;/*函数:void display_signed_int(unsigned char lin,unsigned int col,signed int dat)*功能:显示有符号整型数*/void display_signed_int(unsigned char lin,unsigned int col,signed int dat) unsigned int seg;unsigned char k5,a;k0=12;if(dat0)dat=(dat)+1;k0=11;k4=dat%10;k3=(dat/10)%10);k2=(dat/100)%10);k1=(dat/1000)%10);a=k0;if(k1=0) k0=12;k1=a;if(k1=a)&(k2=0) k0=12;k1=12;k2=a;if(k1=12)&(k2=a)&(k3=0)k0=12;k1=12;k2=12;k3=a;for(seg=0;seg5;seg+)display_number(lin,col,kseg);col=col+10;/*函数:void display_unsigned_char(unsigned char lin,unsigned int col,unsigned int dat)*功能:显示显示无符号2位数*/void display_unsigned_char(unsigned char lin,unsigned int col,unsigned char dat)unsigned int seg;unsigned char k3;k1=dat%10;k0=(dat/10)%10);for(seg=0;seg2;seg+)display_number(lin,col,kseg);col=col+10;LCD.h文件#include #include #ifndef _LCD_#define _LCD_#define CWADD1 XBYTE0x8000 / 写指令代码地址(E1)#define DWADD1 XBYTE0x8001 / 写显示数据地址(E1)#define CRADD1 XBYTE0x8002 / 读状态字地址(E1)#define DRADD1 XBYTE0x8003 / 读显示数据地址(E1)#define CWADD2 XBYTE0x8004 / 写指令代码地址(E2)#define DWADD2 XBYTE0x8005 / 写显示数进地址(E2)#define CRADD2 XBYTE0x8006 / 读状态字地址(E2)#define DRADD2 XBYTE0x8007 / 读显示数据地址(E2)extern void LCD_Init();extern void display_cn(unsigned char lin,unsigned int col,unsigned int len,unsigned char *p);extern void display_signed_int(unsigned char lin,unsigned int col,signed int dat);extern void display_unsigned_int(unsigned char lin,unsigned int col,unsigned int dat);extern void display_unsigned_char(unsigned char lin,unsigned int col,unsigned char dat);extern void LCD_Clear(void);#endifDS18B20.c文件#include #include string.h#include intrins.h#include DS18B20.hsbit DQ=P30;/*函数:void delay(unsigned int uSeconds)*功能:延时*/void delay(unsigned int uSeconds) for(;uSeconds0;uSeconds-);/*函数:unsigned char ow_reset(void)*功能:复位*/unsigned char ow_reset(void)unsigned char xdata presence; DQ = 0; delay(48); DQ = 1; delay(7); presence = DQ; delay(48); return(presence);/*函数:unsigned char read_byte(void)*功能:从 1-wire 总线上读取一个字节*/unsigned char read_byte(void)unsigned char i;unsigned char value = 0; for (i=8;i0;i-) value=1;DQ = 0;DQ = 1;_nop_();_nop_();_nop_();_nop_();_nop_();if(DQ) value|=0x80;delay(7);return(value);/ pull DQ low to start read timeslot / then rlease DQ/ read DQ data at 1 to 15us,here delay 6us;/ wait for rest of timeslot,72us/*函数:void write_byte(char val)*功能:向 1-WIRE 总线上写一个字节*/void write_byte(char val)unsigned char i; for (i=8; i0; i-)/ writes byte, one bit at a time DQ = 0;/ pull DQ low to start timeslot DQ = val&0x01; delay(7);/ hold value for remainder timeslot,here 72us DQ = 1; val=val/2; delay(5);/*函数:float Read_Temperature(void)*功能:读取温度*/float Read_Temperature(void)unsigned char Hdata,Ldata,b;int a;bit flag;float x,y,z; ow_reset(); write_byte(0xCC);/ Skip ROM write_byte(0xBE);/ Read Scratch Pad delay(100); Ldata=read_byte();/ Low byte first Hdata=read_byte();/ High byte after ow_reset(); write_byte(0xCC);/Skip ROM write_byte(0x44); / Start Conversion a=Hdata*256+Ldata; x=(float)(Ldata&0x0f); x=x/16; if(a4; z=(float)(b); if(flag=1) b=b+1; z=(float)(b); z=0-z; y=z+x; return y;DS18B20.h文件#ifndef _DS18B20_#define _DS18B20_extern float Read_Temperature(void);#endifMCU.c文件#include #include MCU.h/*函数:timer0_init(void); *功能:启动定时器0*/void timer0_init(void)/okTMOD|=0x01;/Timer0 is 16 bits timer, timer1 is Baud rate generatorTH0=0x97;TL0=0xd5;TR0=1;ET0=1;MCU.h文件#ifndef _MCU_#define _MCU_extern void timer0_init(void);#endifMAIN.c文件#include #include#include#include MCU.h#include DS18B20.hsbit min=P10;sbit hour=P11;sbit key=P12;sbit day_3=P13;sbit LED7=P17;sbit bp=P16;/*函数:void delay(unsigned int x)*功能:延时*/void wait(unsigned int x) unsigned int i; i=0; for(i=0;i=20) ms_count=0; second_count+; if(second_count=60) second_count=0; minute_count+; if(minute_count=60) minute_count=0; hous_count+; bp=1; if(hous_count=24) hous_count=0; day_count+; void main(void) float F; signed int a; P1=0Xff; LED7=0; LCD_Init(); LCD_Clear(); timer0_init( ); display_cn(0,30,1,year); display_cn(0,70,1,month); display_cn(0,108,1,day); display_cn(1,16,1,hous); display_cn(1,42,1,hous); display_cn(1,106,1,d); EA=1; while(1) F=Read_Temperature( ); a=(signed int)F; display_signed_int(1,58,a); wait(5000); if(hour=1|min=1|day_3=1) TR0=0; if(key=0) wait(800); if(key=0) if(hour=1&min=0&day_3=0) hous_count+; if(hous_count=24) hous_count=0; if(hour=0&min=1&day_3=0) minute_count+; if(minute_count=60) minute_count=0; if(hour=0&min=0&day_3=1) day_count+; if(day_count31) day_count=1; if(hour=1&min=1) second_count+; if(second_count=60) second_count=0; / if(a=30) / LED7=1; else TR0=1; if(a=32) LED7=1; display_unsigned_char(1,0,hous_count); display_unsigned_char(1,26,minute_count); display_unsigned_char(1,52,second_count); display_unsigned_char(0,8,year_count); display_unsigned_char(0,50,month_count); display_unsigned_char(0,88,day_count); wait(5000); MAIN.h文件#ifndef MAIN_H_#define MAIN_H_/ 中文字模库16x16点阵code unsigned char year= /纵向字节倒序0x00,0x20,0x10,0xCC,0x47,0x44,0x44,0xFC, / 年0x44,0x44,0x44,0x64,0x46,0x04,0x00,0x00,0x04,0x04,0x04,0x07,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x06,0x04,0x00;code unsigned char month=0x00,0x00,0x00,0x00,0xFE,0x22,0x22,0x22, / 月0x22,0x22,0x22,0xFF,0x02,0x00,0x00,0x00,0x00,0x80,0x40,0x30,0x0F,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x00,0x00,0x00,0x00,/0x20,0x24,0x24,0xA4,0xFE,0xA3,0x22,0x80, / 秒/0x70,0x00,0xFF,0x00,0x10,0x20,0x60,0x00,/0x10,0x08,0x06,0x01,0xFF,0x00,0x81,0x80,/0x40,

温馨提示

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

评论

0/150

提交评论