OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2309|回复: 7

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

[复制链接]

7

主题

12

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2018-10-10
在线时间
4 小时
发表于 2018-11-18 21:54:34 | 显示全部楼层 |阅读模式
1金钱
我的开发板是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\n",time_data);//串口打印结果
            delay_ms(1000);
                TH0=0;
        TL0=0;
    }
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-11-19 02:02:25 | 显示全部楼层
回复

使用道具 举报

15

主题

317

帖子

0

精华

高级会员

Rank: 4

积分
863
金钱
863
注册时间
2015-2-12
在线时间
354 小时
发表于 2018-11-19 09:17:14 | 显示全部楼层
你的工程中,是否有定时器0中断服务程序,若有请贴出,若无就不要开启该中断了。
回复

使用道具 举报

2

主题

686

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
10921
金钱
10921
注册时间
2014-6-12
在线时间
1041 小时
发表于 2018-11-19 09:24:32 | 显示全部楼层
1 应该用定时器中断计数功能,而不是用轮询,这样会漏数。2 应该用下降沿判断而不是低电平。
回复

使用道具 举报

7

主题

12

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2018-10-10
在线时间
4 小时
 楼主| 发表于 2018-11-19 16:22:59 | 显示全部楼层
csmjmcc 发表于 2018-11-19 09:17
你的工程中,是否有定时器0中断服务程序,若有请贴出,若无就不要开启该中断了。

没有中断服务函数
回复

使用道具 举报

8

主题

571

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2922
金钱
2922
注册时间
2016-5-13
在线时间
185 小时
发表于 2018-11-20 11:23:38 | 显示全部楼层
C51不是有中断计数功能的么,开中断计数。设置为下降沿有效。while里不停滴判断计数是否有变化,有变化就打印一次计数就好了啊(如果变化不快的话)。
你这个是老师出的题目吧,之前大学里我们老师也出过类似的题目。当时我们的老师是让外接一个按键,然后要求用中断计数来上报按下的次数。
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

4

主题

163

帖子

0

精华

高级会员

Rank: 4

积分
955
金钱
955
注册时间
2018-9-7
在线时间
115 小时
发表于 2018-11-22 10:27:07 | 显示全部楼层
我也是个小白,仅发表一下个人见解,可能是错误的,你参考一下就好。在我看来,你这个程序的思路就是错误的,首先你吧p1.0拉高,我能理解你是怕外面的低电平影响该脚的电平,然后你就开始执行第一层循环,等外界把1.0拉高,开启定时器,你第一个循环的执行的时候,里面的两个循环在第一个执行的时候第二个是不一定执行的,而且p1.0第二次引脚变换的时候,也就是第二个循环执行的时候第一个可能已经执行了很多次,也输出了很多次定时器的值,后面你还把定时器重新赋初值了。你可以考虑变化的时候进循环,然后开定时器,第二次变换的时候,改变循环的判断值,退出循环,再计算他定时的时间
回复

使用道具 举报

4

主题

163

帖子

0

精华

高级会员

Rank: 4

积分
955
金钱
955
注册时间
2018-9-7
在线时间
115 小时
发表于 2018-11-22 10:33:36 | 显示全部楼层
我好想读错题了,你说的两次变化,我没理解你的意思是有高到低再到高算两次,还是由高到低再到高再到低算两次,如果是第一种的话,感觉你可以把第二个while(0)改成while(1)后面加个分号应该就好了。我是个菜鸟,答错了轻点喷。。。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 23:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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