• 方案介紹
    • 一、前言
    • 二、代碼實(shí)現(xiàn)
  • 附件下載
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

STC51 配置串口1實(shí)現(xiàn)數(shù)據(jù)發(fā)送和接收

23小時(shí)前
526
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

更多詳細(xì)資料請(qǐng)聯(lián)系.docx

共1個(gè)文件

一、前言

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ā)展。

image-20240612115412493

image-20240612115425251

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");
        }
    }
}

  • 更多詳細(xì)資料請(qǐng)聯(lián)系.docx
    下載

相關(guān)推薦