娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2024年12月23日(星期一)

正在發生

2021年12月23日 | 串口收發實驗——鍵盤鍵入數字**.*,PC端循環接收顯示**.*

發布者:Amy啊111111 來源: eefocus關鍵字:串口收發  PC端 手機看文章 掃描二維碼
隨時隨地手機看文章

小編今天筆記一下串口的收發實驗,實驗的靈感來源于對藍牙模塊收發的學習。我們在電路中使用藍牙,其實就是把藍牙看做是一個中轉站,這個中轉站在透傳的模式下,不會對接收到的數據做任何變動,而是直接轉發出去。


那么,我們只要知道單片機串口收發和PC端鍵盤的輸入都是以字符的ASCII碼的形式進行的,PC端收到后顯示則是正常字符的形式

即:

鍵盤鍵入字符(ASCII碼形式)–>單片機收到字符(ASCII碼形式)

敲擊3,實質鍵入0x33–>單片機讀buff收到消息0x33

單片機發送字符(ASCII嗎形式)–>模擬PC收到字符(正常形式顯示)

單片機發送字符3,實質寫buff發0x33–>模擬PC收到后顯示3


廢話少說,上仿真電路圖:

代碼:

main.c


#include

#include


#define uint unsigned int

#define uchar unsigned char

#define ulong unsigned long


sbit LSA=P2^2;

sbit LSB=P2^3;

sbit LSC=P2^4; //38譯碼器的片選


bit lanya = 0 ;  //藍牙發送標志,單片機發送給PC

uchar LanYa_DATA_count=0;  //用于后面LnaYa_receive[]數組的各位數賦值,相當于[i]中的i

uchar LanYa_receive[4]; //LanYa串口接收數據緩存

uint Receive_Data;  //最后單片機接收的整合的數據 ,必須是uint,因為uchar不能超過255

uchar Display_Data[3]; //處理要顯示在數碼管的數據緩沖數組

uchar Computer[4];  //要發給PC的數組

uchar T0RH = 0;   //用于后面的TH0賦值

uchar T0RL = 0;   //用于后面的TL0賦值

uchar UART_data;   /*設一個中間變量,獲取讀sbuf的數據,在串口中斷服務函數中用到*/

uchar code smgduan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79};


/********************************************************

函數名稱:void delay(uint i)

函數作用:延時函數

參數說明:

********************************************************/

void delay(uint i){ //延時函數

 while(i--);

}


/********************************************************

函數名稱:ConfigUart(uint baud)

函數作用:串口初始化函數

參數說明: baud:要設置的波特率

********************************************************/

void ConfigUart(uint baud){

 SCON  = 0x50;  //配置串口:工作方式1,既可以接,也可以收

    TMOD |= 0x20;  //配置定時器T1為工作方式2:自動重裝 ;使用T1的目的就是作為波特率發生去的一部分

    TH1 = 256 - (11059200/12/32)/baud;  //利用公式,加上參數,計算T1重載值

    TL1 = TH1;     //初值等于重載值

    ET1 = 0;       //禁止定時器T1中斷(因為它作為波特發生器一部分)

    TR1 = 1;       //啟動T1,即使能T1

 EA=1;     //開總中斷

 ES=1;     //開串行口中斷

}


/********************************************************

函數名稱:send_char_com(uchar ch)

函數作用:利用串口發送一個字符 ,串口接/收的其實就是8位的ASCII,即一個字符

參數說明: uchar ch:要發送的字符

********************************************************/

