找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2801|回复: 0
收起左侧

单片机Proteus仿真主从机串口通信通知流水灯与程序

[复制链接]
ID:399416 发表于 2020-6-23 08:16 | 显示全部楼层 |阅读模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
1592870941(1).jpg ba3a9e871358bed33e090010fc5b0ef.png

单片机源程序如下:
  1. **********************************************************************
  2. *                         头文件包含
  3. **********************************************************************
  4. */
  5. #include <reg52.h>
  6. #include <intrins.h>
  7. /*
  8. **********************************************************************
  9. *                         本地宏定义
  10. **********************************************************************
  11. */
  12. typedef unsigned char u8;                 // 重命名类型u8简化代码编写
  13. typedef unsigned int u16;


  14. sbit key= P2^0;
  15. /*
  16. **********************************************************************
  17. *                         本地全局变量
  18. **********************************************************************
  19. */

  20. /*
  21. **********************************************************************
  22. *                         函数原型声明
  23. **********************************************************************
  24. */
  25. void UartInit(void);
  26. void UartSendByte(u8 c);

  27. /*********************************************************************
  28. * 函 数 名       : main
  29. * 函数功能                 : 主函数
  30. * 参数列表       : 无
  31. * 函数输出             : 无
  32. *********************************************************************/
  33.   void delay(unsigned int x)
  34. {                              
  35.         unsigned int i,j;
  36.         for(i = x; i > 0; i --)
  37.                 for(j = 114; j > 0; j --);
  38. }
  39. unsigned char flag=0;
  40. void main(void)
  41. {
  42.           unsigned char j = 0;
  43.         UartInit();
  44.         while(1)
  45.         {
  46.         if(key==0)
  47.         {
  48.           delay(5) ;
  49.            if(key==0)
  50.            {
  51.              while(key==0) ;
  52.                  if(flag==0) {flag=1;UartSendByte(1);}
  53.                  else {flag=0;UartSendByte(0);}
  54.            }
  55.          }
  56.            if(flag==1 )
  57.            {
  58.                    P1 = ~(0x80 >> j++);
  59.                    delay(200);
  60.                    if(j == 8)
  61.                    {
  62.                         j = 8;
  63.                         flag=0;
  64.                }
  65.                 }
  66.                 else if(flag==2 )
  67.                 {
  68.                           P1 = ~(0x01 << j++);                            //00000001 00000010 11111101
  69.                         delay(200);
  70.                     if(8 == j)                                   
  71.                     {         
  72.                           j = 8;
  73.                           flag=0;                              
  74.                     }
  75.                 }
  76.                 else
  77.                 {
  78.                     j=0;
  79.                          P1 =0xff;
  80.                 }
  81.         }
  82. }

  83. /*********************************************************************
  84. * 函 数 名       : UartInit
  85. * 函数功能                 : 串口初始化为2400波特率,8位数据位
  86. * 参数列表       : 无
  87. * 函数输出             : 无
  88. *********************************************************************/
  89. void UartInit(void)
  90. {
  91.     TMOD = 0x20;                // T1设置为8位自动重装载定时器                       
  92.     SCON = 0x50;                // 串口工作在模式1:8位UART波特率可变,且允许接收
  93.     TH1 = 0xE6;                        // 单片机小精灵V1.3算出的2400波特率且波特率
  94.     TL1 = TH1;                        // 加倍时的定时器设置值。
  95.     PCON = 0x80;                // 设置为波特率加倍
  96.         EA = 1;                                // 开总中断
  97.         ES = 1;                            // 开串口中断
  98.         TR1 = 1;                    // 定时器1开启计数
  99. }


  100. /*********************************************************************
  101. * 函 数 名       : UartSendByte
  102. * 函数功能                 : 通过串口发送1字节数据给外部设备
  103. * 参数列表       : c - 待发送的1字节数据
  104. * 函数输出             : 无
  105. *********************************************************************/
  106. void UartSendByte(u8 c)
  107. {
  108.     SBUF = c;
  109.     while (!TI);
  110.     TI = 0;
  111. }


  112. /*********************************************************************
  113. * 函 数 名       : UartIsr
  114. * 函数功能                 : 串口的中断处理程序
  115. * 参数列表       : 无
  116. * 函数输出             : 无
  117. *********************************************************************/
  118. void UartIsr(void) interrupt 4        // 注意串口中断的编号是4
  119. {
  120.         u8 c = 0;                                    // 临时变量用于存储串口中断接收的字符

  121.     if (RI)                                                // 串口接收中断
  122.     {
  123.         RI = 0;
  124.         //add your code here!
  125.                 c = SBUF;                                // 通过串口接收外部发送的字符
  126.                 if(c==1)
  127.                 {
  128.                   flag=2;
  129.                 }
  130.                 else
  131.                 {
  132.                 flag=0;
  133.                 }
  134.         //        UartSendByte(c + 1);        // 加1后回发出去
  135.     }
  136.     else                                                 // 串口发送中断
  137.         TI = 0;                                        // if else中如果只有1句代码则可不加大括号
  138. }


复制代码

51hei.png

全部资料51hei下载地址:
主从机串口通信通知流水灯.rar (177.01 KB, 下载次数: 26)

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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