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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1239|回復: 0
打印 上一主題 下一主題
收起左側

一種基于51單片機的雙機有線通信裝置設計 程序電路原理圖

[復制鏈接]
跳轉到指定樓層
樓主
設計基于STC15F2K60S2單片機的串行通信,通過四行三列矩陣鍵盤作為輸入設備,實時掃描按鍵按下情況,經鍵盤掃描程序進行處理,輸出相應的鍵值并送入串行口1數據發送緩沖器,等待一幀數據發送完成。運用串行口1中斷,讀取串口1接收數據緩沖器內的數據,經過接收數據處理程序的處理,將不同數據接收的次數轉換為BCD碼,并和本次接收的數據一同送數碼管顯示,達到雙機通信并顯示的目的。系統硬件包括單片機串行通信模塊、矩陣式按鍵模塊、數碼管顯示模塊等三部分。

制作出來的實物圖如下:


電路原理圖如下:


單片機源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define led_data P0
  6. #define led_bit P1
  7. #define KEY P2
  8. uchar k = 10;
  9. uchar m = 10;
  10. uchar n = 10;
  11. uchar r_data = 10;
  12. uchar code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};        //共陰極字形碼{0,1,2,3,4,5,6,7,8,9,不顯示}
  13. uchar code key_code[] = {0x57,0x6e,0x5e,0x3e,0x6d,0x5d,0x3d,0x6b,0x5b,0x3b};        //鍵碼{[4,2];[1,1];[1,2],[1,3];[2,1];[2,2];[2,3];[3,1];[3,2];[3,3]}
  14. uchar code scan_con[4] = {0x0E,0x0D,0x0B,0x07};                                                                        //位掃描字{1,2,3,4}
  15. /*-----------------------------------------------1ms延時子函數-----------------------------------------------------*/
  16. void delay1ms(int t)
  17. {
  18.         int i,j;
  19.         for (i = 0;i < t;i++)
  20.         for (j = 0;j < 120;j++);
  21. }
  22. /*---------------------------------------------鍵盤掃描發送子函數--------------------------------------------------*/
  23. uchar keyscan()
  24. {
  25.         uchar X,Y,Z;
  26.         uchar k;
  27.         KEY = 0x7f;                                             
  28.         KEY = 0x0f;                                                        //列掃描輸出全 “0”
  29.         if(KEY != 0x0f)                                                //判斷是否有鍵按下
  30.         {                                                                  
  31.                 delay1ms(130);                                        //軟件延時去干擾
  32.                 if(KEY != 0x0f)                                        //確認按鍵按下
  33.                 {
  34.                         X = KEY;                                        //保存列掃描時有鍵按下的狀態(列掃描鍵碼)
  35.                         KEY = 0x70;                                        //行掃描輸出全 “0”
  36.                         Y = KEY;                                        //保存行掃描時有鍵按下的狀態(行掃描鍵碼)
  37.                         Z = X | Y;                                        //鍵碼=列掃描鍵碼+行掃描鍵碼(按位相與)
  38.                         for(k = 0;k <= 9;k++)
  39.                         {
  40.                                 if(Z == key_code[k])        //查表得鍵值
  41.                                 {
  42.                                         SBUF = k;                        //將鍵值送入發送緩沖器
  43.                                         while(TI == 0);                //等待發送過程結束
  44.                                         TI = 0;                                //發送中斷標志位清零
  45.                                 }
  46.                         }
  47.                 }
  48.         }
  49.         else KEY = 0x7f;                                        //恢復掃描線為輸入狀態
  50.         return(10);
  51. }
  52. /*--------------------------------------------串行口1中斷接收函數--------------------------------------------------*/
  53. void Serial_ISR(void) interrupt 4
  54. {
  55.         uint a,b,c,d,e,f,g,h,i,j,num;                //定義0-9各數字接收次數變量和BCD運算變量
  56.         if(RI == 1)                                                //判斷是否為接收中斷
  57.         {
  58.                 r_data = SBUF;                                        //保存接收到的數據
  59.                 RI = 0;                                                        //接收中斷標志位清零
  60.                 switch(r_data)                                        //分析所接收到的數據
  61.                 {
  62.                         case 0x00:++a;num = a;break;
  63.                         case 0x01:++b;num = b;break;
  64.                         case 0x02:++c;num = c;break;
  65.                         case 0x03:++d;num = d;break;
  66.                         case 0x04:++e;num = e;break;
  67.                         case 0x05:++f;num = f;break;
  68.                         case 0x06:++g;num = g;break;
  69.                         case 0x07:++h;num = h;break;
  70.                         case 0x08:++i;num = i;break;
  71.                         case 0x09:++j;num = j;break;
  72.                         default:num = num;
  73.                 }
  74.                 if(num <= 9)                                        //一位十進制數的BCD碼
  75.                 {
  76.                         k = 10;
  77.                         m = 10;
  78.                         n = num;          
  79.                 }               
  80.                 else if(num <= 99)                                //兩位十進制數的BCD碼
  81.                 {
  82.                         k = 10;
  83.                         m = num / 10;
  84.                         n = num % 10;
  85.                 }
  86.                 else                                                        //三位十進制數的BCD碼
  87.                 {
  88.                            k = num / 100;
  89.                         m = (num - k * 100) / 10;
  90.                         n = num % 10;
  91.                 }
  92.         }
  93. }
  94. /*----------------------------------------------數碼管顯示子函數---------------------------------------------------*/
  95. display()
  96. {                         
  97.         led_bit = scan_con[0];                                //送位選碼
  98.         led_data = table[r_data];                        //送段碼
  99.         delay1ms(1);          
  100.         led_bit = scan_con[1];
  101.         led_data = table[k];
  102.         delay1ms(1);          
  103.         led_bit = scan_con[2];
  104.         led_data = table[m];
  105.         delay1ms(1);          
  106.         led_bit = scan_con[3];
  107.         led_data = table[n];
  108.         delay1ms(1);
  109.         return(0);          
  110. }
  111. /*---------------------------------------------------主函數--------------------------------------------------------*/
  112. void main(void)
  113. {
  114.         TMOD = 0x20;                                                //實用定時器T1方式2(8位自動重裝初值)  
  115.         TH1 = 0xf4;                                                        //244
  116.         TL1 = 0xf4;                                                        //波特率為2400
  117.         TR1 = 1;                                                        //啟動定時器T1
  118.         SCON = 0x40;                                                //設定串行口1為方式1
  119.         REN = 1;                                                        //允許串行口1接受數據
  120.         ES = 1;                                                                //開放串行口1中斷
  121.         EA = 1;                                                                //開放總中斷
  122.         while(1)
  123.         {               
  124.                 keyscan();                                                //執行鍵盤掃描程序
  125.                 display();                                                //執行數碼管顯示程序
  126.         }        
  127. }
