使用stc89c52单片机,电路很简单,采用八位共阳数码管,p0口为数码管的段选,p2口为位选. 通过key1-key3来调整时间
重点:
1、函数的模块化
2、中断
#include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit p2_0=P2^0; sbit p2_1=P2^1; sbit p2_2=P2^2; sbit p2_3=P2^3; sbit p2_4=P2^4; sbit p2_5=P2^5; sbit p2_6=P2^6; sbit p2_7=P2^7; sbit key0=P3^2; sbit key1=P3^3; sbit key2=P3^4; sbit key3=P3^5; sbit p17=P1^7; uint t=0; uint key=0; uchar set=0; uchar second=00,minter=55,hour=11; uchar second_1,second_2,minter_1,minter_2,hour_1,hour_2; const uchar tab[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf} ; //0~~9数码表 void delay() //延时延时子程序 { uint i; for(i=0;i<240;i++); } void time_0(void) interrupt 1 using 0 //内部定时器0内部定时50ms { TH0=0x3c; TL0=0xb0; t++; // t是记定时次数 } void display(uchar secondd,uchar minterr,uchar hourr) //显示始终时间的子程序 { second_1=secondd/10; second_2=secondd%10; minter_1=minterr/10; minter_2=minterr%10; hour_1=hourr/10; hour_2=hourr%10; P0=tab[second_2]; p2_0=0; delay(); p2_0=1; P0=tab[second_1]; p2_1=0; delay(); p2_1=1; p2_2=0; P0=0xbf; delay(); p2_2=1; P0=tab[minter_2]; p2_3=0; delay(); p2_3=1; P0=tab[minter_1]; p2_4=0; delay(); p2_4=1; p2_5=0; P0=0xbf; delay(); //延时 是为了使— “——”显示出来,否则时间太快,— p2_5=1; P0=tab[hour_2]; p2_6=0; delay(); p2_6=1; P0=tab[hour_1]; p2_7=0; delay(); p2_7=1; } void time() { //定时1s的时间是否到? if(t==19) //1s到,则加一秒 { t=0; second++; if(second==60) // 是否为60秒 ,是秒清零,分加一秒,不到则跳出 { second=0; minter++; if(minter==60) // 分是否为60分,是 ,分清零,时加一;不是则跳出 { minter=0; hour++; if(hour==24) { hour=0; } } } } display(second,minter,hour); //调用显示函数 来显示时间时间 } uint scan_key() //调整时间 按键 扫描 函数 { //延时 delay(); //判断 如果按键 按key3下则返回1 来调用 调整时间函数,不为零则返回0 不变不调整 if(key0==0) set=1; if(key0==1) set=0; return set; } void set_time() //调整时间函数 { uchar m; if(key1==0) delay(); //调整小时,确定key1健按下 if(key1==0) hour++; // x小时数递增 if(hour==24) hour=0; //小时数到24,从零开始 for(m=0;m<20;m++) //循环20次 { time(); //调用显示函数 来显示时间时间 } if(key2==0) delay(); //调整分钟 if(key2==0) minter++; if(minter==60) minter=0; delay(); time(); //调用时间函数 来显示时间时间 if(key0==0) time(); } void main() //主函数 设定 内部时间定时 { TMOD=0X01; TH0=0X10; TL0=0X00; EA=1; ET0=1; TR0=1; P2=0xff; while(1) { if(key0==0) // p判断 调整时间的按键是否按下 即 是否需要 调整时间 { p17=0; delay(); delay(); delay(); p17=1; delay(); delay(); key=scan_key(); } switch(key) { //定时1s的时间是否到? case 0: time(); break; case 1: set_time();break; default :break; } } }