標題:
求助一段單片機代碼 中斷套中斷的
[打印本頁]
作者:
學到老1112
時間:
2017-6-28 22:24
標題:
求助一段單片機代碼 中斷套中斷的
代碼目的:單片機通過定時器0產(chǎn)生中斷 ,定時發(fā)送串口數(shù)據(jù)并接受返回值 通過判斷返回值來判斷SIM900a模塊工作狀態(tài),通過檢測LED5亮 否則LED5熄 ,但是總是不知道哪里的問題 達不到效果,請大神們指教 單片機愛好者 初學 謝謝!代碼如下:
#include <reg52.h>
#include <stdio.h>
#include <string.h>
#define Buf_Max 90
unsigned char i = 0;
unsigned char T0RL =0;
unsigned char T0RH =0;
xdata unsigned char Rec_Buf[Buf_Max];
void init(void);
void GSM_Call(unsigned char *num)
void Delay_ms(unsigned int time);
void CLR_Buf(void);//Çå3y»o′æ
void Send_ASCII(unsigned char *b);
void Send_Hex(unsigned char c);
void work_test(void);
void ConfigTimer0(unsigned int ms);
void ConfigUART(unsigned int baud);
char code num[]="xxxxxxxxxx";
sbit key1=P1^1;
sbit LED5=P1^5;
void main(void)
{
EA = 1;
ConfigUART(9600);
ConfigTimer0(20);
CLR_Buf();
Delay_ms(3000);
while(1)
{
if(key1==0)
{
Delay_ms(20)
if(key1==0)
{
GSM_Call(num);
Delay_ms(1000);
}
}
}
}
void GSM_Call(unsigned char *num)
{
Send_ASCII("ATD");
Send_ASCII(num);
Send_ASCII(";");
Send_Hex(0x0d);
Send_Hex(0x0a);
Delay_ms(200)
}
//oáÃëÑóê±oˉêy
void Delay_ms(unsigned int time)
{
unsigned int i;
for(;time>0;time--)
{
i=125;
while(i--);
}
}
void CLR_Buf(void)
{
unsigned char k;
for(k=0;k<Buf_Max;k++)
{
Rec_Buf[k] = 0;
}
i = 0;
}
void Send_Hex(unsigned char c)
{
ES = 0;
SBUF = c;
while(TI!=1);
TI = 0;
ES = 1;
}
void Send_ASCII(unsigned char *b)
{
ES = 0;
for (b; *b!='\0';b++)
{
SBUF = *b;
while(TI!=1);
TI = 0;
}
ES = 1;
}
void work_test(void)
{
Send_ASCII("AT")
Send_Hex(0x0d);
Send_Hex(0x0a);
Delay_ms(2000);
if(strstr(Rec_Buf,"OK")!=NULL)
{
CLR_Buf();
//LED2=0;
Send_ASCII("AT+CPIN?")
Send_Hex(0x0d);
Send_Hex(0x0a);
Delay_ms(2000);
if(strstr(Rec_Buf,"+CPIN")!=NULL&&strstr(Rec_Buf,"OK")!=NULL)
{
CLR_Buf();
// LED3=0;
Send_ASCII("AT+CSQ")
Send_Hex(0x0d);
Send_Hex(0x0a);
Delay_ms(2000);
if(strstr(Rec_Buf,"OK")!=NULL)
{
CLR_Buf();
// LED4=0;
Send_ASCII("AT+CREG?")
Send_Hex(0x0d);
Send_Hex(0x0a);
Delay_ms(2000);
if(strstr(Rec_Buf,"0")!=NULL&&strstr(Rec_Buf,"1")!=NULL&&strstr(Rec_Buf,"OK")!=NULL)
{
CLR_Buf();
Delay_ms(1000);
LED5 = 0;
}
}
}
}else LED5 = 1;
}
void ConfigUART(unsigned int baud)
{
SCON = 0x50;
TMOD &= 0x0F
TMOD |= 0x20
TH1 = 256 - (11059200/12/32)/baud
TL1 = TH1;
ET1 = 0;
ES = 1;
TR1 = 1;
}
void ConfigTimer0(unsigned int ms)
{
unsigned long tmp
tmp = 11059200 / 12;
tmp = (tmp * ms) / 1000
tmp = 65536 - tmp;
tmp = tmp + 18;
T0RH = (unsigned char)(tmp>>8);
T0RL = (unsigned char)tmp;
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = T0RH;
TL0 = T0RL;
ET0 = 1;
TR0 = 1;
}
void InterruptTimer0() interrupt 1
{
static unsigned int cnt = 0;
TH0 = T0RH;
TL0 = T0RL;
cnt++;
if(cnt ==50)
{
work_test();
}
if(cnt ==800)
cnt =0;
}
void tinit() interrupt 4
{
ES = 0;
if(TI)
{
TI = 0
}
if(RI)
{
RI = 0
Rec_Buf[i] = SBUF
i++;
if(i>90)
{
i = 0;
}
}
ES = 1;
}
復制代碼
作者:
學到老1112
時間:
2017-6-28 23:16
求大神指點 在線等
作者:
學到老1112
時間:
2017-6-29 09:56
這么大的論壇有人懂的嗎
作者:
nicoledtt
時間:
2017-6-29 11:13
你就不能加點備注么?好難審閱啊
作者:
yzwzfyz
時間:
2017-7-1 01:27
1、達不到效果,已達到了什么程序呢?
2、串行數(shù)據(jù)丟失風險大,其中斷優(yōu)先級可以考慮設(shè)置為最高。
3、中斷服務(wù)程序要盡可能“小”少用時間,以防妨礙其它低級別的中斷。所以,中斷事件盡可不要在中斷服務(wù)程序中處理,而是做個“記號”,讓事件在主程序中進行依“記號”處理。
作者:
cjjcjj1
時間:
2017-7-1 08:57
提示:
作者被禁止或刪除 內(nèi)容自動屏蔽
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1