復制代碼

原理圖和以上程序下載: 原理圖及程序.7z (26.63 KB, 下載次數: 4)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲男人天堂2024 | 一本一道久久a久久精品综合 | 午夜精品久久久久久久久久久久久 | 在线观看免费av片 | 精品福利在线 | 欧美一级在线观看 | 一级黄色毛片a | www.国产一区 | 久久久久国产一区二区 | 精品国产91久久久久久 | 国产精品免费在线 | 欧美激情精品久久久久久 | 成人国产在线视频 | 狠狠爱综合 | 久久精品国产久精国产 | 日韩中文视频 | 精品久久国产视频 | 日韩久久久久 | 久久精品国产一区老色匹 | 在线观看国产视频 | www.99热.com | 91性高湖久久久久久久久_久久99 | 久久精品91久久久久久再现 | 亚洲看片网站 | 牛牛热在线视频 | 国产区在线免费观看 | 中文字幕精品一区二区三区精品 | 日韩欧美第一页 | 欧美精品一区二区免费视频 | 国产人成精品一区二区三 | 91精品中文字幕一区二区三区 | 国产在线区 | a亚洲精品 | 91视频免费在观看 | 国产1区2区3区 | 欧美三级在线 | 日本在线免费看最新的电影 | 欧美国产精品一区二区三区 | 中文字幕一区二区三区四区五区 | 中文字幕免费观看 | 亚洲一级毛片 |