1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
| #include <REGX52.H> sbit SHCP = P0^1; // 移位寄存器的时钟输入 sbit STCP = P0^2; //存储寄存器的时钟输入 sbit DS = P0^0; code unsigned char SegTab[17]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};//共阴数码管段码表 code unsigned char BitTab[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选 data unsigned char DBuf[8]={0x00}; unsigned char miao=12,fen=26,shi=8; //秒、分、时高位低位 unsigned char miao_L, miao_H, fen_L, fen_H, shi_L, shi_H;
void DelayXms(unsigned char ms){unsigned int dly; while(ms--) {dly = 100; while(dly--){;} } } void Driver595 (unsigned char dat) { unsigned char i; for(i=0;i<8;i++) { SHCP=0; if(dat & 0x80)DS=1; else DS=0; SHCP=1; dat <<=1;} } void Display(unsigned char\* ptr){ unsigned char i; STCP=0; for(i = 0;i < 8;i++) { Driver595(BitTab[i]); Driver595(ptr[i]); STCP=1;DelayXms(2); STCP=0;}} void update(unsigned char \*dst,unsigned char shi,unsigned char fen,unsigned char miao) { \*dst++ = SegTab[shi/10]; \*dst++ = SegTab[shi%10]; \*dst++ = 0x40; \*dst++ = SegTab[fen/10]; \*dst++ = SegTab[fen%10]; \*dst++ = 0x40; \*dst++ = SegTab[miao/10]; \*dst++ = SegTab[miao%10]; } /\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* \* 函 数 名 : TimerInit \* 函数功能 : 定时器0初始化 \* 参数 :无 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ void TimerInit() { TMOD|=0X01; //选择为定时器0模式,工作方式1,仅用TR0打开启动。 TH0=0X3c; //给定时器赋初值,定时50ms 3CB0 TL0=0Xb0; //0X3CB0的十进制是15536 从15536计数到65536计数50000次 即50000us=50ms ET0=1; //打开定时器0中断允许 EA=1; //打开总中断 TR0=1; //打开定时器
} /\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* \* 函 数 名 : Timer0() \* 函数功能 : 定时器0中断函数 \* 参数 :无 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ void Timer0() interrupt 1 { unsigned char i; TL0 =(65536-50000)%256;//50ms预装载值 TH0 =(65536-50000)/256; i++; if(i==20)//20个50毫秒即一秒 { i=0; miao++; if(miao==60) { miao=0; fen++; if(fen==60)//定时一小时自动清零 { fen=0; shi++; if(shi==24) { shi=0; fen =0; miao = 0; } } } miao_L = miao%10; miao_H = miao/10;
fen_L = fen%10; fen_H = fen/10;
shi_L = shi%10; shi_H = shi/10; } }
void main(void) { TimerInit(); while(1){ update(DBuf,shi,fen,miao); Display(DBuf);} }
|