标题:
消防应急系统,DC--DC, 恒流模拟
[打印本页]
作者:
lhlbest
时间:
2017-3-14 23:27
标题:
消防应急系统,DC--DC, 恒流模拟
刚做完一款消防应急灯的程序,采用15W自带CCAP 可调方便实现恒流输出。恒流模块遇到瓶颈希望大家给点建议,同时按键进入月检,年检还没实现!欢迎大家评论!
#include "reg51.h"
#include "intrins.h"
//#define FOSC 11059200L
#define FOSC 24000000L
typedef unsigned char BYTE;
typedef unsigned int WORD;
WORD code Vbg_ROM _at_ 0x03f7; //1K程序空间的MCU
WORD second,minute,hour,moutch;
BYTE ADCbg;
BYTE ADCx;
WORD Vx; //恒流电压mV
BYTE ADCy;
WORD Vy; //电池电压mV
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;
sfr P_SW1 = 0xA2; //外设功能切换寄存器1
#define CCP_S0 0x10 //P_SW1.4
#define CCP_S1 0x20 //P_SW1.5
sfr CCON = 0xD8; //PCA控制寄存器
sbit CCF0 = CCON^0; //PCA模块0中断标志
sbit CCF1 = CCON^1; //PCA模块1中断标志
sbit CR = CCON^6; //PCA定时器运行控制位
sbit CF = CCON^7; //PCA定时器溢出标志
sfr CMOD = 0xD9; //PCA模式寄存器
sfr CL = 0xE9; //PCA定时器低字节
sfr CH = 0xF9; //PCA定时器高字节
sfr CCAPM0 = 0xDA; //PCA模块0模式寄存器
sfr CCAP0L = 0xEA; //PCA模块0捕获寄存器 LOW
sfr CCAP0H = 0xFA; //PCA模块0捕获寄存器 HIGH
sfr CCAPM1 = 0xDB; //PCA模块1模式寄存器
sfr CCAP1L = 0xEB; //PCA模块1捕获寄存器 LOW
sfr CCAP1H = 0xFB; //PCA模块1捕获寄存器 HIGH
sfr CCAPM2 = 0xDC; //PCA模块2模式寄存器
sfr CCAP2L = 0xEC; //PCA模块2捕获寄存器 LOW
sfr CCAP2H = 0xFC; //PCA模块2捕获寄存器 HIGH
sfr PCA_PWM0 = 0xf2; //PCA模块0的PWM寄存器
sfr PCA_PWM1 = 0xf3; //PCA模块1的PWM寄存器
sfr PCA_PWM2 = 0xf4; //PCA模块2的PWM寄存器
sfr ADC_CONTR = 0xBC; //ADC控制寄存器
sfr ADC_RES = 0xBD; //ADC高8位结果
sfr ADC_LOW2 = 0xBE; //ADC低2位结果
sfr P1ASF = 0x9D; //P1口第2功能控制寄存器
#define ADC_POWER 0x80 //ADC电源控制位
#define ADC_FLAG 0x10 //ADC完成标志
#define ADC_START 0x08 //ADC起始控制位
#define ADC_SPEEDLL 0x00 //540个时钟
#define ADC_SPEEDL 0x20 //360个时钟
#define ADC_SPEEDH 0x40 //180个时钟
#define ADC_SPEEDHH 0x60 //90个时钟
sbit SDJC = P1^0;
sbit SDZDC = P1^1;
sbit CD = P1^2;
sbit DC = P1^5;
sbit K = P3^0;
sbit BELL = P3^1;
sbit BL = P3^2;
sbit GL = P3^3;
sbit RL = P3^6;
void InIt();
void Delay(WORD n);
//void GetADC(BYTE ch);
void GetMv();
void GetPWMInIt();
void BEL();
void YorM();
void GetPWM();
/*----------------------------
初始化
----------------------------*/
void InIt(){
CD = 1;
DC = 1;
BL = 1;
GL = 1;
RL = 1;
}
/*----------------------------
软件延时
----------------------------*/
void Delay(WORD n)
{
WORD x;
while (n--)
{
x = 5000;
while (x--);
}
}
/*----------------------------
ADC检测
----------------------------*/
BYTE GetADC(BYTE ch){
ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
Delay(2); //ADC上电并延时
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
_nop_(); //等待4个NOP
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG)); //等待ADC转换完成
ADC_CONTR &= ~ADC_FLAG; //清除ADC标志
return ADC_RES;
}
/*----------------------------
电压检测
----------------------------*/
void GetMv(){
//第一步:通过ADC的第2通道测试外部输入电压的ADC测量值
ADC_RES = 0; //清除结果寄存器
P1ASF = 0x08; //设置P1.3口为模拟通道
GetADC(3);
GetADC(3);
ADCx = GetADC(3); //恒流AD
ADC_RES = 0; //清除结果寄存器
P1ASF = 0x10; //设置P1.4口为模拟通道
GetADC(4);
GetADC(4);
ADCy = GetADC(4); //电池检测AD
//第二步:通过ADC的第9通道测试Bandgap电压的ADC测量值
ADC_RES = 0; //清除结果寄存器
P1ASF = 0x00; //不设置P1ASF,即可从ADC的第9通道读取内部Bandgap电压的ADC测量值
GetADC(3);
GetADC(3);
ADCbg = GetADC(3);
//第三步:通过公式计算外部输入的实际电压值
//Vx = Vbg_RAM * ADCx / ADCbg; //使用RAM中的Bandgap电压参数进行计算
Vx = Vbg_ROM * ADCx / ADCbg; //使用ROM中的Bandgap电压参数进行计算
//Vy = Vbg_RAM * ADCy / ADCbg;
Vy = Vbg_ROM * ADCy / ADCbg;
}
/*----------------------------
PWM输出初始化
----------------------------*/
void GetPWMInIt(){
ACC = P_SW1;
ACC &= ~(CCP_S0 | CCP_S1); //CCP_S0=0 CCP_S1=0
P_SW1 = ACC; //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2)
CCON = 0; //初始化PCA控制寄存器
//PCA定时器停止
//清除CF标志
//清除模块中断标志
CL = 0; //复位PCA寄存器
CH = 0;
CMOD = 0x02; //设置PCA时钟源
//禁止PCA定时器溢出中断
PCA_PWM2 = 0x80; //PCA模块2工作于6位PWM
CCAP2H = CCAP2L = 0x10; //PWM2的占空比为60% ((40H-10H)/40H)
CCAPM2 = 0x42; //CCP2/P3.7输出
CR = 0;
}
/*----------------------------
PWM输出
----------------------------*/
void GetPWM(){
CR = 1;
if((Vx!=100)&&(20<Vx<=300)){ //Vx不等于100则减1
CCAP0L = CCAP0L-1;
if(CCAP0L==0x04){
CCAP0L = 0x04; //最大占空比输出
}
}
CCAP0H = CCAP0L;
if((Vx<=20)||(Vx>300)){ //LED故障
CR = 0;
BEL();
GL = 0;
Delay(100);
GL = 1;
}else if((Vy<=2000)||(Vy>=4300)){ //电池故障
CR = 0;
BEL();
CD = 0;
RL = 0;
Delay(100);
RL = 1;
}else{
CR = 1;
}
}
/*----------------------------
BELL警报
----------------------------*/
void BEL(){
BELL = 1;
Delay(100);
BELL = 0;
}
/*----------------------------
自动年检,月检
----------------------------*/
void YorM(){
switch(moutch){
case 0: SDZDC = 0;
GetPWM();
Delay(200);
break;
case 1: SDZDC = 0;
GetPWM();
Delay(200);
break;
case 2: SDZDC = 0;
GetPWM();
Delay(200);
break;
case 3: SDZDC = 0;
GetPWM();
Delay(200);
break;
case 4: SDZDC = 0;
GetPWM();
Delay(200);
break;
case 5: SDZDC = 0;
GetPWM();
Delay(200);
break;
case 6: SDZDC = 0;
GetPWM();
Delay(200);
break;
case 7: SDZDC = 0;
GetPWM();
Delay(200);
break;
case 8: SDZDC = 0;
GetPWM();
Delay(200);
break;
case 9: SDZDC = 0;
GetPWM();
Delay(200);
break;
case 10: SDZDC = 0;
GetPWM();
Delay(200);
break;
case 11: SDZDC = 0;
GetPWM();
Delay(2000);
break;
}
}
/*----------------------------
主函数
----------------------------*/
void main()
{
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
P6M0 = 0x00;
P6M1 = 0x00;
P7M0 = 0x00;
P7M1 = 0x00;
InIt();
GetPWMInIt();
while(1){
GetMv(); //AD检测
if(SDJC == 1){ //市电照明
Delay(20);
if(SDJC == 1){
YorM(); //年检 月检
SDZDC = 1;
DC = 1;
GetPWM(); //PWM输出
if(2000<=Vy<3900){
CD = 1;
RL = 0;
}
if(3900<=Vy<4200){
Delay(200);
if(3900<=Vy<4200){
CD = 1;
RL = 1;
}
}
if(4200<=Vy<4300){
Delay(200);
if(4200<=Vy<4300){
CD = 0;
RL = 1;
}
}
}
}else{
SDZDC = 0;
DC = 0;
CD = 0;
GetPWM();
if(K == 0){
CR = 0;
}
}
}
}
void timer0() interrupt 1 //定时器0(中断1)
{
BYTE tim1; //定义临时变量
TL0=TL0+0XB0;TH0=0X3C; //重装定时器初值
tim1++; //每中断一次tim1加1
if(tim1==20){ //中断20(1秒)
tim1=0;
second++;
if(second>=60){ //如果秒到60
second=0;
minute++; //秒变0,分加1
if(minute>=60){ //如果分到60
…………余下代码请下载附件…………
复制代码
0.png
(67.78 KB, 下载次数: 56)
下载附件
2017-3-15 21:33 上传
下载:
消防应急系统.zip
(44.42 KB, 下载次数: 147)
2017-3-15 21:34 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1