久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2324|回復: 0
收起左側

單片機串口收發實驗—鍵盤鍵入數字**.*,PC端循環接收顯示**.*

[復制鏈接]
ID:885189 發表于 2021-2-20 18:33 | 顯示全部樓層 |閱讀模式

小編今天筆記一下串口的收發實驗,實驗的靈感來源于對藍牙模塊收發的學習。我們在電路中使用藍牙,其實就是把藍牙看做是一個中轉站,這個中轉站在透傳的模式下,不會對接收到的數據做任何變動,而是直接轉發出去。
那么,我們只要知道單片機串口收發和PC端鍵盤的輸入都是以字符的ASCII碼的形式進行的,PC端收到后顯示則是正常字符的形式
即:
鍵盤鍵入字符(ASCII碼形式)–>單片機收到字符(ASCII碼形式)
敲擊3,實質鍵入0x33–>單片機讀buff收到消息0x33
單片機發送字符(ASCII嗎形式)–>模擬PC收到字符(正常形式顯示)
單片機發送字符3,實質寫buff發0x33–>模擬PC收到后顯示3

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

1.jpg

代碼:

仿真結果
鍵盤鍵入**.[ i]則
數碼管顯示*.*
PC端顯示**.*并換行循環顯示直至鍵入新的數

2.jpg

小編水平有限,有啥不對的地方,請路過的大佬指出。今天溜了。。。。

