|
本帖最后由 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
|
評分
-
查看全部評分
|