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

📄 main.c

📁 自编的C51串口通讯程序
💻 C
字号:
#include <REG51.H>

#define F_CPU            11059200     //11.0592Mhz 
#define UART_BAND_RATE      9600      // 9600 band

typedef unsigned char	uint8_t;
//typedef signed char	int8_t;
typedef unsigned int	uint16_t;
//typedef signed int	int16_t;
typedef unsigned long	uint32_t;
//typedef signed long	int32_t;

//接收数据
uint8_t receive_start,receive_number=0,bus_changed;
uint8_t receive_data[100];

uint8_t *uart_data_ptr;
uint8_t uart_counter;

void sei(void)
{
	EA = 1;
}
/*
void cli(void)
{
	EA = 0;
}
*/

void uart_init(void)
/* initialize uart */
{      
//	TH1 = 256-((F_CPU*(SMOD+1))/(384*UART_BAND_RATE));//mode 1 baud (SMOD=0 OR 1)

	SCON  = 0x50;                      	// mode 1: 8-bit UART, enable receiver   
  	TMOD |= 0x20;                      	// timer 1 mode 2: 8-Bit reload          
  	PCON |= 0x80; 						//SMOD=1,baud*2
	TH1 = 0xfA;              			// 11.0592M,value 9600 baud       
  	TR1 = 1;                         	// timer 1 run                           
  	ES = 1;								// UART INTERRUPT open
	
}

void delay(uint8_t delay_time)      
{
        uint8_t i,j,k;
        for(i=0;i<255;i++)
        	{
        		for(j=0;j<200;j++)
        			{
        						for(k=0;k<delay_time;k++)
        						;
        					
        			}
        	}		
}

void uart_isr(void) interrupt 4 
{
		if (TI) 
		{ // 输出中断
				TI = 0;
				uart_data_ptr++;
	    		if (--uart_counter)
	    		{
					SBUF = *uart_data_ptr;
				}
		}
		if (RI) 
		{//接收中断
			uint8_t receive;
			RI = 0;
			receive = SBUF;
/*	///////////////////////	接收协议:开始,长度receive_data[1],没结束	
			if ((receive==0xAA)&&(receive_number==0)) receive_start=1;
			if (receive_start==1) 
			{
				receive_data[receive_number]=receive;
				receive_number++;
			}
			if(receive_number == (receive_data[1]+2))//receive_data[1]存放有效数据的长度
			{
				receive_start=receive_number=0;
				bus_changed=1;
			}
*/
	/////////////////////////接收协议:开始,结束,没长度		
			if ((receive==0xDD)&&(receive_number==0)) receive_start=1;
			if (receive_start==1) 
			{
				receive_data[receive_number]=receive;
				receive_number++;
			}
			if ((receive==0xEE)&&(receive_start==1)&&(receive_number>1))
			{
				receive_start=0;
				bus_changed=1;
			}
	/////////////////////////		
			
		}
}



void uart_send(uint8_t *p,uint8_t size)
/* send buffer <buf> to uart */
{   
	uart_data_ptr  = p;
	uart_counter=size;
	TI = 0;
	SBUF = *uart_data_ptr;
    
}



void execute_cmd(void)
{
	if(receive_data[2]==0x01)
	{
		P1 = 0x01;	//p1.0=1;
	}
	if(receive_data[2]==0x02)
	{
		P1 = 0x02;	//p1.1=1;
	}
	if(receive_data[2]==0x03)
	{
		P1 = 0x04;	//p1.2=1;
	}
	if(receive_data[2]==0x04)
	{
		P1 = 0x08;	//p1.3=1;
	}
}


int main(void)
{

    uart_init();
    sei();                 //允许中断  
    for (;;) 
    {    
    	if(bus_changed == 1)//已接收
//		if(receive_number >= 3)
		{
			execute_cmd(); // 执行命令
		    	uart_send("ok",2);
				delay(1);
		    	//接收到数据,发送"ok"
				uart_send(receive_data,receive_number);
				bus_changed=0;
				receive_number=0;
		}
	//	uart_send("yes",3);
		delay(1);
    }            
}

⌨️ 快捷键说明

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