/*******個人之前的原創文章非抄襲*************/


  1. main.c
  2. #include <reg52.h>
  3. #include <intrins.h>

  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. #define ulong unsigned long

  7. sbit LSA=P2^2;
  8. sbit LSB=P2^3;
  9. sbit LSC=P2^4; //38譯碼器的片選

  10. bit lanya = 0 ;  //藍牙發送標志,單片機發送給PC
  11. uchar LanYa_DATA_count=0;  //用于后面LnaYa_receive[]數組的各位數賦值,相當于中的i
  12. uchar LanYa_receive[4]; //LanYa串口接收數據緩存
  13. uint Receive_Data;  //最后單片機接收的整合的數據 ,必須是uint,因為uchar不能超過255
  14. uchar Display_Data[3]; //處理要顯示在數碼管的數據緩沖數組
  15. uchar Computer[4];  //要發給PC的數組
  16. uchar T0RH = 0;//用于后面的TH0賦值
  17. uchar T0RL = 0;//用于后面的TL0賦值
  18. uchar UART_data;/*設一個中間變量,獲取讀sbuf的數據,在串口中斷服務函數中用到*/
  19. uchar code smgduan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79};

  20. /********************************************************
  21. 函數名稱:void delay(uint i)
  22. 函數作用:延時函數
  23. 參數說明:
  24. ********************************************************/
  25. void delay(uint i){ //延時函數
  26. while(i--);
  27. }

  28. /********************************************************
  29. 函數名稱:ConfigUart(uint baud)
  30. 函數作用:串口初始化函數
  31. 參數說明: baud:要設置的波特率
  32. ********************************************************/
  33. void ConfigUart(uint baud){
  34. SCON  = 0x50;  //配置串口:工作方式1,既可以接,也可以收
  35. TMOD |= 0x20;  //配置定時器T1為工作方式2:自動重裝 ;使用T1的目的就是作為波特率發生去的一部分
  36. TH1 = 256 - (11059200/12/32)/baud;  //利用公式,加上參數,計算T1重載值
  37. TL1 = TH1;  //初值等于重載值
  38. ET1 = 0; //禁止定時器T1中斷(因為它作為波特發生器一部分)
  39. TR1 = 1; //啟動T1,即使能T1
  40. EA=1;  //開總中斷
  41. ES=1;  //開串行口中斷
  42. }

  43. /********************************************************
  44. 函數名稱:send_char_com(uchar ch)
  45. 函數作用:利用串口發送一個字符 ,串口接/收的其實就是8位的ASCII,即一個字符
  46. 參數說明: uchar ch:要發送的字符
  47. ********************************************************/
  48. void send_char_com(uchar ch) {
  49. SBUF=ch;  //發sbuf,發送字符ch
  50. while(TI==0);//TI被硬件置1表示發送成功,跳出死循環
  51. TI=0; //軟件將TI置零,接著準備下次發送
  52. }

  53. /********************************************************
  54. 函數名稱:send_string_com(unsigned char *str,unsigned int strlen)
  55. 函數作用:利用串口發送字符串
  56. 參數說明: unsigned char *str:指針指向字符串的首地址,unsigned int strlen:想發送的長度(這個字符串的字符個數)
  57. ********************************************************/
  58. void send_string_com(uchar *str,uint strlen){
  59. uint k=0;
  60. do
  61. {  
  62.   send_char_com(*(str + k)); /*這里應該是用來指針的首地址+偏移量*/
  63.   k++;  
  64. }
  65. while(k < strlen);
  66. }

  67. /********************************************************
  68. 函數名稱:void ConfigTimer0(unsigned int ms)
  69. 函數作用:定時器0初始化函數,ms級定時溢出中斷
  70. 參數說明: unsigned int ms:設置定時溢出的ms數
  71. ********************************************************/
  72. void ConfigTimer0(uint ms){
  73. ulong tmp;
  74. tmp = 11059200/12;
  75. tmp = (tmp * ms)/1000;
  76. tmp = 65536 - tmp;
  77. tmp = tmp + 18;
  78. EA = 1;
  79. T0RH = (uchar)(tmp >> 8);
  80. T0RL = (uchar)tmp;  //上面的這些行直接用就行
  81. TMOD &= 0xF0;
  82. TMOD |= 0x01; //設置TMOD的定時器0,方式1,需要重裝初值的
  83. TH0 = T0RH;
  84. TL0 = T0RL;
  85. ET0 = 1;//開定時器0的中斷允許
  86. TR0 = 1;//開定時器0的使能
  87. }

  88. /********************************************************
  89. 函數名稱:void dispiay()
  90. 函數作用:數據處理并顯示
  91. 參數說明: 無
  92. ********************************************************/
  93. void dispiay(){  
  94. uchar i;
  95. Display_Data[0]=smgduan[Receive_Data/100];
  96. Display_Data[1]=smgduan[Receive_Data%100/10] | 0x80; //0x80是加個小數點
  97. Display_Data[2]=smgduan[Receive_Data%10];
  98. for(i=0;i<3;i++){ //先分別選中位,循環和switch實現
  99.   switch(i){
  100. case 0: LSA=0;LSB=0;LSC=0;break;
  101. case 1: LSA=1;LSB=0;LSC=0;break;
  102. case 2: LSA=0;LSB=1;LSC=0;break;
  103.   }
  104. P0=Display_Data[2-i]; //選中位后,傳段選數據
  105. delay(100);  //延時1ms
  106. P0=0x00; //消隱
  107. }
  108. }

  109. /********************************************************
  110. 函數名稱:void main()
  111. 函數作用:數據處理并顯示
  112. 參數說明: 無
  113. ********************************************************/
  114. void main(){  //主程序
  115. uchar i;
  116. ConfigUart(9600);  //波特率設置為9600
  117. ConfigTimer0(5); //定時器T0 5ms
  118. while(1){
  119.   for(i=0;i<4;i++){
  120. Computer= LanYa_receive[  i];
  121.   }
  122.   dispiay();//顯示在數碼管
  123. f(lanya==1&&(UART_data=='\r')){//藍牙標志位置1,表單片機發送,并且讀buff收到回車字符(表示PC端發送結束)
  124. send_string_com(Computer,4);  //將從PC端接收到的數據發送給PC端
  125. send_char_com('\r');  //發送\r,表換行
  126. lanya = 0; //藍牙標志清零,單片機發送結束
  127.   }
  128. }
  129. }

  130. /********************************************************
  131. 函數名稱:void InterruptTimer0() interrupt 1
  132. 函數作用:定時器0中斷服務程序
  133. 參數說明: 無
  134. ********************************************************/
  135. void InterruptTimer0() interrupt 1{
  136. static uchar tmr1s = 0;
  137. TH0 = T0RH;  //重新加載重載值
  138. TL0 = T0RL;
  139. tmr1s++;
  140. if(tmr1s >= 200)  //這個tmr1s變量起緩沖的
  141. {
  142.   tmr1s = 0;
  143.   lanya = 1;  //將”lanya“標志位置1,準備在main中單片機發送數據
  144. }
  145. }

  146. /********************************************************
  147. 函數名稱:void uart(void) interrupt 4
  148. 函數作用:串口中斷服務程序
  149. 參數說明: 無
  150. ********************************************************/
  151. void uart(void) interrupt 4 {
  152. uchar  a,b,c;
  153. if(RI)
  154. {
  155.   UART_data=SBUF;
  156. f(UART_data=='\r'){ //如果檢測到回車按鍵則得到Receive_Data,將其(PC發送給單片機的數)通過display函數顯示在數碼管上
  157. a = LanYa_receive[0]-0x30;/*這些數都減0x30的原因是:微機原理中,數字0-9,對應ASCII嗎為30H-39H
  158.   字母A-Z 對應ASCII碼就是41H-5AH,字母a-z ASCII碼就是61H-7AH
  159.   這樣減30H就可以得到顯示正確的數字*/
  160.   b = LanYa_receive[1]-0x30;
  161.   c = LanYa_receive[3]-0x30;
  162. Receive_Data = a*100+b*10+c;
  163.   LanYa_DATA_count=0;
  164.   }
  165.   else{ //否則將PC傳來的字符串一個字符一個字符的存放至LanYa_receive[]數組中
  166. LanYa_receive[LanYa_DATA_count]=UART_data;
  167. LanYa_DATA_count++;
  168.   }
  169. }
  170. RI=0;
  171. }
  172. /******************************************************/
復制代碼


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久国产精品免费免费狐狸 | 国产精品久久久久久亚洲调教 | 羞羞视频在线网站观看 | 国产精品18久久久久久久 | 91黄在线观看 | 国产成在线观看免费视频 | 99精品欧美一区二区三区综合在线 | 国产美女视频黄a视频免费 国产精品福利视频 | 国产www成人 | 久婷婷| 在线亚洲人成电影网站色www | 精品影院| 久国产视频 | 日韩综合在线 | www.久久久久久久久 | 日日摸夜夜添夜夜添精品视频 | 国产高清视频在线观看播放 | 亚洲精品久久久一区二区三区 | 国产女人与拘做受免费视频 | 国产精品亚洲一区二区三区在线观看 | 91久久精品一区二区三区 | 91网视频| 成人免费高清 | 日本不卡视频 | 精精国产xxxx视频在线播放 | 午夜视频一区 | 亚洲区一区二 | 色爱区综合 | 成人永久免费视频 | 蜜桃视频在线观看免费视频网站www | 天天射天天干 | 精品久久久久久 | 91免费在线看 | av黄色在线 | 蜜桃精品视频在线 | 亚洲欧美男人天堂 | 久久精品亚洲精品 | 一区二区伦理电影 | 亚洲欧美aⅴ | 日日夜夜天天 | 久久精品91久久久久久再现 |