找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7074|回复: 3
收起左侧

单片机双机串口通信数码管显示程序&仿真普中开发板验证OK

[复制链接]
ID:163705 发表于 2018-2-28 11:05 | 显示全部楼层 |阅读模式
双机串口通信数码管显示程序&仿真普中开发板验证OK

通过矩阵键盘输入要发送的数据,数码管显示,点击发送按键可发送至另一个板子上显示
可双向传输显示
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
图片1.png 图片2.png 图片3.png 图片4.png


单片机源程序如下:
  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黑下载附件…………
复制代码
0.png

所有资料51hei提供下载:
双机串口通信数码管显示程序&amp;仿真普中开发板验证OK.zip (186.92 KB, 下载次数: 192)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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 单片机教程网

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