51单片机实现串口收发

在大学里,我们都学过单片机,单片机什么东西最重要呢?无疑就是中断,串口,定时器,而串口,恰恰是现实中用得最多的一类。一般公司有固定的串口协议,然后工程师们根据协议来开发产品。

        51单片机的串口比较简单,这里我们就直接实现一个例子,串口发送一个命令,单片机接收到后响应,会点亮LED,驱动蜂鸣器,驱动流水灯,其实这样的功能在现实开发中也经常做的。

      代码如下:

/*
*author : Y.X.YANG
*data :   2016-4-7
*version: 20160407
*function: Uart send and accept
*/

#include <reg52.h>
#include<intrins.h>
#include "type.h"

sbit LED1 = P1^0 ; 
sbit LED2 = P1^1 ; 
sbit LED3 = P1^2 ;
sbit BELL = P2^3 ;

//定义一个自锁的串口接收标志位,如果收到数据后,该标志位就会被置1 , 否则就为0
int accept_flag = 0 ;
//校验标志位
int check_flag = 0 ;
//接收的存放数据的变量
unsigned char date = 0 ; 
//初始化
void Uart_init(void);
//单片机外设初始化
void Mcuboard_init(void);
//串口发送一个字节的数据
void Uart_Send_byte(u8 byte);
//延时函数
void delay(unsigned int xms) ;
//流水灯
void fallinglight(void) ;

void main()
{
	//单片机中断,定时,串口等初始化
	Uart_init();
	//单片机外围设备初始化
	Mcuboard_init();
	//大循环
	while(1)
	{
			switch(date)
			{
				 case 1 : BELL = 1 ; LED1 = 1 , Uart_Send_byte('A'); break  ; 
				 case 2 : BELL = 0; LED1 = 0, Uart_Send_byte('Y'); break  ;
				 case 3 : fallinglight()  ; break  ; 
				 default : 
					P1 = 0xff ; 
					P2 = 0xff ;
				break ;
			}
	  }
}

void uart() interrupt 4
{
	  date = SBUF;
   	while(!RI);		   /*yantgyx  test*/
	  RI = 0;			
}


void Uart_init(void)
{
	SCON=0X50;			//设置为工作方式1
	TMOD=0X20;			//设置计数器工作方式2
	PCON=0X00;			//SMOD=0,32分频
	TH1=0Xfd;			//计数器初始值设置,注意波特率是9600的
	TL1=0Xfd;
	ES=1;				//打开接收中断
	EA=1;				//打开总中断
	TR1=1;				//打开计数器
}

void Mcuboard_init(void)
{
	/*MUC board init statu*/
	P0 = P1 = P2 = P3 = 0xff ;
}

void fallinglight(void)
{
	  int i ;
	  P1 = 0xfe ;
		while(1)
		{
			delay(100);
			P1 =_crol_(P1,1);/*将P1循环左移1位*/
			BELL = 0;
			delay(100);
			BELL = 1;
		}
}

void Uart_Send_byte(u8 byte)
{
	SBUF = byte ; 
	while(!TI);
	TI = 0 ;
}

void delay(unsigned int xms)				
{
	unsigned int i,j;
	for(i=xms;i>0;i--)		      //i=xms即延时约xms毫秒
		for(j=112;j>0;j--);
}


上一篇:关于单片机按键问题总结


下一篇:钢铁侠要为Facebook的智能管家配音,really?