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

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

22小時前
526
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

更多詳細資料請聯(lián)系.docx

共1個文件

一、前言

1.1 項目介紹

STC90C51是一款常用的8位單片機,以其強大的功能、易用的編程和穩(wěn)定的性能在嵌入式系統(tǒng)設計中廣泛應用。在許多應用中,單片機與外部設備或系統(tǒng)之間的通信是必不可少的,而串口通信作為一種常見的通信方式,具有傳輸距離遠、抗干擾能力強、成本低廉等優(yōu)點,因此被廣泛應用于各種領域。

隨著物聯(lián)網智能家居工業(yè)自動化等領域的快速發(fā)展,對單片機與外部設備之間的通信需求日益增加。STC90C51作為一種性能穩(wěn)定、功能豐富的單片機,通過配置其串口1實現(xiàn)數據的發(fā)送和接收功能,可以滿足這種需求。通過串口通信,STC90C51可以與上位機、其他單片機或外部設備建立穩(wěn)定可靠的通信連接,實現(xiàn)數據的交換和共享。

在實際應用中,串口通信具有廣泛的應用場景。例如,在智能家居系統(tǒng)中,STC90C51可以通過串口接收來自傳感器的數據,如溫度、濕度、光照強度等,然后將這些數據發(fā)送給上位機進行處理和顯示;同時,STC90C51也可以通過串口接收上位機發(fā)送的控制指令,實現(xiàn)對家居設備的遠程控制。在工業(yè)自動化領域,STC90C51可以通過串口與其他單片機或PLC進行通信,實現(xiàn)數據的采集、傳輸和處理,從而實現(xiàn)對生產過程的監(jiān)控和控制。

因此,本項目的開發(fā)旨在通過配置STC90C51的串口1實現(xiàn)數據的發(fā)送和接收功能,為各種應用提供穩(wěn)定可靠的通信解決方案。通過本項目的實施,可以進一步提高系統(tǒng)的通信效率和穩(wěn)定性,推動相關領域的技術進步和應用發(fā)展。

image-20240612115412493

image-20240612115425251

1.2 串口協(xié)議介紹

串口協(xié)議是一種在計算機和其他數字設備之間傳輸數據的標準接口協(xié)議。其核心功能是作為顯控設備與信號處理板之間、顯控設備與其他設備、設備與設備之間的通信接口,實現(xiàn)了協(xié)議數據幀的通信傳輸。串口通信的特點在于其按位(bit)發(fā)送和接收字節(jié)的方式,盡管這種串行通信方式相較于并行通信可能顯得較慢,但串口能夠在同一時間使用一根線發(fā)送數據的同時用另一根線接收數據,從而實現(xiàn)了全雙工的通信模式。

串口通信協(xié)議具體規(guī)定了數據包的內容,通常包含起始位、主體數據、校驗位及停止位。起始位標記數據包的開始,通常為邏輯0的數據位;主體數據是傳輸的核心內容,長度可以根據需要設定為5、6、7或8位;校驗位用于確保數據的完整性,常用的校驗方法有奇校驗(odd)、偶校驗(even)、0校驗(space)、1校驗(mark)及無校驗(noparity);停止位則用于表示單個包的結束,并給計算機提供校正時鐘同步的機會,常見的停止位值為1、1.5和2位。

串口通信協(xié)議還包括了一系列重要的參數,如波特率、數據位、停止位和奇偶校驗位。波特率決定了通信的速度,即每秒鐘傳送的bit的個數,常見的波特率有4800、9600、115200等。數據位則定義了通信中實際數據位的數量,通常為5、7或8位。

在串口通信中,常用的協(xié)議包括RS-232、RS-422和RS-485。這些協(xié)議在工業(yè)自動化、通信、電力、醫(yī)療等多個領域中發(fā)揮著重要的作用,例如在工業(yè)自動化領域中,PLC控制器、工業(yè)機器人、傳感器等設備都可以通過串口通信實現(xiàn)數據的傳輸和控制。

串口協(xié)議是一種基于串行通信的數據傳輸規(guī)范,它通過規(guī)定數據包的內容和傳輸參數,實現(xiàn)了計算機與其他設備之間的穩(wěn)定、可靠的數據通信。

二、代碼實現(xiàn)

2.1 uart.c

#include "uart.h"
/*
串口初始化函數
單片機采用了12M的晶振
波特率配置為4800
*/
void UART_Init(void)
{
    PCON=0x80;    //波特率加倍
    SCON=0x50;    //配置串口工作在模式1(8位數據模式)
    EA=1;		  //打開總中斷
    ES=1;	      //打開接收中斷
    TMOD&=0x0F;   //清零T1的控制位
    TMOD|=0x20;   //配置T1為模式2 (8位自動重裝載)
    //TL1=TH1=256-(12000000/12/32/4800); //計算 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);  //計算公式  FOSC表示晶振頻率  BAUD表示波特率
    
    TR1=1;        //啟動 T1
}

/*
串口接收中斷
*/
void UART_IRQHandler(void) interrupt 4
{
	u8 Rx_Byte;
	if(RI)  //接收到字節(jié)
	{
        RI=0;//手動清零接收中斷標志位
        Rx_Byte=SBUF;  //接收到的數據保存到變量中
        UART_SendOneByte(Rx_Byte); //再發(fā)回給電腦端
	}
}

/*
發(fā)送一個字符
*/
void UART_SendOneByte(u8 c)
{
    SBUF = c;
    while(TI==0){}
    TI = 0;
}
/*
發(fā)送字符串
*/
void UART_SendString(u8 *p)
{
    while(*p++!='?')
    {
        UART_SendOneByte(*p);
    }
}

/*
重寫putchar函數為了支持printf函數
*/
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歡迎學習51單片機開發(fā).rn");
        }
    }
}

  • 更多詳細資料請聯(lián)系.docx
    下載

相關推薦