您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 酒店餐饮 > 51单片机万年历实验DS1302可按键设置时钟
//以下程序都是在VC++6.0上调试运行过的程序,没有错误,没有警告。//单片机是STC89C52RC,但是在所有的5152单片机上都是通用的。51只是一个学习的基础平台,你懂得。//程序在关键的位置添加了注释。/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////以下是主文件main.c的内容/********************************************************************************实验名:万年历实验*使用的IO:*实验效果:1602显示时钟,按K3进入时钟设置,按K1选择设置的时分秒日月,按K2选择*选择设置加1。*注意:*******************************************************************************/#includereg51.h#includelcd.h#includeds1302.hsbitK1=P3^1;sbitK2=P3^0;sbitK3=P3^2;sbitK4=P3^3;voidInt0Configuration();voidLcdDisplay();unsignedcharSetState,SetPlace;voidDelay10ms(void);//误差0us/********************************************************************************函数名:main*函数功能:主函数*输入:无*输出:无*******************************************************************************/voidmain(){unsignedchari;Int0Configuration();LcdInit();Ds1302Init();while(1){if(SetState==0){Ds1302ReadTime();}else{if(K1==0)//检测按键K1是否按下{Delay10ms();//消除抖动if(K1==0){SetPlace++;if(SetPlace=7)SetPlace=0;}while((i50)&&(K1==0))//检测按键是否松开{Delay10ms();i++;}i=0;}if(K2==0)//检测按键K2是否按下{Delay10ms();//消除抖动if(K2==0){TIME[SetPlace]++;if((TIME[SetPlace]&0x0f)9)//换成BCD码。{TIME[SetPlace]=TIME[SetPlace]+6;}if((TIME[SetPlace]=0x60)&&(SetPlace2))//分秒只能到59{TIME[SetPlace]=0;}if((TIME[SetPlace]=0x24)&&(SetPlace==2))//小时只能到23{TIME[SetPlace]=0;}if((TIME[SetPlace]=0x32)&&(SetPlace==3))//日只能到31{TIME[SetPlace]=0;}if((TIME[SetPlace]=0x13)&&(SetPlace==4))//月只能到12{TIME[SetPlace]=0;}if((TIME[SetPlace]=0x7)&&(SetPlace==5))//周只能到7{TIME[SetPlace]=1;}//if(SetPlace==5)//月只能到12//{//TIME[SetPlace]=;//}}while((i50)&&(K2==0))//检测按键是否松开{Delay10ms();i++;}i=0;}}LcdDisplay();}}/********************************************************************************函数名:LcdDisplay()*函数功能:显示函数*输入:无*输出:无*******************************************************************************/voidLcdDisplay(){LcdWriteCom(0x80+0X40);LcdWriteData('0'+TIME[2]/16);//时LcdWriteData('0'+(TIME[2]&0x0f));LcdWriteData('-');LcdWriteData('0'+TIME[1]/16);//分LcdWriteData('0'+(TIME[1]&0x0f));LcdWriteData('-');LcdWriteData('0'+TIME[0]/16);//秒LcdWriteData('0'+(TIME[0]&0x0f));LcdWriteCom(0x80);LcdWriteData('2');LcdWriteData('0');LcdWriteData('0'+TIME[6]/16);//年LcdWriteData('0'+(TIME[6]&0x0f));LcdWriteData('-');LcdWriteData('0'+TIME[4]/16);//月LcdWriteData('0'+(TIME[4]&0x0f));LcdWriteData('-');LcdWriteData('0'+TIME[3]/16);//日LcdWriteData('0'+(TIME[3]&0x0f));LcdWriteCom(0x8D);LcdWriteData('0'+(TIME[5]&0x07));//星期}/********************************************************************************函数名:Int0Configuration()*函数功能:配置外部中断0*输入:无*输出:无*******************************************************************************/voidInt0Configuration(){//设置INT0IT0=1;//跳变沿出发方式(下降沿)EX0=1;//打开INT0的中断允许。EA=1;//打开总中断}/********************************************************************************函数名:Int0()*函数功能:外部中断0中断函数*输入:无*输出:无*******************************************************************************/voidInt0()interrupt0{Delay10ms();if(K3==0){SetState=~SetState;SetPlace=0;Ds1302Init();}}/********************************************************************************函数名:Delay10ms*函数功能:延时函数,延时10ms*输入:无*输出:无*******************************************************************************/voidDelay10ms(void)//误差0us{unsignedchara,b,c;for(c=1;c0;c--)for(b=38;b0;b--)for(a=130;a0;a--);}/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////以下是被调文件lcd.c的内容#includelcd.h/********************************************************************************函数名:Lcd1602_Delay1ms*函数功能:延时函数,延时1ms*输入:c*输出:无*说名:该函数是在12MHZ晶振下,12分频单片机的延时。*******************************************************************************/voidLcd1602_Delay1ms(uintc)//误差0us{uchara,b;for(;c0;c--){for(b=199;b0;b--){for(a=1;a0;a--);}}}/********************************************************************************函数名:LcdWriteCom*函数功能:向LCD写入一个字节的命令*输入:com*输出:无*******************************************************************************/#ifndefLCD1602_4PINS//当没有定义这个LCD1602_4PINS时voidLcdWriteCom(ucharcom)//写入命令{LCD1602_E=0;//使能LCD1602_RS=0;//选择发送命令LCD1602_RW=0;//选择写入LCD1602_DATAPINS=com;//放入命令Lcd1602_Delay1ms(1);//等待数据稳定LCD1602_E=1;//写入时序Lcd1602_Delay1ms(5);//保持时间LCD1602_E=0;}#elsevoidLcdWriteCom(ucharcom)//写入命令{LCD1602_E=0;//使能清零LCD1602_RS=0;//选择写入命令LCD1602_RW=0;//选择写入LCD1602_DATAPINS=com;//由于4位的接线是接到P0口的高四位,所以传送高四位不用改Lcd1602_Delay1ms(1);LCD1602_E=1;//写入时序Lcd1602_Delay1ms(5);LCD1602_E=0;//Lcd1602_Delay1ms(1);LCD1602_DATAPINS=com4;//发送低四位Lcd1602_Delay1ms(1);LCD1602_E=1;//写入时序Lcd1602_Delay1ms(5);LCD1602_E=0;}#endif/*************************************
本文标题:51单片机万年历实验DS1302可按键设置时钟
链接地址:https://www.777doc.com/doc-4293462 .html