欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
消防應急系統,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.raoushi.com/bbs/)
Powered by Discuz! X3.1