DragonYu 发表于 2022-4-2 11:32:48

51智能充电器问题

关于一个充电器问题,就是投币后 再开始的话 等待的时候电压 电流 还有电量在LCD1602中为什么不会改变啊?按道理应该随着充电时间而增加的啊?DEBUG了一下发现那个AD转换好像值也没变 不知道什么原因 有大神看看嘛?
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
/***************Òý½ÅÉùÃ÷*********************/
#define lcd P0
sbit rs=P2^7;          //LCDÒº¾§¿ØÖƶË
sbit en=P2^6;
sbit SPK=P1^7;//·äÃùÆ÷Òý½Å
sbit CS=P1^2;   //½«CS붨ÒåΪP1.2Òý½Å
sbit CLK=P1^0;//½«CLK붨ÒåΪP1.0Òý½Å
sbit DIO=P1^1;//½«DIO붨ÒåΪP1.1Òý½Å
sbit key1=P1^6;//¶¨Òå°´¼üÒý½Å
sbit key2=P1^5;//¶¨Òå°´¼üÒý½Å
sbit key3=P1^4;//¶¨Òå°´¼üÒý½Å
sbit a=P2^0;                //Ä£ÄâÁ¿Í¨µÀÑ¡Ôñ¶Ë
sbit b=P2^1;                //Ä£ÄâÁ¿Í¨µÀÑ¡Ôñ¶Ë
sbit c=P2^2;                //Ä£ÄâÁ¿Í¨µÀÑ¡Ôñ¶Ë
sbit LED = P3^7;
sbit LED1 = P3^6;
sbit LED2 = P3^5;

uint total = 0;                       
uint count = 0;

/***********LCDÏÔʾÊý×é**************************/

uchar table1[]="V=0.00V";
uchar table3[]="I=0.00A";
uchar table5[]="PO=000%";
uchar time[]="T=000Min";

/***************È«¾Ö±äÁ¿************************/
uchar flag=0;      //»»µ²±ê־λ


void delay(uint count)               //ÑÓʱ
{
uint i,j;
for(i=0;i<count;i++)
   for(j=0;j<120;j++);
}

/*************LCD1602Çý¶¯³ÌÐò************************/
void w_cmd(uchar com)                  //lcd1602дÃüÁî
{
rs=0;
lcd=com;
en=1;
delay(5);
en=0;
}

void w_data(uchar dat)                  //lcd1602¶ÁÊý¾Ý
{
rs=1;
lcd=dat;
en=1;
delay(5);
en=0;
}

void w_str(uchar *s)       //lcd1602д×Ö·û´®
{
    while(*s)w_data(*s++);
}

void init()                     //lcd1602³õʼ»¯
{
en=0;
w_cmd(0x38);
w_cmd(0x0c);
w_cmd(0x06);
w_cmd(0x01);
}

/*****************************************************
º¯Êý¹¦ÄÜ£º½«Ä£ÄâÐźÅת»»³ÉÊý×ÖÐźÅ
***************************************************/
unsigned charA_D()
{
unsigned char i,dat;
   CS=1;   //Ò»¸öת»»ÖÜÆÚ¿ªÊ¼
   CLK=0;//ΪµÚÒ»¸öÂö³å×÷×¼±¸
   CS=0;//CSÖÃ0£¬Æ¬Ñ¡ÓÐЧ
   DIO=1;    //DIOÖÃ1£¬¹æ¶¨µÄÆðʼÐźÅ
   CLK=1;   //µÚÒ»¸öÂö³å
   CLK=0;   //µÚÒ»¸öÂö³åµÄϽµÑØ£¬´ËÇ°DIO±ØÐëÊǸߵçƽ
   DIO=1;   //DIOÖÃ1£¬ ͨµÀÑ¡ÔñÐźÅ
   CLK=1;   //µÚ¶þ¸öÂö³å£¬µÚ2¡¢3¸öÂö³åϳÁ֮ǰ£¬DI±ØÐë¸ú±ðÊäÈëÁ½Î»Êý¾ÝÓÃÓÚÑ¡ÔñͨµÀ£¬ÕâÀïѡͨµÀCH0
   CLK=0;   //µÚ¶þ¸öÂö³åϽµÑØ
   
   DIO=0;   //DIÖÃ0£¬Ñ¡ÔñͨµÀ0
   CLK=1;    //µÚÈý¸öÂö³å
   CLK=0;    //µÚÈý¸öÂö³åϽµÑØ
   DIO=1;    //µÚÈý¸öÂö³åϳÁÖ®ºó£¬ÊäÈë¶ËDIOʧȥ×÷Óã¬Ó¦ÖÃ1
   CLK=1;    //µÚËĸöÂö³å
   for(i=0;i<8;i++)//¸ßλÔÚÇ°
    {
      CLK=1;         //µÚËĸöÂö³å
      CLK=0;
      dat<<=1;       //½«ÏÂÃæ´¢´æµÄµÍλÊý¾ÝÏòÓÒÒÆ
   dat|=(unsigned char)DIO;   //½«Êä³öÊý¾ÝDIOͨ¹ý»òÔËËã´¢´æÔÚdat×îµÍλ
    }            
    CS=1;          //ƬѡÎÞЧ
return dat;//½«¶ÁÊéµÄÊý¾Ý·µ»Ø   
}
/**********************±¨¾¯³ÌÐò************************/
void BaoJing(void)
{
        uint i, j;
        for (i = 0; i < 200; i++)    //²úÉúÂö³åʹ·äÃùÆ÷·¢³öÉùÒô
        {
         SPK = 0; for (j = 0; j < 100; j++);
         SPK = 1; for (j = 0; j < 100; j++);
}       
}
/*********************°´¼üÅж¨************************************/
void keyscan()
{
        if(key1==0)                   //ÅжÏÊÇ·ñ°´ÏÂ
        {
                delay(10);
                if(key1==0)
                {
                        while(!key1);
                        total+=5;
                        BaoJing();   //ÌáʾÒô
                        if(total >990 ) total = 990;
                       
                }
        }
        if(key2==0)                   //ÅжÏÊÇ·ñ°´ÏÂ
        {
                delay(10);
                if(key2==0)
                {
                        while(!key2);
                        if(total > 0){
                                BaoJing();   //ÌáʾÒô
                                LED = 1;
                                TR1 = 1;
                        }
                       
                }
        }
        if(key3==0)                   //ÅжÏÊÇ·ñ°´ÏÂ
        {
                delay(10);
                if(key3==0)
                {
                        while(!key3);
                        BaoJing();   //ÌáʾÒô
                        LED = 0;
                        LED = 0;
                        LED = 0;
                        total = 0;
                        TR1 = 0;       
                }
        }
}

