带温度显示的万年历 数码管显示
- 格式:doc
- 大小:1.73 MB
- 文档页数:35
设计报告万年历时钟的设计班级: 09光电<2>班专业:光电子技术姓名:阮军峰学号: 0906010234 完成日期:2011年06月11日一、设计目的:1、掌握C51程序用于实践并实现相应的功能;2、掌握时钟程序的使用方法;3、掌握时间函数的使用方法;4、掌握键盘的程序使用方法;二、设计任务:设计一个智能化万年历时钟电路,LED数码管作为电路的显示部分,按钮开关作为调时部分,通过与单片机连接数码管动态显示年、月、日、时、分、秒、星期、温度。
并能准确计算闰年闰月的显示。
三、设计要求:通过与单片机连接数码管动态显示年、月、日、时、分、秒、星期等功能,并能准确计算闰年闰月的显示,三个个按钮连接P3.0、P3.1、P3.2可以精确调整每一个时间数值,通过对所设计的万年历时钟电路进行实验测试,达到了动态显示时间,随时调整时间等技术指标。
四、系统方案设计:1、系统总体设计:1) 原理构成框图本设计用STC89C51作为核心控制部分,外接晶振电路和74HC154,74LS138作为位选扩展电路,P3.0、 P3.1 、P3.2接三个个按钮作为时间调整部分,以两个17个数码管作为显示部分,P2口作为位选,P0口作为数据输出部分。
具体框图如图1所示:图1 原理框图2) 主程序的设计系统程序采用C语言按模块化方式进行设计,然后通过KeilC51L 软件开发平台将程序转变成十六进制程序语言,得到HEX文件,接着使用Proteous进行仿真,其次,按照Proteous的仿真电路图,在Protel99SE中完成电路板的逻辑布局及布线。
3) 时间调整电路的设计采用按键设计,独立式按键直接与单片机I/O口相连构成键盘,每个按键不会相互影响,按下模式可以选择年月日时分秒星期。
按下(+)(-)进行调试,程序如下:while(1){P3_0=1;if(P3_0==0){delay(10);if(P3_0==0)//如果按键被按下{Kdelay();if(P3_0==0)//确定按键按下{while(P3_0==0); // 等待按键放开cursor++;if(cursor>=9){cursor=0;}//如果cursor大于9则cursor=0if(P1_0==0){cursor=0;}} }}P3_1=1;if(P3_1==0){delay(10);if(P3_1==0) //如果按键被按下{Kdelay();if(P3_1==0) //确定按键按下{if(cursor==1){sec++;//如果cursor=1则按键按下秒数加一if(sec==60)sec=0;//如果秒数等于60秒则回到0开始}if(cursor==2){min++;//如果cursor=2则按键按下分数加一if(min==60)min=0; 如果分数等于60分则回到0开始}if(cursor==3){hour++;//如果cursor=3则按键按下时数加一if(hour==24)hour=0; //如果时数等于24时则回到0开始}if(cursor==4){day++;//如果cursor=4则按键按下天数加一if(day==31)day=0; //如果天数等于31天则回到0开始}if(cursor==5){month++;//如果cursor=5则按键按下月数加一if(month==13)month=0; //如果月数等于13月则回到0开始}if(cursor==6){yearl++;//如果cursor=6则按键按下年数低位加一if(yearl==100)yearl=0; //如果年数等于100则回到0开始}if(cursor==7){yearh++;//如果cursor=7则按键按下年数高位加一if(yearh==30)yearh=20; //如果年数大于30则回到0开始}if(cursor==8){week++;//如果cursor=8则按键按下星期数加一if(week==8)week=1; //如果星期数等于8则回到0开始}}while(P3_1==0);}}P3_2=1; //写入时先写1if(P3_2==0){//按键按下delay(10);//延时10个毫秒if(P3_2==0)//确定按键按下{Kdelay();if(P3_2==0){if(cursor==1){sec--;//如果cursor=1则按键按下秒数减一if(sec==0)sec=59; //如果秒数小于0则回到59开始}if(cursor==2){min--;//如果cursor=2则按键按下分数减一if(min==0)min=59; //如果分数小于0则回到59开始}if(cursor==3){hour--;//如果cursor=3则按键按下时数减一if(hour==0)hour=23; //如果时数小于0则回到23开始}if(cursor==4){day--;//如果cursor=4则按键按下天数减一if(day==0)day=31; //如果天数小于0则回到31开始}if(cursor==5){month--;//如果cursor=5则按键按下月数减一if(month==0)month=12; //如果月数小于0则回到12开始}if(cursor==6){yearl--;//如果cursor=6则按键按下年的低位数减一if(yearl==0)yearl=99; //如果年数小于0则回到99开始}if(cursor==7){yearh--;//如果cursor=7则按键按下年的高位数减一if(yearh==20)yearh=30; //如果年数小于0则回到30开始}if(cursor==8){week--;//如果cursor=8则按键按下秒星期减一if(week==0)week=7; //如果星期数小于0则回到7开始}while(P3_2==0);}}}i=ReadTemperature();所连线路和单片机接口仿真图如图3所示:图3 仿真按键4)温度采集部分:DS18B20温度传感器,测温范围-55℃~+125℃,固有测温分辨率0.5℃。
独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
DS18B20的采集数据通过DQ传入单片机,单片机读取数据后将数据输出!如图所示:程序如下:ReadOneChar(void){unsigned char i=0;// 定义i用于循环unsigned char dat = 0;// 读取的8位数据for (i=8;i>0;i--)//8次循环{DQ = 0;// 拉低DQ总线开始读时序dat>>=1;// dat左移一位DQ = 1; //释放DQ总线if(DQ)// 如果DQ=1,执dat|=0x80;(0x80即第7位为1,如果DQ为1,即读取的数据为1,将dat的第7为置1,然后dat>>=1,循环8次结束,dat 即为读取的数据)//DQ=0,就跳过dat|=0x80;Tdelay(4);// 延时以完成此次读时序,之后再读下一数据}return(dat); 返回读取的dat}//写一个字节WriteOneChar(unsigned char dat){unsigned char i=0;//for (i=8; i>0; i--)//{DQ = 0;//DQ = dat&0x01;//Tdelay(5);//延时以完成此次读时序,之后再读下一数据DQ = 1;//dat>>=1;//}}//读取温度ReadTemperature(void){unsigned char a=0;unsigned char b=0;unsigned int t=0;float tt=0;//Init_DS18B20();WriteOneChar(0xCC);// 写指令,跳过ROM,WriteOneChar(0x44);// 启动温度转换Init_DS18B20();WriteOneChar(0xCC);// 写指令,跳过ROM,WriteOneChar(0xBE);// 写指令,读暂存存储器a=ReadOneChar();//读低8位b=ReadOneChar();//读高8位t=b;//t<<=8;//t=t|a;//tt=t*0.0625;//t= tt*10+0.5;//return(t); //获得0.01°C 的精度并返回}5) LED数码管的选择LED数码管分为共阴和共阳两种,以利用STC89C51的P0口作为LED显示的数据部分,以P2口的七个口作为显示部分的位选,通过三八译码器和4-16译码器扩展为17位的位选分别接在一个四位数码管和13个数码管的位选部分。
详细电路图如图4-5所示:程序如下:P2=0xF0;P0=L1;delay(1); //yearh P2=0xF1;P0=L2;delay(1); //yearhif(cursor==8){P2=0x1F|a;P0=L17;delay(1);}else{P2=0x1F;P0=L17;delay(1);}//weekif(cursor==6){P2=0xF2|a;P0=L3;delay(1);}else{P2=0xF2;P0=L3;delay(1);} //yearlif(cursor==6) {P2=0xF3|a;P0=L4;delay(1);}else{P2=0xF3;P0=L4;delay(1);} //yearlif(cursor==5) {P2=0xF4|a;P0=L5;delay(1);}else{P2=0xF4;P0=L5;delay(1);} //monthif(cursor==5) {P2=0xF5|a;P0=L6;delay(1);}else{P2=0xF5;P0=L6;delay(1);} //monthif(cursor==4) {P2=0xF6|a;P0=L7;delay(1);}else{P2=0xF6;P0=L7;delay(1);} //dayif(cursor==4) {P2=0xF7|a;P0=L8;delay(1);}else{P2=0xF7;P0=L8;delay(1);} //dayP2=0xFF;if(cursor==3) {P2=0xF8|a;P0=L9;delay(1);}else{P2=0xF8;P0=L9;delay(1);} //hourif(cursor==3) {P2=0xF9|a;P0=L10;delay(1);else{P2=0xF9;P0=L10;delay(1);} //hourif(cursor==2) {P2=0xFA|a;P0=L11;delay(1);}else{P2=0xFA;P0=L11;delay(1);} //minif(cursor==2) {P2=0xFB|a;P0=L12;delay(1);}else{P2=0xFB;P0=L12;delay(1);} //minif(cursor==1) {P2=0xFC|a;P0=L13;delay(1);}else{P2=0xFC;P0=L13;delay(1);} //secif(cursor==1)P2=0xFD|a;P0=L14;delay(1);}else{P2=0xFD;P0=L14;delay(1);} //secP2=0xFE;P0=L15;delay(1); //tempP2=0x0F;P0=L16;delay(1); //tempP2=0xFF;}图5 日期显示6) 仿真实验整个电路仿真图如下图6所示所示:图6 仿真电路图7) 实物的制作与调试(1)原理图的绘制与PCB的制作(2)原理图的绘制(3)在Protel99se中先新建一个工程,把所需要的元件载入到文档里面。