打印

请教 51单片机做频率计的问题

[复制链接]
4387|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tiancai963|  楼主 | 2009-11-27 12:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
网上找到的资料

单片机89c51频率计c程序
// 用定时器1定时,使用方式一,晶振频率为11.0592MHZ,常数为4C00;
//用外部中断一计数,每中断一次,count加一
//使用P1口接的八个发光二极管显示

#include<reg51.h>
                         unsigned   int   t1oc=20;//5000;定时器定时次数
                         unsigned   int  count=0,precount;
                        
                         void display(unsigned int dis)
                               {
                                 P1=dis;//显示语句
                                }
                          
                           void t1int() interrupt 3//定时器1溢出中断服务程序
                                 {
                                        TR1=0;  //关定时器               
                                         t1oc--;//
                                         TH1=0x4c;//72;//56;
                                          TL1=0x00;//72;//56;  赋初值
                                        if(t1oc==0)//************************每定时器溢出t1oc次,取一次count作为周期,赋给precount
                                           {
                                               t1oc=20;//5000;
                                               precount=count;
                                               count=0;
                                            }
                                         TR1=1;
                                     }
                               void int0int() interrupt 0//外部中断服务程序  
                                              {               

                                                EX0=1;
                                                 count++;
                                                EX0=0;
                                              }
                                void main(void)
                                         {
                                            TMOD=0x10;//0x20;//定时器模式选择且GATE1=0
                                            TH1=0x4c;//72;//56;
                                            TL1=0x00;//72;//56;
                                             EA=1;//总中断开启
                                              EX0=1;IT0=1;//开外部中断,低电平触发
                                              ET1=1;//开定时器中断                                       
                                              TR1=1;//开定时器
                                              while(1)
                                            {
                                             display(precount);
                                            }   
                                         }
疑问:
1 定时器中断与外部中断同一优先级???会不会在定时器中断执行时导致外部中断不能触发??
2 外部中断低电平触发中断,中断完成之后外部仍为低电平怎么办??或者外部中断源在中断相应之前已经变高怎么办??
请高手指点下 这个程序是否可行???

相关帖子

沙发
zhenxing2000| | 2009-11-27 13:12 | 只看该作者
INT0的中断优先级高于定时器。
IT0=0才是低电平触发,这一点楼主是不是出错了。

使用特权

评论回复
板凳
tiancai963|  楼主 | 2009-11-27 13:24 | 只看该作者
恩 是下降沿触发中断,我注释错了
程序中没有对优先级寄存器设置,默认不是同一优先级么?? 如果在不同优先级 终端服务子程序不是要在不同的存储区么??

使用特权

评论回复
地板
tjx727| | 2009-11-28 22:40 | 只看该作者
不是高手,刚刚做过一个。个人觉得你这个思路有点问题,你的程序的意思是“定时器每溢出t1oc次,取一次count作为周期,赋给precount”,我觉得这样计算就不准确了,对结果的影响会比较大。假如你定时器溢出t1oc次的时候,你所测的波形却跑了(count+0.9)个周期,是不是这没有一个周期的时间你就在定时器里面体现不出来了。
你可以换一种思路,让外部中断计N个周期(至少100,频率高1000也可以),测到第一个下降沿的时候就开定时器,然后在外部中断计数到N个周期的时候,读取定时器里面的值M(这里要注意定时器溢出,溢出的话用个标志来K++)。这样你的所测的周期就等于T=(定时器溢出一次的时间*k+M)/N。这个只是思路,应该可以的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

14

帖子

1

粉丝