|
50鱼币
关于一个充电器问题,就是投币后 再开始的话 等待的时候电压 电流 还有电量在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 char A_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[2]=temp%1000/100+0x30;
table1[4]=temp%100/10+0x30;
table1[5]=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[2]=temp%1000/100+0x30;
table3[4]=temp%100/10+0x30;
table3[5]=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[3]=temp%1000/100+0x30;
table5[4]=temp%100/10+0x30;
table5[5]=temp%10+0x30;
w_cmd(0xc0+0);
w_str(table5);
delay(10);
//³äµçʱ¼äÏÔʾ
time[2]=total%1000/100+0x30;
time[3]=total%100/10+0x30;
time[4]=total%10+0x30;
w_cmd(0xc0+8);
w_str(time);
delay(10);
}
}
本帖最后由 村里小黑 于 2022-4-12 11:05 编辑
不太清楚你的电量采集模拟?电能量完全可以根据公式计算出来的啊,没必要去在单独采集了呀,电压*电流*时间=电能量;而且电能量应该是和时间有关系的,随时间累计增加的,在你代码里没看出来有,也有可能是你电量采集的硬件已经做好了?我不清楚。
至于AD值没有变可能是因为是在模拟环境下进行,你的电平,电阻都是理想的,所以没有波动。
只是猜测,仅供参考!
|
-
仿真图
最佳答案
查看完整内容
不太清楚你的电量采集模拟?电能量完全可以根据公式计算出来的啊,没必要去在单独采集了呀,电压*电流*时间=电能量;而且电能量应该是和时间有关系的,随时间累计增加的,在你代码里没看出来有,也有可能是你电量采集的硬件已经做好了?我不清楚。
至于AD值没有变可能是因为是在模拟环境下进行,你的电平,电阻都是理想的,所以没有波动。
只是猜测,仅供参考!
|