使用stc89c52單片機,電路很簡單,采用八位共陽數(shù)碼管,p0口為數(shù)碼管的段選,p2口為位選. 通過key1-key3來調(diào)整時間
重點:
1、函數(shù)的模塊化
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數(shù)碼表 void delay() //延時延時子程序 { uint i; for(i=0;i<240;i++); } void time_0(void) interrupt 1 using 0 //內(nèi)部定時器0內(nèi)部定時50ms { TH0=0x3c; TL0=0xb0; t++; // t是記定時次數(shù) } 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); //調(diào)用顯示函數(shù) 來顯示時間時間 } uint scan_key() //調(diào)整時間 按鍵 掃描 函數(shù) { //延時 delay(); //判斷 如果按鍵 按key3下則返回1 來調(diào)用 調(diào)整時間函數(shù),不為零則返回0 不變不調(diào)整 if(key0==0) set=1; if(key0==1) set=0; return set; } void set_time() //調(diào)整時間函數(shù) { uchar m; if(key1==0) delay(); //調(diào)整小時,確定key1健按下 if(key1==0) hour++; // x小時數(shù)遞增 if(hour==24) hour=0; //小時數(shù)到24,從零開始 for(m=0;m<20;m++) //循環(huán)20次 { time(); //調(diào)用顯示函數(shù) 來顯示時間時間 } if(key2==0) delay(); //調(diào)整分鐘 if(key2==0) minter++; if(minter==60) minter=0; delay(); time(); //調(diào)用時間函數(shù) 來顯示時間時間 if(key0==0) time(); } void main() //主函數(shù) 設(shè)定 內(nèi)部時間定時 { TMOD=0X01; TH0=0X10; TL0=0X00; EA=1; ET0=1; TR0=1; P2=0xff; while(1) { if(key0==0) // p判斷 調(diào)整時間的按鍵是否按下 即 是否需要 調(diào)整時間 { 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; } } }