- #include <reg52.h>
- #include <intrins.h>
- #include <stdio.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit up = P1^0;
- sbit down = P1^1;
- sbit thousand = P2^0; //數碼管com與顯示數組
- sbit hundred = P2^1;
- sbit tan = P2^2;
- sbit one = P2^3;
- uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- uint frequency; //電機上下的次數,上升算一次,下降算一次
- uint num = 0; //定時器計數
- void putin(uchar c) ; //串口輸出
- void ddelay(uint z); //設置一秒
- void show(uint z); //數碼管顯示數字
- void main()
- {
- uint q = 0;
- frequency = 0;
- up = 0;
- down = 1;
- TMOD = 0x21; //定時器1方式2 定時器0方式1
- TH0 = (65536-45872)/256; //裝初值11.0592M晶振定時50ms數為45872
- TL0 = (65536-45872)%256;
- TH1 = 0xf4; //裝載初值
- TL1 = 0xf4;
-
- SCON = 0x50; //串口方式1
- PCON = 0x00; //不倍增
-
- EA = 1; //打開全局中斷
- ES = 1; //打開串口中斷
- ET0 = 1; //打開定時器0中斷
- TR0 = 1; //打開定時器0,開始計時
- TR1 = 1; //打開定時器1,用于串口通信
- while(1)
- {
- if(num == 20) //如果到了20次,說明1秒時間
- {
- q++;
- num=0;
-
- if(q == 3) //每3秒串口發送數據
- {
- up = ~up; //指示燈
- down = ~down;
- frequency++;
- q = 0; //重置時間
- putin(0xff);
- }
- }
- putin(0xfe);
- show(frequency);
- }
- }
- void ddelay(uint z) //設置一秒
- {
-
- unsigned char h, i, j, k, l;
- for (l = z; l > 0; l--)
- for (h = 5; h > 0; h--)
- for (i = 4; i > 0; i--)
- for (j = 116; j > 0; j--)
- for (k = 214; k > 0; k--);
- }
- void putin(uchar c) //串口輸出
- {
- SBUF = c;
- while(TI == 0);
- TI = 0;
- }
- void show(uint z) //數碼管顯示數字
- {
- uchar i,j,k,l;
- i = z/1000;
- j = (z%1000)/100;
- k = (z%100)/10;
- l = z%10;
-
- P0 = 0xff;
- P0 = table[i];
- thousand = 0;
- thousand = 1;
-
- P0 = 0xff;
- P0 = table[j];
- hundred = 0;
- hundred = 1;
-
- P0 = 0xff;
- P0 = table[k];
- tan = 0;
- tan = 1;
-
- P0 = 0xff;
- P0 = table[l];
- one = 0;
- one = 1;
- }
- void T0_time()interrupt 1 //定時器0中斷
- {
- TH0=(65536-45872)/256; //重新裝載初值
- TL0=(65536-45872)%256;
- num++;
- }
復制代碼 |