|
本帖最后由 KeepYn 于 2021-6-27 13:24 编辑
## 说明
打开串口,任意向单片机发送一字符,单片机向PC端返回一段字符“HELLO”,每发送一次便返回一次。以下直接放代码,有什么地方错误欢迎大家指出讨论,一起进步。
### 程序部分
老样子,还是基于模块化
以下是主程序
#include "init.h" //自定义的头文件,此头文件以包erg51.h头文件,因此不用在此声明
uchar code array[]="HELLO"; //定义一个数组用来储存发送的数据
void main() //主程序
{
init(); //初始化此函数
while(1)//主循环
{
if(a == 1) //主循环中检测a是否等于1
{
ES = 0; //当a等于1时,关闭串口中断
for(c=0;c<5;c++) //通过5次循环将数组中的字符写入串口中
{
SBUF = array[c];
while(!TI); //TI为发送中断标志位(相应中断后硬件置1)判断是否相应中断
TI = 0; //相应中断后手动清零(否则会一直向主机申请中断)
}
SBUF = b; //将b的字符写给串口
while(!TI); //等待是否发送完毕
TI = 0; //
ES = 1; //允许串口中断
a = 0; //将a清零,以便主程序下次判断串口是否发送数据
}
}
}
#include "init.h"
void init() //配置定时器,串口
{
TMOD = 0x20;//定时器/计数器工作方式寄存器(高4位配置T1,低4位反之)T1定时器工作方式2
TH1 = 0xfd;//T1定时器装初值(9600bsp、晶振11.0592对应初值0XFD/SMOD=0情况下)
TL1 = 0xfd;//T1定时器装初值
TR1 = 1; //T1定时器运行控制位(运行T1定时器运行)
REN = 1; //串行接收位(允许串口接收数据)
SM0 = 0; //SM0、SM1配置串口工作方式
SM1 = 1; //串口工作方式1
EA = 1; //打开总中断
ES = 1; //串口中断允许位 (打开串口中断)
}
//#include "init.h"对应H文件
#ifndef __INIT_H__
#define __INIT_H__
#include <reg51.h> //51单片机头文件
typedef unsigned int uint; //给unsigned int定义新名字为uint
typedef unsigned char uchar; //同上
extern uchar a,b,c; //声明a、b、c数据类型 (无符号字符型)
extern void init(void); //外部可调用此函数
#endif
#include "ser.h"
void UART_Routine(void) interrupt 4
{
RI = 0; //接收中断标志位,接收数据后必须手动清零
b = SBUF;//将串口中的字符写给b
a = 1; //串口中断发送时将a置1,给主程序判断用
}
#include "ser.h" 对应H文件
#ifndef __SER_H__
#define __SER_H__
#include "init.h"
#endi
|
评分
-
查看全部评分
|