版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
-PAGE.z.《单片机技术及其应用》课程设计报告题目:万年历的设计班级:120302**:1203010216姓名:涂划同组人员:汤吉鑫、高翔、王正提指导教师:薛莲二0一四年九月二十七日目录TOC\o"1-2"\h\z\u1.课程设计目的42.课程设计题目描述和要求PAGEREF_Toc399625998\h43.课程设计报告内容53.1设计思路53.2设计过程5HYPERLINK //包含头文件main.h#include"LCD.h" //包含头文件LCD.h#include"DS1302.h" //包含头文件DS1302.h#include"word.h" //包含头文件word.h#include"lunar_calendar.h"//包含头文件lunar_calendar.h#include"buzz.h" //包含头文件buzz.hTIMEtime,tmp_time;//时间变量ALARMalarm; //时间变量bitAlarm_flag=0; //时间变量bitClock_flag=0; //时间变量bitflag=0; //时间变量sbitDQ=P2^6;//DS18B20pin温度传感器引脚//18B20unsignedcharL_18B20,H_18B20,zhengshu,shangwen,*iawen;//温度用变量unsignedintfg=0,*iaoshu_a; //温度用变量//18B20//音乐uint8codeSONG_TONE[]=//音乐数据{ 212,212,190,212,159,169,212,212,190,212,142,159,212,212,106,126,129,169,190,119,119,126,159,142,159,0};uint8codeSONG_LONG[]=//{ 9,3,12,12,12,24,9,3,12,12,12,24,9,3,12,12,12,12,12,9,3,12,12,12,24,0};//voiddelay(uint16n)//延时us级{ while(n--);}//************************************************************************///函数:LCD_Delay()//描述:延时tms函数//参数:t//返回:无//备注:11.0592MHZt=1延时时间约1ms//版本:2011/01/01Firstversion//************************************************************************/voidDelay_nms(unsignedintt){ unsignedinti,j; for(i=0;i<t;i++) //循环t次 for(j=0;j<113;j++) //循环113次每次约3us ;}///////////////////////////////////////////////////播放音乐voidPlayMusic(){ uint16i=0,j,k; while(SONG_LONG[i]!=0||SONG_TONE[i]!=0) { for(j=0;j<SONG_LONG[i]*20;j++) //读取数据 { BEEP=~BEEP; //蜂鸣器取反 for(k=0;k<SONG_TONE[i]/3;k++);//读取数据 } Delay_nms(10); //延时10ms i++; //累加1 } BEEP=1; //关闭蜂鸣器}//////////////////////////////////////////////////*DS18B20*/voiddelay_18B20(unsignedinti){ while(i--);}voidInit_DS18B20(void){ unsignedchar*=0; DQ=1;//DQ复位 delay_18B20(8);//稍做延时 DQ=0;//单片机将DQ拉低 delay_18B20(80);//精确延时大于480us DQ=1;//拉高总线 delay_18B20(14);//延时 *=DQ;//稍做延时后如果*=0则初始化成功*=1则初始化失败 delay_18B20(20);//延时}voidWriteOneChar(unsignedchardat){ unsignedchari=0; for(i=8;i>0;i--)//循环8次 { DQ=0; //DQ输出0 DQ=dat&0*01; delay_18B20(5);//延时 DQ=1;//DQ输出1 dat>>=1;//右移位}}unsignedcharReadOneChar(void){ unsignedchari=0; unsignedchardat=0; for(i=8;i>0;i--) { DQ=0; //给脉冲信号 dat>>=1;//移位 DQ=1; //给脉冲信号 if(DQ)//如果DQ=1,执行下面的语句 dat|=0*80; delay_18B20(4);//延时 } return(dat); //返回数据}voidread_18B20(void){ Init_DS18B20(); WriteOneChar(0*CC); //跳过读序号列号的操作 WriteOneChar(0*44); //启动温度转换 delay_18B20(100);//thismessageisweryimportant Init_DS18B20(); //初始化DS18B20 WriteOneChar(0*CC); //跳过读序号列号的操作 WriteOneChar(0*BE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度 delay_18B20(100); //延时 L_18B20=ReadOneChar(); //读取低八位数据 H_18B20=ReadOneChar(); //读取高八位数据 zhengshu=L_18B20/16+H_18B20*16;//整数部分 *iaoshu_a=(L_18B20&0*0f)*10/16;//小数第一位}//DS18B20//////////////////////////////////////////////////**按键扫描*/int8scan_key(void){ int8val=-1; //初始化键值为-1 if(KeyIn1==0) //判断=0?有无按键按键 { val=1; //键值=1 while(KeyIn1==0);//等待按键释放 } elseif(KeyIn2==0) //判断=0?有无按键按键 { val=2; //键值=2 while(KeyIn2==0);//等待按键释放 } elseif(KeyIn3==0) //判断=0?有无按键按键 { val=3; //键值=3 while(KeyIn3==0);//等待按键释放 } //if(val>0) //buzzer_sound(); returnval; //返回键值}/**主界面框架*/voidmain_frame(void){ play32(80,2,10);//显示数 play32(32,2,10);//显示数 play8(16,0,S_*ie);//显示斜线 play8(40,0,S_*ie);//显示斜线// play8(96,0,RH);// play8(120,0,S_percent); play8(120,6,S_du);//显示度}/**主界面*/voidmain_show(bitrefresh){uint8lunar[2]; if(refresh) read_time((uint8*)&time);//读时间函数//时间 if(refresh||(time.sec!=tmp_time.sec))//秒更新 { tmp_time.sec=time.sec; //读取秒数据 play8_num(104,6,zhengshu); //温度显示 play32_num(96,2,time.sec); //显示秒 } if(refresh) main_frame();//刷新界面 if(refresh||(time.min!=tmp_time.min))//分更新 { if(!refresh) flag=0; tmp_time.min=time.min;//读取分 play32_num(48,2,time.min);//显示分 } if(refresh||(time.hour!=tmp_time.hour))//时更新 { if((!refresh)&&(Clock_flag)) alarm_sound(); tmp_time.hour=time.hour; //读取时 play32_num(0,2,time.hour); //显示时 } if(refresh||(time.day!=tmp_time.day))//日更新 { tmp_time.day=time.day; //读取日 play8_num(48,0,time.day); //显示日 //农历 turn_lunar_calendar(&time,lunar); play_lunar_calendar(0,6,lunar[0],lunar[1]); } if(refresh||(time.week!=tmp_time.week))//周更新 { tmp_time.week=time.week; //读取周 play_week(68,0,time.week); //显示周 } if(refresh||(time.mon!=tmp_time.mon))//月更新 { tmp_time.mon=time.mon; //读取月 play8_num(24,0,time.mon); //显示月 //农历 turn_lunar_calendar(&time,lunar); //转换农历月 play_lunar_calendar(0,6,lunar[0],lunar[1]); //显示农历月 } if(refresh||(time.year!=tmp_time.year))//年更新 { tmp_time.year=time.year; //读取年数据 play8_num(0,0,time.year); //显示年 //农历 turn_lunar_calendar(&time,lunar); //转换农历年 play_lunar_calendar(0,6,lunar[0],lunar[1]); //显示农历年 }}/**主机界面设置*/voidmain_set(void){ int8key_val,state=1; //变量 play32_num(96,2|0*80,time.sec); //显示秒 while(1) { key_val=scan_key();//键盘扫描 if(key_val==1)//设置 { if(state>=7) state=0; else state++; //位置状态加1 set_time((uint8*)&time); //设置时间 main_show(1); //显示主界面 switch(state) { case0: set_time((uint8*)&time);break;//设置时间 case1: play32_num(96,2|0*80,time.sec);break;//显示秒 case2: play32_num(48,2|0*80,time.min);break;//显示分 case3: play32_num(0,2|0*80,time.hour);break;//显示时 case4: play_week(68,0|0*80,time.week);break;//显示周 case5: play8_num(48,0|0*80,time.day);break;//显示日 case6: play8_num(24,0|0*80,time.mon);break;//显示月 case7: play8_num(0,0|0*80,time.year);break;//显示年 default:break; //退出循环 } } elseif(key_val>1)//按键值大于1 { if(state==1)//位置1设置秒 { if(key_val==3)//加按下? time.sec++;//秒加1 else time.sec--;//秒减1 if(time.sec>=60) time.sec=0; elseif(time.sec<0) time.sec=59; play32_num(96,2|0*80,time.sec);//显示秒 } elseif(state==2) //位置2设置分 { if(key_val==3) //加按下? time.min++; //加1 else time.min--; //减1 if(time.min>=60) time.min=0; elseif(time.min<0) time.min=59; play32_num(48,2|0*80,time.min);//显示分 } elseif(state==3) //位置3设置时 { if(key_val==3) //加按下? time.hour++; //加1 else time.hour--; //减1 if(time.hour>=24) time.hour=0; elseif(time.hour<0) time.hour=23; play32_num(0,2|0*80,time.hour);//显示时 } elseif(state==4) //位置4设置周 { if(key_val==3) //加按下? time.week++; //加1 else time.week--; //减1 if(time.week>=8) time.week=1; elseif(time.week<1) time.week=7; play_week(68,0|0*80,time.week);//显示周 } elseif(state==5)//位置5设置日 { if(key_val==3) //加按下? time.day++; //加1 else time.day--; //减1 if(time.day>=32) time.day=1; elseif(time.day<1) time.day=31; play8_num(48,0|0*80,time.day);//显示日 } elseif(state==6) //位置6设置月 { if(key_val==3) //加按下? time.mon++; //加1 else time.mon--; //减1 if(time.mon>=13) time.mon=1; elseif(time.mon<1) time.mon=12; play8_num(24,0|0*80,time.mon);//显示月 } elseif(state==7) //位置7设置年 { if(key_val==3) //加按下? time.year++; //加1 else time.year--; //减1 if(time.year>=100) time.year=0; //0年 elseif(time.year<0) time.year=99; //99年 play8_num(0,0|0*80,time.year);//显示年 } else { break; //退出循环 } } if(state==0) break; //退出循环 }}/**闹钟界面显示*/voidalarm_show(void){ int8key_val,state=1; uint32t=0; play16(0,0,nao); //显示闹 play16(16,0,zhong); //钟 play16(32,0,maohao); //冒号: if(Alarm_flag) play16(48,0,kai); //开 else play16(48,0,guan);//关 play32_num(32,2,alarm.hour); //时 play32(64,2,10); //冒号 play32_num(80,2,alarm.min); //分 play16(0,6,zheng); //显示整 play16(16,6,dian); //显示点 play16(32,6,bao); //显示报 play16(48,6,shi); //显示时 play16(64,6,maohao); //显示冒号 if(Clock_flag) play16(80,6,kai); //显示开 else play16(80,6,guan); //显示关 for(t=0;t<30000;t++) { key_val=scan_key(); //键盘扫描获取键值 if(key_val>1) //判断数据 break; elseif(key_val==1) //判断数据 { if(Alarm_flag) play16(48,0|0*80,kai);//显示开 else play16(48,0|0*80,guan);//关 while(1) { key_val=scan_key();//键盘扫描获取键值 if(key_val==1) //完成设置 { if(state>=4) //判断数据 state=0; else state++; if(Alarm_flag) play16(48,0,kai); //显示开 else play16(48,0,guan); //显示关 play32_num(32,2,alarm.hour);//闹钟时显示 play32_num(80,2,alarm.min); //闹钟分显示 if(Clock_flag) play16(80,6,kai); //显示开 else play16(80,6,guan); //显示关 switch(state)//判断数据 { case1: if(Alarm_flag)//判断数据 play16(48,0|0*80,kai); //显示开 else play16(48,0|0*80,guan); //显示关 break; case2: play32_num(80,2|0*80,alarm.min);//闹钟分显示 break; case3: play32_num(32,2|0*80,alarm.hour);//闹钟时显示 break; case4: if(Clock_flag)//判断数据 play16(80,6|0*80,kai);//显示开 else play16(80,6|0*80,guan);//显示关 break; default:break; } } elseif(key_val>1)//判断数据 { if(state==1)//判断数据 { Alarm_flag=~Alarm_flag; if(Alarm_flag) play16(48,0|0*80,kai);//显示开 else play16(48,0|0*80,guan);//显示关 } elseif
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度灰土地面施工工程风险评估与管理合同
- 二零二四年度知识产权许可合同标的:专利技术的使用权3篇
- 2025年度会议场地租赁合同范本(含设施设备)
- 2025年度新型建筑材料石子采购合同
- 2025年度环卫公司城市绿化养护服务劳动合同书
- 2025年度化肥运输成本优化服务合同
- 住宅销售专项经纪服务合同范本版
- 2025版湿地草地生态补偿与植被重建合同3篇
- 井盖购销合同 标准版
- 2025年度脚手架租赁与施工现场环境治理合同4篇
- 二年级数学上册100道口算题大全(每日一练共12份)
- 河南省郑州市2023-2024学年高一下学期6月期末数学试题(无答案)
- 七年级数学垂线1
- JTG C10-2007 公路勘测规范
- 糖尿病酮症酸中毒护理查房演示课件
- 重大危险源的风险评估模型
- 采购支出管理制度
- 湖北十堰燃气爆炸事故案例
- 混凝土试件台账
- 人机料法环测检查表
- 中国数字货运发展报告
评论
0/150
提交评论