电子按键时钟仿真+程序数码管显示

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

所用到元件程序#includereg51.h#includeintrins.hsbitk1=P3^0;sbitk2=P3^1;sbitk3=P3^2;sbitLED=P3^3;sbitLED1=P3^7;//---定义ds1302使用的IO口---//sbitDSIO=P3^4;sbitRST=P3^5;sbitSCLK=P3^6;//---定义全局函数---//voidDs1302Write(ucharaddr,uchardat);ucharDs1302Read(ucharaddr);voidDs1302Init();voidDs1302ReadTime();ucharTIME[7];voiddelay(uchari);voiddelay1(uchari);voidSet_RTC();voidzzh();uchartemp[4]={0xe,0x0d,0xb,0x07},DisplayData[7]={0},temp1[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};voidmain(){uchari,zzh6;Ds1302Init();LED=1;LED1=1;zzh6=TIME[0];while(1){Ds1302ReadTime();//读取数值DisplayData[3]=TIME[2]/16;//小时DisplayData[2]=TIME[2]&0x0f;DisplayData[1]=TIME[1]/16;//分DisplayData[0]=TIME[1]&0x0f;for(i=0;i4;i++)//数码管显示{P0=temp1[DisplayData[3-i]];//数码管位选P2=temp[i];//数码管段选if(zzh6!=TIME[0]){zzh6=TIME[0];LED=~LED;}delay1(10);P0=0x00;}if(k3==0)//判断调时按健是否按下{delay(22);if(k3==0)zzh();}}}voidzzh(){uchari,j=0;delay(20);while(1){if(k1==0){//分调数按键delay(20);if(k1==0){j=0;while((j50)&&(k1!=0))//抖动检测{delay(10);j++;}if(DisplayData[0]9)//读取分按键调试数值并存取DisplayData[0]++;else{DisplayData[0]=0;if(DisplayData[1]5)DisplayData[1]++;elseDisplayData[1]=0;}}}if(k2==0){//时调数按键检测delay(20);if(k2==0){j=0;while((j50)&&(k2!=0))//抖动检测{delay(10);j++;}if(DisplayData[3]2)//读时分按键调试数值并存取{if(DisplayData[2]9)DisplayData[2]++;else{DisplayData[2]=0;DisplayData[3]++;}}if(DisplayData[3]==2){if(DisplayData[2]3)DisplayData[2]++;else{DisplayData[2]=0;DisplayData[3]=0;}}}}for(i=0;i4;i++)//显示当前调试的数字{P0=temp1[DisplayData[3-i]];P2=temp[i];delay1(1);P0=0x00;}if(k3==0){delay(20);while((j50)&&(k3!=0))//抖动检测{delay(10);j++;}Set_RTC();break;}}}voidSet_RTC()//写入改变的时间{ucharcodeWRITE_RTC_ADDR1[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};uchari,*p=WRITE_RTC_ADDR1,zzh2[2]={0};zzh2[0]=DisplayData[0]+DisplayData[1]*16;zzh2[1]=DisplayData[2]+DisplayData[3]*16;Ds1302Write(0x8E,0X00);for(i=1;i3;i++)//2次写入分时{p++;Ds1302Write(*p,zzh2[i-1]);}Ds1302Write(0x8E,0x80);}voiddelay(uchari)//延时函数{uchark,j;while(i--)for(j=0;j10;j++)for(k=130;k0;k++);}voiddelay1(uchari)//延时函数{ucharj;while(i--)for(j=0;j10;j++);}//---DS1302写入和读取时分秒的地址命令---////---秒分时日月周年最低位读写位;-------//ucharcodeREAD_RTC_ADDR[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};ucharcodeWRITE_RTC_ADDR[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//---DS1302时钟初始化2013年1月1日星期二12点00分00秒。---////---存储顺序是秒分时日月周年,存储格式是用BCD码---//ucharTIME[7]={0x00,0x22,0x12,0x01,0x01,0x02,0x13};/********************************************************************************函数名:Ds1302Write*函数功能:向DS1302命令(地址+数据)*输入:addr,dat*输出:无*******************************************************************************/voidDs1302Write(ucharaddr,uchardat){ucharn;RST=0;_nop_();SCLK=0;//先将SCLK置低电平。_nop_();RST=1;//然后将RST(CE)置高电平。_nop_();for(n=0;n8;n++)//开始传送八位地址命令{DSIO=addr&0x01;//数据从低位开始传送addr=1;SCLK=1;//数据在上升沿时,DS1302读取数据_nop_();SCLK=0;_nop_();}for(n=0;n8;n++)//写入8位数据{DSIO=dat&0x01;dat=1;SCLK=1;//数据在上升沿时,DS1302读取数据_nop_();SCLK=0;_nop_();}RST=0;//传送数据结束_nop_();}/********************************************************************************函数名:Ds1302Read*函数功能:读取一个地址的数据*输入:addr*输出:dat*******************************************************************************/ucharDs1302Read(ucharaddr){ucharn,dat,dat1;RST=0;_nop_();SCLK=0;//先将SCLK置低电平。_nop_();RST=1;//然后将RST(CE)置高电平。_nop_();for(n=0;n8;n++)//开始传送八位地址命令{DSIO=addr&0x01;//数据从低位开始传送addr=1;SCLK=1;//数据在上升沿时,DS1302读取数据_nop_();SCLK=0;//DS1302下降沿时,放置数据_nop_();}_nop_();for(n=0;n8;n++)//读取8位数据{dat1=DSIO;//从最低位开始接收dat=(dat1)|(dat17);SCLK=1;_nop_();SCLK=0;//DS1302下降沿时,放置数据_nop_();}RST=0;_nop_();//以下为DS1302复位的稳定时间,必须的。SCLK=1;_nop_();DSIO=0;_nop_();DSIO=1;_nop_();returndat;}/********************************************************************************函数名:Ds1302Init*函数功能:初始化DS1302.*输入:无*输出:无*******************************************************************************/voidDs1302Init(){ucharn;Ds1302Write(0x8E,0X00);//禁止写保护,就是关闭写保护功能for(n=0;n7;n++)//写入7个字节的时钟信号:分秒时日月周年{Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);}Ds1302Write(0x8E,0x80);//打开写保护功能}/********************************************************************************函数名:Ds1302ReadTime*函数功能:读取时钟信息*输入:无*输出:无*******************************************************************************/voidDs1302ReadTime(){ucharn;for(n=0;n7;n++)//读取7个字节的时钟信号:分秒时日月周年{TIME[n]=Ds1302Read(READ_RTC_ADDR[n]);}}

1 / 9
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功