|
本帖最后由 KeepYn 于 2021-6-27 13:24 編輯
## 說(shuō)明
打開(kāi)串口,任意向單片機(jī)發(fā)送一字符,單片機(jī)向PC端返回一段字符“HELLO”,每發(fā)送一次便返回一次。以下直接放代碼,有什么地方錯(cuò)誤歡迎大家指出討論,一起進(jìn)步。
### 程序部分
老樣子,還是基于模塊化
以下是主程序
#include "init.h" //自定義的頭文件,此頭文件以包erg51.h頭文件,因此不用在此聲明
uchar code array[]="HELLO"; //定義一個(gè)數(shù)組用來(lái)儲(chǔ)存發(fā)送的數(shù)據(jù)
void main() //主程序
{
init(); //初始化此函數(shù)
while(1)//主循環(huán)
{
if(a == 1) //主循環(huán)中檢測(cè)a是否等于1
{
ES = 0; //當(dāng)a等于1時(shí),關(guān)閉串口中斷
for(c=0;c<5;c++) //通過(guò)5次循環(huán)將數(shù)組中的字符寫(xiě)入串口中
{
SBUF = array[c];
while(!TI); //TI為發(fā)送中斷標(biāo)志位(相應(yīng)中斷后硬件置1)判斷是否相應(yīng)中斷
TI = 0; //相應(yīng)中斷后手動(dòng)清零(否則會(huì)一直向主機(jī)申請(qǐng)中斷)
}
SBUF = b; //將b的字符寫(xiě)給串口
while(!TI); //等待是否發(fā)送完畢
TI = 0; //
ES = 1; //允許串口中斷
a = 0; //將a清零,以便主程序下次判斷串口是否發(fā)送數(shù)據(jù)
}
}
}
#include "init.h"
void init() //配置定時(shí)器,串口
{
TMOD = 0x20;//定時(shí)器/計(jì)數(shù)器工作方式寄存器(高4位配置T1,低4位反之)T1定時(shí)器工作方式2
TH1 = 0xfd;//T1定時(shí)器裝初值(9600bsp、晶振11.0592對(duì)應(yīng)初值0XFD/SMOD=0情況下)
TL1 = 0xfd;//T1定時(shí)器裝初值
TR1 = 1; //T1定時(shí)器運(yùn)行控制位(運(yùn)行T1定時(shí)器運(yùn)行)
REN = 1; //串行接收位(允許串口接收數(shù)據(jù))
SM0 = 0; //SM0、SM1配置串口工作方式
SM1 = 1; //串口工作方式1
EA = 1; //打開(kāi)總中斷
ES = 1; //串口中斷允許位 (打開(kāi)串口中斷)
}
//#include "init.h"對(duì)應(yīng)H文件
#ifndef __INIT_H__
#define __INIT_H__
#include <reg51.h> //51單片機(jī)頭文件
typedef unsigned int uint; //給unsigned int定義新名字為uint
typedef unsigned char uchar; //同上
extern uchar a,b,c; //聲明a、b、c數(shù)據(jù)類型 (無(wú)符號(hào)字符型)
extern void init(void); //外部可調(diào)用此函數(shù)
#endif
#include "ser.h"
void UART_Routine(void) interrupt 4
{
RI = 0; //接收中斷標(biāo)志位,接收數(shù)據(jù)后必須手動(dòng)清零
b = SBUF;//將串口中的字符寫(xiě)給b
a = 1; //串口中斷發(fā)送時(shí)將a置1,給主程序判斷用
}
#include "ser.h" 對(duì)應(yīng)H文件
#ifndef __SER_H__
#define __SER_H__
#include "init.h"
#endi
|
-
串口返回.jpg
(225.27 KB, 下載次數(shù): 81)
下載附件
2021-6-27 13:23 上傳
-
-
模塊化 串口向PC端返回字符.rar
2021-6-26 00:56 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
22.88 KB, 下載次數(shù): 8, 下載積分: 黑幣 -5
評(píng)分
-
查看全部評(píng)分
|