找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2829|回復: 2
收起左側

基于單片機的數(shù)字式電能表

[復制鏈接]
ID:308098 發(fā)表于 2018-4-14 17:29 | 顯示全部樓層 |閱讀模式


//////////////////////////////////////////////
#include<REG52.H>
#define uchar unsigned char
#define uint unsigned int
unsigned char code command[6][7]={
                                 0xB0,0xC0,0xA8,0x01,0x01,0x00,0x1A,//讀取電壓值
                                 0xB1,0xC0,0xA8,0x01,0x01,0x00,0x1B,//讀取電流值
                                 0xB3,0xC0,0xA8,0x01,0x01,0x00,0x1D,//讀取電量值
                                 0x7e,0x05,0x41,0x00,0x04,0x40,0xef,
                                 0x7e,0x05,0x41,0x00,0x05,0x41,0xef,
                                 0x7e,0x05,0x41,0x00,0x06,0x42,0xef

                                };//串口控制音樂指令
uchar shuju[8];
uchar jishu=0;
uchar CRC=0;
uchar j=0;

long  AA=0;
uint BB=0;
uint CC;
//******************LCD1602****************************//
sbit lcden=P1^2;
sbit lcdrw=P1^1;
sbit lcdrs=P1^0;

//////////////LCD1602///////////////////////////////////////
void delay1(uint z)
{
    uint x,y;
    for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}
void write_com(uchar com)
{
    lcdrs=0;
    P0=com;
    delay1(5);
    lcden=1;
    delay1(5);
    lcden=0;
}

void write_data(uchar date)
{
    lcdrs=1;
    P0=date;
    delay1(5);
    lcden=1;
    delay1(5);
    lcden=0;
}
void init1602()
{
    lcden=0;
    write_com(0x38);
    write_com(0x0c);//    write_com(0x0e);
    write_com(0x06);
    write_com(0x01);
    write_com(0x80+2);
}
///////////////LCD1602   
void SendASC(uchar d)    //串口發(fā)送字符
{
   
    SBUF=d;                //數(shù)據(jù)賦值到緩沖區(qū)
    while(!TI);            //發(fā)送完

    TI=0;                //清零
}
void deal(void)
{
  //電壓讀取
           jishu=0;
           for(j=0;j<7;j++)
            {    shuju[j]=0;
                  SendASC(command[0][j]);   
            }
            delay1(200);
            delay1(20);
            if(jishu>0)
              {      CRC=0;
                  for(j=0;j<6;j++)
                    {   
                       CRC=CRC+shuju[j];

                    }
                  if((CRC==shuju[6])&&(shuju[0]==0xa0))
                      {
                          AA=shuju[1]*256+shuju[2];
                          write_com(0x80+0x40);
                          if(AA>=100)
                               write_data(AA/100+0x30);
                          else write_data(' ');
                          delay1(20);
                          write_data(AA%100/10+0x30);
                          delay1(20);
                          write_data(AA%10+0x30);
                          delay1(20);
                          write_data('.');
                          delay1(20);
                          write_data(shuju[3]+0x30);
                          delay1(20);
                          write_data('V');
                          delay1(20);
                      }
              }
   //電流讀取
           jishu=0;
           for(j=0;j<7;j++)
            {    shuju[j]=0;
                  SendASC(command[1][j]);   
            }
            delay1(200);
            if(jishu>0)
              {      CRC=0;
                  for(j=0;j<6;j++)
                    {   
                       CRC=CRC+shuju[j];

                    }
                  if((CRC==shuju[6])&&(shuju[0]==0xa1))
                      {
                          AA=shuju[2];
                          write_com(0x80+0x40+9);
                          if(AA>=100)
                               write_data(AA/100+0x30);
                          else write_data(' ');
                          delay1(20);
                          write_data(AA%100/10+0x30);
                          delay1(20);
                          write_data(AA%10+0x30);
                          delay1(20);
                          write_data('.');
                          delay1(20);
                          write_data(shuju[3]/10+0x30);
                          delay1(20);
                          write_data(shuju[3]%10+0x30);
                          delay1(20);
                          write_data('A');
                          delay1(20);
                      }
              }
    //電量讀取
           jishu=0;
           for(j=0;j<7;j++)
            {    shuju[j]=0;
                  SendASC(command[2][j]);   
            }
            delay1(200);
            if(jishu>0)
              {      CRC=0;
                  for(j=0;j<6;j++)
                    {   
                       CRC=CRC+shuju[j];

                    }
                  if((CRC==shuju[6])&&(shuju[0]==0xa3))
                      {
                        
                          AA=shuju[1];
                          AA=AA<<16;
                          AA=AA+shuju[2]*256;
                          AA=AA+shuju[3];
                          write_com(0x80);
                          if(AA>=1000000)
                               write_data(AA/1000000+0x30);
                          else write_data(' ');
                          delay1(20);
                          if(AA>=100000)
                               write_data(AA%1000000/100000+0x30);
                          else write_data(' ');
                          delay1(20);
                          if(AA>=10000)
                               write_data(AA%100000/10000+0x30);
                          else write_data(' ');
                          delay1(20);
                          if(AA>=1000)
                               write_data(AA%10000/1000+0x30);
                          else write_data(' ');
                          delay1(20);
                          if(AA>=100)
                               write_data(AA%1000/100+0x30);
                          else write_data(' ');
                          delay1(20);
                          if(AA>=10)
                               write_data(AA%100/10+0x30);
                          else write_data(' ');
                          delay1(20);
                          write_data(AA%10+0x30);
                          delay1(20);

                          write_data('W');
                          delay1(20);
                          write_data('H');
                          delay1(20);
                      }
              }

}
void main(void)
{

  lcdrw=0;
  init1602();
  //串口通信
   TMOD=0x21;//?????0?????1
   TH1=0Xfd;
   TL1=0Xfd;        //9600波特率
   TR1=1;             // 定時器1啟動  
   SM0=0;        // 設置串口的工作模式
   SM1=1;         //方式1
   REN=1;          // 允許串口接收數(shù)據(jù)      
   ES=1;          // 串口中斷應許
   EA=1;
  while(1)
        {  
        
            deal();
         

        }
}

void ser() interrupt 4
{
    if(RI)
       {
        RI=0;
        shuju[jishu++]=SBUF;
        if(jishu>7)
            jishu=0;
       }
   
}  

回復

使用道具 舉報

ID:313732 發(fā)表于 2018-4-25 17:25 | 顯示全部樓層
小白在做設計,有沒有仿真圖啊
回復

使用道具 舉報

ID:1115953 發(fā)表于 2024-4-10 14:05 | 顯示全部樓層
靜凈 發(fā)表于 2018-4-25 17:25
小白在做設計,有沒有仿真圖啊

哥給看看仿真圖,我現(xiàn)在才做DIY小玩意,遇到難點了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表