不错,我也有个ADE7755的电表电路板,不知道好坏,改天也做个试试 |
这个东西好,多功能表啊 |
老师,原来单片机也挺牛的啊。 |
本帖最后由 gongyuancun 于 2011-9-8 18:16 编辑 频率计程序 #include<reg2051.h> #define ON 0 #define OFF 1 /****************定义显示*****************/ sbit led1=P3^5; //指示灯 sbit led2=P3^7; sbit L1=P3^0; //扫描位 sbit L2=P3^1; sbit L3=P3^2; sbit L4=P3^3; char code disp_data[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,}; //段码 char disp_buffer[4]; //显存 char disp_count; //显示指针 /**************定义计时,计数**************/ unsigned char count; unsigned char time; bit timer_flag; /*************************************************** 延时1S ***************************************************/ void delay(void) { unsigned char ys1,ys2,ys3; for(ys1=167;ys1;ys1--) //设 for(ys2=39;ys2;ys2--) for(ys3=76;ys3;ys3--); } /*************************************************** 定时器1中断 功能: 计数溢出中断,用于计数扩展 ***************************************************/ void count_timer0(void) interrupt 1 { count++; } /*************************************************** 定时器0中断 功能: 1S计时和显示 ***************************************************/ void timer1(void) interrupt 3 using 0 { TL1|=0x60; //4MS 12M晶振 TH1=0xF0; led2=OFF; //1S计时 if(++time==250) { TR0=0; TR1=0; time=0x00; timer_flag=1; } //显示 P3 |= 0x0F; P1=disp_buffer[disp_count]; switch(disp_count) { case 0: L1=0; break; case 1: L2=0; break; case 2: L3=0; break; case 3: L4=0; break; } if(++disp_count==4) disp_count=0x00; } /******************************** 1. 定时器0作为外部输入计数器 2. 定时器1作为定时器,用于1S计时和显示 ****************** void main(void) { unsigned long x; unsigned char i,j,temp; delay(); led1=ON; led2=ON; TMOD=0x15; EA=1; ET0=1; ET1=1; PT1=1; // TH1=0xF0; // TL1=0x60+0x12; TR1=1; // TR0=1; while(1) { PCON |= 0x01; //1S计时时间到的处理 if(timer_flag) { //计算计数值 ((char*)&x)[3]=TL0; ((char*)&x)[2]=TH0; ((char*)&x)[1]=count; //开始第二次测量 led2=ON; timer_flag=0; count=0x00; TH1=0xF0; TL1=0x60+0x12; TH0=0x00; TL0=0x00; TR1=1; TR0=1; //确定小数点位置和显示的数 if(x<1000) { led1=OFF; //KHZ单位小数点灭 j=4; //小数点不显示 } else if(x<10000) { led1=ON; //KHZ单位小数点亮 j=3; //小数点位置 } else if(x<100000) { led1=ON; j=2; x/=10; //只要显示高四位 } else if(x<1000000) { led1=ON; j=1; x/=100; } //将要显示的内容存放到显示缓存 for(i=0;i<4;i++) { temp=x%10; disp_buffer=disp_data[temp]; if(i==j) disp_buffer &= 0xFB; //小数点 x/=10; } for(i=3;i;i--) if(disp_buffer==0xc0) disp_buffer=0xff; else break; } } } |
GMT+8, 2024-5-18 23:31 , Processed in 0.402595 second(s), 24 queries .
Powered by Discuz! X3.1
© 2001-2013 Comsenz Inc.