为什么扩充51单片机测两个外部中断外部中断没有用

21ic官方微信-->
打算用51的定时器和外部中断做个频率计,为什么总是实现不了呢,求大神给看一下
中级技术员, 积分 156, 距离下一级还需 144 积分
中级技术员, 积分 156, 距离下一级还需 144 积分
中级技术员, 积分 156, 距离下一级还需 144 积分
中级技术员, 积分 156, 距离下一级还需 144 积分
1602的部分就不用看了
#include&reg52.h&
#define uchar unsigned char
#define uint unsigned int
void delayms(unsigned char ms)& & & & & & & & //延时程序
{& & & & & & & & & & & & & & & & & & & & & & & &
& & & & while(ms--)
& & & & & & & & for(i = 0; i & 120; i++);
sbit rs=P2^5;& & & & & & & & //1602& & & & & & & & & & & & & & & && &
sbit rw=P2^6;& & & & & & & & //
sbit e=P2^7;& & & & & & & & //
uchar table1[]=&&;
long int k=0,m,n,flag=0;
long int g,s,b,q,w;
long double i,t;
void display();& & & & & & & && & //显示函数
void write_com(uchar com)& & & & & & & & & & & && &//1602写入指令
&&delayms(1);
&&delayms(5);
void write_data(uchar dat)& & & & & & & & & & & && &//1602写入数据
&&delayms(1);
&&delayms(5);
void init(void)& & & & & & & & & & & & & & & & & & & & & & & & & & & &&&//1602初始化设置程序
&&delayms(15);
&&write_com(0x38);
&&delayms(5);
&&write_com(0x38);
&&delayms(5);
&&write_com(0x38);
&&write_com(0x38);
&&write_com(0x08);
&&write_com(0x01);
&&write_com(0x06);
&&write_com(0x0c);
main()& & & & & & & & & & & & & & & && &//主函数
& & & & EA=1;& & & & & & & & //中断总开关
& & & & EX0=1;& & & && & //外部中断
& & & & IT0=1;& & & && & //负跳变沿触发
& & & & & & & & TMOD=0x01;& & & &&&//定时器0 方式1
& & & & & & & & TH0=0;& & & & & & & && &//初值 高8位
& & & & & & & & TL0=0;& & & & & & & && &//初值低8位
& & & & & & & & EA=1;
& & & & //& & & & ET0=1;& & & & & & & &&&//打开定时器中断
& & & & //& & & & TR0=1;& & & & & & & &&&//启动定时器
& & & & while(1)
& & & & {& & & &
& & & & & & & & display();
& & & & & & & &
void timer0() interrupt 1
& & & && && &&&k++;& & & & & & & &&&//计数器溢出值
& & & & & & & && & TH0=0;
& & & & & & & && & TL0=0;
& & & & & & & && &
& & & & & & & && &
& & & & & & & && &
void int0() interrupt 0
& & & && &if(flag==0)& & & & & & & &&&//第一次中断
& & & && &{
& & & && && & & & i=0;
& & & & & & & & k=0;
& & & & & & & & TH0=0;
& & & & & & & & TL0=0;
& & & & & & & & ET0=1;& & & & & & & & //打开定时器中断
& & & & & & & & TR0=1;& & & & & & & & //
& & & & & & & & flag++;
& & & && &}
& & & && &
& & & && &if(flag==1)& & & && & //第二次中断
& & & && &{& & & & & & & && & & & & && && & & && && & & && &
& & & && &m=TH0;
& & & && &n=TL0;
& & & && &
& & & && &ET0=0;& & & && &//关闭定时器中断
& & & && &TR0=0;& & & && & //
& & & && &flag=0;
& & & && &t=k**m+n;& & & && &//被测频率的一个周期
& & & && &
& & & && &i=100000/t;& & & & & & & && && & & &&&//频率& & & & & & & &&&& & & & & & & & & & & && && & & & & & & &
& & & & & & & &&&& & & &
& & & &&&}& & & & & & & & & & & &
& & & & & & & && & & & & & & & & & & & & && && & & && && & & & & & & & & & & & & & & &
void display()
{& & & & & & & && & & & & & & & & & & & & && &&&
& & & & & & & && & & & & && &&&
& & & & & & & & & & & & & & & &
& & & & & & & & & & & &
& & & & & & & & & & & && & g=(long int)i%10;& & & & & & & & & & & & //& & & & 个位
& & & & & & & & & & & && & s=(long int)i/10%10;& & & & & & & & & & & & //& & & &&&十
& & & & & & & & & & & && & b=(long int)i/100%10;& & & && & //& & & && &百
& & & & & & & & & & & && & q=(long int)i/1000%10;&&& & & & & & & & //& &千& & & & & & & &
& & & & & & & & & & & && & w=(long int)i/10000;& & & & & & & & & & & & //& & & && &万
& & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & init();
& && & & & & & & & & & & & & & & & write_com(0x80); & & & & & & & & & & & && &//显示
& && & & & & & & & & & & & & & & & write_data(table1[w]);
& && & & & & & & & & & & & & & & & delayms(10);
& && & & & & & & & & & & & & & & & write_com(0x81);
& && & & & & & & & & & & & & & & & write_data(table1[q]);
& && & & & & & & & & & & & & & & & delayms(10);
& && & & & & & & & & & & & & & & & write_com(0x82);
& && & & & & & & & & & & & & & & & write_data(table1);
& && & & & & & & & & & & & & & & & delayms(10);
& && & & & & & & & & & & & & & & & write_com(0x83);
& && & & & & & & & & & & & & & & & write_data(table1);
& && & & & & & & & & & & & & & & & delayms(10);
& & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & write_com(0x84);
& && & & & & & & & & & & & & & & & write_data(table1[g]);
& && & & & & & & & & & & & & & & & delayms(10);
& & & & & & & & & & & & while(1);&&& & & & & & & & & & & & & & & & & & & & & & & &&&& & & & & & & && & & & & & & & & & & & & && && & & && &
& & & & & & & && &
满意回复+5
if(flag==0)
//第一次中断
不知道你的频率计测频范围准备做多高?
要想准,计时部分不能由软件控制,最好是全硬件的。对于你要求的10kHz测频,可以考虑先对输入信号做分频,然后用定时器的捕获模式来测周期,精度可以 ...
//被测频率的一个周期
i=100000/t;
这两句要耗费大量的时间,导致 ...
频率小的时候很准,当频率超过一千误差就大了
楼上的很对。
觉得这个t=k**m+n;
时间长的话就用移位来做,时间就很短了。
中级技术员, 积分 156, 距离下一级还需 144 积分
中级技术员, 积分 156, 距离下一级还需 144 积分
中级技术员, 积分 156, 距离下一级还需 144 积分
中级技术员, 积分 156, 距离下一级还需 144 积分
求大神啊,上午在线等
中级技术员, 积分 156, 距离下一级还需 144 积分
中级技术员, 积分 156, 距离下一级还需 144 积分
中级技术员, 积分 156, 距离下一级还需 144 积分
中级技术员, 积分 156, 距离下一级还需 144 积分
木有人来啊
中级技术员, 积分 156, 距离下一级还需 144 积分
中级技术员, 积分 156, 距离下一级还需 144 积分
中级技术员, 积分 156, 距离下一级还需 144 积分
中级技术员, 积分 156, 距离下一级还需 144 积分
自己顶一下,别沉了啊
中级技术员, 积分 156, 距离下一级还需 144 积分
中级技术员, 积分 156, 距离下一级还需 144 积分
中级技术员, 积分 156, 距离下一级还需 144 积分
中级技术员, 积分 156, 距离下一级还需 144 积分
技术达人, 积分 8502, 距离下一级还需 1498 积分
技术达人, 积分 8502, 距离下一级还需 1498 积分
技术达人, 积分 8502, 距离下一级还需 1498 积分
技术达人, 积分 8502, 距离下一级还需 1498 积分
t=k**m+n;& && && & //被测频率的一个周期
& && && & i=100000/t;& && && && && && && && && &//频率& &&&
这两句要耗费大量的时间,导致中断程序耗时过长,不能及时响应下一个中断,最终频率测量不准。
其它的没细看。
中级技术员, 积分 156, 距离下一级还需 144 积分
中级技术员, 积分 156, 距离下一级还需 144 积分
中级技术员, 积分 156, 距离下一级还需 144 积分
中级技术员, 积分 156, 距离下一级还需 144 积分
cjseng 发表于
t=k**m+n;& && && & //被测频率的一个周期
& && && & i=100000/t;& && && && && && &&&...
为什么这两句要用好长时间呢?
资深技术员, 积分 317, 距离下一级还需 183 积分
资深技术员, 积分 317, 距离下一级还需 183 积分
资深技术员, 积分 317, 距离下一级还需 183 积分
资深技术员, 积分 317, 距离下一级还需 183 积分
if(flag==0)& && && && && &&&//第一次中断
& && && & {
& && && && && && &i=0;
& && && && && & k=0;
& && && && && & TH0=0;
& && && && && & TL0=0;
& && && && && & ET0=1;& && && && && & //打开定时器中断
& && && && && & TR0=1;& && && && && & //
& && && && && & flag++;
& && && & }
& && && & if(flag==1)& &
这里&&一次中断两个IF都执行了 。。。
资深技术员, 积分 317, 距离下一级还需 183 积分
资深技术员, 积分 317, 距离下一级还需 183 积分
资深技术员, 积分 317, 距离下一级还需 183 积分
资深技术员, 积分 317, 距离下一级还需 183 积分
if(flag == 0)
else if(flag == 1)
资深技术员, 积分 317, 距离下一级还需 183 积分
资深技术员, 积分 317, 距离下一级还需 183 积分
资深技术员, 积分 317, 距离下一级还需 183 积分
资深技术员, 积分 317, 距离下一级还需 183 积分
灯火阑珊处 发表于
额,,,&&为什么这两句要用好长时间呢?
单片机计算* /用时长 建议不要这个用,可试试使用移位操作 而且最好判断除数是否为0&&
资深技术员, 积分 338, 距离下一级还需 162 积分
资深技术员, 积分 338, 距离下一级还需 162 积分
资深技术员, 积分 338, 距离下一级还需 162 积分
资深技术员, 积分 338, 距离下一级还需 162 积分
楼上的很对。
觉得这个t=k**m+n;& & 时间长的话就用移位来做,时间就很短了。
t=(k&&16)|(m&&8)|n;
中级技术员, 积分 156, 距离下一级还需 144 积分
中级技术员, 积分 156, 距离下一级还需 144 积分
中级技术员, 积分 156, 距离下一级还需 144 积分
中级技术员, 积分 156, 距离下一级还需 144 积分
longmaodo 发表于
if(flag == 0)
有道理&&这确实是有问题啊
中级技术员, 积分 156, 距离下一级还需 144 积分
中级技术员, 积分 156, 距离下一级还需 144 积分
中级技术员, 积分 156, 距离下一级还需 144 积分
中级技术员, 积分 156, 距离下一级还需 144 积分
很忙 发表于
楼上的很对。
觉得这个t=k**m+n;& & 时间长的话就用移位来做,时间就很短了。
有道理啊 懂的真多呀
中级技术员, 积分 156, 距离下一级还需 144 积分
中级技术员, 积分 156, 距离下一级还需 144 积分
中级技术员, 积分 156, 距离下一级还需 144 积分
中级技术员, 积分 156, 距离下一级还需 144 积分
一些问题修改之后1602还是输出00000,是不是哪里有更大的问题啊[em:24:][em:24:][em:24:][em:24:][em:24:][em:24:][em:24:][em:24:][em:24:][em:24:]
资深技术员, 积分 317, 距离下一级还需 183 积分
资深技术员, 积分 317, 距离下一级还需 183 积分
资深技术员, 积分 317, 距离下一级还需 183 积分
资深技术员, 积分 317, 距离下一级还需 183 积分
灯火阑珊处 发表于
一些问题修改之后1602还是输出00000,是不是哪里有更大的问题啊[ ...
你可以断点调试吗&&
如果可以&&那你就幸福了 只要一步一步的检测那个地方出错了就行了
如果不行 你最好先确定问题的位置&&一步步排除 比如先测试1206显示没问题
再确定你的采集回来的数据&&
PS:顺便问一下 你的时钟是多少 你这样设计是基于你的频率不能很大的
中级技术员, 积分 156, 距离下一级还需 144 积分
中级技术员, 积分 156, 距离下一级还需 144 积分
中级技术员, 积分 156, 距离下一级还需 144 积分
中级技术员, 积分 156, 距离下一级还需 144 积分
longmaodo 发表于
你可以断点调试吗&&
如果可以&&那你就幸福了 只要一步一步的检测那个地方出错了就行了
如果不行 你最好 ...
12M晶振啊,这种用外部中断+定时器的做法是不是有问题啊,好多人都是定时器+计数器做出来的
资深技术员, 积分 317, 距离下一级还需 183 积分
资深技术员, 积分 317, 距离下一级还需 183 积分
资深技术员, 积分 317, 距离下一级还需 183 积分
资深技术员, 积分 317, 距离下一级还需 183 积分
灯火阑珊处 发表于
12M晶振啊,这种用外部中断+定时器的做法是不是有问题啊,好多人都是定时器+计数器做出来的 ...
刚才没怎么仔细看你的要求&&我觉得你的思路有点问题& &
计算频率 你可以看成是计算1S时间内波的个数&&
所以只要定义一个1S中的定时器 和一个外部中断就可以了
在外部中断中循环计算&&在1S定时中判断个数
这样就没有除法了&&最简单 只是提供思路 代码请自编
中级技术员, 积分 156, 距离下一级还需 144 积分
中级技术员, 积分 156, 距离下一级还需 144 积分
中级技术员, 积分 156, 距离下一级还需 144 积分
中级技术员, 积分 156, 距离下一级还需 144 积分
longmaodo 发表于
刚才没怎么仔细看你的要求&&我觉得你的思路有点问题& &
计算频率 你可以看成是计算1S时间内波的个数&&
对呀,思路稍微变一下就可以,我怎么就没想到呢,还在测周期,容易出错还不准,,,大神能不能留个扣扣
资深技术员, 积分 317, 距离下一级还需 183 积分
资深技术员, 积分 317, 距离下一级还需 183 积分
资深技术员, 积分 317, 距离下一级还需 183 积分
资深技术员, 积分 317, 距离下一级还需 183 积分
灯火阑珊处 发表于
对呀,思路稍微变一下就可以,我怎么就没想到呢,还在测周期,容易出错还不准,,,大神能不能留 ...
不要叫大神&&都是从百度和论坛上过来的人
见到了就说一下 QQ就不要了&&一个人的力量是有限的&&
多问问论坛上的人就成了 我只能解答初级问题
助理工程师, 积分 1831, 距离下一级还需 169 积分
助理工程师, 积分 1831, 距离下一级还需 169 积分
助理工程师, 积分 1831, 距离下一级还需 169 积分
助理工程师, 积分 1831, 距离下一级还需 169 积分
不知道你的频率计测频范围准备做多高?
扫描二维码,随时随地手机跟帖
技术新星奖章
人才类勋章
突出贡献奖章
等级类勋章
时间类勋章
沉静之湖泊
发帖类勋章
技术导师奖章
人才类勋章
时间类勋章
技术高手奖章
人才类勋章
涓涓之细流
发帖类勋章
社区建设奖章
等级类勋章
湍急之河流
发帖类勋章
时间类勋章
您需要登录后才可以回帖
热门推荐 /551单片机中断扩展_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
51单片机中断扩展
阅读已结束,下载本文需要
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢为什么我的外部中断函数不能在串口上显示,51单片机的,急急
[问题点数:40分,结帖人qq_]
为什么我的外部中断函数不能在串口上显示,51单片机的,急急
[问题点数:40分,结帖人qq_]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2014年7月 硬件/嵌入开发大版内专家分月排行榜第二
2013年10月 硬件/嵌入开发大版内专家分月排行榜第三2013年6月 硬件/嵌入开发大版内专家分月排行榜第三2013年3月 硬件/嵌入开发大版内专家分月排行榜第三
2014年7月 硬件/嵌入开发大版内专家分月排行榜第二
2013年10月 硬件/嵌入开发大版内专家分月排行榜第三2013年6月 硬件/嵌入开发大版内专家分月排行榜第三2013年3月 硬件/嵌入开发大版内专家分月排行榜第三
匿名用户不能发表回复!|}

我要回帖

更多关于 合泰单片机 外部中断 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信