单片机串口程序1

//转的单片机串口程序
发一个用串口命令单片机控制开关输出的小程序,如串口发送led0_open回车后,单片机点亮led0 
程序波特率设为2400bps(12Mhz晶振),请根据需要自行修改
[attachment=2332028]

#include <reg52.h>
#include "string.h"
sbit led0=P0^0; //定义led接口
sbit led1=P0^1; //同上
sbit led2=P0^2; //同上
sbit led3=P0^3; //同上
sbit led4=P0^4; //同上
sbit led5=P0^5; //同上
sbit led6=P0^6; //同上
sbit led7=P0^7; //同上
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
//                         定义各种变量
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
unsigned char cmd_buf[40];  //串口命令的缓冲区
unsigned char data counter=0;  //用于数据接收计数
unsigned char data flag=0;  //命令接收结束标记,为1时说明接收到了个完整的命令,进入到主函数中进行解析和执行
/**************************************************************************
- 功能描述:51单片机的串口初始化
- 隶属模块:STC51串口操作
- 函数属性:外部,使用户使用
- 参数说明:无
- 返回说明:无
- 注:正确的初始化串口十分重要
**************************************************************************/
void Com_init()
{
/******************设定定时器*********************/
TMOD = 0x20;      //设定定时器的工作方式(方式2)
TH1  = 0xf3;      //设定波特率为 9600 bps (在11.0592MHZ晶振时)
TL1  = 0xf3;
/*******************设定串口**********************/
SM0  = 0;       //SM0 和 SM1 设定串口的工作方式(方式1)
SM1  = 1;
REN  = 1;       //允许串口接收外部传来的数据
/******************设定中断**********************/
ES   = 1;       //允许串口收到数据后产生中断通知我们
EA   = 1;       //因为总中断开关是控制所有中断的,所以要把它打开
TR1  = 1;       //启动定时器,串口就开始工作喽!
}
/**************************************************************************
- 功能描述:51单片机的串口发送字节的函数
- 隶属模块:STC51串口操作
- 函数属性:外部,使用户使用
- 参数说明:mydata:要发送的一个字节
- 返回说明:无
- 注:发送一个字节,是串口发送的基础操作
**************************************************************************/
void UART_Send_Byte(unsigned char mydata) 
{
ES=0;
TI=0;
SBUF=mydata;
while(!TI);
TI=0;
ES=1;
}
/**************************************************************************
- 功能描述:51单片机的串口发送0d 0a ,即回车换行
- 隶属模块:STC51串口操作
- 函数属性:外部,使用户使用
- 参数说明:无
- 返回说明:无
- 注:此函数就是发送0d 0a这两个字节,在“超级终端”上会有回车换行的效果
**************************************************************************/
void UART_Send_Enter()
{
UART_Send_Byte(0x0d);
UART_Send_Byte(0x0a);
}
/********************************************************************
* 名称 : UART_Send_Str(char *s)
* 功能 : 串口发送一个字符串
* 输入 : s:指向字符串数组的指针
* 输出 : 无
***********************************************************************/
void UART_Send_Str(char *s)
{
int len=strlen(s);     //求字符串长度的
int i;
for(i=0;i<len;i++)
if(s=='\r') 
{
  UART_Send_Enter();
}
else
{
  UART_Send_Byte(s);
}
}
/********************************************************************
* 名称 : Com_send(unsigned char *p)
* 功能 : 串口发送字符串
* 输入 : p:指向字符串数组的指针
* 输出 : 无
***********************************************************************/
void Com_send(unsigned char *p)
{
while(1)
{
  SBUF = *p;
  while(!TI);      //如果发送完毕,硬件会置位TI
  p++;
  if(*p == '\0') break;   //在每个字符串的最后,会有一个'\0'
  TI = 0;       //TI清零
}
}
/******************************************************************
- 功能描述:将一个32位的变量dat转为字符串,比如把1234转为"1234"
- 隶属模块:公开函数模块
- 函数属性:外部,用户可调用
- 参数说明:dat:带转的long型的变量
             str:指向字符数组的指针,转换后的字节串放在其中           
- 返回说明:无
******************************************************************/
void u32tostr(unsigned long dat,char *str) 
{
char temp[20];
unsigned char i=0,j=0;
i=0;
while(dat)
{
  temp=dat%10+0x30;
  i++;
  dat/=10;
}
j=i;
for(i=0;i<j;i++)
{
  str=temp[j-i-1];
}
if(!i) {str[i++]='0';}
str=0;
}
/******************************************************************
- 功能描述:将一个字符串转为32位的变量,比如"1234"转为1234
- 隶属模块:公开函数模块
- 函数属性:外部,用户可调用
- 参数说明:str:指向待转换的字符串           
- 返回说明:转换后的数值
******************************************************************/
unsigned long strtou32(char *str) 
{
unsigned long temp=0;
unsigned long fact=1;
unsigned char len=strlen(str);
unsigned char i;
for(i=len;i>0;i--)
{
  temp+=((str[i-1]-0x30)*fact);
  fact*=10;
}
return temp;
}
/**************************************************************************
- 功能描述:51单片机的串口发送数值
- 隶属模块:STC51串口操作
- 函数属性:外部,使用户使用
- 参数说明:dat:要发送的数值
- 返回说明:无
- 注:函数中会将数值转为相应的字符串,发送出去。比如 4567 转为 "4567" 
**************************************************************************/
void UART_Put_Num(unsigned long dat)
{
char idata  temp[20];  //temp数组确定显示数字的位数
u32tostr(dat,temp);   //转换数字到字符串的
UART_Send_Str(temp);
}
/********************************************************************
* 名称 : UART_Put_Inf(char *inf,unsigned long dat)
* 功能 : 串口发送一个字符串后面接着一串数字
* 输入 : inf:指向字符串数组的指针 dat:数字不能超过20位
* 输出 : 无
***********************************************************************/
void UART_Put_Inf(char *inf,unsigned long dat)
{
UART_Send_Str(inf);
UART_Put_Num(dat);
UART_Send_Str("\r");  
}
/********************************************************************
* 名称 : unsigned char cmd_panduan(unsigned char *cmd_buf,unsigned char *cmd,unsigned char len)
* 功能 : 在指定长度内比较两个字符串是否一致
* 输入 : 指向字符串的指针cmd_buf,cmd 要比较的长度
* 输出 : 是:输出1,否:输出0
********************************************************************/
unsigned char cmd_panduan(unsigned char *cmd_buf,unsigned char *cmd,unsigned char len)
{
unsigned char i,j;
for(j=0;j<len;j++)
{
  i=(cmd_buf[j+1]==cmd[j]);
  if(i)
  {
   i=1;
  }
  if(i==0)
  {
   i=0;
   break;
  }
}
j=0;
return i;
} 
/**************************************************************************
- 功能描述:51单片机的串口中断处理函数
- 隶属模块:STC51串口操作
- 函数属性:外部,使用户使用(在此中断函数中常用来处理从串口收到的数据)
- 参数说明:无
- 返回说明:无
- 注:振南的很多产品,都是配合“超级终端”来进行演示的,在“超级终端”中
       敲入的命令就是从计算机的串口发出,由单片机从串口接收,接收到的串口
    数据就在此中断函数中进行处理,完成命令接收及处理、命令解析等工作。
**************************************************************************/
void com_ser() interrupt 4    //串口中断处理函数,收到数据后产生中断,在这里处理
{
unsigned char data len=0;   //命令字符串长度
if(RI)        //如果数据已经接收完,即RI=1
{
  RI=0;       //对RI进行清零
  cmd_buf[counter] = SBUF;  //把收到的数据赋值给变量(注意接收的写法)
}   
if(cmd_buf[counter]==0x0d)   //如果串口输入回车,那么命令结束
{
  cmd_buf[counter]='\0';
  len=counter-1;
  counter = 0;
  flag=1;
}
else
  counter = counter+1;

if(flag)       //处理接收到的命令
{
  if(cmd_panduan(cmd_buf,"led0_open",len))
  {
   led0=0;
   UART_Send_Str("led0_open OK!\r");
  }
  if(cmd_panduan(cmd_buf,"led0_close",len))
  {
   led0=1;
   UART_Send_Str("led0_close OK!\r");
  }
  if(cmd_panduan(cmd_buf,"led1_open",len))
  {
   led1=0;
   UART_Send_Str("led1_open OK!\r");
  }
  if(cmd_panduan(cmd_buf,"led1_close",len))
  {
   led1=1;
   UART_Send_Str("led1_close OK!\r");
  }
  if(cmd_panduan(cmd_buf,"led2_open",len))
  {
   led2=0;
   UART_Send_Str("led2_open OK!\r");
  }
  if(cmd_panduan(cmd_buf,"led2_close",len))
  {
   led2=1;
   UART_Send_Str("led2_close OK!\r");
  }
  if(cmd_panduan(cmd_buf,"led3_open",len))
  {
   led3=0;
   UART_Send_Str("led3_open OK!\r");
  }
  if(cmd_panduan(cmd_buf,"led3_close",len))
  {
   led3=1;
   UART_Send_Str("led3_close OK!\r");
  }
  if(cmd_panduan(cmd_buf,"led4_open",len))
  {
   led4=0;
   UART_Send_Str("led4_open OK!\r");
  }
  if(cmd_panduan(cmd_buf,"led4_close",len))
  {
   led4=1;
   UART_Send_Str("led4_close OK!\r");
  }
  if(cmd_panduan(cmd_buf,"led5_open",len))
  {
   led5=0;
   UART_Send_Str("led5_open OK!\r");
  }
  if(cmd_panduan(cmd_buf,"led5_close",len))
  {
   led5=1;
   UART_Send_Str("led1_close OK!\r");
  }
  if(cmd_panduan(cmd_buf,"led6_open",len))
  {
   led6=0;
   UART_Send_Str("led6_open OK!\r");
  }
  if(cmd_panduan(cmd_buf,"led6_close",len))
  {
   led6=1;
   UART_Send_Str("led6_close OK!\r");
  }
  if(cmd_panduan(cmd_buf,"led7_open",len))
  {
   led7=0;
   UART_Send_Str("led7_open OK!\r");
  }
  if(cmd_panduan(cmd_buf,"led7_close",len))
  {
   led7=1;
   UART_Send_Str("led7_close OK!\r");
  }
  flag=0;       //这里一定要将命令结束标记恢复置0
}
}
void main()   //主函数
{
P0=0xff;  //P0 I/O口置1,不输出控制信号(低电平输出控制信号)
Com_init();  //初始化串口
while (1);  //什么都不做,等待串口中断
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值