12c5a60s2单片机的移动电源设计

2019-07-15 19:39发布

#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的时候照明亮 可是实现不了 求大神指导指导。。。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
190471306
1楼-- · 2019-07-16 00:13
你可以
1:
把那么多的if换成if-else if
2:按键的检测那块有问题。
我急看了你前面一点
164908060
2楼-- · 2019-07-16 03:55
可以            只不过我不会程序
青春的祭奠
3楼-- · 2019-07-16 07:54
190471306 发表于 2014-5-19 20:39
你可以
1:
把那么多的if换成if-else if

求花点时间指导下
190471306
4楼-- · 2019-07-16 09:04
青春的祭奠 发表于 2014-5-21 11:39
求花点时间指导下

换成if-else 我也是前些天和我同学聊天的时候他说了这个问题;
还有就是你的按键检测:
   最简单的可以这样啊,用延时,
    if(k2==0)
    {
           delay(200);
           if(k2==0)
            {....}

     }
  还有你可以上网找一下按键检测的程序,很多,也很实用。。

zhang168shen
5楼-- · 2019-07-16 14:58
 精彩回答 2  元偷偷看……

一周热门 更多>