当前位置:文档之家› AVR实验mega16多功能电子钟

AVR实验mega16多功能电子钟

A VR课程设计数字时钟物联网专业一、课程目的通过课程设计,充分利用所学知识,将知识整合,实现最基本的数字时钟。

二、课程要求1、时间显示、日历、并且显示屏可以切换2、秒表,可以记录多个时间,可以加入时间3、叫醒闹钟设置,闹钟等4、温度显示5、记事提醒子模块:液晶,按键,DS1302时钟,温度传感器,其他等三、功能设计1、时间显示:通过调用ds1302时间函数,实现时间的显示。

通过按键二的控制,显示四行数据,第二行显示时间,其余三行可自由添加;按键零实现调制时间的分钟数和时钟数,按键一为加一控制,按键二为减一控制,按键七为跳回主界面控制。

2、日历设置:同样是通过调用ds1302日历函数,实现日历的显示。

通过按键二的控制,跳入日历显示界面,第二行显示日历,其余三行可自由发挥;按键零实现调制天、月和年,按键一为加一控制,按键二为减一控制,按键七为跳回主界面。

3、闹钟显示:实现蜂鸣器和时间函数的同时调用,在当前时间等于闹钟时间时,可以自行跳出闹钟界面,按键七可返回之前界面;在主菜单项,可以通过按键三实现闹钟界面显示,按键零可实现闹钟时间的小时和分钟的调制,按键一为加一,按键二为减一,按键七跳回主界面。

闹钟自动跳出提醒,按键七可以退出闹钟响应。

4、显示屏显示:整个显示屏的显示直接调用DS12864显示,菜单六栏,分别为时钟显示,日历显示,闹钟显示,温度显示,记事本及秒表,通过按键控制相应的区域。

