摘要:目前,所有型號串口的輸入是輸出是。串口全雙工通信是沒有時鐘脈沖的,只能依靠晶振脈沖定時器的溢出脈沖。中斷中讀取,清標志,然后返回給計算機,等待發(fā)送完畢防重疊最少時間次位定時器時間。實現(xiàn)燒錄程序的目的。
多位數(shù)據(jù)同時傳輸
通訊介質(zhì)通常為TTL,差分(低壓差分芯片)
例如:LCO1602,ADC0804,LVDS(液晶顯示)等
多位數(shù)據(jù)排隊傳輸,任意IO口都可以做數(shù)據(jù)收發(fā)
通信介質(zhì)通常為TTL,差分(485),無線電
74HC595(單工),IIC(半雙工),SPI
單線歸零、1- Wire 、 CAN 總線、無線電、UART (含 DMX512 、 modbus )。
? UART 是單片機的獨立模塊。我們設(shè)置好模塊的參數(shù),需要發(fā)送什么內(nèi)容,扔給串口模塊就行。 CPU 不需要按位讀寫。該模塊是指定的管腳輸入輸出。目前, STC 所有型號串口1 的輸入是 RxD1=P3.0, , 輸出是 TxD1=P3.1 。
? STC15 開發(fā)板使用 STC15W4K16S4 芯片,串口有4個,其中串口3的輸入是 RxD3= P0.0, , 輸出是 TxD3= P0.1 。與矩陣鍵盤共用了兩個 IO
CPU 往 SBUF 中寫入一個 byte , CPU 可以跑去執(zhí)行其他函數(shù)。如果發(fā)送完成,串口模塊向 CPU 申請中斷(T1);
串口收發(fā)一位數(shù)據(jù),依靠嚴格的時間來保證收發(fā)同步
如果串口模塊接收完一個字節(jié),也向 CPU 申請中斷( RI ),CPU 可以從 SBUF 中讀取數(shù)據(jù)。
**1.位采樣脈沖:**接收器把每個 bit 的時間平均等份,對線路電平進行采樣,確定接收到的是高電平還是低電平,才能進行下一位數(shù)據(jù)的采樣。 STC89 是 16 等份判斷7、8 、9(三選二)。STC15W 和 STC8 系列是4等份(四選三,官方資料寫錯成 16 了)
2.波特率:: 是指1秒鐘的時間內(nèi),串口通信線路上面,發(fā)送的數(shù)據(jù)位數(shù), , 簡單理解成1秒鐘內(nèi)電平跳變多少次
常用的波特率有 9600 等, STC 下載軟件里面可以選擇的就有很多種波特率。我們后面要學(xué)的 DMX512 就是 250000bps .
**波特率的本質(zhì),是設(shè)置信號時間點。**到點就按時發(fā)送或者接收一位。串口全雙工通信是沒有時鐘脈沖的,只能依靠晶振脈沖、定時器的溢出脈沖。
==3.波特率哪里來:==波特率來自定時器的溢出,獨立波特率發(fā)生器,以及系統(tǒng)時鐘分頻
波特率是 9600 ,每位采樣4次。就需要定時器2每秒鐘溢出 9600*4 次 =38400
定時器2溢出需要的脈沖數(shù)是:24000000 ÷ 38400=625. 那么,定時器2的預(yù)裝初值就是:65536-625=64911=0xFD8F
void Uart1_Init(){ SM0 = 0; SM1 = 1; REN = 1; //上面三條語句就等于操作SCON |= 0x50; PCON &= 0x3f; AUXR |= 0x01; AUXR |= 0x14; T2H = 0xfd; T2L = 0x8f; ES = 1;}
在中斷里面我們干什么,進中斷第一件事就是先把接收標志,發(fā)送標志給軟件清零,然后再做一系列操作
void Uart1_Routine() interrupt 4{ if (RI) { RI = 0;//先把接收標志給清零 Uart1_Data = SBUF; } if (TI) { TI = 0;//先把發(fā)送標志給清零 }}
監(jiān)控串口通信內(nèi)容,如果在 9600 波特率下,連續(xù)收到 10 個字節(jié)都是 0x7f, 那么讓單片機軟復(fù)位,去支持 ISP 監(jiān)控區(qū)域代碼。實現(xiàn)燒錄程序的目的。單片機不斷電就可下載程序,方便項目調(diào)試
上面我們故意用最低波特率與最高波特率都是1200,小于9600,我就點了下載,(板子是上電的)沒有用板子的開關(guān)復(fù)位,就是通過純軟件復(fù)位,等了幾秒沒有反應(yīng),說明我們用9600下載的方式是不支持1200下載的
9600很慢的(哈哈)下載了
我們發(fā)現(xiàn)只要最低波特率到9600就可以軟復(fù)位了,越高會下載越快
void Uart1_Routine() interrupt 4{ //記錄接收命令流變量 static char Uart1_ser_n = 0; if (RI) { RI = 0;//先把接收標志給清零 Uart1_Data = SBUF; if (SBUF == 0x7f) //9600波特率 { //接收命令為0x7f時就++ Uart1_ser_n++; if(Uart1_ser_n > 10)//大于10基本就是確定是下載命令 { Uart1_ser_n = 0; //然后執(zhí)行軟復(fù)位 IAP_CONTR |= 0xe0; } } } if (TI) { TI = 0;//先把發(fā)送標志給清零 }}
為什么一直是0xFF,眼看也不是1啊是不是 ,我們用邏輯分析儀來抓取看看
完美,為了讓你直觀的看到美,我采集一下給你們看看
我們給他一個標志位,前面一個字節(jié)發(fā)送完成后,標志位修改,然后發(fā)第二個字節(jié),以此類推
//串口發(fā)送底層驅(qū)動的函數(shù)void Uart1_Up_Data_Drive(){ //串口1標志為1才能發(fā)送字節(jié), //可以讓數(shù)據(jù)有效的發(fā)送 if(Uart1_Flag) { Uart1_Flag = 0; SBUF = 1; }}//串口1中斷void Uart1_Routine() interrupt 4{ //記錄接收命令流變量 static char Uart1_ser_n = 0; if (RI) { RI = 0;//先把接收標志給清零 if (SBUF == 0x7f) //9600波特率 { //接收命令為0x7f時就++ Uart1_ser_n++; if(Uart1_ser_n > 10)//大于10基本就是確定是下載命令 { Uart1_ser_n = 0; //然后執(zhí)行軟復(fù)位 IAP_CONTR |= 0xe0; } } } if (TI) { TI = 0;//先把發(fā)送標志給清零 //數(shù)據(jù)全部發(fā)送完成后標志位置1 //置1后是準備發(fā)送后一個字節(jié) Uart1_Flag = 1; //調(diào)用串口發(fā)送函數(shù) Uart1_Up_Data_Drive(); }}
我們可以看到接收緩沖區(qū)啥也沒有,那就是因為發(fā)送緩沖區(qū)沒有數(shù)據(jù)發(fā)送,單片機也就沒有數(shù)據(jù)接收,標志沒置1,然后單片機發(fā)送數(shù)據(jù)就沒有一個觸發(fā)的引子
我們發(fā)送任意數(shù)據(jù)都可以,只要單片機接收到數(shù)據(jù)就行,然后串口標志就會置1,使得串口發(fā)送函數(shù)有用,我們就可以看到電壓顯示出來,但是細心的同學(xué)會發(fā)現(xiàn),我的發(fā)送漢字緩沖區(qū)明明是換行回車,你這也沒看到啊,那是SPI軟件有點小毛病,我們換個軟件
所以知道為什么我在發(fā)送漢字緩沖區(qū)中寫換行回車了嗎
#include "all.h"//需要顯示串口的臨時變量bit Uart1_Flag = 1;//漢字是固定的 直接code//串口發(fā)送漢字數(shù)組緩存 先換行/n回車/ru8 code Uart1_Up_Symbol_Buffer[30] = {"/n/r電壓: "};//串口發(fā)送數(shù)字數(shù)組緩存 20個足夠以后用的了u8 xdata Uart1_Up_Num_Buffer[20];//串口1初始化void Uart1_Init(){ SM0 = 0; SM1 = 1; REN = 1; //上面三條語句就等于操作SCON |= 0x50; PCON &= 0x3f; AUXR |= 0x01; AUXR |= 0x14; T2H = 0xfd; T2L = 0x8f; ES = 1;}//串口發(fā)送底層驅(qū)動的函數(shù)void Uart1_Up_Data_Drive(){ static xdata u8 count = 0; //串口1標志為1才能發(fā)送字節(jié), //可以讓數(shù)據(jù)有效的發(fā)送 if(Uart1_Flag) { Uart1_Flag = 0; count++; switch (count) { case 1: SBUF = Uart1_Up_Symbol_Buffer[0];break; case 2: SBUF = Uart1_Up_Symbol_Buffer[1];break; case 3: SBUF = Uart1_Up_Symbol_Buffer[2];break; case 4: SBUF = Uart1_Up_Symbol_Buffer[3];break; case 5: SBUF = Uart1_Up_Symbol_Buffer[4];break; case 6: SBUF = Uart1_Up_Symbol_Buffer[5];break; case 7: SBUF = Uart1_Up_Symbol_Buffer[6];break; case 8: SBUF = Uart1_Up_Symbol_Buffer[7];break; case 9: SBUF = Uart1_Up_Symbol_Buffer[8];break; case 10:SBUF = Uart1_Up_Symbol_Buffer[9];break; case 12:SBUF = Uart1_Up_Num_Buffer[0];break; case 14:SBUF = Uart1_Up_Num_Buffer[1];break; case 16:SBUF = Uart1_Up_Num_Buffer[2];break; case 18:SBUF = Uart1_Up_Num_Buffer[3];break; case 20:SBUF = Uart1_Up_Num_Buffer[4];break; case 22:SBUF = Uart1_Up_Num_Buffer[5];break; case 24:count=0;break; } }}//串口1中斷void Uart1_Routine() interrupt 4{ //記錄接收命令流變量 static char Uart1_ser_n = 0; if (RI) { RI = 0;//先把接收標志給清零 //當(dāng)接收到一個字節(jié)時,串口標志置1 Uart1_Flag = 1; if (SBUF == 0x7f) //9600波特率 { //接收命令為0x7f時就++ Uart1_ser_n++; if(Uart1_ser_n > 10)//大于10基本就是確定是下載命令 { Uart1_ser_n = 0; //然后執(zhí)行軟復(fù)位 IAP_CONTR |= 0xe0; } } } if (TI) { TI = 0;//先把發(fā)送標志給清零 //數(shù)據(jù)全部發(fā)送完成后標志位置1 //置1后是準備發(fā)送后一個字節(jié) Uart1_Flag = 1; //調(diào)用串口發(fā)送函數(shù) Uart1_Up_Data_Drive(); }}
#ifndef Uart1_Drive#define Uart1_Drive//外部聲明extern void Uart1_Init();extern bit Uart1_Flag;extern void Uart1_Up_Data_Drive();extern u8 xdata Uart1_Up_Num_Buffer[20];#endif
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/123696.html
摘要:復(fù)位后初值是子函數(shù)調(diào)用,中斷響應(yīng)過程調(diào)用子函數(shù)處理中斷響應(yīng)的時候,程序計數(shù)器的值以及相關(guān)數(shù)據(jù)會先壓入堆棧,然后去處理子函數(shù)中斷服務(wù)。聯(lián)動文章身家過億的帝都富豪對小碼農(nóng)說你時空復(fù)雜度會了嗎 ...
摘要:行列總共使用個口,可以掃描個按鍵的開關(guān)狀態(tài),這就是矩陣鍵盤的優(yōu)勢。口之間必須串聯(lián)電阻。 文章目錄 小碼農(nóng)為了總裁,咳咳,為了知識敢說按鍵不會嗎?==**帝都富豪與...
摘要:否則可能會導(dǎo)致電平顛倒完美的計數(shù)糟糕的線條再來一個測試組我們來實現(xiàn)一個呼吸燈的效果呼吸燈波形為了賢淑妻子,咳咳,賢淑才女,小碼農(nóng)必定讓控制時間什么是脈寬調(diào)制中間動的線是電流線,電流通斷,電流小就暗,電流大就亮。 ...
摘要:對于電壓或者電流連續(xù)變化的信號,就需要通過模數(shù)轉(zhuǎn)換電路,變成單片機可以識別的數(shù)字電平信號。目前來說,常見的有兩種方式,一種是并行比較,一種是逐次比較。具有成本低元件簡單等優(yōu)勢,而且容易做出高精度的轉(zhuǎn)換器,所以被廣泛使用。 ...
摘要:前言今天下班突然看到一篇刷屏朋友圈的文章為什么甲骨文被裁員工不值得同情來自一個財經(jīng)的微信公眾號剛看題目我以為文章是會分析甲骨文公司內(nèi)部的財經(jīng)類問題所以就戳開看了畢竟本人不喜歡看打雞血的文章。 為工薪層能合理取得報酬而發(fā)聲,為大眾選擇不同生活狀態(tài)都能獲得尊重而發(fā)聲,為不同職場層次的職場人都能有健康的工作環(huán)境而發(fā)聲。 前言 今天下班突然看到一篇刷屏朋友圈的文章來自一個XX財經(jīng)的微信公眾號,...
閱讀 2685·2021-11-18 10:02
閱讀 1779·2021-09-30 10:00
閱讀 5437·2021-09-22 15:27
閱讀 1280·2019-08-30 15:54
閱讀 3742·2019-08-29 11:13
閱讀 3016·2019-08-29 11:05
閱讀 3389·2019-08-29 11:01
閱讀 631·2019-08-26 13:52