该程序能检测处理后的三相电源信号,希望有所帮助。
单片机源程序如下:
- #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++;
- }
复制代码
|