12c5a60s2单片机的移动电源设计
时间:10-02
整理:3721RD
点击:
#include<STC12c5a60s2.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define float
#define AD_SPEED 0X60
uchar z=0,n=0.0,h=0;//z定时器、
float v=0.0;
sbit L1=P0^0;
sbit L2=P0^1;
sbit L3=P0^2;
sbit L4=P0^3;
sbit I=P0^6;//检查是否有外部输入。
sbit L5=P0^7;
sbit k1=P0^5;
sbit k2=P0^4;
//void zd();
void ad();
void desplay();
void PWM(uchar n);
void delay(uint w);
void main()
{
while(1)
{
if(k2==0)
{
h=~h;break;
}
if(h==1)
{
L5=1;
}
if(I==1)//当外部有输入时
{
ad();
desplay();
if(v>=102.0&v<112.2)//2.0<v<2.2
{
PWM(0x75);//PWM(0x75); //46
}
if(v>=112.2&v<122.4)//2.2<v<2.4
{
PWM(0x80); //50
}
if(v>=122.4&v<132.6)//2.4<v<2.6
{
PWM(0x8a); //54
}
if(v>=132.6&v<142.8)//2.6<v<2.8
{
PWM(0x94); //58
}
if(v>=142.8&v<153.0)//2.8<v<3.0
{
PWM(0x9e); //62
}
if(v>=153.0&v<163.2)//3.0 3.2
{
PWM(0xa8); //66
}
if(v>=163.2&v<188.7)//3.2<v<3.7
{
PWM(0xc2); //76
}
if(v>=188.7&v<204)//3.7<v<4.0
{
PWM(0xd1); //82
}
if(v>=204.0&v<=212.0)//4.0<v<4.15
{
PWM(0xd5); //83.5
}
if(v==213)
{
PWM(0x00);
}
}
if(I==0&k1==1)//当外部无输入时
{
ad();
desplay();
}
}
}
//******************************LED*************************//
void desplay()
{
if(I==1)
{
//PWM=0;
//ad();
//PWM=1;
if(v<163.2) //第一格灯闪 <3.2
{
L1=~1;;
delay(50000);
}
if(v>163.2&v<175.95) //第一格灯亮,第二格灯闪 3.2 3.45
{
L1=1;
L2=~L2;
delay(50000);
}
if(v>175.95&v<188.7) //第一二格灯亮,第三格灯闪 3.45 3.7
{
L1=1;
L2=1;
L3=~L3;
delay(50000);
}
if(v>188.7&v<201.45) //第一二三灯亮,第四灯闪 3.7 3.95
{
L1=1;
L2=1;
L3=1;
L4=~L4;
delay(50000);
}
if(v>201.45&v<214.2) //第一二三四灯亮.3.95 4.2
{
L1=1;
L2=1;
L3=1;
L4=1;
}
}
if(I==0)
{
if(v<163.2) //第一格灯闪
{
L1=~L1;;
delay(8000);
}
if(v>163.2&v<176.64) //第一格灯亮
{
L1=1;
}
if(v>176.64&v<189.44) //第一二格灯亮
{
L1=1;
L2=1;
}
if(v>189.44&v<202.24) //第一二三灯亮
{
L1=1;
L2=1;
L3=1;
}
if(v>202.24&v<214.2) //第一二三四灯亮.
{
L1=1;
L2=1;
L3=1;
L4=1;
}
}
}
//*******************************以上是LED显示程序*********************************//
//*******************************以下是ADC程序********************************//
void ad()
{
AUXR1=0x00;
ADC_RES=0;//储存ad清零
ADC_RESL=0;
//DC_CONTR|=0x00;
ADC_CONTR|=0x80;//启动电源
delay(2);
ADC_CONTR|=0x08;//开始转换
while((ADC_CONTR&0X10)==0);
ADC_CONTR&=0xe7;//11110111 清AD_FLAG位,关闭AD
v=(ADC_RES/255)*5;//返回AD高8位
}
void delay(uint w)
{
uchar x,j;
for(j=0;j<w;j++)
for(x=0;x<=148;x++);
}
//**************************************ADC************************************//
//**************************************ZD*************************************//xjw
/*void zdini(void) //
{
TMOD = 0x02;
TH0=(65536-50000)/256; //50ms;12M晶振;
TL0=(65536-50000)%256;
TL0 = 0x19;
TR0 = 1;
ET0=1;
EA=1;
}
void zd() interrupt 1 //使用的是定时器T0
{
z++;
TH0=(65536-50000)/256; //50ms;12M晶振;
TL0=(65536-50000)%256;
}*/
void PWM(uchar n)//PWM主程序
{
CCON=0;//PCA控制寄存器初始化
//PCA定时器停止运行
//清楚CF标志位
//清除全部单元中断标志位
CL=0;//PCA的16位计数器低八位//PCA时基复位
CH=0;//PCA的16位计数器母甙宋?
CMOD=0X05;// 选择系统时钟为计数脉冲 此时PWM频率为系统时钟/256
//PCA时钟溢出不能使位
CCAP0H=n;
//CCAP0L=n;
PCA_PWM0=0X00;//控制占空比第九位为0
CCAPM0=0X42;//允许P1.3作为PWM输出
CR=1;//启动PCA计数器
}
编译没为题,但是我想实现的功能是在没有外接输入(也就是充电的时候),按下k1就启动ad和指示灯显示程序显示电量电能,按下k2的时候照明灯亮。当有外界输入的时候,led指示灯根据电量显示灯数量,按下k2的时候照明亮 可是实现不了 求大神指导指导。
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define float
#define AD_SPEED 0X60
uchar z=0,n=0.0,h=0;//z定时器、
float v=0.0;
sbit L1=P0^0;
sbit L2=P0^1;
sbit L3=P0^2;
sbit L4=P0^3;
sbit I=P0^6;//检查是否有外部输入。
sbit L5=P0^7;
sbit k1=P0^5;
sbit k2=P0^4;
//void zd();
void ad();
void desplay();
void PWM(uchar n);
void delay(uint w);
void main()
{
while(1)
{
if(k2==0)
{
h=~h;break;
}
if(h==1)
{
L5=1;
}
if(I==1)//当外部有输入时
{
ad();
desplay();
if(v>=102.0&v<112.2)//2.0<v<2.2
{
PWM(0x75);//PWM(0x75); //46
}
if(v>=112.2&v<122.4)//2.2<v<2.4
{
PWM(0x80); //50
}
if(v>=122.4&v<132.6)//2.4<v<2.6
{
PWM(0x8a); //54
}
if(v>=132.6&v<142.8)//2.6<v<2.8
{
PWM(0x94); //58
}
if(v>=142.8&v<153.0)//2.8<v<3.0
{
PWM(0x9e); //62
}
if(v>=153.0&v<163.2)//3.0 3.2
{
PWM(0xa8); //66
}
if(v>=163.2&v<188.7)//3.2<v<3.7
{
PWM(0xc2); //76
}
if(v>=188.7&v<204)//3.7<v<4.0
{
PWM(0xd1); //82
}
if(v>=204.0&v<=212.0)//4.0<v<4.15
{
PWM(0xd5); //83.5
}
if(v==213)
{
PWM(0x00);
}
}
if(I==0&k1==1)//当外部无输入时
{
ad();
desplay();
}
}
}
//******************************LED*************************//
void desplay()
{
if(I==1)
{
//PWM=0;
//ad();
//PWM=1;
if(v<163.2) //第一格灯闪 <3.2
{
L1=~1;;
delay(50000);
}
if(v>163.2&v<175.95) //第一格灯亮,第二格灯闪 3.2 3.45
{
L1=1;
L2=~L2;
delay(50000);
}
if(v>175.95&v<188.7) //第一二格灯亮,第三格灯闪 3.45 3.7
{
L1=1;
L2=1;
L3=~L3;
delay(50000);
}
if(v>188.7&v<201.45) //第一二三灯亮,第四灯闪 3.7 3.95
{
L1=1;
L2=1;
L3=1;
L4=~L4;
delay(50000);
}
if(v>201.45&v<214.2) //第一二三四灯亮.3.95 4.2
{
L1=1;
L2=1;
L3=1;
L4=1;
}
}
if(I==0)
{
if(v<163.2) //第一格灯闪
{
L1=~L1;;
delay(8000);
}
if(v>163.2&v<176.64) //第一格灯亮
{
L1=1;
}
if(v>176.64&v<189.44) //第一二格灯亮
{
L1=1;
L2=1;
}
if(v>189.44&v<202.24) //第一二三灯亮
{
L1=1;
L2=1;
L3=1;
}
if(v>202.24&v<214.2) //第一二三四灯亮.
{
L1=1;
L2=1;
L3=1;
L4=1;
}
}
}
//*******************************以上是LED显示程序*********************************//
//*******************************以下是ADC程序********************************//
void ad()
{
AUXR1=0x00;
ADC_RES=0;//储存ad清零
ADC_RESL=0;
//DC_CONTR|=0x00;
ADC_CONTR|=0x80;//启动电源
delay(2);
ADC_CONTR|=0x08;//开始转换
while((ADC_CONTR&0X10)==0);
ADC_CONTR&=0xe7;//11110111 清AD_FLAG位,关闭AD
v=(ADC_RES/255)*5;//返回AD高8位
}
void delay(uint w)
{
uchar x,j;
for(j=0;j<w;j++)
for(x=0;x<=148;x++);
}
//**************************************ADC************************************//
//**************************************ZD*************************************//xjw
/*void zdini(void) //
{
TMOD = 0x02;
TH0=(65536-50000)/256; //50ms;12M晶振;
TL0=(65536-50000)%256;
TL0 = 0x19;
TR0 = 1;
ET0=1;
EA=1;
}
void zd() interrupt 1 //使用的是定时器T0
{
z++;
TH0=(65536-50000)/256; //50ms;12M晶振;
TL0=(65536-50000)%256;
}*/
void PWM(uchar n)//PWM主程序
{
CCON=0;//PCA控制寄存器初始化
//PCA定时器停止运行
//清楚CF标志位
//清除全部单元中断标志位
CL=0;//PCA的16位计数器低八位//PCA时基复位
CH=0;//PCA的16位计数器母甙宋?
CMOD=0X05;// 选择系统时钟为计数脉冲 此时PWM频率为系统时钟/256
//PCA时钟溢出不能使位
CCAP0H=n;
//CCAP0L=n;
PCA_PWM0=0X00;//控制占空比第九位为0
CCAPM0=0X42;//允许P1.3作为PWM输出
CR=1;//启动PCA计数器
}
编译没为题,但是我想实现的功能是在没有外接输入(也就是充电的时候),按下k1就启动ad和指示灯显示程序显示电量电能,按下k2的时候照明灯亮。当有外界输入的时候,led指示灯根据电量显示灯数量,按下k2的时候照明亮 可是实现不了 求大神指导指导。
你可以
1:
把那么多的if换成if-else if
2:按键的检测那块有问题。
我急看了你前面一点
可以 只不过我不会程序
求花点时间指导下
换成if-else 我也是前些天和我同学聊天的时候他说了这个问题;
还有就是你的按键检测:
最简单的可以这样啊,用延时,
if(k2==0)
{
delay(200);
if(k2==0)
{....}
}
还有你可以上网找一下按键检测的程序,很多,也很实用。
k