📄 模拟中断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 + -