用的是STC89C52RC的单片机,写的通信程序只能跑一遍..

2019-07-16 08:43发布

用的是STC89C52RC的单片机,程序想实现的功能大概是通过计时器0计时学习板上的两个按键开关分别闭合的时间间隔t,得到t以后和一些常数运算得到v,然后再将v传输到另一个单片机上去,波特率由计时器1设置。

但是我把程序下载好了以后,用串口监视器查看传输的数据却发现,只有打开单片机后的第一次运行能得到可以正确反映开关闭合时间差异的数据,后面得到的都是00。
在下单片机新手,苦寻半天也未能发现原因,恳请各位前辈高人不吝赐教

#include <reg52.h>

unsigned int time,t,v;

const s=3000;

void Delay(unsigned int xms);
void Init();
void Transmit();

void main()
{
  Init();
  while(1)
  {
    if(k1==0)
        {
          Delay(10);  //开关消抖
          if(k1==0)
          {
                time=0;
                TH0=0x4c;
                TL0=0x00;
                TR0=1;
                while(k2==1);
                TR0=0;
                Transmit();
          }
        }
  }
}

void Delay(unsigned int xms)
{
    unsigned int i,j;
        for(i=xms;i>0;i--)
          for(j=112;j>10;j--);
}

void Init()
{
  TMOD=0x21;                //计数器0计时用,计数器1波特率
  TH0=0x4c;                        //计数器0初值,一次循环为50ms
  TL0=0x00;
  TH1=0xfd;                        //设置计数器1的初值,决定波特率
  TL1=0xfd;               
  PCON=0x00;      // 波特率不倍增
  SCON=0x50;                //设置工作方式1 开启接受允许
  EA=1;
  ES=1;
  ET0=1;
  TR1=1;
}

void count() interrupt 1
{
  TH0=0x4c;
  TL0=0x00;
  time++;
}

void Transmit()
{
  t=50*time;
  v=s/t;
  SBUF=time;
  while(!TI);
  TI=0;
}
.k1和k2是开关,电路图如下
1.jpg

2.jpg

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
13条回答
marrychen
2019-07-16 12:13

我也是啊  用gsm模块  接受短信 控制灯的开关  明明写在大循环里  只能执行一次 开关 然后就失效了

用P3.0 和P3.1口的通信

更悲剧的是  单片机写进这个程序以后 重新写程序写不进去了  之前写的程序一直在里面运行  

是不是之前的程序覆盖了下载程序的信号啊

希望有前辈能不吝赐教   小弟先行谢过了

一周热门 更多>