一、前言
1.1 項(xiàng)目介紹
STC90C51是一款常用的8位單片機(jī),以其強(qiáng)大的功能、易用的編程和穩(wěn)定的性能在嵌入式系統(tǒng)設(shè)計(jì)中廣泛應(yīng)用。在許多應(yīng)用中,單片機(jī)與外部設(shè)備或系統(tǒng)之間的通信是必不可少的,而串口通信作為一種常見的通信方式,具有傳輸距離遠(yuǎn)、抗干擾能力強(qiáng)、成本低廉等優(yōu)點(diǎn),因此被廣泛應(yīng)用于各種領(lǐng)域。
隨著物聯(lián)網(wǎng)、智能家居、工業(yè)自動(dòng)化等領(lǐng)域的快速發(fā)展,對(duì)單片機(jī)與外部設(shè)備之間的通信需求日益增加。STC90C51作為一種性能穩(wěn)定、功能豐富的單片機(jī),通過配置其串口1實(shí)現(xiàn)數(shù)據(jù)的發(fā)送和接收功能,可以滿足這種需求。通過串口通信,STC90C51可以與上位機(jī)、其他單片機(jī)或外部設(shè)備建立穩(wěn)定可靠的通信連接,實(shí)現(xiàn)數(shù)據(jù)的交換和共享。
在實(shí)際應(yīng)用中,串口通信具有廣泛的應(yīng)用場(chǎng)景。例如,在智能家居系統(tǒng)中,STC90C51可以通過串口接收來自傳感器的數(shù)據(jù),如溫度、濕度、光照強(qiáng)度等,然后將這些數(shù)據(jù)發(fā)送給上位機(jī)進(jìn)行處理和顯示;同時(shí),STC90C51也可以通過串口接收上位機(jī)發(fā)送的控制指令,實(shí)現(xiàn)對(duì)家居設(shè)備的遠(yuǎn)程控制。在工業(yè)自動(dòng)化領(lǐng)域,STC90C51可以通過串口與其他單片機(jī)或PLC進(jìn)行通信,實(shí)現(xiàn)數(shù)據(jù)的采集、傳輸和處理,從而實(shí)現(xiàn)對(duì)生產(chǎn)過程的監(jiān)控和控制。
因此,本項(xiàng)目的開發(fā)旨在通過配置STC90C51的串口1實(shí)現(xiàn)數(shù)據(jù)的發(fā)送和接收功能,為各種應(yīng)用提供穩(wěn)定可靠的通信解決方案。通過本項(xiàng)目的實(shí)施,可以進(jìn)一步提高系統(tǒng)的通信效率和穩(wěn)定性,推動(dòng)相關(guān)領(lǐng)域的技術(shù)進(jìn)步和應(yīng)用發(fā)展。
1.2 串口協(xié)議介紹
串口協(xié)議是一種在計(jì)算機(jī)和其他數(shù)字設(shè)備之間傳輸數(shù)據(jù)的標(biāo)準(zhǔn)接口協(xié)議。其核心功能是作為顯控設(shè)備與信號(hào)處理板之間、顯控設(shè)備與其他設(shè)備、設(shè)備與設(shè)備之間的通信接口,實(shí)現(xiàn)了協(xié)議數(shù)據(jù)幀的通信傳輸。串口通信的特點(diǎn)在于其按位(bit)發(fā)送和接收字節(jié)的方式,盡管這種串行通信方式相較于并行通信可能顯得較慢,但串口能夠在同一時(shí)間使用一根線發(fā)送數(shù)據(jù)的同時(shí)用另一根線接收數(shù)據(jù),從而實(shí)現(xiàn)了全雙工的通信模式。
串口通信協(xié)議具體規(guī)定了數(shù)據(jù)包的內(nèi)容,通常包含起始位、主體數(shù)據(jù)、校驗(yàn)位及停止位。起始位標(biāo)記數(shù)據(jù)包的開始,通常為邏輯0的數(shù)據(jù)位;主體數(shù)據(jù)是傳輸?shù)暮诵膬?nèi)容,長(zhǎng)度可以根據(jù)需要設(shè)定為5、6、7或8位;校驗(yàn)位用于確保數(shù)據(jù)的完整性,常用的校驗(yàn)方法有奇校驗(yàn)(odd)、偶校驗(yàn)(even)、0校驗(yàn)(space)、1校驗(yàn)(mark)及無校驗(yàn)(noparity);停止位則用于表示單個(gè)包的結(jié)束,并給計(jì)算機(jī)提供校正時(shí)鐘同步的機(jī)會(huì),常見的停止位值為1、1.5和2位。
串口通信協(xié)議還包括了一系列重要的參數(shù),如波特率、數(shù)據(jù)位、停止位和奇偶校驗(yàn)位。波特率決定了通信的速度,即每秒鐘傳送的bit的個(gè)數(shù),常見的波特率有4800、9600、115200等。數(shù)據(jù)位則定義了通信中實(shí)際數(shù)據(jù)位的數(shù)量,通常為5、7或8位。
在串口通信中,常用的協(xié)議包括RS-232、RS-422和RS-485。這些協(xié)議在工業(yè)自動(dòng)化、通信、電力、醫(yī)療等多個(gè)領(lǐng)域中發(fā)揮著重要的作用,例如在工業(yè)自動(dòng)化領(lǐng)域中,PLC控制器、工業(yè)機(jī)器人、傳感器等設(shè)備都可以通過串口通信實(shí)現(xiàn)數(shù)據(jù)的傳輸和控制。
串口協(xié)議是一種基于串行通信的數(shù)據(jù)傳輸規(guī)范,它通過規(guī)定數(shù)據(jù)包的內(nèi)容和傳輸參數(shù),實(shí)現(xiàn)了計(jì)算機(jī)與其他設(shè)備之間的穩(wěn)定、可靠的數(shù)據(jù)通信。
二、代碼實(shí)現(xiàn)
2.1 uart.c
#include "uart.h"
/*
串口初始化函數(shù)
單片機(jī)采用了12M的晶振
波特率配置為4800
*/
void UART_Init(void)
{
PCON=0x80; //波特率加倍
SCON=0x50; //配置串口工作在模式1(8位數(shù)據(jù)模式)
EA=1; //打開總中斷
ES=1; //打開接收中斷
TMOD&=0x0F; //清零T1的控制位
TMOD|=0x20; //配置T1為模式2 (8位自動(dòng)重裝載)
//TL1=TH1=256-(12000000/12/32/4800); //計(jì)算 T1 重載值
//TL1=TH1=256-(31250/4800); 31250/4800=6.510416666666667 約等于6.5
// 256-6.5=249.5
// 0xF3=243
//
TL1=TH1=0xF3;
//TH1= TL1=256-(FOSC/12/32/BAUD); //計(jì)算公式 FOSC表示晶振頻率 BAUD表示波特率
TR1=1; //啟動(dòng) T1
}
/*
串口接收中斷
*/
void UART_IRQHandler(void) interrupt 4
{
u8 Rx_Byte;
if(RI) //接收到字節(jié)
{
RI=0;//手動(dòng)清零接收中斷標(biāo)志位
Rx_Byte=SBUF; //接收到的數(shù)據(jù)保存到變量中
UART_SendOneByte(Rx_Byte); //再發(fā)回給電腦端
}
}
/*
發(fā)送一個(gè)字符
*/
void UART_SendOneByte(u8 c)
{
SBUF = c;
while(TI==0){}
TI = 0;
}
/*
發(fā)送字符串
*/
void UART_SendString(u8 *p)
{
while(*p++!='?')
{
UART_SendOneByte(*p);
}
}
/*
重寫putchar函數(shù)為了支持printf函數(shù)
*/
char putchar(char c)
{
UART_SendOneByte(c);
return c;
}
2.2 uart.h
#ifndef UART_H
#define UART_H
#include "type.h"
#include <stdio.h>
#include <reg51.h>
void UART_Init(void);
void UART_SendString(u8 *p);
void UART_SendOneByte(u8 c);
#endif
2.3 main.c
#include <reg51.h>
#include "delay.h"
#include "key.h"
#include "type.h"
#include "led.h"
#include "uart.h"
#include "timer.h"
#include "exti.h"
int main()
{
u8 key;
UART_Init();
while(1)
{
key=Array_Scan();
if(key)
{
UART_SendString("12345歡迎學(xué)習(xí)51單片機(jī)開發(fā).rn");
}
}
}