找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8604|回复: 11
打印 上一主题 下一主题
收起左侧

2015全国电子设计大赛A题实物100分

  [复制链接]
跳转到指定楼层
楼主
ID:225545 发表于 2017-8-7 20:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
内含辅助电路  功率电路  控制电路
/*2015全国电子设计大赛A题作品程序*/
#include <STC12C5A60S2.H>
#include <intrins.h>              /*use _nop_() function*/
#define uchar unsigned char
#define uint unsigned int
#define ADC_FLAG      0X10

/*****************************************
端口功能设定
*****************************************/
sbit PWM_1                =        P1^4;       //PWM1_Boost/Buck
sbit SD_1                  =        P1^3;       //SD1_Boost_Buck
sbit Key_1                =        P2^1;       //Key_1
sbit Key_2                =        P2^2;       //Key_2
sbit Key_3                =        P2^3;       //Key_3

uint ADC_value;
uchar PWM_temp=2;
uchar last_key;                                //按键变量
uchar channel=0;                        //第一通道
uchar Caes=0;                                //菜单
uint  OUT_Current=300;
uint  Battery_voltage;                //输入电压        
uint  Boost_voltage;                //Boost电压                 
uint  Boost_Buck_current;        //Buck_Boost电流8位
uint  O_current;                        //输出电流
uint  A_value=90;
bit lock=0;                           //PWM输出锁定
bit ADC_ready=0;                   //ADC完毕
bit K=0;
bit Charge=0;
void delay();
void Key_0_();
void Key_1_();
void Key_2_();
void Key_3_();
void init_pca();
void init_timer();
/**********************************************************
函数说明: 延时程序
**********************************************************/
void delay(uchar t)
{
        uint j;
        uchar i;
        for(i=0;i<t;i++)
                for(j=0;j<1000;j++);
}
/**********************************************************
函数说明: PWM初始化
**********************************************************/
void init_pwm()
{
  CCON = 0;
        CL = 0;
        CH = 0;
        CMOD = 0X08; //0X08:43KHZ // 0X02,22KHZ // 0X0A,10KHZ //
        CCAPM1        =0x42;//8位PWM输出,无中断
        CCAP1L         =CCAP1H =250;//初始化spwm输出的占空比
        CR=1;
}
/**********************************************************
函数说明: 中断 始化函数
**********************************************************/
void InitADC()
{
        P1M1=0x47;
        P1M0=0x00;
        P1ASF=0X47;                    //选择ADC通道0126
        ADC_RES=0;
        ADC_CONTR=0X88;                   //1110 0000           E8 开电源,最高速
        EA=1;
        EADC=1;
}
/**************************************
1602液晶
**************************************/
sbit RS = P2^5;               
sbit RW = P2^6;
sbit E  = P2^7;
/**************************************
短延时
**************************************/
void delay5ms()   
{
    uchar i,v,k;
    for(i=1;i>0;i--)
        for(v=168;v>0;v--)
            for(k=22;k>0;k--);
}
/**************************************
写指令
**************************************/
void lcd_Write_com(uchar com)         
{
        RS=0;                        //定义指令寄存器
        RW=0;                                  //写允许
        P0=com;                                          //写指令
        delay5ms();        E=1;                //片选端上拉
        delay5ms();        E=0;                //下降沿锁存
}
/**************************************
写数据
**************************************/
void lcd_write_date(uchar date)        
{
        RS=1;                                        //定义数据寄存器
        RW=0;                                        //写允许
        P0=date;                                //写数据
        delay5ms();        E=1;                //片选端上拉
        delay5ms();        E=0;                //下降沿锁存
}
/**************************************
显示程序
**************************************/
void dis_lcd1602(uchar x,uchar y,uchar dat)
{
        uchar add;
        if(y==1)         add=(0x80+x);
        if(y==2)         add=(0xc0+x);
        lcd_Write_com(add);                //写指令
        lcd_write_date(dat);        //写数据
}  
/**************************************
液晶初始化
**************************************/
void lcd1602_init()
{
        lcd_Write_com(0x38);        //设置8位格式,2行,5*7
        lcd_Write_com(0x01);        //清屏
        lcd_Write_com(0x0c);        //整体显示,关光标,不闪烁
        lcd_Write_com(0x06);        //设定输入方式,增量不移位
        lcd_Write_com(0x80);        //初始坐标
}
/**************************************
液晶显示汉字程序
**************************************/
void hz_lcdDis(uchar x,uchar y,uchar *p) //汉字显示
{
   uchar i=0,temp;
   if(x)temp = 0x40;   else temp = 0;
   for(i=y;*p!='\0';i++,p++)
   {
                lcd_Write_com(i|0x80+temp);
                lcd_write_date(*p);
                delay5ms();                          
   }
}
/**************************************
液晶显示数字程序
**************************************/
void  num_lcdDis(uchar X,uchar Y,uint num,uchar n)        
{
        uint i=0,temp,hang;   
        n +=1;
           if(X)hang = 0x40;else hang = 0;
           for(i=(n-1);i>0;i--)
    {           
                  lcd_Write_com((i+Y-1)|0x80+hang);          //从个位开始显示
                  temp = num%10+0x30;
                  lcd_write_date(temp);        
                 delay5ms();
                  num/=10;                                         
        }        
}
/**********************************************************
函数说明: 平均滤波函数
**********************************************************/
#define N 50
uint Filter(uint adc_data)
{
        uint value=0;
        uchar count,count_ADC;
        for(count=0;count<N;count++)
        {
                for(count_ADC=0;count_ADC<3;count_ADC++)
                {
                        while(!ADC_ready){}
                        ADC_ready=0;
                }
                value+=adc_data;         
        }
        return (value);
}
/**********************************************************
函数说明:按键延时防抖动
P3^5       Key_1
P3^6       Key_2
P3^7       Key_3

**********************************************************/
void key_scan()
{
        uchar temp;
        temp = P2&0x0F;
        if(temp != 0x0F)
        {
                delay(10);
                temp = P2&0x0F;
                if(temp!= 0x0F)
                {
                        switch(temp)
                        {
                                case 0x0E: Key_0_();        break;        //20
                                case 0x0D: Key_1_();        break;        //21
                                case 0x0B: Key_2_();        break;        //22
                                case 0x07: Key_3_();        break;        //23
                                default:break;
                        }
                }
        }
//        last_key = temp;
}

