該程序能檢測處理后的三相電源信號,希望有所幫助。
單片機源程序如下:
- #include<reg52.h>
- unsigned long fre;
- unsigned char time;
- unsigned int count;
- unsigned char led[6];
- unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,
- 0x6d,0x7d,0x07,0x7f,0x6f}; //數碼管0123456789顯示
- sbit swan=P2^0;
- sbit wan =P2^1;
- sbit qian=P2^2;
- sbit bai =P2^3;
- sbit shi =P2^4;
- sbit ge=P2^5;
- sbit ppp= P0^0 ;
- void timer_init(); //函數聲明
- void display(unsigned long num);
- void delay(unsigned int a);
-
- void main()
- {
- // timer_init(); //定時/計數器初始化
- while(1)
- { //display(fre); //數碼管顯示
- P2 = 0x75;
- P0 = 0x35;
- }
- }
-
- void delay(unsigned int a) //延時約1ms(12Mhz晶振)
- {
- unsigned char i;
- while(a--!=0)
- for(i=125;i>0;i--);
- }
- void display(unsigned long num) //顯示函數
- {unsigned char sw,w,q,b,s,g;
- P0 = 0x75;
- //sw=num/100000;P0=table[sw];swan=0;delay(2);swan=1;
- //w=num/10000%10;P0=table[w];wan=0;delay(2);wan=1;
- //q=num/1000%10;P0=table[q];qian=0;delay(2);qian=1;
- //b=num%1000/100;P0=table[b];bai=0;delay(2);bai=1;
- //s=num%100/10;P0=table[s];shi=0;delay(2);shi=1;
- //g=num%10;P0=table[g];ge=0;delay(2);ge=1;
- }
- void timer_init(void) //定時/計數器初始化
- { TMOD=0x06; //計數器0工作工作方式2,自動重裝初值
- TH0=0; //計數器初值為0
- TL0=0;
- TR0=1; //計數器開始計數
- ET0=1; //打開計數器0中斷
- RCAP2H=(65536-62500)/256; //在程序初始化時給RCAP2L和RCAP2H賦值
- RCAP2L=(65536-62500)%256; //TH2 和 TL2 將會在中斷產生時自動使 TH2=RCAP2H,TL2=RCAP2L。
- TH2=RCAP2H; //12M晶振下每次中斷62.5ms
- TL2=RCAP2L;
- ET2=1; //打開定時器2中斷
- TR2=1; //定時器2開始計時
- EA=1; //開總中斷
- }
- void timer2(void) interrupt 5 //定時器2中斷(62.5ms)
- {
- time++;
- TF2=0;//定時器2的中斷標志位TF2不能夠由硬件清零,所以要在中斷服務序中將其清零
- if (time==16) //定時1s時間到
- {
- time=0; //計時清0
- EA=0; //關中斷
- fre=7;
- //fre=(long)count*256+TL0; //count*256強制轉換成long型,否則將不產生進位
- TL0=0; //清零計數器0計數
- TH0=0;
- count=0; //清零計數器0計數
- EA=1; //開始中斷
- }
- }
- void timer0(void)interrupt 1//計數器0中斷
- {
- count++;
- }
復制代碼
|