• 放飞梦想666
    了解作者
  • C/C++
    开发工具
  • 313KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 6
    下载次数
  • 2018-09-16 21:24
    上传日期
51单片机加LCD1602方案,自制的功率表,可显示电压,电流,功率,电能,时间 量程0-5V/50V 0-3A/10A
功率表 2.0.rar
  • 功率表 2.0
  • Listings
  • main.lst
    16.5KB
  • 功率表2.m51
    30KB
  • STARTUP.lst
    13.8KB
  • Objects
  • 功率表2.hex
    10.5KB
  • 功率表2.lnp
    123B
  • main.__i
    116B
  • STARTUP.obj
    819B
  • 功率表2.build_log.htm
    277.6KB
  • 功率表2.0.uvopt
    5KB
  • 功率表2.0.uvproj
    13.7KB
  • STARTUP.A51
    6.2KB
  • 功率表2.0.uvgui.Administrator
    83.2KB
  • 功率表.pdf
    262.9KB
  • main.c
    7.1KB
内容介绍
#include <reg52.H> #define unt unsigned int #define unr unsigned char sbit RS=P1^4; //1602液晶屏命令数据选择端,数据段为P0 //sbit RW=P1^1; //1602液晶屏读写控制端,数据段为P0 sbit EN=P1^5; //1602液晶屏使能控制端,数据段为P0 //P1.2采集电流,P1.3采集电压 sbit Uq=P1^1;//电压自动切换,1时5V,0时50V sbit Iq=P1^0;//电流自动切换,1时3A,0时10A sbit TP=P5^4;//时间/电量切换 sbit ON=P5^5;//开始/暂停/清零 unr code sz2[]="0123456789"; unr code sz1[]="Design by ZHW"; //13 unr code sz3[]="Power meter 2.0"; //15 unsigned long va222,va333;//算平均数时,电压总量 unt c2,lcd_va2_pj,lcd_va_pj,wait; unt count,a=0,va,va2,lcd_va,lcd_va2; //LCD显示的电参数 unr adc_hi,zh=0; //zh为选择显示的变量,zh=1时,显示瓦时,zh=0时显示时间 unr adc_low; float waitss=0; long waitssxs; float wa; void ys(unt x) //延时ms { unt i,j; for(i=x;i>0;i--) for(j=900;j>0;j--); } void ysus(unt x) //延时us { unt i; for(i=x;i>0;i--); } void xie_ml(unr ml) //写lcd1602的命令 { EN=0; RS=0; //RW=0; P3=ml; ysus(500); EN=1; ysus(500); EN=0; } void xie_sj(unr sj) //写lcd1602数据 { EN=0; RS=1; // RW=0; P3=sj; ysus(500); EN=1; ysus(500); EN=0; } unr miao=0,fen=0,si=0; unt us4=0; void lcd_put_num(unr x,unr y,unt sz) //sz为一个四位整数,显示格式为0.00 用来显示小量程电压,电流 { unr ge,shi,bai; bai=sz/100; shi=sz%100/10; ge=sz%100%10; if(y==1) { xie_ml(0x80+x-1); xie_sj(sz2[bai]); xie_sj('.'); xie_sj(sz2[shi]); xie_sj(sz2[ge]); } if(y==2) { xie_ml(0x80+0x40+x-1); xie_sj(sz2[bai]); xie_sj('.'); xie_sj(sz2[shi]); xie_sj(sz2[ge]); } } void lcd_put_large_num(unr x,unr y,unt sz) //sz为一个3位整数,显示格式为00.0 用来显示大量程电压 { unr ge,shi,bai; bai=sz/1000; shi=sz%1000/100; ge=sz%1000%100/10; if(y==1) { xie_ml(0x80+x-1); xie_sj(sz2[bai]); xie_sj(sz2[shi]); xie_sj('.'); xie_sj(sz2[ge]); } if(y==2) { xie_ml(0x80+0x40+x-1); xie_sj(sz2[bai]); xie_sj(sz2[shi]); xie_sj('.'); xie_sj(sz2[ge]); } } void lcd_put_P(unr x,unr y,unt sz) //sz为一个四位整数,显示格式为000.0 功率 { unr ge,shi,bai,qian; qian=sz/1000; bai=sz%1000/100; shi=sz%1000%100/10; ge=sz%1000%100%10; if(y==1) { xie_ml(0x80+x-1); xie_sj(sz2[qian]); xie_sj(sz2[bai]); xie_sj(sz2[shi]); xie_sj('.'); xie_sj(sz2[ge]); } if(y==2) { xie_ml(0x80+0x40+x-1); xie_sj(sz2[qian]); xie_sj(sz2[bai]); xie_sj(sz2[shi]); xie_sj('.'); xie_sj(sz2[ge]); } } void lcd_put_long_num(unr x,unr y,unsigned long sz) //sz为一个5位整数,显示格式为000.00 显示电能 { unr ge,shi,bai,qian,wan; wan=sz/10000; qian=sz%10000/1000; bai=sz%10000%1000/100; shi=sz%10000%1000%100/10; ge=sz%10000%1000%100%10; if(y==1) { xie_ml(0x80+x-1); xie_sj(sz2[wan]); xie_sj(sz2[qian]); xie_sj(sz2[bai]); xie_sj('.'); xie_sj(sz2[shi]); xie_sj(sz2[ge]); } if(y==2) { xie_ml(0x80+0x40+x-1); xie_sj(sz2[wan]); xie_sj(sz2[qian]); xie_sj(sz2[bai]); xie_sj('.'); xie_sj(sz2[shi]); xie_sj(sz2[ge]); } } void lcd_put_sj(unr x,unr y,unt sj) //sj为一个2位整数,显示格式为00 显示时间 { unr sh,g; sh=sj/10; g=sj%10; if(y==1) { xie_ml(0x80+x-1); xie_sj(sz2[sh]); xie_sj(sz2[g]); } if(y==2) { xie_ml(0x80+0x40+x-1); xie_sj(sz2[sh]); xie_sj(sz2[g]); } } void lcd_xy(unr x,unr y) //显示字母时,选地址函数 { if(y==1) xie_ml(0x80+x-1); if(y==2) xie_ml(0x80+0x40+x-1); } void lcd_csh() //1602显示屏初始化 { xie_ml(0x38); xie_ml(0x0c); //无光标 xie_ml(0x06); xie_ml(0x01); xie_ml(0x80); } void kj() //开机动画 { unr i; lcd_xy(1,1); for(i=0;i<13;i++) { xie_sj(sz1[i]); ys(100); } lcd_xy(1,2); for(i=0;i<15;i++) { xie_sj(sz3[i]); ys(100); } ys(2000); xie_ml(0x01); } void T0_csh() //定时器初始化 { TMOD=0x02; TH0=6; TL0=6; EA=1; ET0=1; TR0=1; } void key() //按键扫描 { if(TP==0) { ys(30); while(!TP); if(zh==1) zh=0; else zh=1; } if(ON==0) { ys(30); while(!ON); si=0; fen=0; miao=0; waitss=0; lcd_xy(8,2); xie_sj(' '); } } void adc_cy() //ADC电压采样 { while(1) { unr status; ADC_CONTR|=0x80; //打开ADC电源 ys(1); P1ASF=0x0C; //P1.2为采样通道 ADC_CONTR=0xE3; //P1.2 AUXR1 |=0x04; //ADRJ=1; ys(1); ADC_CONTR|=0x08; //重新启动AD转换 status=0; while(status==0) //等待ADC转换结束 { status=ADC_CONTR&0x10; } ADC_CONTR&=0xE7; //ADC_FLAG清零 adc_hi=ADC_RES&0x03; //保存AD转换结果高2位 adc_low=ADC_RESL; //保存AD转换结果低8位 va=adc_hi; va=va<<8; va=va+adc_low; //电流计算 if(Iq==1) {lcd_va=va/3.413;} if(Iq==0) {lcd_va=va/1.024;} ys(1); ADC_CONTR=0xE2; //P1.3为采样通道 AUXR1 |=0x04; //ADRJ=1; ys(1); ADC_CONTR|=0x08; //重新启动AD转换 status=0; while(status==0) //等待ADC转换结束 { status=ADC_CONTR&0x10; } ADC_CONTR&=0xE7; //ADC_FLAG清零 adc_hi=ADC_RES&0x03; //保存AD转换结果高2位 adc_low=ADC_RESL; //保存AD转换结果低8位 va2=adc_hi; va2=va2<<8; va2=va2+adc_low; //电压计算 if(Uq==1) {lcd_va2=va2/2.048;} if(Uq==0) {lcd_va2=va2/0.2048;} key(); } } void time() //时间计算 { us4++; if(us4>=4000) { miao++; us4=0; waitss=wait/10+waitss; waitssxs=waitss/3600*100;//化成小时 if(waitss>=3596400) //此时电能显示999.00 { waitss=0; lcd_xy(8,2); xie_sj('1'); } if(miao>=60) { miao=0; fen++; if(fen>=60) { fen=0; si++; if(si>=99) si=0; } } } } void main() //主函数 { lcd_csh(); kj(); T0_csh(); lcd_xy(7,1); xie_sj('V'); lcd_xy(7,2); xie_sj('A'); lcd_xy(15,1); xie_sj('W'); adc_cy(); } void T0_time() interrupt 1 //0.25毫秒中断一次 { time(); count++; if(count==4) { count=0; } if(count==2) //采样一次,c2自加一次,1ms采样一次 { va222=lcd_va2+va222; va333=lcd_va+va333; c2++; } if(c2==100) //取100次算平均值,去显示,50ms刷新一次显示 { lcd_va2_pj=va222/100; lcd_va_pj=va333/100; va222=0; va333=0; c2=0; if(Uq==1) { lcd_put_num(3,1,lcd_va2_pj); lcd_xy(1,1); xie_sj('!'); xie_sj(' '); }//电压显示小量程 if(Uq==0) { lcd_put_large_num(3,1,lcd_va2_pj); lcd_xy(1,1); xie_sj('!'); xie_sj('!'); }//电压显示大量程 lcd_put_num(3,2,lcd_va_pj); if(Iq==1) { lcd_xy(1,2); xie_sj('!'); xie_sj(' '); } if(Iq==0) { lcd_xy(1,2); xie_sj('!'); xie_sj('!'); } wa=((float)lcd_va2_pj/100)*((float)lcd_va_pj/100); wait=10*wa; lcd_put_P(10,1,wait); if(zh==0) { lcd_put_sj(15,2,miao); lcd_put_sj(12,2,fen); lcd_put_sj(9,2,si); lcd_xy(11,2); xie_sj(':'); lcd_xy(14,2); xie_sj(':'); } if(zh==1) { lcd_put_long_num(9,2,waitssxs); lcd_xy(15,2); xie_sj('W'); lcd_xy(16,2); xie_sj('h'); } } }
评论
    相关推荐