四、课程器材A VR实验箱一台五、课程连线1、按键JP37接PB口,实现按键控制2、ds12864的D口,接PD口,实现显示屏显示3、RS,RW,E分别接PA5,PA6,PA74、ds1302的SCK,I/C,RST口分别接PA0,PA1,PA2,实现时钟显示5、ds1820的JP39接PA3,实现温度传感器6、ds1820的JP16接PA4,实现蜂鸣器六、课程代码DS1302#include <mega16.h>#define PA0 0#define PA1 1#define PA2 2/*复位脚*/#define RST_CLR PORTA &= ~(1 << PA2)/*电平置低*/#define RST_SET PORTA |= (1 << PA2)/*电平置高*/#define RST_IN DDRA &= ~(1 << PA2)/*方向输入*/#define RST_OUT DDRA |= (1 << PA2)/*方向输出*//*双向数据*/#define IO_CLR PORTA &= ~(1 << PA1)/*电平置低*/#define IO_SET PORTA |= (1 << PA1)/*电平置高*/#define IO_R PINA & (1 << PA1)/*电平读取*/#define IO_IN DDRA &= ~(1 << PA1)/*方向输入*/#define IO_OUT DDRA |= (1 << PA1)/*方向输出*//*时钟信号*/#define SCK_CLR PORTA &= ~(1 << PA0)/*时钟信号*/#define SCK_SET PORTA |= (1 << PA0)/*电平置高*/#define SCK_IN DDRA &= ~(1 << PA0)/*方向输入*/#define SCK_OUT DDRA |= (1 << PA0)/*方向输出*/#define ds1302_sec_add 0x80 //秒数据地址#define ds1302_min_add 0x82 //分数据地址#define ds1302_hr_add 0x84 //时数据地址#define ds1302_date_add 0x86 //日数据地址#define ds1302_month_add 0x88 //月数据地址#define ds1302_day_add 0x8a //星期数据地址#define ds1302_year_add 0x8c //年数据地址#define ds1302_control_add 0x8e //控制数据地址#define ds1302_charger_add 0x90#define ds1302_clkburst_add 0xbeunsigned char time_buf[8] = {0x20,0x14,0x05,0x14,0x23,0x59,0x00,0x02};/*向DS1302写入一字节数据*/void ds1302_write_byte(unsigned char addr, unsigned char d) {unsigned char i;RST_SET; /*启动DS1302总线*//*写入目标地址:addr*/IO_OUT;addr = addr & 0xFE;/*最低位置零*/for (i = 0; i < 8; i ++) {if (addr & 0x01) {IO_SET;}else {IO_CLR;}SCK_SET;SCK_CLR;addr = addr >> 1;}/*写入数据:d*/IO_OUT;for (i = 0; i < 8; i ++) {if (d & 0x01) {IO_SET;}else {IO_CLR;}SCK_SET;SCK_CLR;d = d >> 1;}RST_CLR; /*停止DS1302总线*/ }/*从DS1302读出一字节数据*/unsigned char ds1302_read_byte(unsigned char addr) {unsigned char i;unsigned char temp;RST_SET; /*启动DS1302总线*//*写入目标地址:addr*/IO_OUT;addr = addr | 0x01;/*最低位置高*/for (i = 0; i < 8; i ++) {if (addr & 0x01) {IO_SET;}else {IO_CLR;}SCK_SET;SCK_CLR;addr = addr >> 1;}/*输出数据:temp*/IO_IN;for (i = 0; i < 8; i ++) {temp = temp >> 1;if (IO_R) {temp |= 0x80;}else {temp &= 0x7F;}SCK_SET;SCK_CLR;}RST_CLR; /*停止DS1302总线*/return temp;}/*向DS302写入时钟数据*/void ds1302_write_time(void) {ds1302_write_byte(ds1302_control_add,0x00); //关闭写保护ds1302_write_byte(ds1302_sec_add,0x80); //暂停//ds1302_write_byte(ds1302_charger_add,0xa9); //涓流充电ds1302_write_byte(ds1302_year_add,time_buf[1]); //年ds1302_write_byte(ds1302_month_add,time_buf[2]); //月ds1302_write_byte(ds1302_date_add,time_buf[3]); //日ds1302_write_byte(ds1302_day_add,time_buf[7]); //周ds1302_write_byte(ds1302_hr_add,time_buf[4]); //时ds1302_write_byte(ds1302_min_add,time_buf[5]); //分ds1302_write_byte(ds1302_sec_add,time_buf[6]); //秒ds1302_write_byte(ds1302_control_add,0x80); //打开写保护}/*从DS302读出时钟数据*/void ds1302_read_time(void) {time_buf[1]=ds1302_read_byte(ds1302_year_add); //年time_buf[2]=ds1302_read_byte(ds1302_month_add); //月time_buf[3]=ds1302_read_byte(ds1302_date_add); //日time_buf[4]=ds1302_read_byte(ds1302_hr_add); //时time_buf[5]=ds1302_read_byte(ds1302_min_add); //分time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7F;//秒time_buf[7]=ds1302_read_byte(ds1302_day_add); //周}/*DS302初始化函数*/void ds1302_init(void) {RST_CLR; /*RST脚置低*/SCK_CLR; /*SCK脚置低*/RST_OUT; /*RST脚设置为输出*/SCK_OUT; /*SCK脚设置为输出*/}DS18B20#include <mega16.h>#include <delay.h>#define PA3 PORTA3#define DQ_IN DDRA &= ~(1 << PA3) /*设置输入*/#define DQ_OUT DDRA |= (1 << PA3) /*设置输出*/#define DQ_CLR PORTA &= ~(1 << PA3) /*置低电平*/#define DQ_SET PORTA |= (1 << PA3) /*置高电平*/#define DQ_R PINA & (1 << PA3) /*读了电平*/unsigned char flag; /*中断标志缓存*//*延时函数延时时间:i X 10 + 16uS。

CPU频率为:1MHz。

