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