找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机串行控制流水灯 keil没报错,但是proteus调试不出来,求大佬指点

[复制链接]
ID:857618 发表于 2020-12-11 21:38 | 显示全部楼层 |阅读模式
本帖最后由 sunminda 于 2020-12-12 17:05 编辑

用串行控制流水灯,我编的程序,keil没报错,但是proteus调试不出来,求大佬指点

单片机源程序如下:
#include<reg51.h>
#include<intrins.h>
unsigned char i=200,j,FLAG1,FLAG2,Temp;

void Init_T0(void)
{ TH0=0xEE;
  TL0=0x00;}

void Init_UART(void)
{ SCON=0x50;
  PCON=0x00;
  TH1=0xFD;
  TR1=1;
  ES=1;}

void UART_SER(void) interrupt 4 using 1
{ RI=0;
  Temp=SBUF;
  FLAG2=1;}

void time0_SER(void) interrupt 1 using 2
{ TH0=0xEE;
  TL0=0x00;
  i--;
  if((i==0)&&(FLAG1==0))
    {i=200;  P1=_crol_(j,1);  j=P1;}
   else if((i==0)&&(FLAG1==1))
    {i=200;  P1=_cror_(j,1);  j=P1;}}

void main(void)
{ EA=1;  
  TMOD=0x21;
  Init_T0();
  Init_UART();
  IP=0x10;
  while(1)
   {if (FLAG2==1)
    { ES=0;
      switch(Temp)
{       case 0x55:ET0=1;TR0=1; FLAG1=0; P1=0xfe; j=0xfe; SBUF=Temp;break;
        case 0xAA:ET0=1;TR0=1; FLAG1=1; P1=0x7f; j=0x7f; SBUF=Temp;break;
        case 0x01:ET0=0;TR0=0;break;
        case 0x02:ET0=1;TR0=1;break;}
      while(!TI);TI=0;
      ES=1;FLAG2=0;}}}

proteus图如下
屏幕截图 2020-12-12 170502.png
回复

使用道具 举报

ID:213173 发表于 2020-12-12 09:47 | 显示全部楼层
给你改了,你试试。
  1. #include<reg51.h>
  2. #include<intrins.h>

  3. unsigned char i,j,Temp;
  4. bit flag=0;

  5. void UART_SER(void)
  6. {
  7.         switch(Temp)
  8.         {
  9.                 case 0x55:j=_cror_(j, 1);P1=j;break;//右移
  10.                 case 0xAA:j=_crol_(j, 1);P1=j;break;//左移
  11.                 case 0x01:P1=j;break;                                        //停止移动
  12.                 default:P1=0xff;break;                                        //关闭
  13.         }
  14. }

  15. void time0_SER(void) interrupt 1 using 2
  16. {
  17.         TH0=0x3C;
  18.         TL0=0xB0;
  19.         i++;
  20.         if(i>=10)//0.5s
  21.         {
  22.                 i=0;
  23.                 flag=1;
  24.         }
  25. }

  26. void main(void)
  27. {
  28.         TMOD=0x21;//定时器0方式1,定时器方式2(8位重载)
  29.         TH0=0x3C; //50ms
  30.         TL0=0xB0; //50ms
  31.         TH1=0xfd;//定时器1重载 波特率9600
  32.         TL1=0xfd;//定时器1重载
  33.         TR0=1;        //开定时器0
  34.         TR1=1;        //开定时器1
  35.         REN=1;        //允许串行接收
  36.         SM0=0;        //设置串口方式1
  37.         SM1=1;        //设置串口方式1
  38.         EA =1;   //开总中断
  39.         ET0=1;   //开T0中断       
  40.         j=0xfe;
  41.         while(1)
  42.         {
  43.                 if(RI)                //查询接收中断请求标志位为1(已收到)
  44.                 {
  45.                         RI=0;                //接收中断请求标志位清0
  46.                         Temp=SBUF;                //获取接收寄存器数据
  47.                 }
  48.                 if(flag)                //0.5s定时标志1
  49.                 {
  50.                         flag=0;
  51.                         UART_SER();
  52.                 }
  53.         }
  54. }

复制代码
回复

使用道具 举报

ID:18297 发表于 2020-12-12 18:42 | 显示全部楼层
在仿真电路中,你的max232不需要,compim和单片机的uart口直接接。建议先编写个简单的程序比如单片机接收到00关灯,01开灯,来判断仿真硬件没错。
回复

使用道具 举报

ID:857618 发表于 2020-12-13 09:25 | 显示全部楼层
wulin 发表于 2020-12-12 09:47
给你改了,你试试。

非常感谢,设计要求是0x02时继续流水灯,但是我试了一下我的程序,好像达不到我想要的效果
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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