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