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-12 11:05 编辑
不太清楚你的电量采集模拟?电能量完全可以根据公式计算出来的啊,没必要去在单独采集了呀,电压*电流*时间=电能量;而且电能量应该是和时间有关系的,随时间累计增加的,在你代码里没看出来有,也有可能是你电量采集的硬件已经做好了?我不清楚。
至于AD值没有变可能是因为是在模拟环境下进行,你的电平,电阻都是理想的,所以没有波动。
只是猜测,仅供参考! 村里小黑 发表于 2022-4-12 10:59
不太清楚你的电量采集模拟?电能量完全可以根据公式计算出来的啊,没必要去在单独采集了呀,电压*电流*时间 ...
谢谢
页:
[1]