标题: 简易频率计程序 不停的复位单片机 程序问题出在哪呢 [打印本页]
作者: 碎步湖上 时间: 2017-3-24 17:31
标题: 简易频率计程序 不停的复位单片机 程序问题出在哪呢
程序如下:
#include <reg52.h>
#include "lcd.h"
uint dispcount,lck;
uint disp;
uchar flag;
void Time0_init() //方式1,初值1ms
{
TMOD=0x01;
TH0=0xFC;
TL0=0x18;
ET0=1;
TR0=1;
}
void Time1_IntConfiguration()
{
PT0=0;
PX1=1; //优先级设置
IT1=1; //边沿触发
EX1=1;
EA=1;
}
void Time0_int() interrupt 1 //初值1ms,定时1s,每一秒中断一次,所记得数就是频率,即频率检测
{
TH0=0xFC;
TL0=0x18;
lck++;
if(lck==1000)
{
flag=1;
disp=dispcount; //disp==xxxx,则xxxxHZ
lck=0;
}
}
void Time1_zhongduan() interrupt 2 //外部中断1,P3^3
{
dispcount++; //每一次中断,计数加一
if(flag==1)
dispcount=0;
}
void main()
{
Time0_init();
Time1_IntConfiguration();
lcd_init();
while(1)
{
write_num(0,0,dispcount);
}
}
LCD的程序就不放了,显示数字的程序都没有问题的
现在的问题是,这个程序,我用频率计给P3^3口提供频率,结果是,不停的复位单片机,dispcount永远只能计数为1,而且在松开P3^3口的瞬间,dispcount瞬间计数很多值,超过1000也会出现,这个没有规律。如果用独立按键置低电位给P3^3口,可以不停的累计dispcount。
现在程序问题出在哪呢
作者: 碎步湖上 时间: 2017-3-24 19:00
单独把定时器的程序给注释,dispcount也是只有松开的时候,瞬间计数很多值
作者: 碎步湖上 时间: 2017-3-24 19:00
有没有人救救我的程序
作者: 碎步湖上 时间: 2017-3-24 19:52
标题出错了,就是“简易频率计”而已,具体问题就是我后面描述的
作者: 碎步湖上 时间: 2017-3-24 19:53
求大神指点指点
作者: 286352649 时间: 2017-3-24 20:56
测量的范围是多少
作者: zl2168 时间: 2017-3-24 20:59
本帖最后由 zl2168 于 2017-3-24 21:00 编辑
测量脉冲频率
先Proteus仿真一下,确认有效
实例73 测量脉冲频率.rar
(52.74 KB, 下载次数: 7)
以上摘自张志良编著《单片机实验实训100例》 ISBN978-7-5124-1603-1,北航社出版
书中电路和程序设计有详细说明,程序语句条条有注解。
作者: imxuheng 时间: 2017-3-26 11:40
我帮你改了改,proteus仿真通过,你之前的逻辑不对哈
//************************************
//****************************************
void Time0_init() //方式1,初值1ms
{
TMOD=0x01;
TH0=0xFC;
TL0=0x18;
ET0=1;
TR0=1;
}
void Time1_IntConfiguration()
{
PT0=0;
PX1=1; //优先级设置
IT1=1; //边沿触发
EX1=1;
EA=1;
}
void Time0_int() interrupt 1 //初值1ms,定时1s,每一秒中断一次,所记得数就是频率,即频率检测
{
TH0=0xFC;
TL0=0x18;
lck++;
if(lck==1000)
{
disp=dispcount; //disp==xxxx,则xxxxHZ
lck=0;
dispcount=0;
}
}
void Time1_zhongduan() interrupt 2 //外部中断1,P3^3
{
dispcount++; //每一次中断,计数加一
}
//**************************************
void main()
{
LcdInitiate();
Time0_init();
Time1_IntConfiguration();
while(1)
{
write_num(0,0,disp);
}
}
作者: 碎步湖上 时间: 2017-3-26 15:40
1000HZ左右,因为这个东西只是我做的课设其中一部分要到的原理
作者: 碎步湖上 时间: 2017-3-26 15:43
这个是我一开始的做法,还是实现不了才定义了个标志位作为清零,这个程序我试过也还是没法实现,现象和我发的一样
作者: 碎步湖上 时间: 2017-3-26 15:43
是我这个程序可以用吗?
作者: 碎步湖上 时间: 2017-3-26 15:44
1000HZ左右,因为这个东西只是我做的课设其中一部分要到的原理
作者: imxuheng 时间: 2017-3-26 15:56
修改之后就是实现记录1s内外部脉冲个数
作者: imxuheng 时间: 2017-3-26 15:59
你下载到单片机试试.如果P3.3口的按键1秒钟按1下,那你的显示器显示1;按键1秒钟按2下,显示器显示2
作者: zl2168 时间: 2017-3-26 22:19
你没看到5挡测量频率:10~10kHz?
作者: 碎步湖上 时间: 2017-4-4 12:22
void Time0_int() interrupt 1 //初值1ms,定时1s,每一秒中断一次,所记得数就是频率,即频率检测
{
TH0=0xFC;
TL0=0x18;
lck++;
temp=~temp; //sbit temp=P1^0;使定时器每进入两次,temp一个周期
if(lck==1000)
{
disp=dispcount; //disp==xxxx,则xxxxHZ
lck=0;
dispcount=0;
}
}
我在上述语句增加了一个temp,用P3^3直接检测我用单片机产生的方波(P1^0),也能正常显示是500,但是用P3^3接方波发生器的产生的方波(产生500HZ),显示一直是1,只有不停的短触,才会突然数值上升又停止,这是怎么回事
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |