|
新手,做了一個(gè)用紅外光發(fā)射接收管做輸入,用用STC8G1K08A-8P做控制輸出一個(gè)低電平的程序,就是發(fā)射接收中間有東西,STC8G1K08A-8P的P33就輸出低電平。
電路和程序做好之后,實(shí)際測(cè)試發(fā)現(xiàn)STC8G1K08A-8P的P55輸入低電平之后,P33沒有反應(yīng),程序編譯能通過,不知道什么問題,是光控接收檢測(cè)的程序有問題嗎?但是直接把P55接地,P33也是一樣沒反應(yīng),找不到問題,求教大佬們能不能指點(diǎn)1,2。
電路和程序附上,請(qǐng)多多指教
下面是單片機(jī)程序,請(qǐng)多指教,謝謝(有些語句沒用上,忽略它)
#include <stc8g.h>
#include "intrins.h"
#include "Timer0.h"
#include "Timer1.h"
#include "Delayms.h"
#include "Delay_Long.h"
/*——————宏定義——————*/
#define FOSC 35000000L
#define const_IR_time1 25 /*光控觸發(fā)去抖動(dòng)延時(shí)的時(shí)間*/
#define const_BLow_time2 20 /*低電壓觸發(fā)去抖動(dòng)延時(shí)的時(shí)間*/
/*——————變量函數(shù)定義及聲明——————*/
unsigned char ucKeySec = 0; /*被觸發(fā)的編號(hào)*/
unsigned int uiIRTimeCnt1 = 0; /*光控觸發(fā)時(shí)去抖動(dòng)延時(shí)計(jì)數(shù)器*/
unsigned char ucIRLock1 = 0; /*光控觸發(fā)后自鎖的變量標(biāo)志*/
unsigned int uiBLowTimeCnt2 = 0; /*低電壓觸發(fā)后去抖動(dòng)延時(shí)計(jì)數(shù)器*/
unsigned char ucBLowLock2 = 0; /*低電壓觸發(fā)后自鎖的變量標(biāo)志*/
unsigned int uiHVTimeCnt = 0; /*觸發(fā)后輸出延時(shí)計(jì)數(shù)器*/
//unsigned int uiVoiceCnt = 0; /*蜂鳴器鳴叫的持續(xù)時(shí)間計(jì)數(shù)器*/
unsigned int HVDTcnt = 3000; //輸出延時(shí) 時(shí)間(mS)
//unsigned int uiVoiceCnt = 0; /*蜂鳴器鳴叫的持續(xù)時(shí)間計(jì)數(shù)器*/
/* IO口定義 */
sbit IR_IN = P5^5; /*定義接收光控輸入引腳,光控對(duì)射時(shí)此腳為高電平*/
sbit IT_OUT = P5^4; /*定義發(fā)射光控輸出 方波*/
sbit BUZZER = P3^3; /*定義蜂鳴器,低電壓時(shí)發(fā)出嘀嘀音,重置滿電電池后消聲*/
sbit HV_OUT = P3^2; /*輸出引腳,低電平時(shí)輸出電壓給后級(jí)*/
sbit BLOW = P3^1; /*電池電壓低于6V檢測(cè),蜂鳴報(bào)警提醒*/
/* IO口模式定義 */
void Init_Pin(void)
{
// P3M0 = 0x08; //P33,推挽輸出,P32高陰輸入
// P3M1 = 0x04; //P31,P30準(zhǔn)雙向口
// P3DR |= 0x0e;
// P3IE = (P3IE & ~0x08) | 0x06;
P3M0 = 0x0c; //P33,推挽輸出,P32開渥輸入,P3.1雙向,P30高阻
P3M1 = 0x05;
P5M0 = 0x10; //設(shè)置P5.4為推挽輸出,P5.5為雙向模式
P5M1 = 0x00;
}
/* IO口初始狀態(tài)定義 */
void Init_IO(void)
{
BUZZER = 0;
HV_OUT = 1;
IR_IN = 1;
BLOW = 1;
IT_OUT = 1;
}
/* 定時(shí)器T0初始化為1ms產(chǎn)生中斷 @35MHz */
void Timer0Init(void)
{
AUXR |= 0x80; //定時(shí)器時(shí)鐘1T模式
TMOD &= 0xF0; //設(shè)置定時(shí)器模式
TMOD |= 0x01; /*set timer0 as mode1 (16-bit)*/
// TL0 = T1MS % 256; /*initial timer0 low byte*/
// TH0 = T1MS / 256; /*initial timer0 high byte*/
TL0 = 0x48; //設(shè)置定時(shí)初值 65536-35*1000
TH0 = 0x77; //設(shè)置定時(shí)初值
TF0 = 0; //清除TF0標(biāo)志
// ET0 = 1; //允許定時(shí)器T0溢出中斷
// TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
// EA = 1; // 打開總中斷
}
/* 定時(shí)器T1初始化為1ms產(chǎn)生中斷 @35MHz */
void Timer1Init(void) //1毫秒@35MHz
{
AUXR |= 0x40; //定時(shí)器時(shí)鐘1T模式
TMOD &= 0x0F; //設(shè)置定時(shí)器模式
TL1 = 0x48; //65536-35/1000
TH1 = 0x77;
// TL0 = T1MS % 256; /*initial timer0 low byte*/
// TH0 = T1MS / 256; /*initial timer0 high byte*/
TF1 = 0;
// ET1 = 1; //使能定時(shí)器中斷
// TR1 = 1; //啟動(dòng)定時(shí)器
}
/* 固定延時(shí)1毫秒 @35MHz */
void Delay1ms() //@35MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 46;
j = 113;
do
{
while (--j);
} while (--i);
}
/* n毫秒延時(shí)函數(shù) 參數(shù)給幾 就延時(shí)幾毫秒 */
void delay_ms(unsigned int ms)
{
while(ms--)
{
Delay1ms();
}
}
/**
* @brief 打開定時(shí)器
* @param 無
* @retval 開定時(shí)器
**/
void Init_Peripheral(void)
{
ET0 = 1; /*允許定時(shí)中斷*/
TR0 = 1; /*啟動(dòng)定時(shí)中斷*/
ET1 = 1; /*允許定時(shí)中斷*/
TR1 = 1; /*啟動(dòng)定時(shí)中斷*/
EA = 1; /*開總中斷*/
}
/* 系統(tǒng)初始化 */
void Init(void) //初始化
{
Init_Pin();
Init_IO();
Timer0Init();
Timer1Init();
// Init_Peripheral();
}
void Key_Scan(void);
/* 定時(shí)器T0中斷處理函數(shù),輸出 方波 */
void TM0_Isr() interrupt 1
{
static unsigned int cnt = 0;
static bit flag = 0;
cnt++;
if(cnt >= 10)
{
cnt = 0;
flag = ~flag;
IT_OUT = flag;
}
TF0 = 0;
TL0 = 0x48; //設(shè)置定時(shí)初值 65536-35*1000
TH0 = 0x77; //設(shè)置定時(shí)初值
}
/* 檢測(cè)P55,P31口是否為低電平 */
void TM1_Isr() interrupt 3
{
Key_Scan(); //檢測(cè)P55口為低電平時(shí),P32輸出低電平,p31為低電平時(shí),p33間隔0.5秒輸出高低電平
}
/* 掃描光控和低電壓輸入,低電平為有動(dòng)作 */
void Key_Scan(void) //掃描P55,P31口函數(shù)
{
/*掃描P55,光控對(duì)射中間物體有無檢測(cè)*/
if(IR_IN == 1) /*如果光控中間沒有遮擋(3腳P55為高電平),將一些標(biāo)志位及時(shí)清零*/
{
ucIRLock1 = 0; /*光控自鎖標(biāo)志位清0*/
uiIRTimeCnt1 = 0; /*光控觸發(fā)去抖動(dòng)延時(shí)計(jì)數(shù)器清零*/
}
else if(ucIRLock1 == 0) /*如果光控中間有被遮擋,(外部給3腳P55拉低為低電平),*/
{
uiIRTimeCnt1 ++;
if(uiIRTimeCnt1 > const_IR_time1) //消抖
{
uiIRTimeCnt1 = 0;
ucIRLock1 = 1; /*自鎖標(biāo)志位置位,避免一直觸發(fā)*/
ucKeySec = 1; /*觸發(fā)*/
// uiVoiceCnt = const_voice_short; /*蜂鳴器短叫*/
}
}
// }
// }
/*掃描P31,電池電壓大于6.1V時(shí)為高電平*/
if(BLOW == 1) /*電池電壓大于6.1V時(shí)此Pin為高電平,將一些標(biāo)志位及時(shí)清零*/
{
ucBLowLock2 = 0; /*低電壓自鎖標(biāo)志位清0*/
uiBLowTimeCnt2 = 0; /*低電壓去抖動(dòng)延時(shí)計(jì)數(shù)器清零*/
}
else if(ucBLowLock2 == 0) /*如果電池電壓低于6.1V, 外部給P31拉低為低電平;*/
{
uiBLowTimeCnt2 ++;
if(uiBLowTimeCnt2 > const_BLow_time2)
{
uiBLowTimeCnt2 = 0;
// ucBLowLock2 = 1; /*自鎖標(biāo)志位置位,避免一直觸發(fā)*/
ucKeySec = 2; /*低電壓觸發(fā)*/
}
}
}
/**
* @brief 服務(wù)函數(shù)
* @param 無
* @retval 根據(jù)掃描得到的值,進(jìn)行處理
**/
void key_Service(void)
{
switch(ucKeySec)
{
case 1: /*觸發(fā)*/
// HV_OUT = 0; //輸出低電平,打開PMOS管
while(--HVDTcnt)
{
HV_OUT = 0; //輸出低電平,打開PMOS管,給后面電路供電
// uiHVTimeCnt ++;
// if(uiHVTimeCnt > count_HV_time1) //輸出低電平延時(shí)
// {
// uiHVTimeCnt = 0;
}
HV_OUT = 1;
ucKeySec = 0; /*響應(yīng)光控觸發(fā)服務(wù)處理程序后,編號(hào)清零,避免一直觸發(fā)*/
break;
case 2: /*電壓低于6V,蜂鳴器斷續(xù)響提示*/
if(BLOW == 0)
{
BUZZER = !BUZZER;
delay_ms(500);
}
else if(BLOW == 1)
{
BUZZER = 0;
ucKeySec = 0;
}
break;
}
}
void main() //主函數(shù)
{
Init();
// Delay_Long(100);
Init_Peripheral();
while(1)
{
key_Service();
//Key_Scan();
}
}
|
|