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

📄 main.c

📁 keil C 串口通讯源程序
💻 C
字号:
#include <reg52.h> 
#include <IO_define.h>
#include <intrins.h>
#define  uchar  unsigned char
#define  uint   unsigned int
#define  max_len 0x10//最大长度
//void delay10ms(uint count);
uchar send_buf[max_len]={0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x0a};//发送缓冲区
uchar recv_buf[max_len]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//接收缓冲区

uchar count_s;//发送计数
uchar count_r;//接收计数
bit flag1;
bit sflag;
send(void);
getout();
receive();
restio();
extern write_bit(uchar line,bit value);
extern control(void);
outio(void);
//主程序..........................................................................................
void main()
{
P1=0;//取消片选
P0=0xff;
count_s=0;
count_r=0;
//系统初始化 
TMOD= 0x21;// 定时器0工作模式1, 16位定时方式// 定时器1工作于8位自动重载模式, 用于产生波特率    
TCON= 0x05;
TH0 = 0xfd;	
TL0 = 0xfe;
EA  = 1;
ET0 = 0;
ET1 = 0;

IP  = 0x10; 
TR0 = 0;
//串口设置
TH1=250;
TL1=250;
TR1=1;
PCON=0X80;//SMOD=1,速率加倍
SCON=0X50;//工作方式1,9600
	
ES=1;//开串口中断

while(1)//主循环................................................................................
  {
	outio();
//	control();//调用控制子程序
		
	sflag=0;//一秒一次标志位清零 
	if(fsec==0)flag1=1;//0.5秒执行一次程序  
	if((fsec==1)&&(flag1==1))//一秒钟执行一次程序  
	{
	flag1=0;
	sflag=1;		
	}
		if(sflag)
		{
		;
		}
  }
}//主程序结束...................................................................................

//接收数据处理..................................................................................
receive()
{
uchar i,j;
uint  lrc;
	if((recv_buf[0]==0x3a)&(recv_buf[1]==0x01))
	{
		for(i=1;i<=11;i++)
		{
		lrc+=recv_buf[i];
		}		
		i=lrc;
		lrc=_irol_(lrc,8);
		j=lrc;
		lrc=0;
			if((i==recv_buf[12])&(j==recv_buf[13]))
			{
			send_buf[1]=0x02;
			send_buf[2]=0x01;
			send_buf[12]=0x03;
			send();
			getout();
			}
			else
			{	
			send_buf[1]=0x02;
			send_buf[2]=0x02;
			send_buf[12]=0x04;
			send_buf[13]=0x00;
			send();	
			}
	}
    else
    {	
    send_buf[1]=0x02;
	send_buf[2]=0x02;
	send_buf[12]=0x04;
	send_buf[13]=0x00;
	send();	
	}

}
//将收到的数据送io口
getout()
{
uchar i;
restio();
outio();
	for(i=2;i<=11;i++)
	{
	write_bit(recv_buf[i],0);
	}
}
send()
{
count_r=0;
count_s=0;
SBUF=send_buf[count_s];//发送第一个数据
count_s++;
}
restio()
{
qw1=0xff;
qw2=0xff;
qw3=0xff;
qw4=0xff;
qw5=0xff;
qw6=0xff;
qw7=0xff;
qw8=0xff;
qw9=0xff;
}
//串口中断处理...................................................................................
void serial_int() interrupt 4 using 2
{
	if(TI)//发送中断
	{	
		if(count_s<max_len)
		{
		TI=0;
		SBUF=send_buf[count_s];
		count_s++;
		}
		else
		{
		count_s=0;
		TI=0;
		}
	}
	if(RI)//接收中断
	{
		if(count_r<(max_len-1))
		{
		recv_buf[count_r]=SBUF;
		count_r++;
		RI=0;
		}
		else
		{
		RI=0;
		recv_buf[count_r]=SBUF;
		receive(); 
		return;
		}
	}
}
//T0中断子程序:.............................................................................
void timer0() interrupt 1 using 1
{
//T0 reroad
	TH0 = 252;		
	TL0 = 17;
	
//产生秒信号  
  if(++msec >= 449)
  { 
  msec=0;
    if (++fsec >= 2)
	{
	fsec=0;
	    if (++sec >= 60)
		{
		sec=0;
			if(++min >= 60)
			{
			min=0;
				if(++hour >= 24)
				{
				hour=0;
				}
			}
		}
	}
  }
}
/*void delay10ms(uint count)
{
uint i,j;
for(i=0;i<count;i++)
	{
	for(j=0;j<10000;j++);
	}
}*/


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -