?? 模擬中斷fa.c
字號:
#include<STC_NEW_8051.H>
//-------------------短信內容數組--------------------
unsigned char idata msm[180]="111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999000000000011111111112222222222333333333344444444445555555555666666666677777777778888888888";
//-------------------------------變量定義--------------------------------------------
//b:檢測起始位 z:I/O發送開關 a:接收串口信息
//rspoint:I/O口接收數組下標 x:I/O口接收起始位判斷 rsopen:I/O口接收開關
unsigned char b,z,a,rspoint,x,rsopen;
//--------------I/O口:接收設置--------------
sbit F1 = PSW^1;
sbit BT_REC=P1^5;//I/O口接收數據線
#define rsflag F1
//-----------------I/O口發送變量初始化------------------
sbit clk=P1^2; //I/O口發送時鐘線
sbit BT_SND=P1^0;//I/O口發送線
#define F_TM F0
sbit ACC0= ACC^0;
sbit ACC1= ACC^1;
sbit ACC2= ACC^2;
sbit ACC3= ACC^3;
sbit ACC4= ACC^4;
sbit ACC5= ACC^5;
sbit ACC6= ACC^6;
sbit ACC7= ACC^7;
//---------------------函數聲明---------------------------
void IntTimer0();//發送clk中斷:定時器0
void init();//發送clk中斷:定時器0初始化
void cksz();//串口通訊設置初始化
void sed(unsigned char);//I/O口發送
void time4();//串口中斷
void sendasc(unsigned char asc);//發送一個ASCII碼
void sendtogsm(unsigned char *p,int L);//發送字符串
void delay(int);//延時程序
bit StartBitOn();//檢測起始位
void time();//I/O口clk接收:外部中斷0
void initwai0();//I/O口接收:外部中斷0初始化
unsigned char PGetChar();//I/O口:接收函數
//---------------------主函數---------------------/
void main()
{
cksz();
init();
initwai0();
b=0;
z=0;
rsopen=0;
rspoint=0;
while(1)
{
if(StartBitOn())
{
x=PGetChar();
if(x=='~')
{
rsopen=1;
}
if(x=='!')
{
rspoint=0;
rsopen=0;
sendtogsm(msm,180);
}
if(rsopen==1)
{
msm[rspoint]=x;
if(rspoint==3)
{
if(x=='A') P0=0x00;
if(x=='B') P0=0XFF;
}
rspoint++;
}
}
if(b==1)
{
b=0;
sed(a);
}
}
}
//----------------發送clk中斷:定時器0--------------------/
void IntTimer0() interrupt 1
{
clk=0;
F_TM=1;
}
//-------------發送clk中斷:定時器0初始化-----------------/
void init()
{
TH0=(256-12);
TL0=TH0;
EA=1;
ET0=1;
}
//----------------串口通訊設置初始化-----------------/
void cksz()
{
AUXR=0x60; //波特率*12 4800*12=57600
TMOD=0x22; //波特率設置
TH1=0xfa; //4800
TL1=0xfa;
TR1=1;
REN=1;//工作方式設置
SM0=0;
SM1=1;
EA=1; //開啟中斷
ES=1;
}
//-----------串口:發送一個ASCII碼----------------
void sendasc(unsigned char asc)
{
bit es;
es=ES;
ES=0;
TI=0;
SBUF=asc;
while(!TI);
TI=0;
ES=es;
}
//------------------串口:發送字符串---------------------
void sendtogsm(unsigned char *p,int L)//1、字符串數組 2、字符串長度
{
while (L--)
{
sendasc(*p++);
}
}
//---------------串口中斷---------------------
void time4() interrupt 4
{
RI=0;
a=SBUF;
if(a=='~')
{
z=1;
}
if(z==1)
{
b=1;
}
}
//--------------I/O口發送---------------------/
void sed(unsigned char inch)
{
ACC=inch;
clk=1;
F_TM=0;
BT_SND=0; //start bit
TR0=1; //啟動
while(!F_TM);
BT_SND=ACC0; //先送出低位
clk=1;
F_TM=0;
while(!F_TM);
BT_SND=ACC1;
clk=1;
F_TM=0;
while(!F_TM);
BT_SND=ACC2;
clk=1;
F_TM=0;
while(!F_TM);
BT_SND=ACC3;
clk=1;
F_TM=0;
while(!F_TM);
BT_SND=ACC4;
clk=1;
F_TM=0;
while(!F_TM);
BT_SND=ACC5;
clk=1;
F_TM=0;
while(!F_TM);
BT_SND=ACC6;
clk=1;
F_TM=0;
while(!F_TM);
BT_SND=ACC7;
clk=1;
F_TM=0;
while(!F_TM);
BT_SND=1;
clk=1;
F_TM=0;
while(!F_TM);
TR0=0; //停止timer
clk=1;
}
//--------------------------延時程序---------------------------
void delay(int x)
{
int i;
for (i=0;i<=x;i++);
}
//----------------------檢測起始位----------------------------/
bit StartBitOn()
{
return (BT_REC==0);
}
//--------------------I/O口接收:外部中斷0初始化--------------------/
void initwai0()
{
IT0=1;
EA=1;
EX0=1;
ACC=0XFF;
}
//----------------------I/O口接收:外部中斷0------------------------/
void time() interrupt 0
{
rsflag=1;
}
//--------------------I/O口:接收函數--------------------------/
unsigned char PGetChar()
{
rsflag=0;
while(!rsflag); //等過起始位
ACC0=BT_REC;
rsflag=0;
while(!rsflag);
ACC1=BT_REC;
rsflag=0;
while(!rsflag);
ACC2=BT_REC;
rsflag=0;
while(!rsflag);
ACC3=BT_REC;
rsflag=0;
while(!rsflag);
ACC4=BT_REC;
rsflag=0;
while(!rsflag);
ACC5=BT_REC;
rsflag=0;
while(!rsflag);
ACC6=BT_REC;
rsflag=0;
while(!rsflag);
ACC7=BT_REC;
rsflag=0;
while(!rsflag)
{
if(BT_REC)
{
break;
}
}
return ACC;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -