首页 > 其他 > 详细

51单片机UART通信[发送接收数字字母中文,控制LED亮灭]

时间:2015-10-03 06:12:40      阅读:732      评论:0      收藏:0      [点我收藏+]

51单片机UART通信[发送接收数字字母中文,控制LED亮灭] 


【波特率参考】串口通信常用波特率,中断函数

http://990487026.blog.51cto.com/10133282/1699957






1、发送什么就接收什么

/*
工程创建MCU选取,Atmel 89C55
单片机:STC12C5A60S2
晶振:12M
功能:串口的应用
波特率:4800 8 无 1 无

*/

#include <REG51.h> //  可以使用通用的头文件

//串口中断初始化程序
void UART_init(void){
 	EA=1; //打开总中断【定时器,ADC,串口,比较,计数,外部】等中断类型
	ES=1;//允许串口的中断

	TMOD=0x20;  // 定时器1 T/C1工作方式,用来产生串口工作频率
	SCON=0x50;  // 串口工作方式1
	TH1=0xF3;   // 定时器初始值高8位的设置,查表得频率
	TL1=0xF3;    // 定时器初始值低8位的设置,查表得频率
	PCON=0x80;  // 波特率倍频2400为4800了
	TR1=1;      // 定时器启动
}

void UART_R(void) interrupt 4 using 1{
  unsigned char UART_data;
	RI=0;						//RI接收标志位1就会进入该程序,手动置0,等待新的接收
	UART_data=SBUF; //把接收到的1bit数据放到UART_data
	
	SBUF=UART_data; //把UART_data数据发送出去
	while(TI==0);   //等待发送结束
	TI=0;           //TI发送标志位置0,等待新的发送
}

void main (void) {
	UART_init();
  while (1) {
   }
}






2、把UART_data数据加2发送出去

/*
工程创建MCU选取,Atmel 89C55
单片机:STC12C5A60S2
晶振:12M
功能:串口的应用
波特率:4800 8 无 1 无

*/

#include <REG51.h> //  可以使用通用的头文件

//串口中断初始化程序
void UART_init(void){
 	EA=1; //打开总中断【定时器,ADC,串口,比较,计数,外部】等中断类型
	ES=1;//允许串口的中断

	TMOD=0x20;  // 定时器1 T/C1工作方式,用来产生串口工作频率
	SCON=0x50;  // 串口工作方式1
	TH1=0xF3;   // 定时器初始值高8位的设置,查表得频率
	TL1=0xF3;    // 定时器初始值低8位的设置,查表得频率
	PCON=0x80;  // 波特率倍频2400为4800了
	TR1=1;      // 定时器启动
}

void UART_R(void) interrupt 4 using 1{
  unsigned char UART_data;
	RI=0;						//RI接收标志位1就会进入该程序,手动置0,等待新的接收
	UART_data=SBUF; //把接收到的1bit数据放到UART_data
	
	SBUF=UART_data+0x02; //把UART_data数据加2发送出去
	while(TI==0);   //等待发送结束
	TI=0;           //TI发送标志位置0,等待新的发送
}

void main (void) {
	UART_init();
  while (1) {
   }
}





3、串口的应用:输出指定的数值

/*
工程创建MCU选取,Atmel 89C55
单片机:STC12C5A60S2
晶振:12M
功能:串口的应用:输出指定的数值
波特率:4800 8 无 1 无

*/

//#include <REG51.h> //  可以使用通用的头文件
#include <STC12C5A60S2.H>


//串口中断初始化程序
void UART_init(void){
 	EA=1; //打开总中断【定时器,ADC,串口,比较,计数,外部】等中断类型
  ES=1;//允许串口的中断

	TMOD=0x20;  // 定时器1 T/C1工作方式,用来产生串口工作频率
	SCON=0x50;  // 串口工作方式1
	TH1=0xF3;   // 定时器初始值高8位的设置,查表得频率
	TL1=0xF3;    // 定时器初始值低8位的设置,查表得频率
	PCON=0x80;  // 波特率倍频2400为4800了 
	TR1=1;      // 定时器启动
}

void main (void) {
	UART_init();
  while (1) {
		SBUF=0xfa;
		while(TI==0);
		TI=0;
   }
}





4、串口的应用:输出字符“Ok9”

/*
工程创建MCU选取,Atmel 89C55
单片机:STC12C5A60S2
晶振:12M
功能:串口的应用:输出字符“Ok9”
波特率:4800 8 无 1 无
*/

#include <STC12C5A60S2.H>
#include <STRING.H>


void UART_init(void){
 	EA=1; //打开总中断【定时器,ADC,串口,比较,计数,外部】等中断类型
  ES=1;//允许串口的中断

	TMOD=0x20;  // 定时器1 T/C1工作方式,用来产生串口工作频率
	SCON=0x50;  // 串口工作方式1
	TH1=0xF3;   // 定时器初始值高8位的设置,查表得频率
	TL1=0xF3;    // 定时器初始值低8位的设置,查表得频率
	PCON=0x80;  // 波特率倍频2400为4800了 
	TR1=1;      // 定时器启动
}

void UART_T (unsigned char UART_data){ //定义串口发送数据变量
	SBUF = UART_data;	//将接收的数据发送回去
	while(TI == 0);		//检查发送中断标志位
	TI = 0;			//令发送中断标志位为0(软件清零)
}

void UART_TC (unsigned char *str){
	while(*str != ‘\0‘){
		UART_T(*str);
		*str++;
	}
	*str = 0;
}

void main (void) {
	UART_init();
  while (1) {
    UART_TC ("Ok");
		UART_T(0x30+9);// 数字偏移量
   }
}





5、串口的应用:输出字符“Ok0”到“Ok9”

/*
工程创建MCU选取,Atmel 89C55
单片机:STC12C5A60S2
晶振:12M
功能:串口的应用:输出字符“Ok9”
波特率:4800 8 无 1 无
*/

#include <STC12C5A60S2.H>
#include <STRING.H>


void UART_init(void){
 	EA=1; //打开总中断【定时器,ADC,串口,比较,计数,外部】等中断类型
  ES=1;//允许串口的中断

	TMOD=0x20;  // 定时器1 T/C1工作方式,用来产生串口工作频率
	SCON=0x50;  // 串口工作方式1
	TH1=0xF3;   // 定时器初始值高8位的设置,查表得频率
	TL1=0xF3;    // 定时器初始值低8位的设置,查表得频率
	PCON=0x80;  // 波特率倍频2400为4800了 
	TR1=1;      // 定时器启动
}

void UART_T (unsigned char UART_data){ //定义串口发送数据变量
	SBUF = UART_data;	//将接收的数据发送回去
	while(TI == 0);		//检查发送中断标志位
	TI = 0;			//令发送中断标志位为0(软件清零)
}

void UART_TC (unsigned char *str){
	while(*str != ‘\0‘){
		UART_T(*str);
		*str++;
	}
	*str = 0;
}

void main (void) {
	unsigned char a=0 ;
	UART_init();
  while (1) {
    UART_TC ("Ok");
		UART_T(0x30+a); // 数字偏移量
		a++;
		if(a>9){
			a=0;
     }
   }
}

// 输出结果
// k0Ok1Ok2Ok3Ok4Ok5Ok6Ok7Ok8Ok9




6、输出中文

/*
工程创建MCU选取,Atmel 89C55
单片机:STC12C5A60S2
晶振:12M
功能:串口的应用:输出字符“Ok9”
波特率:4800 8 无 1 无
*/

#include <STC12C5A60S2.H>
#include <STRING.H>


void UART_init(void){
 	EA=1; //打开总中断【定时器,ADC,串口,比较,计数,外部】等中断类型
  ES=1;//允许串口的中断

	TMOD=0x20;  // 定时器1 T/C1工作方式,用来产生串口工作频率
	SCON=0x50;  // 串口工作方式1
	TH1=0xF3;   // 定时器初始值高8位的设置,查表得频率
	TL1=0xF3;    // 定时器初始值低8位的设置,查表得频率
	PCON=0x80;  // 波特率倍频2400为4800了 
	TR1=1;      // 定时器启动
}

void UART_T (unsigned char UART_data){ //定义串口发送数据变量
	SBUF = UART_data;	//将接收的数据发送回去
	while(TI == 0);		//检查发送中断标志位
	TI = 0;			//令发送中断标志位为0(软件清零)
}

void UART_TC (unsigned char *str){
	while(*str != ‘\0‘){
		UART_T(*str);
		*str++;
	}
	*str = 0;
}

void main (void) {
	unsigned char a;
	UART_init();
  while (1) {
    UART_TC ("寄存器值是");
		UART_T(0x30+a); // 数字偏移量
		a++;
		if(a>9){
			a=0;
     }
   }
}

// 超级终端输出结果
//寄存器的值是0寄存器的值是1寄存器的值是2寄存器的值是3寄存器的值是4
//寄存器的值是5寄存器的值是6寄存器的值是7寄存器的值是8寄存器的值是9




7、串口的应用,按0键控制超级终端控制LED灯亮灭

/*
工程创建MCU选取,Atmel 89C55
单片机:STC12C5A60S2
晶振:12M
功能:串口的应用,超级终端控制LED灯亮灭,
波特率:4800 8 无 1 无

*/

#include <STC12C5A60S2.H>  
#include <STRING.H>
sbit LED=P0^0;


//串口中断初始化程序
void UART_init(void){
 	EA=1; //打开总中断【定时器,ADC,串口,比较,计数,外部】等中断类型
	ES=1;//允许串口的中断

	TMOD=0x20;  // 定时器1 T/C1工作方式,用来产生串口工作频率
	SCON=0x50;  // 串口工作方式1
	TH1=0xF3;   // 定时器初始值高8位的设置,查表得频率
	TL1=0xF3;    // 定时器初始值低8位的设置,查表得频率
	PCON=0x80;  // 波特率倍频2400为4800了
	TR1=1;      // 定时器启动
}


void UART_T (unsigned char UART_data){ //定义串口发送数据变量
	SBUF = UART_data;	//将接收的数据发送回去
	while(TI == 0);		//检查发送中断标志位
	TI = 0;			//令发送中断标志位为0(软件清零)
}

void UART_TC (unsigned char *str){
	while(*str != ‘\0‘){
		UART_T(*str);
		*str++;
	}
	*str = 0;
}

void UART_R(void) interrupt 4 using 1{
  unsigned char UART_data;
	RI=0;						//RI接收标志位1就会进入该程序,手动置0,等待新的接收
	UART_data=SBUF; //把接收到的1bit数据放到UART_data
	if(UART_data==0x30) {
		LED=~LED;
		UART_TC ("成功!");
		}
	SBUF=UART_data; //把UART_data数据发送出去
	while(TI==0);   //等待发送结束
	TI=0;           //TI发送标志位置0,等待新的发送
}

void main (void) {
	UART_init();
	UART_TC ("0键开关LED灯");
	
    while (1) {
   }
}

按0键控制LED亮灭效果图:

技术分享





// STC-ISP终端乱码的处理办法

// 1,试试下载XP超级终端,Win7超级终端,Hyper_Terminal

// 2,可以按照下图,恢复KEIL原来的字符编码集,把上面的程序粘贴进去,把49行和58行的这两条提示从新修改为中文。

技术分享





UART串口到此告一段落!



本文出自 “生命不息,折腾不止。” 博客,谢绝转载!

51单片机UART通信[发送接收数字字母中文,控制LED亮灭]

原文:http://990487026.blog.51cto.com/10133282/1699963

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!