/**********************************************************
函数说明: 按键程序
**********************************************************/
void Key_0_()
{
  Charge=~Charge;
        if(Charge)         {CCAP1L         =CCAP1H =128;  SD_1=1;        hz_lcdDis(0,8,"d");}        
        else              {SD_1=0;  hz_lcdDis(0,8,"c");}        

}
void Key_1_()
{
        if(K)        {SD_1=0;        lock=1;                CCAP1L=CCAP1H =128;        hz_lcdDis(0,8,"g");        }  //boost的软启动,防止瞬间冲击电流过大,影响后级稳定性
        else         {SD_1=1;        lock=0;        hz_lcdDis(0,8,"k");        }
        K=~K;
}
void Key_2_()
{
        OUT_Current=OUT_Current+15;
        if(OUT_Current>600)OUT_Current=600;        
}
void Key_3_()
{
        OUT_Current=OUT_Current-15;        
        if(OUT_Current<150)OUT_Current=150;
}
/**********************************************************
函数说明: 主函数
**********************************************************/
void main(void)
{
        uint U1,U2,I1,S;
        SD_1=0;
        lcd1602_init();
        hz_lcdDis(0,4,"Welcome!");
        init_pwm();
        InitADC();
        delay(250);        
//        delay(250);
        EA=1;//开总中断
        lcd_Write_com(0x01);        //清屏
//        SD_1=1;
        hz_lcdDis(0,0,"IN=  . V S= .  A");
        hz_lcdDis(1,0,"OU=  . V I= .  A");
        while(1)//主循环
        {               
                U1=Filter(Boost_voltage)/92;        //输入电压  1:10采样电阻                 93,
                U2=Filter(Battery_voltage)/92;    //输出电压  1:10采样电阻        93
                I1=Filter(O_current)/150;       //输出电流  
//                if(I1>1)                I1=I1-1;//输出电流显示校准
                if(U2>242)               
                        {SD_1=0;        lock=1;                CCAP1L         =CCAP1H =128;        hz_lcdDis(0,8,"P");        }
                num_lcdDis(0,3,U1/10,2);
                num_lcdDis(0,6,U1%10,1);        
                num_lcdDis(1,3,U2/10,2);
                num_lcdDis(1,6,U2%10,1);
……………………


DC-DC辅助电源.~(1).SchDoc.Zip

23.51 KB, 下载次数: 30, 下载积分: 黑币 -5

功率主板.~(1).SchDoc.Zip

24.08 KB, 下载次数: 31, 下载积分: 黑币 -5

控制电路.~(1).SchDoc.Zip

21.28 KB, 下载次数: 37, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶1 踩1
回复

使用道具 举报

沙发
ID:264547 发表于 2017-12-22 19:03 | 只看该作者
能发一份完整的程序吗
邮箱 1090911613@qq.com
谢谢!
回复

使用道具 举报

板凳
ID:256970 发表于 2017-12-27 00:27 | 只看该作者
能发一份完整的程序吗
邮箱 89707600@qq.com
谢谢!
回复

使用道具 举报

地板
ID:380761 发表于 2019-2-20 12:06 | 只看该作者
我在电源网上看到一个功率板和你相同的贴是你发的吗
回复

使用道具 举报

5#
ID:380761 发表于 2019-2-20 12:07 | 只看该作者
求完整代码呀 学习参考 邮箱 1471281414@qq.com
回复

使用道具 举报

6#
ID:262642 发表于 2019-3-6 08:57 | 只看该作者
非常棒
回复

使用道具 举报

7#
ID:295658 发表于 2019-5-24 00:54 | 只看该作者
麻烦您发一份完整的程序。谢谢姐姐。quping987654@163.com
回复

使用道具 举报

8#
ID:577945 发表于 2019-7-20 11:48 | 只看该作者
求完整程序996285926@qq.com 谢谢大神
回复

使用道具 举报

9#
ID:587639 发表于 2019-7-21 12:13 | 只看该作者
求完整程序,谢谢大佬。邮箱1370804305@qq.com
回复

使用道具 举报

10#
ID:588541 发表于 2019-7-23 15:44 | 只看该作者
求完整程序1545636103@qq.com 谢谢大神
回复

使用道具 举报

11#
ID:579484 发表于 2019-7-23 20:40 来自手机 | 只看该作者
感谢楼主分享
回复

使用道具 举报

12#
ID:481797 发表于 2020-1-7 11:50 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表