版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.Word资料单片机实验项目中期报告多功能万年历课程名称:单片机原理及应用组别:第二十组小组成员:****************班级:****************总体设计由于我们实验是在网上购买的现成的开发板来学习和使用的,故在方案的选择上也只能限于开发板设计好的电路和芯片。系统分为主控模块、时钟电路模块、温度检测模块,按键扫描模块,LCD显示模块,电源电路、复位电路、晶振电路等模块。该设计采用STC89C52芯片实现单片机万年历功能。设计应具有时间显示,年月日显示等功能。依据需求可扩展实现农历显示功能。运用proteus进行仿真,实现电路仿真。运用C语言实现软件相关功能。焊接并完成作品调试。详细设计各模块、元器件的型号及功能主控模块采用AT89C52单片机,STC89C52,ATMEL的51系列单片机。支持串口下载,使用非常方便,且具有很大的价格优势。缺点是仅支持串口下载,不支持在线下载,使用中会有些不方便。按键模块用四个按键,用于调整时间,显示模块采用LCD1602,时钟电路模块采用DS1302时钟芯片实现对时间、日期的操作,温度模块使用18B20实现度温度的操作。流程图软件仿真电路图实物连接图目前实现的功能(录制视频)小组分工情况李彪:连接电路,进行程序的烧写。王进:收集资料,参与相关连接。于红红:程序读写,对实物的介绍。进度安排(截止时间12月23日)项目实验已完成近70%,有些功能还不能实现,有待完善,预计二十号完成。附录(程序)#include<reg52.h> //调用单片机头文件#defineucharunsignedchar//无符号字符型宏定义 变量范围0~255#defineuintunsignedint //无符号整型宏定义 变量范围0~65535#include"eeprom52.h"#include"nongli.h"bitflag_200ms;bitflag_100ms;sbitbeep=P3^7; //蜂鸣器定义bitflag_beep_en;uintclock_value;//用作闹钟用的sbitdq=P3^1; //18b20IO口的定义sbithw_P32=P3^2; //红外遥控IO口的定义bitflag_jiema_en=0;//红外解码成功标志位ucharhw_table[4]; //红外解码数据缓冲区uintt_high=300,t_low=100;uinttemperature;//温度变量ucharflag_nl;//农历阳历显示标志位/********红外遥控器按键的操作码************** 红外遥控对应的数据字节hw_table[2] 454647 444043 071509 16190d 0c185e 081c5a 42524a*******************************************/ucharmenu_1,menu_2;ucharkey_time,flag_value;//用做连加的中间变量bitkey_500ms;ucharn_nian,n_yue,n_ri; //农历显示的函数#include"ds1302.h"#include"lcd1602.h"/***********100us的延时函数***12M晶振**************/voiddelay_100us(ucharz){ //12Mucharx,y;for(x=0;x<z;x++)for(y=0;y<20;y++);}/******************把数据保存到单片机内部eeprom中******************/voidwrite_eeprom(){ SectorErase(0x2000); byte_write(0x2000,fen1); byte_write(0x2001,shi1); byte_write(0x2002,open1); byte_write(0x2003,t_high%256); byte_write(0x2004,t_high/256); byte_write(0x2005,t_low%256); byte_write(0x2006,t_low/256); byte_write(0x2058,a_a); }/******************把数据从单片机内部eeprom中读出来*****************/voidread_eeprom(){ fen1=byte_read(0x2000); shi1=byte_read(0x2001); open1=byte_read(0x2002); t_high=byte_read(0x2004); t_high<<=8; t_high|=byte_read(0x2003); t_low=byte_read(0x2006); t_low<<=8; t_low|=byte_read(0x2005); a_a=byte_read(0x2058);}/**************开机自检eeprom初始化*****************/voidinit_eeprom(){ read_eeprom(); //先读 if(a_a!=43) //新的单片机初始单片机内问eeprom { fen1=3; shi1=8; open1=1; t_high=350; t_low=100; a_a=34; write_eeprom(); //保存数据 } }/***********************18b20初始化函数*****************************/voidinit_18b20(){ bitq; dq=1; //把总线拿高 delay_uint(1); //15us dq=0; //给复位脉冲 delay_uint(80); //750us dq=1; //把总线拿高等待 delay_uint(10); //110us q=dq; //读取18b20初始化信号 delay_uint(20); //200us dq=1; //把总线拿高释放总线}/*************写18b20内的数据***************/voidwrite_18b20(uchardat){ uchari; for(i=0;i<8;i++) { //写数据是低位开始 dq=0; //把总线拿低写时间隙开始 dq=dat&0x01;//向18b20总线写数据了 delay_uint(5); //60us dq=1; //释放总线 dat>>=1; } }/*************读取18b20内的数据***************/ucharread_18b20(){ uchari,value; for(i=0;i<8;i++) { dq=0; //把总线拿低读时间隙开始 value>>=1; //读数据是低位开始 dq=1; //释放总线 if(dq==1) //开始读写数据 value|=0x01; delay_uint(5); //60us 读一个时间隙最少要保持60us的时间 } returnvalue; //返回数据}/*************读取温度的值读出来的是小数***************/uintread_temp(){ uintvalue; ucharlow; //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序 init_18b20(); //初始化18b20 write_18b20(0xcc); //跳过64位ROM write_18b20(0x44); //启动一次温度转换命令 delay_uint(50); //500us init_18b20(); //初始化18b20 write_18b20(0xcc); //跳过64位ROM write_18b20(0xbe); //发出读取暂存器命令 EA=0; low=read_18b20(); //读温度低字节 value=read_18b20();//读温度高字节 EA=1; value<<=8; //把温度的高位左移8位 value|=low; //把读出的温度低位放到value的低八位中 value*=0.625; //转换到温度值小数 returnvalue; //返回读出的温度带小数}/******************1ms延时函数*******************/voiddelay_1ms(uintq){ uinti,j; for(i=0;i<q;i++) for(j=0;j<120;j++);}/******************写星期函数*******************/voidwrite_week(ucharhang,ucharadd,ucharweek)//写星期函数{ if(hang==1) write_com(0x80+add); else write_com(0x80+0x40+add); switch(week) { case1:write_data('M');//星期数为1时,显示 write_data('O'); write_data('N'); break; case2:write_data('T');//星期数据为2时显示 write_data('U'); write_data('E'); break; case3:write_data('W');//星期数据为3时显示 write_data('E'); write_data('D'); break; case4:write_data('T');//星期数据为4是显示 write_data('H'); write_data('U'); break; case5:write_data('F');//星期数据为5时显示 write_data('R'); write_data('I'); break; case6:write_data('S');//星期数据为6时显示 write_data('T'); write_data('A'); break; case7:write_data('S');//星期数据为7时显示 write_data('U'); write_data('N'); break; }}/*************时钟显示***************/voidinit_1602_ds1302(){ write_sfm2_ds1302(1,1,shi); //显示时 write_sfm2_ds1302(1,4,fen); //显示分 write_sfm2_ds1302(1,7,miao); //显示秒 write_week(2,12,week);// write_sfm1(1,14,week); //显示星期 write_sfm3_18B20(1,11,temperature); //显示温度 if(flag_nl==0)//显示阳历 { write_sfm2_ds1302(2,2,nian);//显示年 write_sfm2_ds1302(2,5,yue); //显示月 write_sfm2_ds1302(2,8,ri); //显示日 } else //显示农历 { write_sfm2_ds1302(2,2,n_nian); //显示年 write_sfm2_ds1302(2,5,n_yue); //显示月 write_sfm2_ds1302(2,8,n_ri); //显示日 } } /*************定时器0初始化程序***************/voidinit_time0() { EA=1; //开总中断 TMOD=0X01; //定时器0、工作方式1 ET0=1; //开定时器0中断 TR0=1; //允许定时器0定时}/*************闹钟报警函数***************/voidmenu_dis(){ staticucharmm,value; if(flag_100ms==1) //100ms执行一次 { flag_100ms=0; if(open1==1) //如果闹钟打开 { if((miao==0)&&(fen==fen1)&&(shi==shi1)) { flag_beep_en=1; //有报警打开蜂鸣器响的标志位 } if(flag_beep_en==1) //闹钟以被打开 { clock_value++; if(clock_value<=30) beep=~beep; //蜂鸣器叫3秒 //1分钟后自动关闭闹钟 value++; if(value>=10) { value=0; mm++; if(mm>=60) { mm=0; flag_beep_en=0; beep=1; } } } } }}/********************独立按键程序*****************/ucharkey_can; //按键值voidkey() //独立按键程序{ staticucharkey_new; key_can=20;//按键值还原 P3|=0x78;//对应的按键IO口输出为1 if((P3&0x78)!=0x78) //按键按下 { delay_1ms(1); //按键消抖动 if(((P3&0x78)!=0x78)&&(key_new==1)) { //确认是按键按下 key_new=0; switch(P3&0x78) { case0x70:key_can=4;break; //得到按键值 case0x68:key_can=3;break; //得到按键值 case0x58:key_can=2;break; //得到按键值 case0x38:key_can=1;break; //得到按键值 }// write_sfm2(1,0,key_can); //显示按键值 } } else key_new=1; }/**********************设置函数************************/voidkey_with(){ if(key_can==1) //设置键 { menu_1++; if(menu_1==4) //设置时间 { menu_2=1; write_string(1,0,"--W:"); write_string(2,0,"20--"); } if(menu_1==2) //设置闹钟 { menu_2=1; write_string(1,0,"setclock"); write_string(2,0,"Y00:00"); } if(menu_1==3) //设置温度上下限 { menu_2=1; write_string(1,0,"setwendu"); write_string(2,0,"H:.L:."); write_zifu(2,6,0xdf);//显示度 write_zifu(2,14,0xdf);//显示度 } if(menu_1>2)//回到正常显示 { menu_1=0; write_guanbiao(1,2,0); //关闭光标 init_1602_dis_csf();//初始化液晶显示 } } if(key_can==5) { menu_1=0; write_guanbiao(1,2,0); //关闭光标 init_1602_dis_csf();//初始化液晶显示 } if(key_can==2) //选择键 { flag_200ms=1; if(menu_1==1) //设置时间 { menu_2++; if(menu_2>7) menu_2=1; } if(menu_1==2) //设置闹钟 { menu_2++; if(menu_2>3) menu_2=1; } } if(menu_1==1) { if(menu_2==1) //设置时 { if(key_can==3) //加 { shi+=0x01; if((shi&0x0f)>=0x0a) shi=(shi&0xf0)+0x10; if(shi>=0x24) shi=0; } if(key_can==4) //减 { if(shi==0x00) shi=0x24; if((shi&0x0f)==0x00) shi=(shi|0x0a)-0x10; shi--; } } if(menu_2==2) //设置分 { if(key_can==3) //加 { fen+=0x01; if((fen&0x0f)>=0x0a) fen=(fen&0xf0)+0x10; if(fen>=0x60) fen=0; } if(key_can==4) //减 { if(fen==0x00) fen=0x5a; if((fen&0x0f)==0x00) fen=(fen|0x0a)-0x10; fen--; } } if(menu_2==3) //设置秒 { if(key_can==3) //加 { miao+=0x01; if((miao&0x0f)>=0x0a) miao=(miao&0xf0)+0x10; if(miao>=0x60) miao=0; } if(key_can==4) //减 { if(miao==0x00) miao=0x5a; if((miao&0x0f)==0x00) miao=(miao|0x0a)-0x10; miao--; } } if(menu_2==4) //设置星期 { if(key_can==3) //加 { week+=0x01; if((week&0x0f)>=0x0a) week=(week&0xf0)+0x10; if(week>=0x08) week=1; } if(key_can==4) //减 { if(week==0x01) week=0x08; if((week&0x0f)==0x00) week=(week|0x0a)-0x10; week--; } } if(menu_2==5) //设置年 { if(key_can==3) //加 { nian+=0x01; if((nian&0x0f)>=0x0a) nian=(nian&0xf0)+0x10; if(nian>=0x9a) nian=1; } if(key_can==4) //减 { if(nian==0x01) nian=0x9a; if((nian&0x0f)==0x00) nian=(nian|0x0a)-0x10; nian--; } } if(menu_2==6) //设置月 { if(key_can==3) //加 { yue+=0x01; if((yue&0x0f)>=0x0a) yue=(yue&0xf0)+0x10; if(yue>=0x13) yue=1; } if(key_can==4) //减 { if(yue==0x01) yue=0x13; if((yue&0x0f)==0x00) yue=(yue|0x0a)-0x10; yue--; } } if(menu_2==7) //设置日 { if(key_can==3) //加 { ri+=0x01; if((ri&0x0f)>=0x0a) ri=(ri&0xf0)+0x10; if(ri>=0x32) ri=0; } if(key_can==4) //减 { if(ri==0x01) ri=0x32; if((ri&0x0f)==0x00) ri=(ri|0x0a)-0x10; ri--; } } write_sfm2_ds1302(1,2,shi); //显示时 write_sfm2_ds1302(1,5,fen); //显示分 write_sfm2_ds1302(1,8,miao); //显示秒 write_sfm1(1,14,week); //显示星期 write_sfm2_ds1302(2,3,nian); //显示年 write_sfm2_ds1302(2,6,yue); //显示月 write_sfm2_ds1302(2,9,ri); //显示日 switch(menu_2) //光标显示 { case1:write_guanbiao(1,2,1);break; case2:write_guanbiao(1,5,1);break; case3:write_guanbiao(1,8,1);break; case4:write_guanbiao(1,14,1);break; case5:write_guanbiao(2,3,1);break; case6:write_guanbiao(2,6,1);break; case7:write_guanbiao(2,9,1);break; } write_time(); //把时间写进去 } /***************设置闹钟*********************/ if(menu_1==2) { if(menu_2==1) //设置闹钟开关 { if(key_can==3) { open1=1; //闹钟开 } if(key_can==4) { open1=0; //闹钟关 } } if(menu_2==2) //设置闹钟时 { if(key_can==3) //加 { shi1+=0x01; if((shi1&0x0f)>=0x0a) shi1=(shi1&0xf0)+0x10; if(shi1>=0x24) shi1=0; } if(key_can==4) //减 { if(shi1==0x00) shi1=0x5a; if((shi1&0x0f)==0x00) shi1=(shi1|0x0a)-0x10; shi1--; } } if(menu_2==3) //设置秒 { if(key_can==3) //加 { fen1+=0x01; if((fen1&0x0f)>=0x0a) fen1=(fen1&0xf0)+0x10; if(fen1>=0x60) fen1=0; } if(key_can==4) //减 { if(fen1==0x00) fen1=0x5a; if((fen1&0x0f)==0x00) fen1=(fen1|0x0a)-0x10; fen1--; } } if(open1==1) write_string(2,4,"Y"); else write_string(2,4,"N"); write_sfm2_ds1302(2,7,shi1); //显示闹钟时 write_sfm2_ds1302(2,10,fen1); //显示闹钟分 switch(menu_2) //光标显示 { case1:write_guanbiao(2,4,1);break; case2:write_guanbiao(2,7,1);break; case3:write_guanbiao(2,10,1);break; } write_eeprom();//保存闹钟时间 } }/***********红外遥控程序**************/voidhongwai_dis(){ if(flag_jiema_en==1) { flag_jiema_en=0; beep=0; //蜂鸣器叫一声 delay_1ms(50); beep=1; switch(hw_table[2]) { case0x40:key_can=1;break;//得到按键值 case0x44:key_can=2;break;//得到按键值 case0x15:key_can=3;break;//得到按键值 case0x07:key_can=4;break;//得到按键值 case0x43:key_can=5;break;//得到按键值 } key_with(); hw_table[2]=0; //把数据清零 }}/***********外部中断0初始化程序****************/voidinit_int0() //外部中断0初始化程序{ EX0=1; //允许外部中断0中断 EA=1; //开总中断 IT0=1; //外部中断0负跳变中断}/*****************主函数********************/voidmain(){ beep=0; //开机叫一声 delay_1ms(150); P0=P1=P2=P3=0xff; //单片机IO口初始化为1 init_ds1302(); //ds1302初始化 init_1602(); //lcd1602初始化 init_1602_dis_csf();//lcd1602初始化显示 init_eeprom();//开始初始化保存的数据 temperature=read_temp(); //先读出温度的值 delay_1ms(650); temperature=read_temp(); //先读出温度的值 while(1) { key(); //按键程序 if(key_can<10) { if(flag_beep_en==0)//只有闹钟关了的时候才能进入设置 key_with(); else { flag_beep_en=0; //按下任意键可关闭闹钟 beep=1; clock_value=0; read_time
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年钢筋工程专项劳务分包协议范本版B版
- 2024年高科技设备回购担保及研发支持合同2篇
- 2025年度大件运输许可电子档案管理规范3篇
- 2024年设备技术转让协议2篇
- 2024年甲乙双方标准建设工程施工合同示范文本的签订
- 2025年度离婚后子女抚养费及监护权支付协议3篇
- 2025年度宾馆客户关系管理系统开发与实施合同3篇
- 2025年度化妆品店铺转让及销售渠道拓展合同3篇
- 2025年度按揭中二手房买卖合同范本:全装修交付版3篇
- 2024年版地方政府土地征收补偿合同标准文本
- 事故处理程序全套
- 2023年社工考试《社会工作综合能力》(初级)真题(含答案)
- 2023-2024学年江苏省徐州市九年级(上)期中物理试卷
- 硅石项目建议书范本
- 起重机械安全生产隐患课件
- 概率论在金融风险评估中的应用研究
- 信访十种情形追责问责制度
- 大型储罐施工工法倒装法安装
- 手机归属地表格
- 一年级上册数学思维教材
- GB/T 24479-2023火灾情况下的电梯特性
评论
0/150
提交评论