找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2583|回复: 2
打印 上一主题 下一主题
收起左侧

51单片机串行通讯源程序 矩阵键盘 数码管动态显示 基于慧净HL-1型号

[复制链接]
跳转到指定楼层
楼主
说明:该程序可以实现将甲机按下的键值发送到乙机,并且在两个单片机开发板上同时显示出来。


1.发送函数
  1. #include "reg52.h"
  2. #include "intrins.h"
  3. #include "absacc.h"
  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. uchar code shuma[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  7.                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};
  8. uchar code keyzhi[4][4]={ 0,  1,   2,   3,                              //键值二维数组
  9.                       4,  5,   6,   7,
  10.                       8,  9,  10,  11,
  11.                      12, 13,  14,  15  };
  12. uchar idata dis_buf[6]={  16,  16,  16, 16,  16,  16  };                 //数据缓冲区
  13. uchar keyval;
  14. uchar sum;

  15. sbit duan=P2^6;
  16. sbit wei=P2^7;
  17. void Delay1ms(void)              //延时1ms函数
  18. {
  19.    unsigned char a;
  20.    for(a=0;a<125;a++);
  21. }

  22. void display()
  23. {
  24.   uchark,bitcode,segcode;
  25. bitcode=0xfe;                    //起始位码
  26. for(k=0;k<6;k++)
  27. {
  28. segcode=dis_buf[k];             //取数据
  29. P0=shuma[segcode];               //查表送段码
  30. duan=1;
  31. duan=0;
  32. P0=bitcode;                     //送位码
  33. wei=1;                       
  34. Delay1ms();
  35. P0=0xff;                        //消影
  36. wei=0;
  37. bitcode=bitcode<<1;            //更新位码
  38. bitcode=bitcode|0x01;
  39. }
  40. }
  41. void weiyi()
  42. {
  43. dis_buf[0]=dis_buf[1];
  44. dis_buf[1]=dis_buf[2];
  45. dis_buf[2]=dis_buf[3];
  46. dis_buf[3]=dis_buf[4];
  47.   dis_buf[4]=dis_buf[5];
  48. dis_buf[5]=keyval ;
  49. }
  50. void keyscan()                         //键扫描函数
  51. {
  52. uchar hang,lie;
  53. uint l=0;
  54. P3=0x0f;
  55. if(P3!=0x0f)
  56. {   
  57.    display();
  58.    display();
  59.    display();
  60.    display();
  61.    P3=0x0f;
  62.    if(P3!=0x0f)
  63.     {
  64.       switch(P3)
  65.      {
  66.        case 0x07:hang=3;break;
  67.        case 0x0b:hang=2;break;
  68.        case 0x0d:hang=1;break;
  69.        case 0x0e:hang=0;break;
  70.      }
  71.      P3=0xf3;
  72.      display();
  73.      switch(P3)
  74.      {
  75.        case 0x73:lie=3;break;
  76.        case 0xb3:lie=2;break;
  77.        case 0xd3:lie=1;break;
  78.        case 0xe3:lie=0;break;
  79.      }
  80.      while((l<300)&&(P3!=0xf3))         //检测按键松手检测
  81.               {
  82.                      display();
  83.            l++;           
  84.               }
  85.        keyval=keyzhi[hang][lie];     //获取键值
  86.        weiyi(); P1=dis_buf[5];
  87.     }

  88.   }
  89. }

  90. void init()                          //串口初始化
  91. {
  92.    TMOD=0x20;
  93.    TH1=0xfa;
  94.    TL1=0xfa;
  95.     PCON=0x00;
  96.    SCON=0x50;
  97.    REN=1;
  98.    TR1=1;
  99. }

  100. void send()                                //发送函数
  101. {
  102. uchar i;
  103.   do{
  104.     display();
  105.     display();
  106.     display();
  107.     display();
  108.     display();
  109.     SBUF=0xaa;         P1=0x00;
  110.     while(TI==0)display();   P1=0x0f;
  111.     TI=0;
  112.     while(RI==0)display(); P1=0xf0;
  113.     RI=0;}while(SBUF!=0xbb);
  114.     do{
  115.         sum=0;
  116.         for(i=0;i<6;i++)
  117.         {
  118.           display();
  119.           display();
  120.           SBUF=dis_buf[ i];
  121. [ i]          sum+=dis_buf[ i];
  122.            while(TI==0)display();
  123.           TI=0;           
  124.         }
  125.         display();
  126.         display();
  127.         SBUF=sum;
  128.         while(TI==0)display();TI=0;
  129.         while(RI==0)display();RI=0;  
  130.       }while(SBUF!=0x00);
  131. }
  132. void main()                                                   //主函数
  133. {   
  134.    init();
  135.    while(1)
  136.     {
  137.      display();
  138.      keyscan();
  139.      send();
  140.     }
  141. }
  142. 2.接收程序
  143. #include "reg52.h"
  144. #include "intrins.h"
  145. #include "absacc.h"
  146. #define uchar unsigned char
  147. #define uint unsigned int
  148. uchar code shuma[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  149.                       0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40 };
  150. uchar code keyzhi[4][4]={ 0,  1, 2,  3,                                //键值二维数组
  151.                           4, 5,  6,  7,
  152.                           8,  9, 10, 11,
  153.                          12, 13, 14, 15 };
  154. uchar idata dis_buf[6]={  16, 16, 16, 16, 16, 16 };                     //数据缓冲区
  155. uchar sum;
  156. sbit duan=P2^6;
  157. sbit wei=P2^7;
  158. void Delay1ms(void)              //延时1ms函数
  159. {
  160.    unsigned char a;
  161.    for(a=0;a<125;a++);
  162. }
  163. void display()
  164. {
  165. uchar k,bitcode,segcode;
  166. bitcode=0xfe;                    //起始位码
  167. for(k=0;k<6;k++)
  168. {
  169. segcode=dis_buf[k];             //取数据
  170. P0=shuma[segcode];               //查表送段码
  171. duan=1;
  172. duan=0;
  173. P0=bitcode;                     //送位码
  174. wei=1;                       
  175. Delay1ms();
  176. P0=0xff;                        //消影
  177. wei=0;
  178. bitcode=bitcode<<1;            //更新位码
  179. bitcode=bitcode|0x01;
  180. }
  181. }
  182. void init()                               //串口初始化
  183. {
  184.     TMOD=0x20;
  185.     TH1=0xfa;
  186.     TL1=0xfa;
  187.     PCON=0x00;
  188.     SCON=0x50;
  189.     REN=1;
  190.     TR1=1;
  191. }   
  192. void receive()                               //接收函数
  193. {
  194. uchar i;
  195. RI=0;P1=0xf0;
  196. while(RI==0)display(); RI=0;P1=0x00;
  197. while(SBUF!=0xaa)
  198.   {
  199.    SBUF=0xff;
  200.    while(TI==0)display();
  201.    TI=0;
  202.    display();
  203.    display();
  204.   }
  205. SBUF=0xbb;
  206.    while(TI==0)display();
  207.    TI=0;
  208.    sum=0;
  209.    for(i=0;i<6;i++)
  210.     {
  211.      display();
  212.      while(RI==0)display();RI=0;
  213.      dis_buf[ i]=SBUF;
  214.      sum+=dis_buf[ i];
  215.      P1=dis_buf[5];
  216.     }
  217.    while(RI==0)display();RI=0;
  218.    if(SBUF==sum)
  219.     {
  220.      SBUF=0x00;
  221.     }
  222.    else
  223.     {
  224.      SBUF=0xff;
  225.     }
  226.    while(TI==0)display();
  227.    TI=0;
  228. }
  229. void main()                                                   //主函数
  230. {  
  231.    init();
  232.    while(1)
  233.     {
  234.      display();      
  235.      receive();
  236.     }
  237. }
复制代码


HL-1 开发板电路图 (1).pdf

154.69 KB, 下载次数: 11, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:459769 发表于 2019-1-2 09:56 | 只看该作者
System.out.println("牛逼!");
回复

使用道具 举报

板凳
ID:376391 发表于 2019-1-2 10:37 来自手机 | 只看该作者
感谢楼主分享,学习学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表