求求大神帮我看下我的程序,我调试不出来了

2019-07-21 07:38发布

我的开发板是c51的,这个程序功能是记录一个引脚发生2次变化的时间,以下代码测不出引脚发生2次变化的时间,求求大神帮帮我看看#include <stdio.h>
#include <reg52.h>

unsigned int TF0_COUT = 0;   //记录中断次数
typedef unsigned int unint;
sbit date =P1^0; //定义输入状态发生变化的引脚
unint time=0;

void InitUART(void)//使用定时器1作为串口波特率发生器
{
    TH1 = 0xF3;         //晶振12mhz 波特率设为2400
    TL1 = TH1;
    TMOD |= 0x20;         //定时器1方式2
    SCON = 0x50;         //串口接收使能
    ES = 1;                         //串口中断使能
    TR1 = 1;                 //定时器1使能
    TI = 1;                         //发送中断标记位,必须设置
}
void InitTimer0(void)  //定时器0
{
   TMOD |= 0x01;         //定时器1
   TH0=0;
   TL0=0;
   ET0=1;//开放T0中断请求
   TR0=0;  //关定时器
}

//毫秒延时函数
void delay_ms(unsigned int t)
{
    unsigned char a,b;
    while(t--)
    {
      for(b=102;b>0;b--)
      for(a=3;a>0;a--);
    }
}

void main()
{
    unint time_data,out_TH0,out_TL0;
        InitUART();        //初始化串口
        InitTimer0();//初始化定时器0
    EA = 1;                  //开总中断
        date=1;
    while(1)
    {
            while(date==0);         //记录发生2次变化的时间
                TR0=1;
            while(date==0)
                TR0=0;       
                out_TH0 = TH0; //取定时器的值
        out_TL0 = TL0;
        out_TH0 <<= 8;  //右移8位
        time_data = out_TH0 | out_TL0; //合并为16位的值
                printf("%d ",time_data);//串口打印结果
            delay_ms(1000);
                TH0=0;
        TL0=0;
    }
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
正点原子
1楼-- · 2019-07-21 08:21
帮顶
csmjmcc
2楼-- · 2019-07-21 14:09
你的工程中,是否有定时器0中断服务程序,若有请贴出,若无就不要开启该中断了。
xuyaqi
3楼-- · 2019-07-21 16:03
1 应该用定时器中断计数功能,而不是用轮询,这样会漏数。2 应该用下降沿判断而不是低电平。
244862756
4楼-- · 2019-07-21 17:54
csmjmcc 发表于 2018-11-19 09:17
你的工程中,是否有定时器0中断服务程序,若有请贴出,若无就不要开启该中断了。

没有中断服务函数
电脑小白
5楼-- · 2019-07-21 23:52
 精彩回答 2  元偷偷看……
今晚啃母猪丶
6楼-- · 2019-07-22 02:36
我也是个小白,仅发表一下个人见解,可能是错误的,你参考一下就好。在我看来,你这个程序的思路就是错误的,首先你吧p1.0拉高,我能理解你是怕外面的低电平影响该脚的电平,然后你就开始执行第一层循环,等外界把1.0拉高,开启定时器,你第一个循环的执行的时候,里面的两个循环在第一个执行的时候第二个是不一定执行的,而且p1.0第二次引脚变换的时候,也就是第二个循环执行的时候第一个可能已经执行了很多次,也输出了很多次定时器的值,后面你还把定时器重新赋初值了。你可以考虑变化的时候进循环,然后开定时器,第二次变换的时候,改变循环的判断值,退出循环,再计算他定时的时间

一周热门 更多>