⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 模拟中断fa.c

📁 四机通信程序(电脑-单片机-单片机-gsm模块)
💻 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 + -