#基于霍尔元件模块的测速程序
#原理:齿轮转一圈,霍尔元件模块通过齿轮上的磁铁产生下降沿信号,通过外部中断0,单片机记录一次。 设置了50MS时钟中断,每经过50MS单片机计算一次并通过LLCD1602显示。
#现象:就显示了5个0,不知道哪出了问题
#include
#include
unsigned int number=0;
unsigned int n=0;
unsigned int x=0;
void main()
{
IT0=1;
EX0=1;
EA=1; //设置int0为外部中断
TMOD &= 0xF0; //设置定时器模式 50ms
TMOD |= 0x01; //设置定时器模式
TL0 = 0x00; //设置定时初始值
TH0 = 0x4C; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
EA=1;
LCD_Init();
while(1)
{
if(n==1) //50ms检测一次
{
LCD_ShowNum(1,1,number*1200,5); //显示转速
number=0;
n=0;
}
}
}
void Timer0_Isr() interrupt 1 //时间中断
{
TL0 = 0x00; //设置定时初始值
TH0 = 0x4C; //设置定时初始值
n++;
}
void ex1_intr() interrupt 0 //外部中断
{
number++;
}
Build target 'Target 1'
compiling main.c...
linking...
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
SEGMENT: ?PR?_LCD_SHOWCHAR?LCD1602
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
SEGMENT: ?PR?_LCD_SHOWSTRING?LCD1602
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
SEGMENT: ?PR?_LCD_SHOWSIGNEDNUM?LCD1602
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
SEGMENT: ?PR?_LCD_SHOWHEXNUM?LCD1602
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
SEGMENT: ?PR?_LCD_SHOWBINNUM?LCD1602
Program Size: data=44.0 xdata=0 code=807
creating hex file from ".\Objects\检测"...
".\Objects\检测" - 0 Error(s), 5 Warning(s).
Build Time Elapsed: 00:00:00
代码中未看到明显错误。但您所描述的现象,即LCD上显示了5个0,可能是因为霍尔元件模块产生下降沿信号的速度过快,导致外部中断程序执行了多次,从而增加了测速计数,最终导致显示的转速过高。为了验证这一点,可以通过增加一个变量来记录外部中断是否被多次执行,并在每次外部中断中检查该变量,从而避免重复计数。同时,您还可以添加一些输出语句来观察程序运行情况,以便更好地定位问题。