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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機雙機串口通信數碼管顯示程序&仿真普中開發板驗證OK

[復制鏈接]
跳轉到指定樓層
樓主
雙機串口通信數碼管顯示程序&仿真普中開發板驗證OK

通過矩陣鍵盤輸入要發送的數據,數碼管顯示,點擊發送按鍵可發送至另一個板子上顯示
可雙向傳輸顯示
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)



單片機源程序如下:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. #define GPIO_KEY P1

  5. #define GPIO_DIG   P0                           //數據端

  6. sbit LSA=P2^2;
  7. sbit LSB=P2^3;
  8. sbit LSC=P2^4;

  9. unsigned char k;
  10. unsigned char state=0;

  11. unsigned char code DIG_CODE[17]={
  12. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  13. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  14. //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的顯示碼
  15. unsigned char KeyValue;
  16. //用來存放讀取到的鍵值
  17. unsigned char KeyState;        //記錄按鍵的狀態,0沒有,1有
  18. unsigned char DisplayData[8];
  19. //用來存放要顯示的8位數的值
  20. unsigned char receiveData[8];
  21. void Delay10ms();   //延時10ms
  22. void KeyDown();                 //檢測按鍵函數
  23. void DigDisplay(); //動態顯示函數

  24. //向串口發送
  25. void Putc_to_SerialPort(uchar c)
  26. {
  27.         SBUF=c;
  28.         while(TI==0);
  29.         TI=0;
  30. }

  31. //主程序
  32. void main()
  33. {
  34.         uchar i=0,j=0;
  35.         SCON=0X50;                        //設置為工作方式1
  36.         TMOD=0X20;                        //設置計數器工作方式2
  37.         PCON=0X80;                        //波特率加倍
  38.         TH1=0XF4;                                //計數器初始值設置,注意波特率是4800的
  39.         TL1=0XF4;
  40.         ES=1;                                                //打開接收中斷
  41.         EA=1;                                                //打開總中斷
  42.         TR1=1;                                        //打開計數器

  43.         LSA=0; //給一個數碼管提供位選
  44.         LSB=0;
  45.         LSC=0;

  46.         while(1)
  47.         {
  48.                 while(state==0)
  49.                 {
  50.                 /*
  51.                 KeyDown();
  52.                 if((KeyState==1)&&(KeyValue<10))
  53.                 {
  54.                         KeyState=0;
  55.                         Putc_to_SerialPort(KeyValue);
  56.                 }
  57.                 */

  58.                 KeyDown();
  59.                  if(KeyState==1)
  60.                 {
  61.                         if((i<8)&&(KeyValue<10))
  62.                         {
  63.                         i++;
  64.                         DisplayData[7]=DisplayData[6];
  65.                         DisplayData[6]=DisplayData[5];
  66.                         DisplayData[5]=DisplayData[4];
  67.                         DisplayData[4]=DisplayData[3];
  68.                         DisplayData[3]=DisplayData[2];
  69.                         DisplayData[2]=DisplayData[1];
  70.                         DisplayData[1]=DisplayData[0];
  71.                         DisplayData[0]=DIG_CODE[KeyValue];
  72.                         }
  73.                         if(KeyValue==15)
  74.                         {
  75.                         i=0;
  76.                         for(j=0;j<8;j++)
  77.                         {
  78.                                 Putc_to_SerialPort(DisplayData[j]);
  79.                         }
  80.                         DisplayData[7]=0x00;
  81.                         DisplayData[6]=0x00;
  82.                         DisplayData[5]=0x00;
  83.                         DisplayData[4]=0x00;
  84.                         DisplayData[3]=0x00;
  85.                         DisplayData[2]=0x00;
  86.                         DisplayData[1]=0x00;
  87.                         DisplayData[0]=0x00;
  88.                         }
  89.                         KeyState=0;
  90.                 }
  91.                 DigDisplay();
  92.                 }







  93.                 while(state==1)
  94.                 {
  95.                 for(j=0;j<8;j++)
  96.                 {
  97.                         DisplayData[j]=receiveData[j];
  98.                 }
  99.                 DigDisplay();
  100.                 KeyDown();
  101.                  if(KeyState==1)
  102.                 {
  103.                         DisplayData[7]=0x00;
  104.                         DisplayData[6]=0x00;
  105.                         DisplayData[5]=0x00;
  106.                         DisplayData[4]=0x00;
  107.                         DisplayData[3]=0x00;
  108.                         DisplayData[2]=0x00;
  109.                         DisplayData[1]=0x00;
  110.                         DisplayData[0]=0x00;
  111.                         state=0;
  112.                 }
  113.                 }
  114.         }
  115. }

  116. /*******************************************************************************
  117. * 函 數 名         : DigDisplay
  118. * 函數功能                   : 使用數碼管顯示
  119. * 輸    入         : 無
  120. * 輸    出         : 無
  121. *******************************************************************************/
  122. void DigDisplay()
  123. {
  124.         unsigned char i;
  125.         unsigned int j;
  126.         for(i=0;i<8;i++)
  127.         {
  128.                 switch(i)         //位選,選擇點亮的數碼管,
  129.                 {
  130.                         case(0):
  131.                                 LSA=0;LSB=0;LSC=0; break;//顯示第0位
  132.                         case(1):
  133.                                 LSA=1;LSB=0;LSC=0; break;//顯示第1位
  134.                         case(2):
  135.                                 LSA=0;LSB=1;LSC=0; break;//顯示第2位
  136.                         case(3):
  137.                                 LSA=1;LSB=1;LSC=0; break;//顯示第3位
  138.                         case(4):
  139.                                 LSA=0;LSB=0;LSC=1; break;//顯示第4位
  140.                         case(5):
  141.                                 LSA=1;LSB=0;LSC=1; break;//顯示第5位
  142.                         case(6):
  143.                                 LSA=0;LSB=1;LSC=1; break;//顯示第6位
  144.                         case(7):
  145.                                 LSA=1;LSB=1;LSC=1; break;//顯示第7位       
  146.                 }
  147.                 GPIO_DIG=DisplayData[i];//發送段碼
  148.                 j=10;                                                 //掃描間隔時間設定
  149.                 while(j--);       
  150.                 GPIO_DIG=0x00;//消隱
  151.         }
  152. }

  153. void Delay10ms(void)   //誤差 0us
  154. {
  155.     unsigned char a,b,c;
  156.     for(c=1;c>0;c--)
  157.         for(b=38;b>0;b--)
  158.             for(a=130;a>0;a--);
  159. }
  160. void KeyDown(void)
  161. {
  162.         char a=0;
  163.         GPIO_KEY=0x0f;
  164.         if(GPIO_KEY!=0x0f)//讀取按鍵是否按下
  165.         {
  166.                 Delay10ms();//延時10ms進行消抖
  167.                 if(GPIO_KEY!=0x0f)//再次檢測鍵盤是否按下
  168.                 {
  169.                        
  170.                         KeyState=1;
  171.                         //測試列
  172.                         GPIO_KEY=0X0F;
  173.                         switch(GPIO_KEY)
  174.                         {
  175.                                 case(0X07):        KeyValue=0;break;
  176.                                 case(0X0b):        KeyValue=1;break;
  177.                                 case(0X0d): KeyValue=2;break;
  178.                                 case(0X0e):        KeyValue=3;break;
  179.                         }
  180.                         //測試行
  181.                         GPIO_KEY=0XF0;
  182.                         switch(GPIO_KEY)
  183.                         {
  184.                                 case(0X70):        KeyValue=KeyValue;break;
  185.                                 case(0Xb0):        KeyValue=KeyValue+4;break;
  186.                                 case(0Xd0): KeyValue=KeyValue+8;break;
  187.                                 case(0Xe0):        KeyValue=KeyValue+12;break;
  188.                         }
  189.                         while((a<50)&&(GPIO_KEY!=0xf0))         //檢測按鍵松手檢測
  190.                         {
  191. ……………………

  192. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼


所有資料51hei提供下載:
雙機串口通信數碼管顯示程序&amp;仿真普中開發板驗證OK.zip (186.92 KB, 下載次數: 192)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:341926 發表于 2018-6-21 09:46 | 只看該作者
附件下載了怎么打開不了
回復

使用道具 舉報

板凳
ID:433677 發表于 2018-11-27 18:09 | 只看該作者
以解壓縮的方式打開即可
回復

使用道具 舉報

地板
ID:474896 發表于 2019-2-17 20:04 | 只看該作者
什么文件格式?下載了都打不開
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区影院 | 91看片视频 | 成人精品一区二区 | 久久黄色精品视频 | 一区二区在线免费观看视频 | 韩日一区二区三区 | 日本一区二区高清不卡 | 日批免费观看 | 久久精片 | 亚洲精品www久久久久久广东 | 久热久热| 污污的网站在线观看 | 免费视频一区 | 一a级片 | 亚洲精品一 | 中文字幕日韩欧美一区二区三区 | 日韩欧美在线视频观看 | 国产精品99久久久久 | 欧美久久一区二区三区 | 青青久久| 一区二区日韩 | 中文字幕一区二区三区四区 | 亚洲一区精品在线 | av在线免费观看网址 | 激情欧美日韩一区二区 | 欧美日韩精品一区二区天天拍 | av中文网| 日韩在线视频免费观看 | 亚洲在线免费观看 | 欧美片网站免费 | 一级全黄少妇性色生活免费看 | 欧美国产日韩在线 | 99日韩 | 一区二区三区成人 | 亚洲成人999| 国产精品亚洲一区 | 日韩在线视频观看 | www日韩 | 欧美日韩在线视频一区 | 日韩欧美在线视频 | 亚洲 中文 欧美 日韩 在线观看 |