当前位置: 首页 > news >正文

C51--PC通过串口(中断)点亮LED

B4中的:REN允许 / 禁止串行接收控制位
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

REN = 1为允许串行接收状态。
接收数据必须开启。所以SCON:0101 0000 ;即0x50

如何知道数据已经接收
RI位:当收到数据后 RI = 1(由硬件置一)
硬件置一后必须用软件复位: RI = 0

PC通过串口点亮LED

例:
通过发送缓冲区发送 ‘ c ’ 或者 ‘ o ’ 熄灭或者打开D5

#include "reg52.h"
#include "intrins.h"sfr AUXR = 0x8E;
sbit D5 = P3^7;//串口初始化
void UartInit(void)		//9600bps@11.0592MHz
{PCON &= 0x7F;		//波特率不倍速SCON = 0x50;		//8位数据,可变波特率AUXR &= 0xBF;		//定时器1时钟为Fosc/12,即12TAUXR &= 0xFE;		//串口1选择定时器1为波特率发生器TMOD &= 0x0F;		//清除定时器1模式位TMOD |= 0x20;		//设定定时器1为8位自动重装方式TL1 = 0xFD;		//设定定时初值TH1 = 0xFD;		//设定定时器重装值ET1 = 0;		//禁止定时器1中断TR1 = 1;		//启动定时器1
}void Delay1000ms()		//@11.0592MHz
{unsigned char i, j, k;_nop_();i = 8;j = 1;k = 243;do{do{while (--k);} while (--j);} while (--i);
}void sendByte(char data_msg)
{//往发送缓冲区中写入数据,就完成了数据的发送SBUF = data_msg;while(!TI);		//超声波中,用while等待,发送成功后T1 == 1TI = 0;		
}void sendString(char* str)
{while(*str != '\0'){sendByte(*str);str++;}
}void main()
{char cmd;D5 = 1;		//D5通电以后为灭的状态//配置c51串口的通信方式 UartInit();while(1){Delay1000ms();sendString("laowang lihai!\r\n");//如何知道数据已经接收,通过查询RI的值,如果RI = 1(收到数据后由硬件置一)if(RI == 1){RI = 0;		//软件复位cmd = SBUF;		//读数据if(cmd == 'o'){D5 = 0;		//D5点亮}if(cmd == 'c'){D5 = 1;		//D5熄灭}}}}

不使用中断时,亮灯会有延时。

PC通过串口中断控制LED

串口中断:UART
使用的中断号:void UART_Rountine(void) interrupt 4
发送和接收用的同一个中断处理函数。

ES: 串行口1中断允许位。ES = 1,允许串行口1中断;ES = 0,禁止串行口1中断。
EA: CPU的总中断控制位。EA = 1,CPU开放中断;EA = 0,CPU屏蔽所有中断请求。
在这里插入图片描述

#include "reg52.h"
#include "intrins.h"sfr AUXR = 0x8E;
sbit D5 = P3^7;char cmd;//串口初始化
void UartInit(void)		//9600bps@11.0592MHz
{PCON &= 0x7F;		//波特率不倍速SCON = 0x50;		//8位数据,可变波特率AUXR &= 0xBF;		//定时器1时钟为Fosc/12,即12TAUXR &= 0xFE;		//串口1选择定时器1为波特率发生器TMOD &= 0x0F;		//清除定时器1模式位TMOD |= 0x20;		//设定定时器1为8位自动重装方式TL1 = 0xFD;		//设定定时初值TH1 = 0xFD;		//设定定时器重装值ET1 = 0;		//禁止定时器1中断TR1 = 1;		//启动定时器1EA = 1;			//开启总中断ES = 1;			//开启串口中断
}void Delay1000ms()		//@11.0592MHz
{unsigned char i, j, k;_nop_();i = 8;j = 1;k = 243;do{do{while (--k);} while (--j);} while (--i);
}void sendByte(char data_msg)
{//往发送缓冲区中写入数据,就完成了数据的发送SBUF = data_msg;while(!TI);		//超声波中,用while等待,发送成功后T1 == 1TI = 0;		
}void sendString(char* str)
{while(*str != '\0'){sendByte(*str);str++;}
}void main()
{D5 = 1;		//D5通电以后为灭的状态//配置c51串口的通信方式 UartInit();while(1){Delay1000ms();sendString("laowang lihai!\r\n");}}//中断函数
void UART_Rountine(void) interrupt 4
{if(RI){			//接收中断RI = 0;		//软件复位cmd = SBUF;		//读数据if(cmd == 'o'){D5 = 0;		//D5点亮}if(cmd == 'c'){D5 = 1;		//D5熄灭}}if(TI);			//发送中断
}

static:静态的局部变量。
不加static的时候每次调用都要执行,加上后只执行一次

处理字符串指令

#include "reg52.h"
#include "intrins.h"
#include <string.h>#define SIZE 12sfr AUXR = 0x8E;
sbit D5 = P3^7;char cmd[SIZE];				//数组操作发送字符串//串口初始化
void UartInit(void)		//9600bps@11.0592MHz
{PCON &= 0x7F;		//波特率不倍速SCON = 0x50;		//8位数据,可变波特率AUXR &= 0xBF;		//定时器1时钟为Fosc/12,即12TAUXR &= 0xFE;		//串口1选择定时器1为波特率发生器TMOD &= 0x0F;		//清除定时器1模式位TMOD |= 0x20;		//设定定时器1为8位自动重装方式TL1 = 0xFD;		//设定定时初值TH1 = 0xFD;		//设定定时器重装值ET1 = 0;		//禁止定时器1中断TR1 = 1;		//启动定时器1EA = 1;			//开启总中断ES = 1;			//开启串口中断
}void Delay1000ms()		//@11.0592MHz
{unsigned char i, j, k;_nop_();i = 8;j = 1;k = 243;do{do{while (--k);} while (--j);} while (--i);
}void sendByte(char data_msg)
{//往发送缓冲区中写入数据,就完成了数据的发送SBUF = data_msg;while(!TI);		//超声波中,用while等待,发送成功后T1 == 1TI = 0;		
}void sendString(char* str)
{while(*str != '\0'){sendByte(*str);str++;}
}void main()
{D5 = 1;		//D5通电以后为灭的状态//配置c51串口的通信方式 UartInit();while(1){Delay1000ms();sendString("laowang lihai!\r\n");}}//中断函数
void UART_Rountine(void) interrupt 4
{static int i = 0;		//静态的局部变量,被初始化一次if(RI){			//接收中断RI = 0;		//软件复位cmd[i] = SBUF;		//读数据i++;if(i == SIZE){i = 0;}if(strstr(cmd,"en")){							//strcmp函数,比较函数,两个函数都为open,向下执行//查找子串,获得的字符串中间有没有enD5 = 0;		//D5点亮i = 0;memset(cmd,'\0',SIZE);		//清空数组,\0没有任何东西,大小12}if(strstr(cmd,"se")){D5 = 1;		//D5熄灭i = 0;memset(cmd,'\0',SIZE);}}if(TI);			//发送中断
}
http://www.lryc.cn/news/231198.html

相关文章:

  • 使用pixy计算群体遗传学统计量
  • 第十九章总结:Java绘图
  • Mybatis-Plus条件构造器QueryWrapper
  • python解析wirshark抓包数据
  • 一个用于操作Excel文件的.NET开源库
  • Web APIs——正则表达式使用
  • 文件包含学习笔记总结
  • <C++> 优先级队列
  • systemverilog:interface中的modport用法
  • VR建筑仿真场景编辑软件有助于激发创作者的灵感和创造力
  • 8.查询数据
  • VB.NET—Bug调试(参数话查询、附近语法错误)
  • 武汉凯迪正大—锂电池均衡维护仪
  • 解决服务器中的mysql连接不上Navicat的问题脚本
  • Git Flow的简单使用
  • LOWORD, HIWORD, LOBYTE, HIBYTE的解释
  • Centos7.9用rancher来快速部署K8S
  • NSSCTF第12页(2)
  • 基于单片机的电源切换控制器设计(论文+源码)
  • 机器学习-特征选择:使用Lassco回归精确选择最佳特征
  • uniapp开发ios上线(在win环境下使用三方)
  • 【深度学习 | 核心概念】那些深度学习路上必经的核心概念,确定不来看看? (六)
  • 景联文科技:驾驭数据浪潮,赋能AI产业——全球领先的数据标注解决方案供应商
  • OpenCV+特征检测
  • Excel-lookup函数核对两个表格的数据匹配
  • Vue 简单的语法
  • 华为ensp:vrrp双机热备负载均衡
  • postswigger 靶场(CSRF)攻略-- 1.没有防御措施的 CSRF 漏洞
  • Langchain知识点(下)
  • 百度飞浆环境安装