有沒有大佬幫忙看一下怎么解決
單片機源程序如下:
#include <reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
sbit KEY_OPEN = P3^3; //引腳定義
sbit KEY_CLOSE = P3^5;
sbit LED_GREEN = P2^1;
sbit LED_RED = P2^2;
sbit BUZZER = P2^0;
#define BUZZER_ON (BUZZER = 0)
#define BUZZER_OFF (BUZZER = 1)
sbit SHAKE_PIN = P1^1; //震動傳感器
sbit HC_SR501 = P1^0; //人體活動傳感器
sbit RELAY_LOCK = P2^3; //電磁鎖
bit g_irFlag = 0; //紅外接收標志,收到一幀正確數據后置1
unsigned char g_irCode[4];
unsigned char refreshFlag = 0; //更新顯示標志
unsigned char setFlag = 0; //設置參數標志
bit lockFlag = 1; //鎖的狀態標志
bit monitorFlag = 0; //監控標志
bit alarmFlag = 0; //報警標志
unsigned char time500msCnt = 0;
unsigned char time500msCnt2 = 0;
bit oldPinState = 0;
bit nowPinState = 0;
char dis0[16]; //定義顯示區域臨時存儲數組
void CheckKey(void);
void CheckBluetooth(void);
void Timer1_Init(void); //定時器初始化
void main(void)
{
IR_INPUT = 1; 110.c(49): error C141: syntax error near '=', expected 'hdata' ,110.c(49): error C141: syntax error near '=', expected '__asm'
Timer1_Init();
IR_Init();
Uart_Init();
LCD_Init(); //初始化液晶
DelayMs(200); //延時有助于穩定
LCD_Clear(); //清屏
LCD_DispStr(0, 0, " Welcome! ");
DelayS(1);
LCD_DispStr(0, 0, " Waiting... ");
DelayS(5);
err_num = GSM_Init(); //GSM初始化
DelayMs(10);
if (gsm_init_flag) //初始化完成
{
err_num = GSM_Text_Mode(); //GSM 設置Text模式
}
DelayMs(10);
if (gsm_config_flag)
{
err_num = GSM_Delete_Sms("1"); //刪除短信1
}
DelayMs(10);
if (!(gsm_init_flag || gsm_config_flag || gsm_delete_flag)) // AT命令報錯
{
BUZZER_ON;
LCD_DispStr(0, 0, " Init Err Num ");
LCD_WriteData((int)err_num+'0');
DelayS(1);
BUZZER_OFF;
}
else
{
LCD_DispStr(0, 0, " Init OK! ");
}
DelayS(3);
EEPROM52_Init(); //初始化電話號碼
LCD_DispStr(0, 0, " Status ");
while (1) //主循環
{
gsm_receive_process(); //gsm接收處理
if (lockFlag == 1) //已上鎖
{
LED_RED = 0;
LED_GREEN = 1;
RELAY_LOCK = 1; //關閉鎖
if (alarmFlag == 0)
{
if (HC_SR501 == 0 && SHAKE_PIN == 0) //有人且震動
monitorFlag = 1;
if (monitorFlag == 1) //進入監控狀態
{
if (time500msCnt >= 10 && time500msCnt <= 20) //進入監控模式后的5s~10s,持續監測
{
if (HC_SR501 == 0 && SHAKE_PIN == 0) //再次檢測到有人且震動
{
alarmFlag = 1;
time500msCnt = 0;
BUZZER_ON;
LCD_DispStr(0, 1, " Warning! ");
GSM_Send_Sms(phone1, "Please pay attention to your car!");
DelayMs(10);
}
}
else if (time500msCnt > 20) //超過10s沒檢測到
{
monitorFlag = 0; //退出監控
time500msCnt = 0;
}
}
else
{
time500msCnt = 0;
BUZZER_OFF;
}
}
else //報警模式
{
if (time500msCnt >= 120) //響鈴1分鐘退出報警模式
{
alarmFlag = 0;
}
}
}
else
{
LED_RED = 1;
LED_GREEN = 0;
alarmFlag = 0;
monitorFlag = 0;
RELAY_LOCK = 0; //打開鎖
BUZZER_OFF;
}
if (refreshFlag == 1) //刷新界面
{
refreshFlag = 0;
TR1 = 0;
if (lockFlag == 1) //已上鎖
{
if (alarmFlag == 0)
{
if (monitorFlag == 1) //進入監控狀態
{
time500msCnt++;
}
else
{
time500msCnt = 0;
LCD_DispStr(0, 1, " Lock ");
}
}
else //報警模式
{
time500msCnt++;
}
}
else
{
LCD_DispStr(0, 1, " Open ");
if (time500msCnt2 > 0)
{
time500msCnt2--;
}
else
{
RELAY_LOCK = 0; //關閉鎖
LED_RED = 0;
LED_GREEN = 1;
lockFlag = 1;
}
}
TR1 = 1;
}
CheckKey(); //檢測按鍵
}
}
void CheckKey(void)
{
static unsigned char rekey = 0;
if ((KEY_OPEN == 0) || (KEY_CLOSE == 0)) //檢測到按鍵按下
{
DelayMs(10); //小抖動
if (rekey == 0)
{
if (KEY_OPEN == 0) //檢測是否按下
{
rekey = 1;
lockFlag = 0;
time500msCnt2 = 20; //開鎖20*500ms=10s
}
else if (KEY_CLOSE == 0) //
{
rekey = 1;
lockFlag = 1;
}
}
}
else
{
rekey = 0; //防止重復檢測到按鍵
}
if (g_irFlag == 1 && g_irCode[2] == IRCodeMap[0][0])
{
lockFlag = 0;
g_irFlag = 0;
time500msCnt2 = 20; //開鎖20*500ms=10s
}
else if (g_irFlag == 1 && g_irCode[2] == IRCodeMap[2][0])
{
lockFlag = 1;
g_irFlag = 0;
}
}
/**************************************************************************************************
*************************************紅外解碼定時器程序********************************************
**************************************************************************************************/
//外部中斷解碼程序_外部中斷0
void Ext0_Interrupt(void) interrupt 0
{
unsigned char i, j;
unsigned char byt;
unsigned int time;
time = IR_GetLowTime();
if ((time < 7833) || (time > 8755))
{
IE0 = 0;
return;
} //找到啟始碼
time = IR_GetHighTime();
if ((time < 3686) || (time > 4608)) //時間判定范圍為4.0~5.0ms,
{ //超過此范圍則說明為誤碼,直接退出
IE0 = 0;
return;
}
//接收并判定后續的4 字節數據
for (i = 0; i < 4; i++) //循環接收4 個字節
{
for (j = 0; j < 8; j++) //循環接收判定每字節的8 個bit
{
//接收判定每bit 的560us 低電平
time = IR_GetLowTime();
if ((time < 313) || (time > 718)) //時間判定范圍為340~780us,
{ //超過此范圍則說明為誤碼,直接退出
IE0 = 0;
return;
}
//接收每bit 高電平時間,判定該bit 的值
time = IR_GetHighTime();
if ((time > 313) && (time < 718)) //時間判定范圍為340~780us,
{ //在此范圍內說明該bit 值為0
byt >>= 1; //因低位在先,所以數據右移,高位為0
}
else if ((time > 1345) && (time < 1751)) //時間判定范圍為1460~1900us,
{ //在此范圍內說明該bit 值為1
byt >>= 1; //因低位在先,所以數據右移,
byt |= 0x80; //高位置1
}
else //不在上述范圍內則說明為誤碼,直接退出
{
IE0 = 0;
return;
}
}
g_irCode[ i] = byt; //接收完一個字節后保存到緩沖區
}
g_irFlag = 1; //接收完畢后設置標志
IE0 = 0; //退出前清零INT0 中斷標志
}
/**************************************************************************************************
***************************************************************************************************
**************************************************************************************************/
/*------------------------------------------------
定時器初始化子程序
------------------------------------------------*/
void Timer1_Init(void)
{
TMOD &= 0x0F; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響
TMOD |= 0x10; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響
TH1 = (65536 - 18432) / 256; //重新賦值 20ms
TL1 = (65536 - 18432) % 256;
EA = 1; //總中斷打開
ET1 = 1; //定時器中斷打開
TR1 = 1; //定時器開關打開
}
/*------------------------------------------------
定時器中斷子程序
------------------------------------------------*/
void Timer1_Interrupt(void) interrupt 3
{
static unsigned char time20ms = 0;
TH1 = (65536 - 18432) / 256; //重新賦值 20ms
TL1 = (65536 - 18432) % 256;
time20ms++;
if (time20ms >= 25)
{
refreshFlag = 1;
time20ms = 0;
}
} |