void send_char_com(uchar ch) { 

 SBUF=ch;  //發sbuf,發送字符ch 

 while(TI==0);      //TI被硬件置1表示發送成功,跳出死循環

 TI=0;       //軟件將TI置零,接著準備下次發送


/********************************************************

函數名稱:send_string_com(unsigned char *str,unsigned int strlen)

函數作用:利用串口發送字符串

參數說明: unsigned char *str:指針指向字符串的首地址,unsigned int strlen:想發送的長度(這個字符串的字符個數)

********************************************************/

void send_string_com(uchar *str,uint strlen){ 

 uint k=0;    

 do 

 {  

  send_char_com(*(str + k)); /*這里應該是用來指針的首地址+偏移量*/ 

  k++;     

 }

 while(k < strlen);

}


/********************************************************

函數名稱:void ConfigTimer0(unsigned int ms)

函數作用:定時器0初始化函數,ms級定時溢出中斷

參數說明: unsigned int ms:設置定時溢出的ms數

********************************************************/

void ConfigTimer0(uint ms){ 

 ulong tmp;

 tmp = 11059200/12;

 tmp = (tmp * ms)/1000;

 tmp = 65536 - tmp;

 tmp = tmp + 18;

 EA = 1;

 T0RH = (uchar)(tmp >> 8);

 T0RL = (uchar)tmp;  //上面的這些行直接用就行

 TMOD &= 0xF0;

 TMOD |= 0x01;    //設置TMOD的定時器0,方式1,需要重裝初值的

 TH0 = T0RH;

 TL0 = T0RL;

 ET0 = 1;      //開定時器0的中斷允許

 TR0 = 1;      //開定時器0的使能

}


/********************************************************

函數名稱:void dispiay()

函數作用:數據處理并顯示

參數說明: 無

********************************************************/

void dispiay(){  

 uchar i;

 Display_Data[0]=smgduan[Receive_Data/100];

 Display_Data[1]=smgduan[Receive_Data%100/10] | 0x80; //0x80是加個小數點

 Display_Data[2]=smgduan[Receive_Data%10]; 

 for(i=0;i<3;i++){ //先分別選中位,循環和switch實現

  switch(i){

   case 0: LSA=0;LSB=0;LSC=0;break;

   case 1: LSA=1;LSB=0;LSC=0;break;

   case 2: LSA=0;LSB=1;LSC=0;break; 

  }

 P0=Display_Data[2-i]; //選中位后,傳段選數據 

 delay(100);  //延時1ms

 P0=0x00; //消隱 

 }

}


/********************************************************

函數名稱:void main()

函數作用:數據處理并顯示

參數說明: 無

********************************************************/

void main(){  //主程序

 uchar i;

 ConfigUart(9600);  //波特率設置為9600

 ConfigTimer0(5); //定時器T0 5ms

 while(1){

  for(i=0;i<4;i++){

   Computer[i]= LanYa_receive[i];

  }

  dispiay();   //顯示在數碼管 

  if(lanya==1&&(UART_data=='r')){//藍牙標志位置1,表單片機發送,并且讀buff收到回車字符(表示PC端發送結束)

   send_string_com(Computer,4);  //將從PC端接收到的數據發送給PC端

   send_char_com('r');     //發送r,表換行

   lanya = 0; //藍牙標志清零,單片機發送結束

  } 

 }

}


/********************************************************

函數名稱:void InterruptTimer0() interrupt 1

函數作用:定時器0中斷服務程序

參數說明: 無

********************************************************/

void InterruptTimer0() interrupt 1{

 static uchar tmr1s = 0;

 TH0 = T0RH;  //重新加載重載值

 TL0 = T0RL;

 tmr1s++;

 if(tmr1s >= 200)  //這個tmr1s變量起緩沖的

 {

  tmr1s = 0;

  lanya = 1;  //將”lanya“標志位置1,準備在main中單片機發送數據

 }

}


/********************************************************

函數名稱:void uart(void) interrupt 4

函數作用:串口中斷服務程序

參數說明: 無

********************************************************/

void uart(void) interrupt 4 {   

 uchar  a,b,c;

 if(RI)

 {

  UART_data=SBUF;

  if(UART_data=='r'){ //如果檢測到回車按鍵則得到Receive_Data,將其(PC發送給單片機的數)通過display函數顯示在數碼管上

       a = LanYa_receive[0]-0x30;   /*這些數都減0x30的原因是:微機原理中,數字0-9,對應ASCII嗎為30H-39H

                 字母A-Z 對應ASCII碼就是41H-5AH,字母a-z ASCII碼就是61H-7AH

              這樣減30H就可以得到顯示正確的數字*/

        b = LanYa_receive[1]-0x30;

c = LanYa_receive[3]-0x30;

      Receive_Data = a*100+b*10+c; 

     LanYa_DATA_count=0;

  }

  else{ //否則將PC傳來的字符串一個字符一個字符的存放至LanYa_receive[]數組中

   LanYa_receive[LanYa_DATA_count]=UART_data;

   LanYa_DATA_count++;

  }

 }

 RI=0;

}


仿真結果

鍵盤鍵入**.則

數碼管顯示*.*

PC端顯示**.*并換行循環顯示直至鍵入新的數

關鍵字:串口收發  PC端 引用地址:串口收發實驗——鍵盤鍵入數字**.*,PC端循環接收顯示**.*

上一篇:51單片機實驗1——串行通信(TX/RX)
下一篇:小白學習HC-05藍牙透傳模塊

推薦閱讀

現有數據表明,木衛二的表面下是一層覆蓋著光滑冰層的海洋,這使得木衛二成為太陽系中最有可能存在生命的地方之一。A的一個科學家團隊提出了一種核動力“隧道機器人”,該機器人可以幫助探尋木衛二冰層下是否有生命的存在。 “隧道機器人”方案來自于Compass團隊完成的一項概念研究,該研究基于利用穿透木衛二冰層的技術能力,并將獲得的數據傳回地球...
如今,嵌入式視覺系統設計師需要迎合眾多市場趨勢。例如,現在的設計使用的傳感器越來越多,便于收集更多數據或實現新的功能。比如在汽車市場,幾十年前,汽車廠商在車輛上安裝一個備份攝像頭就算是創新之舉了,而現在他們已經開始將攝像頭用于道路偏離監控、速度標志牌識別和其他眾多智能駕駛應用。 同時,嵌入式視覺系統設計師正逐漸采用符合移動產業處...
和利資本成立于2006年,創始團隊脫胎于曾是亞太最大半導體投資的區域型基金,深耕半導體股權投資二十余年來,已投資近數十億美元在半導體領域近180個項目,半數已成功上市或售出。除了投資臺積電、聯電、聯發科、聯詠、京元電、和艦、CSMC(華潤上華)、AOS、展訊、原相等數十家著名的半導體上中下游公司外,亦在相關的科技產業方面創造了杰出的投資業績。...
立訊精密工業公司正在昆山建設一個大規模的生產基地,因為它的目標是在蘋果公司的支持下,打破中國臺灣的競爭對手富士康以及和碩對iPhone組裝市場的高占有率。憑借其在中國東部建設的設施,立訊精密的目標是最早在明年組裝數百萬部iPhone。(圖源:日經亞洲)據日經亞洲評論12月22日報道,中國在蘋果供應鏈中最重要的參與者立訊精密,正在昆山建設一個28.5...

史海拾趣

問答坊 | AI 解惑

點陣lcd的驅動原理

點陣lcd的驅動原理…

查看全部問答∨

最新集成電路應用手冊

集成電路應用手冊,分享給大家?!?

查看全部問答∨

想在DSP寫一個完整的BOOTLODAD,給點建議吧!

    前在C6713上,寫過一個簡單的bootloader代碼,但是現在看來,實用價值太低,而且還有錯誤,主要體現在對不同的段的處理上,沒有很好的處理const段落。     現在,想重新寫一個BootLoader的程序,不知道各位能否給點建議! ...…

查看全部問答∨

BitBlt 效率問題

BitBlt 在橫向模式 和 縱向模式下, 效率差別很大, 就這一個API 執行下來的時間就差很多,這是為什么?…

查看全部問答∨

職場人員如何面對“潛規則”

1. 切勿輕信他人   職場是一個利益交換的場所,品德好的人往往樹敵眾多,而壞人卻順風順水。你可以不學壞人那樣去害人,但至少要有保護自己的能力。別人要來害你,最簡單 的方式是利用你的善良,其次是因為你輕信于人。而在職場中,信任往往應該 ...…

查看全部問答∨

UART 中斷完整接收一條報文

用UART接收報文,一般的單片機都是采用超時(自己在寫的定時器的函數)來判斷一條報文是否結束。 在看STM32的時候,發現USART帶有一個空閑總線的中斷標志,于是想通過這個來判斷,一條報文是否結束。 但,從調試的結果來看,讓人很無語。 通過在 ...…

查看全部問答∨

做開關電源的請進

本帖最后由 paulhyde 于 2014-9-15 03:56 編輯 做出來這個題的,曬曬自己的經驗心得吧!你們的方案是怎么樣的,怎么解決分流的?   沒做出來的壇友們期待高手們的回答。   沒做出來的也說說自己失誤在那?是不夠努力,還是這個題確 ...…

查看全部問答∨

M4 Hanker開發板:uc/GUI的移植(加觸摸功能+心得體會)

發現Triton.zhang老大提供的uc/GUI例程沒有觸摸功能,所以將觸摸功能加入,同時跑了幾個uc/GUI的小例子,因為下周有好多考試,所以沒有進行深入的擴展,不足之處還請見諒!順便請假一周!不然要掛啦!要說uc /GUI的c文件,那叫一個多呀!為了方便編 ...…

查看全部問答∨

avr studio 6.0 下 mega 64 串口中斷問題

我是AVR 新手,在avr studio 6.0 下學習 mega64 的串口0 ,波特率已經配置成9600,發送函數調試成功,現在調不通中斷方式下的接收程序,程序片段如下,望知道的好友指導指導,謝謝 中斷使能 void Usart0InterruptConfig() {    &nb ...…

查看全部問答∨

Keil MDK-ARM Version 5.00下載

迅雷下載 百度網盤地址: http://pan.baidu.com/s/1Fueni…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 光山县| 逊克县| 芒康县| 阿尔山市| 天长市| 中超| 博白县| 吉木萨尔县| 武山县| 古蔺县| 青龙| 荥阳市| 太仆寺旗| 砀山县| 嘉兴市| 云梦县| 汶川县| 谢通门县| 姜堰市| 渭源县| 新安县| 昌都县| 镇宁| 永丰县| 颍上县| 饶河县| 泸定县| 克什克腾旗| 宁安市| 奎屯市| 疏勒县| 邛崃市| 嘉禾县| 新营市| 措勤县| 雷山县| 常宁市| 邹平县| 明水县| 志丹县| 广州市|