用的是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

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。