/***************************************************************************标题: 定时器中断 24小时时钟程序效果: 数码管显示24小时制时钟(具有调时功能)说明: 使用12M晶振 ,key1=P3^7; key2=P3^6; key3=P3^5;key4=P3^4; 数码管位选P1.0~P1.3 ,段选P0******************************************************************************/ #include<reg52.h> #define uchar unsigned char;#define uint unsigned int; uchar position; uchar tt; uchar second; uchar minute;uchar hour; uchar code table[]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0--9 sbit smg_q = P1^0; //数码管千位引脚sbit smg_b = P1^1; sbit smg_s = P1^2;sbit smg_g = P1^3; sbit key1=P3^7; //按键定义sbit key2=P3^6;sbit key3=P3^5;sbit key4=P3^4; void keyscan(); //函数声明void display(unsigned char hour,unsignedchar minute);void delay(unsigned int timer);void init(); /*********************************************************** 主函数***********************************************************/void main(){ init(); while(1) { if(tt==20) { tt=0; second++; if(second==60) { second=0; minute++; if(minute==60) { minute=0; hour++; if(hour==24) hour=0; } } } keyscan(); display(hour,minute); delay(1); }}/*********************************************************** 调时***********************************************************/void keyscan(){ if(key1==0) //小时加1 { TR0=0; hour++; if(hour==24) hour=0; delay(200) ; TR0=1; } if(key2==0) // 小时减 { TR0=0; hour--; if(hour<0) hour=23; delay(200) ; TR0=1; } if(key3==0) // 分钟加 { TR0=0; minute++; if(minute==60) minute=0; delay(200) ; TR0=1; } if(key4==0) // 分钟减 { TR0=0; minute--; if(minute<0) minute=59; delay(200) ; TR0=1; }} /*********************************************************** 初始化***********************************************************/void init(){ tt=0; position=0; second=0; minute=0; hour=0; smg_q=1; smg_b=1; smg_s=1; smg_g=1; key1=1; key2=1; TMOD=0X01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; } /*********************************************************** 定时器TO中断***********************************************************/void t0() interrupt 1{ TH0=(65536-50000)/256; TL0=(65536-50000)%256; tt++; } /*********************************************************** 显示***********************************************************/void display(unsigned char hour,unsignedchar minute){ P0=0XFF; switch(position) { case0: smg_g=1; smg_q=0; P0=table[hour/10]; break; case1: smg_q=1; smg_b=0; P0=table[hour%10]; if(tt>=10) P0&=0x7f; //小数点以半秒的时间闪烁 break; case2: smg_b=1; smg_s=0; P0=table[minute/10]; break; case3: smg_s=1; smg_g=0; P0=table[minute%10]; break; } position++; if(position>3) position=0; } /*********************************************************** 延时***********************************************************/void delay(unsigned int time){ unsignedint x,y; for(x=time;x>0;x--) for(y=110;y>0;y--);}
-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。
自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。