找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2614|回复: 1
收起左侧

单片机通信Proteus仿真实验

[复制链接]
ID:389070 发表于 2019-7-30 13:10 | 显示全部楼层 |阅读模式
本实验是设置八个按键在上位机按下,下位机接收到数据后执行。分别控制八个LED灯,内部有介绍一些关于ASCII可显示字符的使用。在低一个显示字符我改动原来是1=31的一个值。改成/=2F...很好理解的,自己多试试改别的也可以。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png

单片机源程序如下:
  1. /********************************************************************
  2. 函数功能:往串口发送一字节数据(可通过超级终端显示出来,超级终端波特率选为9600)。
  3.             超级终端设置好后,每按下一次S2/S3/S4/S5键显示abcd,松开后均会在超级终端上显示一个字母"a"。
  4.             入口参数:d: 要发送的字节数据。
  5. ********************************************************************/


  6. #include <reg52.h>
  7. #define jingzhen     11059200UL     /*使用22.1184M晶体*/
  8. #define botelv   9600UL                      /*波特率定义为9600*/

  9. //定义待显示字符abcd
  10. unsigned char zifua='/';                        //待显示字符a。
  11. unsigned char zifub='2';                        //待显示字符。
  12. unsigned char zifuc='3';                        //待显示字符。
  13. unsigned char zifud='4';                        //待显示字符。
  14. unsigned char zifue='5';                        //待显示字符。
  15. unsigned char zifuf='6';                        //待显示字符。
  16. unsigned char zifug='7';                        //待显示字符。
  17. unsigned char zifuh='8';                        //待显示字符。

  18. volatile unsigned char sending;

  19. //设置八个独立按键
  20. sbit s1=P2^0;        //按键
  21. sbit s2=P2^1;        //按键
  22. sbit s3=P2^2;        //按键
  23. sbit s4=P2^3;        //按键
  24. sbit s5=P2^4;        //按键
  25. sbit s6=P2^5;        //按键
  26. sbit s7=P2^6;        //按键
  27. sbit s8=P2^7;        //按键

  28. //设置for延时函数
  29. void delay(unsigned char i)
  30. {
  31.         unsigned char j,k;
  32.         for(j=i;j>0;j--)
  33.                 for(k=90;k>0;k--);
  34. }


  35. void init(void)                                //串口初始化
  36. {
  37. EA=0; //暂时关闭中断
  38. TMOD&=0x0F;  //定时器1模式控制在高4位
  39. TMOD|=0x20;    //定时器1工作在模式2,自动重装模式
  40. SCON=0x50;     //串口工作在模式1
  41. TH1=256-jingzhen/(botelv*12*16);  //计算定时器重装值
  42. TL1=256-jingzhen/(botelv*12*16);
  43. PCON|=0x80;    //串口波特率加倍
  44. ES=1;         //串行中断允许
  45. TR1=1;        //启动定时器1
  46. REN=1;        //允许接收
  47. EA=1;         //允许中断
  48. }

  49. //发送一个字节的数据,形参d即为待发送数据。
  50. void send(unsigned char d)                  
  51. {
  52. SBUF=d; //将数据写入到串口缓冲
  53. sending=1;         //设置发送标志
  54. while(sending); //等待发送完毕
  55. }


  56. void main()
  57. {
  58.         init();
  59.         while(1)
  60.         {
  61.                 if(s1==0)            //如果按下S2
  62.                 {
  63.                 delay(20);         //延时
  64.                 if(!s1)           //判断是否按下
  65.                    {
  66.                    while(!s1);           //循环检测S2是否按下并执行下一条          
  67.                      send(zifua);    //发送a
  68.                        }
  69. //                else(s1==1);
  70.                 }

  71.           
  72.                 if(s2==0)
  73.                 {
  74.                 delay(20);
  75.                 if(!s2)
  76.                     {
  77.                      while(!s2);                  
  78.                      send(zifub);
  79.                     }
  80.                 }
  81.             

  82.                 if(s3==0)
  83.                 {
  84.                 delay(20);
  85.                 if(!s3)
  86.                     {
  87.                     while(!s3);                  
  88.                     send(zifuc);
  89.                     }
  90.                 }


  91.                  

  92.                 if(s4==0)
  93.                 {
  94.                 delay(20);
  95.                 if(!s4)
  96.                    {
  97.                     while(!s4);                  
  98.                     send(zifud);
  99.                  }
  100.                 }

  101.                 if(s5==0)
  102.                 {
  103.                 delay(20);
  104.                 if(!s5)
  105.                    {
  106.                     while(!s5);                  
  107.                     send(zifue);
  108.                  }
  109.                 }

  110.                 if(s6==0)
  111.                 {
  112.                 delay(20);
  113.                 if(!s6)
  114.                    {
  115.                     while(!s6);                  
  116.                     send(zifuf);
  117.                  }
  118.                 }

  119.                 if(s7==0)
  120.                 {
  121.                 delay(20);
  122.                 if(!s7)
  123.                    {
  124.                     while(!s7);                  
  125.                     send(zifug);
  126.                  }
  127.                 }

  128.                 if(s8==0)
  129.                 {
  130.                   delay(20);
  131.                  if(!s8)
  132.                    {
  133.                     while(!s8);                  
  134.                     send(zifuh);
  135.                  }
  136.                 }




  137.         }
  138. }


  139. void uart(void) interrupt 4        //串口发送中断
  140. {
  141. if(RI)    //收到数据
  142. {
  143.   RI=0;   //清中断请求
  144. }
  145. else      //发送完一字节数据
  146. {
  147.   TI=0;
  148.   sending=0;  //清正在发送标志
  149. }
  150. }
复制代码

所有资料51hei提供下载:
串口通信模拟.zip (63.51 KB, 下载次数: 22)

评分

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

查看全部评分

回复

使用道具 举报

ID:634277 发表于 2019-11-2 21:08 | 显示全部楼层
感谢共享。。。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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