/*******************¶¨Ê±Æ÷1³õʼ»¯³ÌÐò******************/
void Timer1_Init(void)
{
        TMOD=0x11;       
        TH1 = ( 65535 - 50000 ) / 256;   //0.2ms
        TL1 = ( 65535 - 50000 ) % 256;
        ET1=1;               
        TR1=0;       
        EA=1;
}
/*******************¶¨Ê±Æ÷1ÖжϳÌÐò********************/
void Timer1 ( void ) interrupt 3//¶¨Ê±Æ÷1ÖжϺ¯Êý 0.2ms
{
        TH1 = ( 65535 - 50000) / 256;
        TL1 = ( 65535 - 50000 ) % 256;          
        count++;
        if(count==25*60)
        {
                total--;
                if(total == 0)
                {
                        total =0;
                        LED = 0;
                        LED2 = 1;
                        TR1=0;
                }
                count =0;       
        }
}

/*Ö÷º¯Êý*/                                                               
void main()
{
uint adval;
unsigned long int temp;
init();       //Òº¾§³õʼ»¯       
Timer1_Init();//¶¨Ê±Æ÷1³õʼ»¯
LED = 0;       
LED1=0;
LED2=0;
while(1)
{
       
        //Ö±Á÷µçѹ²âÁ¿
        keyscan();   //°´¼üÅж¨
        c=0;b=0;a=0;    //ͨµÀÑ¡Ôñ
        //w_cmd(0x80);
        //w_str(table0);
        adval=A_D();    //½øÐÐA/Dת»»
        temp=adval* 5.0/255* 2*100;//ת»»³Éʵ¼Êµçѹ²¢·Å´ó100±¶
        table1=temp%1000/100+0x30;
        table1=temp%100/10+0x30;
        table1=temp%10+0x30;                       
        w_cmd(0x80+0x00);       
        w_str(table1);               
        delay(10);
                       
        //Ö±Á÷µçÁ÷²âÁ¿
        c=0;b=0;a=1;    //ͨµÀÑ¡Ôñ
        //w_cmd(0x80);
        //w_str(table2);               
        adval=A_D();    //½øÐÐA/Dת»»
        temp=adval*0.1/255*5000000/10;
       
        table3=temp%1000/100+0x30;
        table3=temp%100/10+0x30;
        table3=temp%10+0x30;       
        w_cmd(0x80+8);       
        w_str(table3);
        delay(10);
                       
        //µçÁ¿¼ì²â
        c=0;b=1;a=0;    //ͨµÀÑ¡Ôñ
        adval=A_D();    //½øÐÐA/Dת»»
        temp=adval*1.0/(255-adval)*1000;
        temp = temp/96;
        if(temp > 100)temp = 100;

        if(temp == 100){
                LED = 0;
                LED1 = 1;
        }else{
                LED1 = 0;
        }       
        table5=temp%1000/100+0x30;               
        table5=temp%100/10+0x30;               
        table5=temp%10+0x30;       
        w_cmd(0xc0+0);       
        w_str(table5);
        delay(10);
                                       
        //³äµçʱ¼äÏÔʾ
        time=total%1000/100+0x30;               
        time=total%100/10+0x30;               
        time=total%10+0x30;       
        w_cmd(0xc0+8);       
        w_str(time);
        delay(10);                                       
          
}
}

村里小黑 发表于 2022-4-2 11:32:49

本帖最后由 村里小黑 于 2022-4-12 11:05 编辑

不太清楚你的电量采集模拟?电能量完全可以根据公式计算出来的啊,没必要去在单独采集了呀,电压*电流*时间=电能量;而且电能量应该是和时间有关系的,随时间累计增加的,在你代码里没看出来有,也有可能是你电量采集的硬件已经做好了?我不清楚。
至于AD值没有变可能是因为是在模拟环境下进行,你的电平,电阻都是理想的,所以没有波动。

只是猜测,仅供参考!

DragonYu 发表于 2022-4-15 16:22:46

村里小黑 发表于 2022-4-12 10:59
不太清楚你的电量采集模拟?电能量完全可以根据公式计算出来的啊,没必要去在单独采集了呀,电压*电流*时间 ...

谢谢
页: [1]
查看完整版本: 51智能充电器问题