图3-2 时间处理子程序流程框图
图3-3 中断子程序
3.4 设计课题软件系统程序清单
;----------------------------------------------------------------------- ;项目名称:数字电子钟
;项目功能:本电子钟实现24小时制,8位数码管显示时分秒,显示格式:12-59-00 通过4只按键来调整时间,调整选择键KEY1:P1.0;通过选择键选
择调整位,选中位闪烁,增加键KEY2:P1.1;按一次使选中位加1。
减少键KEY3:P1.2;按一次使选中位减1,bear:P3.1;到了整点和闹 钟就会响,
如果长按KEY1第一次切换到正常时钟显示,按第二次切换到时的调整, 按第三次切换到分的调整,同时led:P1.2就会闪烁,
按第四次和第五次分别切换到闹钟的时分的调整 ,可进行调 时、调分快进快减,并停止闪烁。如果选中位是秒,
则按增加键或减少键可实现,但无调时快进和快减功能。P0口输出数 码管段选信号,P2口输出数码管位选信号;晶振12MHz。
编程作者: 林炽逸
完成时间: 2013年06月8日 程序请清单如下:
#include
sbit KEY2=P1^2; //minute ,hour调整加1定义 sbit KEY3=P1^7; //minute ,hour调整减1定义 sbit bear=P3^1; //闹铃
sbit led=P1^2; //闹钟,整时灯闪烁
code unsigned char tab[]={0xc0,0xf9,0xa4,
0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xc8,0x8e,0xff,0x21}; //段码控制 char code weikong_code[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; uchar ms[8]={2,2,10,4,0,0,1,14}; uchar StrTab[8];
uchar minute=59,hour=12,second=0; // 正常 时钟秒,分,时 定义 uchar minute1=00,hour1=00; second1=00; // 闹钟 时钟秒,分,时 定义 uchar flag=0, flag1=0; //切换标志 uchar num=0; uint count=0; //定时器计数,定时50ms,count满20,秒加1 /***********子函数声明*******************************************/
void xianshishuzu(); // 显示数组子程序 void alarm(); //闹钟子程序
/********************** 延时子程序*****************************/ void delay(uint z) { uint x,y; for(x=0;x /***********************时间处理子程序*************************/ void time_pro(void) { if(second==60) {second=0;minute++; if(minute==60) {minute=0;hour++; if(hour==24) {hour=0;} } } } /**********************显示时钟子函数***************************/ void dispaly(uchar w[8]) { unsigned int i,j,aa; aa=0xfe; //位选初值1111 1110 for(i=0;i<8;i++) //依次将数组w中八个数取出,并显示 { P2=aa; //位选 j=w[i]; //取出要显示的数码 P0=tab[j]; //取出段选编码 aa=_crol_(aa,1); //位选信号循环右移? delay(1); //显示延时 P0=0xff; //消影 } } /***********************显示时钟数组子程序***********************/ void xianshishuzu() { StrTab[1]=second/10; //秒个位 StrTab[0]=second; //秒十位 StrTab[2]=10; //间隔符 - StrTab[4]=minute/10; //分个位 StrTab[3]=minute; //分十位 StrTab[5]=10; //间隔符 - StrTab[7]=hour/10; //时个位 StrTab[6]=hour; //时十位 } /**********************键盘扫描子程序*************************/ void keycan() { if(KEY1==0) //按一次,正常显示,按第二次,时调整,按第三次,分调这整, { delay(10); //按键1去抖以及动作 if(KEY1==0) //确认按键是否按下 {flag++;} //切换标志 while(!KEY1);} //释放按键 if(flag==1) { if(KEY2==0) { delay(10); if(KEY2==0) { hour++;if(hour==24)hour=0; } //正常时间 小时 加1 while(!KEY2) //释放按键 {dispaly(StrTab); } } if(KEY3==0) {delay(10); if(KEY3==0) { hour--;if(hour==0)hour=23; dispaly(StrTab);} //正常时间小时 减1 while(!KEY3) { dispaly(StrTab);} } } if(flag==2) {if(KEY2==0) //按键去抖以及动作 { delay(10); if(KEY2==0) { minute++;if(minute==60)minute=0;} //分加1 while(!KEY2) { dispaly(StrTab); } } if(flag==3) // 秒表的加1 { if(KEY3==0) { delay(10); if(KEY3==0) { second++;if(second==0)second=59; //秒加1 } while(!KEY3){ dispaly(StrTab);} } } }