毕业设计(论文)-基于MCS-51的万年历设计_第1页
毕业设计(论文)-基于MCS-51的万年历设计_第2页
毕业设计(论文)-基于MCS-51的万年历设计_第3页
毕业设计(论文)-基于MCS-51的万年历设计_第4页
毕业设计(论文)-基于MCS-51的万年历设计_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

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

文档简介

.黄石理工学院毕业设计[论文]题目:基于MCS-51的万年历设计院系:电气与电子信息工程学院专业:工业电气及其自动化姓名: 指导老师:黄石理工学院毕业设计论文附录一系统原理图附录一系统原理图附录二系统的PCB图和元件安装图系统的PCB图系统的PCB图系统的元件安装图系统的元件安装图附录三程序清单LCD1602.h包含文件:/******************************************************************************************************************************************************************************************************液晶模块LCD1602的操作与控制程序********************************文件名称:LCD1602.h功能:对液晶模块进行操作与控制。主要包括对1602的初始化函数、写命令函数和写数据函数设计者:黄开坤**********************************************************************************/#ifndefLCD1620//条件编译#include<intrins.h>/***端口定义***********************************************************************/sbitLCD_Rs=P2^5;//命令/数据控制线sbitLCD_Rw=P2^6;//读/写控制线sbitLCD_En=P2^7;//使能控制线sfrDBport=0x80;//数据端口,P0=0x80,P1=0x90,P2=0xA0,P3=0xB0/***测试LCD忙函数*****************************************************************/voidLCD_Busy(void){LCD_Rs=0;LCD_Rw=1; _nop_();LCD_En=1;_nop_();while(DBport&0x80);//如果DBport的第七位为1,则LCD忙,继续等待LCD_En=0;}/***向LCD写入命令或数据函数*******************************************************/#defineLCD_COM0//命令#defineLCD_DATA1//数据#defineLCD_CLEAR0x01//清屏#defineLCD_HOME0x02//光标返回voidLCD_Write(bitstyle,unsignedcharinput)//写命令或数据函数{LCD_En=0;LCD_Rs=style;//style=1为读写数据;style=0为写命令LCD_Rw=0;//置写状态_nop_();DBport=input;//写数据LCD_En=1;_nop_();LCD_En=0;_nop_();LCD_Busy();}/***置显示模式*********************************************************************/#defineLCD_SHOW0x04//显示开#defineLCD_HIDE0x00//显示关#defineLCD_CORSOR0x02//显示光标#defineLCD_NO_CORSOR0x00//关闭光标#defineLCD_FLASH0x01//光标闪烁#defineLCD_NO_FLASH0x00//光标不闪烁voidLCD_ShowMode(unsignedcharShowMode)//设置显示模式函数{LCD_Write(LCD_COM,0x08|ShowMode);}/***置输入模式*********************************************************************/#defineLCD_AC_UP0x02//地址计数器AC自增#defineLCD_AC_DOWN0x00//地址计数器AC自减voidLCD_InPutMode(unsignedcharInPut)//设置输入模式函数{LCD_Write(LCD_COM,0x04|InPut);}/***初使化LCD*********************************************************************/voidLCD_Initial(void){LCD_Write(LCD_COM,0x38);//设计8位数据接口,2行显示,5*7点阵字LCD_Write(LCD_COM,0x38);LCD_ShowMode(LCD_SHOW|LCD_NO_CORSOR);//开显示,无光标LCD_Write(LCD_COM,LCD_CLEAR);//清屏LCD_InPutMode(LCD_AC_UP);//地址计数器自增,}/***显示定位***********************************************************************/voidLCD_GoToXY(unsignedcharx,unsignedchary)//用于指定显示内容在LCD屏上的位置{if(y==1)LCD_Write(LCD_COM,0x80|x); //第一行,第X个字符 if(y==2) LCD_Write(LCD_COM,0xC0|x); //第二行,第X个字符}/***显示数据***********************************************************************/voidLCD_Print(unsignedchar*str)//用于将待显示内容送入LCD显示{while(*str!='\0') {LCD_Write(LCD_DATA,*str); str++; }}/***结束***************************************************************************/endifDS18B20.h包含文件/*******************************************************************************************************************************************************************************************************温度传感器DS18B20的操作与控制程序*********************************文件名称:DS18B20.h功能:温度传感器DS18B20进行操作与控制。主要包括对DS18B20的初始化函数、写命令函数和读数据函数设计者:黄开坤**********************************************************************************/#ifndefDS18B20//条件编译/***端口定义及变量声明*************************************************************/;sbitDQ=P2^4;//数据传输线接单片机的相应的引脚unsignedchartempL=0;//暂存从DS18B20读出的温度高位unsignedchartempH=0;//暂存从DS18B20读出的温度低位floattemperature;//存放计算后得出的实际温度值unsignedchartemperature_symbol;//温度的符号位,为1表示负温,为0表示正温unsignedchartemp[8];//用于存放温度的ASCII码/***延时程序***********************************************************************/voidDS18B20_delay(unsignedcharx)//延时时间=机周*2*X+3;X=0至255{while(--x);}/***初使化*************************************************************************/unsignedcharDS18B20_Initial(void)//对DS18B20进行初使化函数{unsignedcharx=0; DQ=1;//DQ先置高DS18B20_delay(1);//稍延时DQ=0;//发送复位脉冲DS18B20_delay(250);//延时>480msDQ=1;//拉高数据线DS18B20_delay(15);//等待15~60ms x=DQ;//若x=0,则DS18B20存在,否则不存在DS18B20_delay(250);DQ=1;return(x);//返回值用于测试DS18B20是否存在,为0则存在}/***读取数据***********************************************************************/unsignedcharDS18B20_Read(void)//从DS18B20中读取数据{unsignedchari=0;unsignedchardat=0;//暂存读取的数据for(i=0;i<8;i++){dat>>=1;//先读取低位,逐位读取DQ=0;//_nop_();//DQ=1;//必须写1,否则读出来的将是不预期的数据DS18B20_delay(1);//稍延时_nop_();if(DQ)//读取数据dat|=0x80;DS18B20_delay(30);//读取一位的周期>60usDQ=1;//释放总线 _nop_();}returndat;//返回读取的值}/***写命令或数据*******************************************************************/voidDS18B20_Write(unsignedchardat){unsignedchari;for(i=0;i<8;i++){if(dat&0x01)//低位在前{DQ=0;//结束RecoverytimeDS18B20_delay(1);DQ=1;}//发送“1”elseDQ=0;//发送“0”DS18B20_delay(30);//等待DS18B20采样DQ=1;//_nop_();//dat>>=1;//准备发送下一位}}/***读取温度值**********************************************************************高位放到tempH里,低位放到tempL里,计算后的实际温度存放到temperature里***********************************************************************************/floatReadTemperature(void){DS18B20_Initial();//初始化DS18B20_Write(0xcc);//跳过读序列号的*作DS18B20_Write(0xbe);//读温度寄存器tempL=DS18B20_Read();//读出温度的低8位tempH=DS18B20_Read();//读出温度的高8位if(tempH&0x80){temperature_symbol=1; //负温度值 tempH=~tempH;tempL=~tempL; temperature=(tempH*256+tempL+1)*0.0625;//计算实际温度 }else{temperature_symbol=0;//正温度值 temperature=(tempH*256+tempL)*0.0625; //计算实际温度 }DQ=1;DS18B20_Initial();//初始化DS18B20_Write(0xcc);//跳过读序列号的*作DS18B20_Write(0x44);//启动温度转换,为下一次读取温作准备return(temperature);}/***数值变换(把浮点数转换成相应的字符串)*******************************************/voidIntToStr(floatt){ temp[0]=(unsignedchar)(t/100)%10+'0';//百位 temp[1]=(unsignedchar)(t/10)%10+'0';//十位 temp[2]=(unsignedchar)t%10+'0';//个位 temp[3]='.';//小数点 temp[4]=(unsignedchar)(t/0.1)%10+'0';//小数 temp[5]=''; temp[6]='C';//温度单位 temp[7]='\0'; if(temperature_symbol) //判断正负, {temp[0]='-';//负号 if(temp[1]=='0') temp[1]='';//消去无效位 } else {if(temp[0]=='0'||temp[0]=='-') temp[0]='';//消去无效位 if(temp[1]=='0') temp[1]='';//消去无效位 } }/***结束***************************************************************************/#endif主程序DataAndTime.c文件/*******************************************************************************************************************************************************************************************************基于MSC-51单片机的万年历程序********************************文件名称:DataAndTime.c设计者:黄开坤**********************************************************************************/#include<reg51.h>#include<LCD1602.h>#include<DS18B20.h>sbitled=P3^7;//LCD屏背光灯控制线sbitPlay=P3^0;//启到发音/***全局变量***********************************************************************/unsignedcharyear=7;//年变量,初始值为2007年unsignedcharmonth=4;//月娈量,初始值为4月unsignedcharday=20;//日变量,初始值为20日unsignedcharweek=5;//周,初始值为周5unsignedcharhour=12;//时,初始值为12unsignedcharminute=0;//分,初始值为0unsignedcharsecond=0;//秒,初始值为0unsignedcharTimer_hour=12;//定时器的时变量unsignedcharTimer_minute=0;//定时器的分变量unsignedchardays=30;//用于存放每月的天数,初使值为30天unsignedcharTimer_Ring=1;//定时器提示音编号unsignedcharled_on=15;//LCD显示屏背光灯亮的时间unsignedcharNumber=0;//用于指定报第几个音bitTemperature_sin=1;//温度转换标志,为1,则启动温度转换并刷新bitLeapYear_sin=0;//润年标志,1为润年,0为非润年bitTimer_sin=0;//定时器响应标志,为1表示定时已到,正在响应bitTimer_ON_OFF;//定时器开/关标志。1开;0为关bitTimer_Show_sin;//定时器显示标志,为1表示正处于定时器显示状态bitSpeak_sin;//报时标志,为1表示正在报时unsignedcharDATA[3];//存放两位十进制数的ASCII码unsignedcharWeek_Str[4];//用于存放3个字符,表示星期,如Mon表示星期一unsignedcharVoice[4];//存放两位十进数的语音地址unsignedcharSpeak[11];//存放将要报出的语音/***0-10语音地址表****************************************************************/unsignedcharcodeVoiceTab[]={0x00,0x04,0x08,0x0c,0x10,0x14,0x18,0x1c,0x20,0x24};/***2000--2099年中的润年表********************************************************/unsignedcharcodeLeap_YearTAB[]={4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96};/***计算润年***********************************************************************/voidLeap_Year(unsignedcharYears){ unsignedchari; for(i=0;i<24;i++) { if(Years==Leap_YearTAB[i])//用查表的方法确定是否为润年 {LeapYear_sin=1;break;}else LeapYear_sin=0; }}/***计算每月的天数*****************************************************************/unsignedcharMomth_Days(unsignedcharMonths){switch(Months) {case2:{if(LeapYear_sin==1)//二月份天数,润年为29天,非润年为28天 days=29; else days=28; };break; case4: //四、六、九、十一月份为30天 case6: case9: case11:days=30;break; default:days=31;//其余月份为31天 } days=days+1 ; return(days);//返回值=某月的实际天数+1。} /***星期转换**********************************************************************/voidWeekToStr(charn){switch(n){case1:{Week_Str[0]='M';//星期一,Mon Week_Str[1]='o'; Week_Str[2]='n'; Week_Str[3]='\0'; };break; case2:{Week_Str[0]='T';//星期二,Tue Week_Str[1]='u'; Week_Str[2]='e'; Week_Str[3]='\0'; };break; case3:{Week_Str[0]='W';//星期三,Wen Week_Str[1]='e'; Week_Str[2]='n'; Week_Str[3]='\0'; };break; case4:{Week_Str[0]='T';//星期四,Thu Week_Str[1]='h'; Week_Str[2]='u'; Week_Str[3]='\0'; };break; case5:{Week_Str[0]='F';//星期五,Fri Week_Str[1]='r'; Week_Str[2]='i'; Week_Str[3]='\0'; };break; case6:{Week_Str[0]='S';//星期六,Sat Week_Str[1]='a'; Week_Str[2]='t'; Week_Str[3]='\0'; };break; case7:{Week_Str[0]='S';//星期日,Sun Week_Str[1]='u'; Week_Str[2]='n'; Week_Str[3]='\0'; };break; }}/***类型转换(将字符型数据转换成相应的ASCII码**************************************/voidCharToStr(unsignedchart){ DATA[0]=(t/10)%10+'0';//取十位,并转换成相应的ASCII码 DATA[1]=t%10+'0';//取个位,并转换成相应的ASCII码 DATA[2]='\0';//字符串结束符}/***延时程序***********************************************************************/voidDelay1ms(unsignedcharn)//延时时间≈(4*n+996*n)us=nms{unsignedchark=166; while(--n) {while(--k) ; }}/***键盘扫描程序*******************************************************************/unsignedcharKey_Scan(void){ if((P2&0x0f)!=0x0f)//判断P.4--P2.7是否有键按下 {Delay1ms(10);//延时10ms,消抖动 if((P2&0x0f)!=0x0f) {led_on=15;//LCD屏的背光灯亮的时间重新赋值 led=1; //只要有键按下,LCD背光灯就亮 Timer_sin=0;//只要有键按下,闹铃停止 switch(P2&0x0f) {case0x0e:{while((P2&0x0f)!=0x0f)//等待按键释放 ; return1; //P2.4上的键按下,1号键 };break; case0x0d:{while((P2&0x0f)!=0x0f)//等待按键释放 ; return2; //P2.5上的键按下,2号键 };break; case0x0b:{while((P2&0x0f)!=0x0f)//等待按键释放 ; return3; //P2.6上的键按下,3号键 };break; case0x07:{while((P2&0x0f)!=0x0f)//等待按键释放 ; return4; //P2.7上的键按下,4号键 };break; default:return0; } } } else return0;}/***数字——语音变换***************************************************************/voidNumberToVoice(unsignedcharnumber)//将数字转换成相应的读音。(0≤number<60){unsignedchara,b; a=(number/10)%10;//取十位值 b=number%10;//取个位值 if(a==0)//0≤number<10时的读音,(一个音) {Voice[0]=VoiceTab[b];// Voice[1]=0xff;// } if(a!=0&&b==0)//number的个位为0,十位不为0时的读音 {if(a==1)//10的读音 {Voice[0]=0x28;// Voice[1]=0xff;// } Voice[0]=VoiceTab[a];//个位为0,十位不为0和1时的读音 Voice[1]=0x28;// Voice[2]=0xff;// } if(a==1&&b!=0)//10<number<20时的读音,(两个音) {Voice[0]=0x28;// Voice[1]=VoiceTab[b];// Voice[2]=0xff;// } if((a!=0&&a!=1)&&b!=0)//number的个位不为0,十位不为0和1时的读音 {Voice[0]=VoiceTab[a];// Voice[1]=0x28;// Voice[2]=VoiceTab[b];// Voice[3]=0xff;// }}/***语音报时***********************************************************************/voidSpeakTime(void)//语音报时函数{unsignedcharj,i=0; Speak[i]=0x3c;//报时前凑音 i++; Speak[i]=0x2c;//“现在时刻” NumberToVoice(hour);//“小时” for(j=0;j<5;j++) {i++ ; if(Voice[j]==0xff) {Speak[i]=0x34;//“点” break; } Speak[i]=Voice[j]; } NumberToVoice(minute);//“分钟” for(j=0;j<5;j++) {i++; if(Voice[j]==0xff) {Speak[i]=0x38; //“分” break; } Speak[i]=Voice[j]; } i++; Speak[i]=0xff;//报时结束标志 EX0=1;//INT0开中 IE0=1;//启动报时 Speak_sin=1;//报时标志置1}/***闹铃***************************************************************************/voidRing(void){ if(Timer_Ring==1) //铃声1 P1=0x44; if(Timer_Ring==2) //铃声2 P1=0x58; if(Timer_Ring==3) //铃声3 P1=0x70; Timer_sin=1;//表示进入闹铃状态 EX0=1; //INT0开中 IE0=1; //启动闹铃}/***日历和时间调整*****************************************************************/voidSet_TimeAndDate(void){ unsignedcharkey; EX1=0; //关闭INT1中断,停止计时LCD_ShowMode(LCD_SHOW|LCD_CORSOR|LCD_FLASH); //开光标,光标闪烁Year_set:LCD_GoToXY(2,1);//年校正 key=Key_Scan();//键盘扫描 if(key==1)gotoMonth_set; //如果按下的是功能键(1号键),转月校正 if(key==2)year++; //如果按下的是加1键(2号键),年加1 if(year==100)//年上限循环 year=0; if(key==3)year--;//如果按下的是减1键(3号键),年减1 if(year==-1) //年下限循环 year=99; Leap_Year(year) ;//判断润年 LCD_GoToXY(2,1); CharToStr(year);//将校正后的年数据转换成相对应的ASCII码 Delay1ms(50);//延时100ms LCD_Print(DATA);//年显示刷新 gotoYear_set; //年校正循环Month_set:LCD_GoToXY(5,1); //月校正 key=Key_Scan();//键盘扫描 if(key==1)gotoDay_set;//如果按下的是功能键(1号键),转日校正 if(key==2)month++; //如果按下的是加1键(2号键),月加1 if(month==13)//月上限循环 month=1; if(key==3)month--;//如果按下的是减1键(3号键),月减1 if(month==0) //月下限循环 month=12; CharToStr(month); //将校正后的月数据转换成相对应的ASCII码 Delay1ms(50); //延时100ms LCD_Print(DATA);//月显示刷新 Momth_Days(month); //确定校正后,月的天数 gotoMonth_set;//月校正循环Day_set:LCD_GoToXY(8,1) ;//日校正 key=Key_Scan();//键盘扫描 if(key==1)gotoWeek_set; //如果按下的是功能键(1号键),转时校正 if(key==2)day++;//如果按下的是加1键(2号键),日加1 if(day==days)//日上限循环 day=1; if(key==3)day--;//如果按下的是减1键(3号键),日减1 if(day==0) //日下限循环 day=days-1; CharToStr(day); //将校正后的日数据转换成相对应的ASCII码 Delay1ms(50);//延时100ms LCD_Print(DATA); //日显示刷新 gotoDay_set;//日校正循环Week_set:LCD_GoToXY(12,1) ;//星期调整 key=Key_Scan();//键盘扫描 if(key==1)gotoHour_set; //如果按下的是功能键(1号键),转时校正 if(key==2)week++;//如果按下的是加1键(2号键),星期加1 if(week==8)//星期上限循环 week=1; if(key==3)week--;//如果按下的是减1键(3号键),星期减1 if(week==0) //星期下限循环 week=7; WeekToStr(week);//将校正后的星期数据转换成相对应的ASCII码 Delay1ms(50);//延时100ms LCD_GoToXY(12,1); //定位到星期在LCD屏上的显示位置 LCD_Print(Week_Str); //星期显示刷新 gotoWeek_set;//日和星期校正循环Hour_set:LCD_GoToXY(0,2); //时校正key=Key_Scan();//键盘扫描 if(key==1)gotoMinute_set; //如果按下的是功能键(1号键),转分校正 if(key==2)hour++; //如果按下的是加1键(2号键),时加1 if(hour==24) //时上限循环 hour=0; if(key==3)hour--;//如果按下的是减1键(3号键),时减1 if(hour==-1) //时下限循环 hour=23; CharToStr(hour);//将校正后的时数据转换成相对应的ASCII码 Delay1ms(50);//延时100ms LCD_Print(DATA);//时显示刷新 gotoHour_set; //时校正循环Minute_set:LCD_GoToXY(3,2); //分校正key=Key_Scan();//键盘扫描 if(key==1)gotoRET; //如果按下的是功能键(1号键),退出校正状态 if(key==2)minute++; //如果按下的是加1键(2号键),分加1 if(minute==60)//分上限循环 minute=0; if(key==3)minute--;//如果按下的是减1键(3号键),分减1 if(minute==-1) //分下限循环 minute=59; CharToStr(minute);//将校正后的分数据转换成相对应的ASCII码 Delay1ms(50);//延时100ms LCD_Print(DATA);//分显示刷新 gotoMinute_set; //分校正循环 RET:EX1=1;//开INT1中断,开始计时LCD_ShowMode(LCD_SHOW|LCD_NO_CORSOR|LCD_NO_FLASH);//关光标,光标不闪烁}/***定时器显示或设定***************************************************************/voidTimer_Show_Set(void){unsignedcharkey; unsignedcharw=10;bitTimer_set_sin=0;//定时器设定标志,为1表示处于定时器设定状态 Timer_Show_sin=1;//表示现在已处于定时器显示状态 LCD_Write(LCD_COM,LCD_CLEAR);//清屏 Delay1ms(50); LCD_Print("Timer");//在显示屏的第一行中间显示“Timer" CharToStr(Timer_hour) ; LCD_GoToXY(3,2);//定位到显示屏的第二行第四个字符 LCD_Print(DATA);//显示定时器的时钟 LCD_Print(":");//在定时器的时钟后显示“:” CharToStr(Timer_minute); LCD_Print(DATA);//显示定时器的分钟 LCD_Print("");//在定时器的分钟后空一格 if(Timer_ON_OFF==1)LCD_Print("1");//如果Timer_ON_OFF=1,则显示1,表示定时开 else LCD_Print("0");//如果Timer_ON_OFF!=1,则显示0,表示定时关 LCD_Print("");//空一格 CharToStr(Timer_Ring);//将歌曲编号转换成相对应的ASCII码 LCD_Print(DATA);//显示歌曲编号 while(--w)//在定时器显示状态下,大约在2s内没有按下 {//功能键,就返回正常显示状态 Delay1ms(100); key=Key_Scan(); if(key==1) {Timer_set_sin=1;break;} }if(Timer_set_sin)//Timer_set_sim为1,则进入定时器设定状态 {LCD_ShowMode(LCD_SHOW|LCD_CORSOR|LCD_FLASH); //开光标,光标闪烁T_hour_set:LCD_GoToXY(3,2);//定时器时设定 key=Key_Scan();//键盘扫描 if(key==1)gotoT_minute_set;//如果按下的是功能键(1号键),转定时器分设定 if(key==2)Timer_hour++; //如果按下的是加1键(2号键),定时器时加1 if(Timer_hour==24)//时上限循环 Timer_hour=0; if(key==3)Timer_hour--;//如果按下的是减1键(3号键),定时器时减1 if(Timer_hour==-1) //时下限循环 Timer_hour=23; LCD_GoToXY(3,2); CharToStr(Timer_hour);//将校正后的定时器时数据转换成对应的ASCII码 Delay1ms(50);//延时100ms LCD_Print(DATA);//定时器时显示刷新 gotoT_hour_set; //定时器时设定循环 T_minute_set:LCD_GoToXY(6,2);//定时器分设定 key=Key_Scan();//键盘扫描 if(key==1)gotoT_ON_OFF; //如果按下的是功能键(1号键),退出校正状态 if(key==2)Timer_minute++; //如果按下的是加1键(2号键),分加1 if(Timer_minute==60)//分上限循环 Timer_minute=0; if(key==3)Timer_minute--;//如果按下的是减1键(3号键),分减1 if(Timer_minute==-1) //分下限循环 Timer_minute=59; CharToStr(Timer_minute);//将校正后的分数据转换成相对应的ASCII码 Delay1ms(50);//延时100ms LCD_Print(DATA);//分显示刷新 gotoT_minute_set; //分校正循环T_ON_OFF:LCD_GoToXY(9,2);//定时器开/关设定key=Key_Scan();//键盘扫描 if(key==1)gotoT_song_set;//如果按下的是功能键(1号键),转定时器分校正 if(key==2||key==3) Timer_ON_OFF=!Timer_ON_OFF;//按下加1键或减1键,定时器开关标志 //(Timer_ON_OFF)取反,因为它只有开(1)和关(0)两种状态 Delay1ms(50);//延时100ms if(Timer_ON_OFF==1)LCD_Print("1");//Timer_ON_OFF=1,则显示1,表示定时开 elseLCD_Print("0");//如果Timer_ON_OFF=0,则显示0,表示定时关 gotoT_ON_OFF; //定时器开/关设定循环T_song_set:LCD_GoToXY(11,2);//定时器提示铃声设定key=Key_Scan();//键盘扫描 if(key==1)gotoT_RET; //如果按下功能键(1号键),退出定时器设定状态 if(key==2)Timer_Ring++; //如果按下的是加1键(2号键),铃声编号加1 if(Timer_Ring==4) Timer_Ring=1; if(key==3)Timer_Ring--;//如果按下的是减1键(3号键),铃声编号减1 if(Timer_Ring==0) Timer_Ring=3; CharToStr(Timer_Ring);//将铃声编号转换成相对应的ASCII码 Delay1ms(50);//延时100ms LCD_Print(DATA) ;//铃声编号显示刷新 Ring(); gotoT_song_set;//定时器提示铃声设定循环T_RET:Timer_set_sin=0;//退出定时器设定状态 LCD_ShowMode(LCD_SHOW|LCD_NO_CORSOR|LCD_NO_FLASH);//关光标,光标不闪烁 } Timer_Show_sin=0;//退出定时器显示状态 }/***主程序*************************************************************************/voidmain(void){floati=0;unsignedcharkeys;Delay1ms(250);LCD_Initial();//LCD1602初始化Delay1ms(100);LCD_Print("Welcome");//开机画面Delay1ms(50);LCD_GoToXY(0,2);LCD_Print("HangKaiKun");Delay1ms(250); //延时250msDelay1ms(250);//延时250msDelay1ms(250); //延时250msDelay1ms(250); //延时250msDelay1ms(250); //延时250msLCD_Write(LCD_COM,LCD_CLEAR);//清屏IT1=1;//置INT1为边沿触发模式IT0=1;//置INT0为边沿触发模式PX1=1;//置INT1为高优先级IE=0x84; //INT1开中while(1){keys=Key_Scan();//键盘扫描if(keys==1) //若为功能键,转校时程序Set_TimeAndDate(); if(keys==2) //若为加1键,转定是显示程序 Timer_Show_Set(); if(keys==4&&!Speak_sin) //若为报时键,转语音报时程序 SpeakTime(); if(Timer_sin) //判断是否响铃 Ring(); //是,则转响铃程序while(Temperature_sin){floati;i=ReadTemperature();//读取温度值IntToStr(i);//将温度值转换成相对应的ASCII码LCD_GoToXY(9,2); //定位到温度显示区LCD_Print(temp); //显示温度Temperature_sin=0; //表示温度处理完毕} }}/***中断1服务程序(用于完成计时和日历转变和刷新,以及判断定时是否已到)**************/voidint1(void)interrupt2using1{ second++;//秒加1 led_on--;//LCD背光时间值减1 if((second%2==0)&&!Timer_sin) //如果不在定时器显示或设计状态,则每隔 Temperature_sin=1

温馨提示

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

评论

0/150

提交评论