您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 单片机课程设计电子时钟实验-可定时调闹钟-用LCD显示
单片机实验报告姓名学号时间2013.1.9实验题目电子数字钟一、实验目的与要求1.电子数字钟必须具有显示年、月、日和显示时、分、秒的功能。(用LCD显示)。2.具有按键时间校正功能。3.具备设定闹钟和定时闹钟功能。二、实验环境(硬件环境、软件环境)1.硬件环境:单片机开发板一个,计算机一台,单片机主机电源线及与计算机的连接线各一条。2.软件环境:软件KeilC51和软件FlashMagic。三、实验电路(P2口输入、P1口输出实验原理图)本次实验主要使用了开发板的4个板块,分别是单片机STC89C52(如图2所示)、矩阵键盘(如图2所示)、1206LCD显示器和蜂鸣器(如图3所示)。其中单片机芯片通过P0口把总线和矩阵键盘连接;通过P2.2和蜂鸣器间接相连,因为蜂鸣器所在的电路已经连芯片ULN2003,因此用一根杜邦线把P2.2和芯片ULN2003的第一个输入口IN1连起来。而键盘显示这一块,由于内部已经把键盘显示的电路和单片机芯片连接起来了,评阅所以不需要借助杜邦线了。图1为实物连线图。图1实物连线图图2单片机机座和矩阵键盘图3蜂鸣器和1602液晶显示器四、程序流程图主要算法:主函数中先定时中断初始化,利用定时器中断实现走时,调用LCD显示程序和按键处理子函数,再调用显示时间函数显示初始时间值。同时,在主函数中判断当前的小时和分钟值是否等于闹钟设定的时间,若等于则让蜂鸣器响。主函数算法的框图如图4所示。按键处理函数算法:通过键盘扫描函数得到确定哪个键盘按下,得到键盘值,如果键0按下则暂停时钟走时;键1按下则在当前的光标所在的时间单元加1;键2按下则开闹钟;键3按下则实现当前的时间单元左移一位的功能;键4按下则在当前的光标所在的时间单元减1。时间的年月日算法:通过定时器实现时钟的走时,秒满60,分钟加1;分满60,小时加1;小时满24,日加1;至于每个月的天数根据闰年和非闰年的表格确定当月天数。图4主函数算法框图五、程序测试报告:(调试输入数据、结果数据或状态。)1.输入:源代码1输出结果:(1)电子数字钟必须具有显示年、月、日和显示时、分、秒的功能。(用LCD显示)(2)具有按键时间校正功能。(3)具备设定闹钟和定时闹钟功能。六、体会:(碰到的问题、如何解决、有何体会。)1.深入了解如何运用高级语言,此次实验运用C语言进行编程,使单片机开发板实现电子时钟的功能,对汇编语言和高级语言在实现单片机功能的特点也加深了认识。体会到C语言在编程时的灵活性和不用过多考虑硬件的方便。2.该实验中主要用到几个板块,单片机控制,键盘运用,LCD显示,蜂鸣器。掌握了键盘的工作方式和扫描的特点,懂得运用C语言进行编程键盘扫描的程序;掌握LCD显示的几种功能指令,尽管LCD显示的程序较多,但是工作原理弄清楚后就清晰很多;掌握如何把硬件和软件联系起来,特别是控制定时闹钟蜂鸣器的程序,由于该片单片机开发板的蜂鸣器是和步进电机等电路连在一起的,所以需要把控制蜂鸣器的连接端口找到,并用指令“sbitBEEP=P2^2”进行定义;对单片机的应用有了更深入的认识和了解。3.蒋老师在实验过程中一直强调程序的排版格式,让我从细节上更注意排版,收获了一个美观处理文档的习惯。在实验过程中遇到了调试失败的各种问题,除了得到老师的指导,自己也主动上网搜索发生错误的各种原因,培养了解决问题的能力。七、源程序代码#includereg52.h#includeintrins.hsbitBEEP=P2^2;//喇叭端口sbitRS=P2^4;//定义端口sbitRW=P2^5;sbitEN=P2^6;bitAl;//闹钟标志位#defineDataPortP0#defineKeyPortP1#defineuintunsignedint#defineucharunsignedcharucharcodetable[]=0123456789;//转换成液晶显示的字符uchartable1[]={31,31,29,31,30,31,30,31,31,30,31,30,31};//闰年uchartable2[]={31,31,28,31,30,31,30,31,31,30,31,30,31};//非闰年uinti,j,k;uintn_hour,n_minu;//闹钟时,分uintsec,minu,hour,day,mon;//秒,分,时,日,星期uintcount,key;unsignedlongintyear;//年ucharhs,hg,mis,mig,ss,sg;ucharnhs,nhg,nms,nmg;ucharms,mg,ds,dg;ucharyq,yb,ys,yg;uchari_,j_,k_;/*------------------------------------------------mS延时函数,这里使用单片机的晶振为12MHz------------------------------------------------*/voidDelayMs(uchari_){for(j_=i_;j_0;j_--)for(k_=500;k_0;k_--)}/*------------------------------------------------判忙函数-----------------------------------------*/bitLCD_Check_Busy(void){DataPort=0xFF;RS=0;RW=1;EN=0;_nop_();EN=1;return(bit)(DataPort&0x80);}/*------------------------------------------------写入命令函数------------------------------------------------*/voidLCD_Write_Com(ucharcom){RS=0;RW=0;DataPort=com;DelayMs(5);EN=1;DelayMs(5);EN=0;}/*------------------------------------------------写入数据函数------------------------------------------------*/voidLCD_Write_Data(ucharData){//while(LCD_Check_Busy());//忙则等待DelayMs(5);RS=1;RW=0;EN=1;DataPort=Data;DelayMs(5);EN=0;}/*------------------------------------------------清屏函数------------------------------------------------*/voidLCD_Clear(void){LCD_Write_Com(0x01);DelayMs(5);}/*------------------------------------------------写入字符串函数------------------------------------------------*/voidLCD_Write_String(ucharx,uchary,uchar*s){if(y==0){LCD_Write_Com(0x80+x);}else{LCD_Write_Com(0xC0+x);}while(*s){LCD_Write_Data(*s);s++;}}/*------------------------------------------------写入字符函数------------------------------------------------*/voidLCD_Write_Char(ucharx,uchary,ucharData){if(y==0){LCD_Write_Com(0x80+x);}else{LCD_Write_Com(0xC0+x);}LCD_Write_Data(Data);}/*------------------------------------------------初始化函数------------------------------------------------*/voidLCD_Init(void){LCD_Write_Com(0x38);/*显示模式设置*/LCD_Write_Com(0x08);/*显示关闭*/LCD_Write_Com(0x01);/*显示清屏*/LCD_Write_Com(0x06);/*显示光标移动设置*/DelayMs(5);LCD_Write_Com(0x0C);/*显示开及光标设置*/}/*------------------------------------------------按键扫描函数,返回扫描键值------------------------------------------------*/unsignedcharKeyScan(void)//键盘扫描函数,使用行列反转扫描法{unsignedcharcord_h,cord_l;//行列值中间变量KeyPort=0x0f;//行线输出全为0cord_h=KeyPort&0x0f;//读入列线值if(cord_h!=0x0f)//先检测有无按键按下{DelayMs(10);//去抖if((KeyPort&0x0f)!=0x0f){cord_h=KeyPort&0x0f;//读入列线值KeyPort=cord_h|0xf0;//输出当前列线值cord_l=KeyPort&0xf0;//读入行线值while((KeyPort&0xf0)!=0xf0);//等待松开并输出return(cord_h+cord_l);//键盘最后组合码值}}return(0xff);//返回该值}/*------------------------------------------------按键值处理函数,返回扫键值------------------------------------------------*/unsignedcharKeyPro(void){switch(KeyScan()){case0x7e:return0;break;//0暂停键case0x7d:return1;break;//1加case0x7b:return2;break;//2闹钟case0x77:return3;break;//3左移case0xbe:return4;break;//4减case0xbd:return5;break;//5case0xbb:return6;break;//6case0xb7:return7;break;//7case0xde:return8;break;//8case0xdd:return9;break;//9case0xdb:return10;break;//acase0xd7:return11;break;//bcase0xee:return12;break;//ccase0xed:return13;break;//dcase0xeb:return14;break;//ecase0xe7:return15;break;//fdefault:return0xff;break;}}/*------------------------------------------------键盘控制时间函数(0键-暂停键,1键-加1键,2键-开闹钟,3键-左移键,4键-减1键)------------------------------------------------*/voidjianpan(){key=KeyPro();if(key!=0xff){if(key==0)//关中断,暂停时钟{EA=~EA;}if((EA==0)&&(Al=
本文标题:单片机课程设计电子时钟实验-可定时调闹钟-用LCD显示
链接地址:https://www.777doc.com/doc-4383004 .html