*/void delay_10us(unsigned char i) {if (i == 0) {return ;}while (i--) {delay_us(1);// NOP();delay_us(1);// NOP();delay_us(1);// NOP();delay_us(1);// NOP();}}/*DS18B20复位函数*/unsigned char ds1820_reset(void) {unsigned char i;flag = SREG; /*中断保护*/SREG&=0x7F;//CLI(); /*关中断*/DQ_OUT;DQ_CLR;delay_10us(49); /*延时500uS(480-960)*/DQ_SET;DQ_IN;delay_10us(7); /*延时80uS*/i = DQ_R;delay_10us(49); /*延时500uS(保持>480uS)*/ if (flag & 0x80) { /*恢复中断状态*/SREG|=0x80;//SEI();}if (i) {return 0x00;}else {return 0x01;}}/*DS18B20字节读取函数*/unsigned char ds1820_read_byte(void) {unsigned char i;unsigned char value = 0;flag = SREG; /*中断保护*/SREG&=0x7F;//CLI(); /*关中断*/for (i = 8; i != 0; i--) {value >>= 1;DQ_OUT;DQ_CLR;delay_us(4);DQ_SET;DQ_IN;delay_us(10);if (DQ_R) {value|=0x80;}delay_10us(5); /*延时60uS*/}if (flag & 0x80) { /*恢复中断状态*/SREG|=0x80;//SEI();}return(value);}/*DS18B20字节写入函数*/void ds1820_write_byte(unsigned char value) {unsigned char i;flag = SREG; /*中断保护*/SREG&=0x7F;//CLI(); /*关中断*/ for (i = 8; i != 0; i--) {DQ_OUT;DQ_CLR;delay_us(4);// NOP(); /*延时4uS*/// NOP();// NOP();// NOP();if (value & 0x01) {DQ_SET;}delay_10us(7); /*延时80uS*/DQ_SET; /*位结束*/value >>= 1;}if (flag & 0x80) { /*恢复中断状态*/SREG|=0x80;//SEI();}}/*启动ds1820转换*/void ds1820_start(void) {ds1820_reset();ds1820_write_byte(0xCC); /*勿略地址*/ds1820_write_byte(0x44); /*启动转换*/}/*DS8B20读取温度信息*/unsigned int ds1820_read_temp(void) {unsigned int i;unsigned char buf[9],pp;pp=ds1820_reset();if(pp==0x01){//有传感器ds1820_write_byte(0xCC); /*勿略地址*/ds1820_write_byte(0xBE); /*读取温度*/for (i = 0; i < 9; i++) {buf[i] = ds1820_read_byte();}i = buf[1];i <<= 8;i |= buf[0];return i;}elsereturn(0x07D0);}DS12864#include <mega16.h>#include <string.h>#define uchar unsigned char#define uint unsigned int#define RS (1<<5)//0010 0000#define RW (1<<6)//0100 0000#define EN (1<<7)//1000 0000void time_ms(uint ms){for(;ms>1;ms--);}//写数据void WriteData(unsigned char WDLCM)//101{//ReadStatusLCM(); //检测忙//time_ms(100);PORTA|=RS; //RS=1 PORTA=0000 0001time_ms(100);PORTA&=~RW; //RW=0 PORTA=0000 0001time_ms(100);PORTA|=EN; //EN=1 PORTA=0000 0001 time_ms(100);PORTD=WDLCM; //输出数据time_ms(100);PORTA&=~EN; //EN=0time_ms(100);}//写指令void WriteCommand(unsigned char WCLCM) //001 {//ReadStatusLCM(); //根据需要检测忙PORTA&=~RS; //RS=0time_ms(100);PORTA&=~RW; //RW=0time_ms(100);PORTA|=EN; //EN=1time_ms(100);PORTD=WCLCM; //输出指令time_ms(100);PORTA&=~EN; //EN=0time_ms(100);}//读状态:检测忙void ReadStatus()//011{uchar temp;uchar flag = 1;while(flag==1){DDRD=0x00; //端口D改为输入PORTD=0xff;time_ms(100);PORTA&=~RS; //RS=0time_ms(100);PORTA|=RW; //RW=1time_ms(100);PORTA|=EN; //EN=1time_ms(1000);temp = PIND; //读端口Dtime_ms(1000);DDRD=0xff; //端口D改为输入time_ms(100);PORTA&=~EN; //EN=0time_ms(100);if(temp>>7==0)flag = 0;}}//LCM初始化void LCMInit(void){WriteCommand(0x38); //三次显示模式设置,不检测忙信号0011 1000功能设置WriteCommand(0x38);WriteCommand(0x38);WriteCommand(0x38); //显示模式设置,开始要求每次检测忙信号WriteCommand(0x08); //关闭显示0000 1000WriteCommand(0x01); //显示清屏0000 0001WriteCommand(0x06); //显示光标移动设置0000 0110 脱离睡眠模式WriteCommand(0x0C); //显示开及光标设置0000 1100}void LCMClear(){WriteCommand(0x01);delay_ms(5);}void DisplayList(unsigned char X,char *DData){unsigned char length;unsigned char i=0;char *p;p = DData;length = strlen(p);//WriteCommand(0x08);//关闭显示0000 1000WriteCommand(X);//10000000 10010000 10001000 10011000WriteCommand(0x06);//显示光标移动设置0000 0110 脱离睡眠模式WriteCommand(0x0C);//显示开及光标设置0000 1100WriteCommand(X);for(i=0;i<length;i++){WriteData(DData[i]);i++;WriteData(DData[i]);}}BELL//PA7口用一条1pin线连接到小喇叭的jp16#include <mega16.h> //包含型号头文件#include <stdio.h> //标准输入输出头文件#include "bell.h" //包含自定义常量头文件#define uchar unsigned char#define uint unsigned int#pragma interrupt_handler Timer1_Ov:10/*-------------两只老虎-------------*/unsigned char MusicTable2[77]={13,2, 15,2, 17,2, 13,1, 0,1,13,2, 15,2, 17,2, 13,1, 0,1,17,2, 18,2, 20,2, 0,2,17,2, 18,2, 20,2, 0,2,20,1, 22,1, 20,1, 18,1, 17,2, 13,2,20,1, 22,1, 20,1, 18,1, 17,2, 13,2,15,2, 8,2, 13,2, 0,2,15,2, 8,2, 13,2, 0,2,0xff};/*-----------------新年好------------------*/unsigned char MusicTable1[129]={ 13,1, 13,1, 13,2, 8,2,//音符,拍数,17,1, 17,1, 17,2, 13,2,13,1, 17,1, 20,2, 20,2,18,1, 17,1, 15,2, 0,2,15,1, 17,1, 18,2, 18,2,17,1, 15,1, 17,2, 13,2,13,1, 17,1, 15,2, 8,2,12,1, 15,1, 13,2, 0,2,13,1, 13,1, 13,2, 8,2, //音符,拍数,17,1, 17,1, 17,2, 13,2,13,1, 17,1, 20,2, 20,2,18,1, 17,1, 15,2, 0,2,15,1, 17,1, 18,2, 18,2,17,1, 15,1, 17,2, 13,2,13,1, 17,1, 15,2, 8,2,12,1, 15,1, 13,2, 0,2,0xff};//0, 1, #1, 2, #2, 3, 4, #4, 5, #5, 6, #6, 7,uintToneTable[37]={ZERO,DO_L,DOA_L,RE_L,REA_L,MI_L,FA_L,FAA_L,SO_L,SOA_L,LA_L, LAA_L,TI_L,DO ,DOA ,RE ,REA ,MI ,FA ,FAA ,SO ,SOA ,LA ,LAA ,TI ,DO_H,DOA_H,RE_H,REA_H,MI_H,FA_H,FAA_H,SO_H,SOA_H,LA_H,LAA_H,TI_H};uint tone;/*******************************************函数名称: Timer1_Ov功能: 定时器1溢出中断服务函数(完成单个音的产生)参数: 无返回值: 无********************************************/void Timer1_Ov(void){if(tone)//若不是休止符,则发声{TCNT1=tone; //计数值装入寄存器PORTA^=BIT(BEEP);//蜂鸣器接口电平翻转}}/*******************************************函数名称: Timer1_init功能: Timer1的初始化参数: 无返回值: 无********************************************/void Timer1_init(void){TCCR1A=0x00; //普通端口操作TCCR1B=0x01; //8分频SREG|=0x80; //开放全局中断}/*******************************************函数名称: Music功能: 完成整曲的音乐演奏参数: pmusic--曲谱数组指针返回值: 无********************************************/void Music(unsigned char *pMusic){while(*pMusic!=0xFF) //0xFF为音乐结尾符{TIMSK=0x04; //Timer1溢出中断使能tone=ToneTable[*pMusic]; //取音调频率TCNT1=tone; //将频率值对应的计数值写入计时器,开始发声pMusic++; //乐谱音符指针+1 ,取拍数Delayms((*pMusic)*10); //按拍数延时Delayms((*pMusic)*10);TIMSK=0x00; //发声结束,屏蔽Timer1溢出中断pMusic++; //乐谱音符指针+1 ,取下一音符}Delayms(1000); //曲谱结束,等待}主函数#include <mega16.h>#include <delay.h>#include "12864.c"#include "ds1302.c"#include "ds1820.c"#include "bell.c"#define uchar unsigned char#define uint unsigned intuchar x[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x 29,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x60,0x6 1,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x7 8,0x79,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x90,0x91,0x92,0x93,0x94,0x9 5,0x96,0x97,0x98,0x99};uchar led_buf[5],y[3]={0x00,0x00,0x10};char char_1[]={"闹钟:09:00:00"};char char_2[]={"2014年05月05日"};char char_3[]={"时间:00:00:00"};char char_4[]={"温度:20.1℃"};char char_5[]={"00: 00: 00"};char char1[]={" 课程设计"};char char2[]={" 1.时钟显示"};char char3[]={" 2.日历显示"};char char4[]={" 3.闹钟信号"};char char5[]={" 4.温度显示"};char char6[]={" 5.记事本"};char char7[]={" 6.秒表"};void clock(){ds1302_read_time();if(y[0]==time_buf[4]&&y[1]==time_buf[5]&&y[2]==time_buf[6]) {LCMInit();Board_init( ); //初始化开发板/Timer1_init(); //Timer1初始化while(1){ds1302_read_time();DisplayList(0x80,"闹钟时间到~");DisplayList(0x88,char_1);//DisplayList(0x98,"按键七可退出闹钟");PORTA.4=0;delay_ms(500);PORTA.4=1;delay_ms(500);if((PINB&(1<<7))==0){PORTA.4=1;LCMInit();break;}}}}void timedisplay(){int a,b,count=0;while(1){clock();//DisplayList(0x80,"可调时钟");//DisplayList(0x88,"按键一:加");//DisplayList(0x98,"按键二:减");ds1302_read_time();char_3[6] = (time_buf[4] >> 4) + '0';/*时*/char_3[7] = (time_buf[4] & 0x0F) + '0';char_3[10] = (time_buf[5] >> 4) + '0';/*分*/char_3[11] = (time_buf[5] & 0x0F) + '0';char_3[14] = (time_buf[6] >> 4) + '0';/*秒*/char_3[15] = (time_buf[6] & 0x0F) + '0'; DisplayList(0x90,char_3);for(a=0;a<60;a++) //分if(x[a]==time_buf[5])break;for(b=0;b<24;b++) //时if(x[b]==time_buf[4])break;if((PINB&(1<<0))==0){count++;}if(count==1){delay_ms(30);DisplayList(0x95," ");delay_ms(20);if((PINB&(1<<1))==0){a++;if(a==60)a=0;time_buf[5]=x[a];ds1302_write_byte(0x82,time_buf[5]);delay_ms(5);ds1302_write_time();}if((PINB&(1<<2))==0){a--;if(a<0)a=59;time_buf[5]=x[a];ds1302_write_byte(0x82,time_buf[5]);delay_ms(5);ds1302_write_time();}}if(count==2){delay_ms(30);DisplayList(0x93," ");delay_ms(20);if((PINB&(1<<1))==0){b++;if(b==24)b=0;time_buf[4]=x[b];ds1302_write_byte(0x84,time_buf[4]);delay_ms(5);ds1302_write_time();}if((PINB&(1<<2))==0){b--;if(b<0)b=23;time_buf[4]=x[b];ds1302_write_byte(0x84,time_buf[4]);delay_ms(5);ds1302_write_time();}}if(count==3){count=0;}if((PINB&(1<<7))==0){break;LCMInit();}}}void setclock(){int i=0,j=0,account=0;ds1302_read_time();char_1[6] = (y[0] >> 4) + '0';/*时*/char_1[7] = (y[0] & 0x0F) + '0';char_1[10] = (y[1] >> 4) + '0';/*分*/char_1[11] = (y[1] & 0x0F) + '0';char_1[14] = (y[2] >> 4) + '0';/*秒*/char_1[15] = (y[2] & 0x0F) + '0';for(i=0;i<60;i++) //分if(x[i]==y[1])break;for(j=0;j<24;j++) //时if(x[j]==y[0])break;while(1){clock();//DisplayList(0x80,"闹钟设定");//DisplayList(0x88,"按键一:加");//DisplayList(0x98,"按键二:减");DisplayList(0x90,char_1);ds1302_read_time();if((PINB&(1<<0))==0){account++;}if(account==1){delay_ms(30);DisplayList(0x95," ");delay_ms(20);if((PINB&(1<<1))==0){i++;if(i==60)i=0;y[1]=x[i];char_1[10] = (y[1] >> 4) + '0';/*分*/char_1[11] = (y[1] & 0x0F) + '0';ds1302_write_byte(0x82,y[1]);delay_ms(5);ds1302_write_time();}if((PINB&(1<<2))==0){i--;if(i<0)i=59;y[1]=x[i];char_1[10] = (y[1] >> 4) + '0';/*分*/char_1[11] = (y[1] & 0x0F) + '0';ds1302_write_byte(0x82,y[1]);delay_ms(5);ds1302_write_time();}}if(account==2){delay_ms(30);DisplayList(0x93," ");delay_ms(20);if((PINB&(1<<1))==0){j++;if(j==24)j=0;y[0]=x[j];char_1[6] = (y[0] >> 4) + '0';/*时*/char_1[7] = (y[0] & 0x0F) + '0';ds1302_write_byte(0x84,y[0]);delay_ms(5);ds1302_write_time();}if((PINB&(1<<2))==0){j--;if(j<0)j=23;y[0]=x[j];char_1[6] = (y[0] >> 4) + '0';/*时*/char_1[7] = (y[0] & 0x0F) + '0';ds1302_write_byte(0x84,y[0]);delay_ms(5);ds1302_write_time();}}if(account==3){account=0;}if((PINB&(1<<7))==0){break;LCMInit();}}}void datedisplay(){int c,d,e,f,count=0;while(1){clock();//DisplayList(0x80,"可调日历");//DisplayList(0x88,"按键一:加");//DisplayList(0x98,"按键二:减");ds1302_read_time();char_2[0] = (time_buf[0] >> 4) + '0';/*年*/char_2[1] = (time_buf[0] & 0x0F) + '0';char_2[2] = (time_buf[1] >> 4) + '0';char_2[3] = (time_buf[1] & 0x0F) + '0';char_2[6] = (time_buf[2] >> 4) + '0';/*月*/char_2[7] = (time_buf[2] & 0x0F) + '0';char_2[10] = (time_buf[3] >> 4) + '0';/*日*/char_2[11] = (time_buf[3] & 0x0F) + '0';DisplayList(0x90,char_2);for(c=0;c<32;c++) //天if(x[c]==time_buf[3])break;for(d=0;d<13;d++) //月if(x[d]==time_buf[2])break;for(e=0;e<99;e++) //年if(x[e]==time_buf[1])break;for(f=0;f<21;f++)if(x[f]==time_buf[0])break;if((PINB&(1<<0))==0){count++;}if(count==1){delay_ms(30);DisplayList(0x95," ");delay_ms(20);if((PINB&(1<<1))==0){c++;if(c==31)c=0;time_buf[3]=x[c];ds1302_write_byte(0x86,time_buf[3]);delay_ms(5);ds1302_write_time();}if((PINB&(1<<2))==0){c--;if(c<0)c=31;time_buf[3]=x[c];ds1302_write_byte(0x86,time_buf[3]);delay_ms(5);ds1302_write_time();}}if(count==2){delay_ms(30);DisplayList(0x93," ");delay_ms(20);if((PINB&(1<<1))==0){d++;if(d==13)d=1;time_buf[2]=x[d];ds1302_write_byte(0x88,time_buf[2]);delay_ms(5);ds1302_write_time();}if((PINB&(1<<2))==0){d--;if(d<1)d=12;time_buf[2]=x[d];ds1302_write_byte(0x88,time_buf[2]);delay_ms(5);ds1302_write_time();}}if(count==3){delay_ms(30);DisplayList(0x91," ");delay_ms(20);if((PINB&(1<<1))==0){e++;if(e==100){e=0;if(++f==22)f=0;time_buf[0]=x[f];}time_buf[1]=x[e];ds1302_write_byte(0x8c,time_buf[1]);delay_ms(5);ds1302_write_time();}if((PINB&(1<<2))==0){e--;if(e<0){e=99;if(--f<0)f=21;time_buf[0]=x[f];}time_buf[1]=x[e];ds1302_write_byte(0x8c,time_buf[1]);delay_ms(5);ds1302_write_time();}}if(count==6){delay_ms(30);DisplayList(0x90," ");delay_ms(20);}if(count==4){count=0;}if((PINB&(1<<7))==0){break;LCMInit();}}}void templedisplay(){char i;while(1){clock();ds1820_start(); /*启动一次转换*/i = ds1820_read_temp(); /*读取温度数值*/i = (i * 10) / 16; /*数值处理*/i = i % 1000;led_buf[2] = i / 100;i = i % 100;led_buf[1] = i / 10;led_buf[0] = i % 10;char_4[6] = led_buf[2]+ '0';char_4[7] = led_buf[1]+ '0';char_4[9] = led_buf[0]+ '0';DisplayList(0x90,"天气预测");DisplayList(0x98,char_4);if((PINB&(1<<7))==0){break;LCMClear();}}}void main(void){bit key=0;LCMInit(); //LCM初始化ds1302_init();delay_ms(10);ds1302_write_time();ds1302_read_time();//端口初始化DDRA=0xff;PORTA=0x10;DDRB=0x00;PORTB=0xff;DDRC=0x00;PORTC=0xff;DDRD=0xff;PORTD=0x00;time_ms(5);time_ms(5);LCMInit(); //LCM初始化DisplayList(0x80," A VR 实验");DisplayList(0x90," 2012112151");DisplayList(0x88," 栗雨然");DisplayList(0x98," 神婆设计");delay_ms(900);while(1){if((PINB&(1<<0))==0){key=~key;}if(key==0){DisplayList(0x80,char1); //显示第一行DisplayList(0x90,char2); //显示第二行DisplayList(0x88,char3); //显示第三行DisplayList(0x98,char4);}if(key==1){DisplayList(0x80,char1); //显示第一行DisplayList(0x90,char5); //显示第二行DisplayList(0x88,char6); //显示第三行DisplayList(0x98,char7);}if((PINB&(1<<1))==0){LCMInit();timedisplay();LCMInit();}if((PINB&(1<<2))==0){LCMInit();datedisplay();LCMInit();}if((PINB&(1<<3))==0){LCMInit();setclock();LCMInit();}if((PINB&(1<<4))==0){LCMInit();templedisplay();LCMInit();}if((PINB&(1<<5))==0){LCMInit();DisplayList(0x90,"啦啦啦啦啦啦");DisplayList(0x88,"我不会~");DisplayList(0x98,"哈哈哈哈哈哈");delay_ms(2000);LCMInit();}if((PINB&(1<<6))==0){LCMInit();//miaobiao();LCMInit();}clock();}}七、课程显示八、课程心得通过A VR的课程学习,我们基本了解了A VR的DS1302、DS18B20、DS12864的功能设计,学习了单片机的基本操作功能,知道了A VR跑马灯、继电器、8路指示灯8路开关、数码管的静态显示、数码管的动态显示、端口按键判断技术、矩阵按键识别技术、12864及74LS17的基本操作和功能,依靠先前所学技术,逐步实现数字时钟的功能设计。

相关主题