用單片機來檢測方波信號的周期,設定在714ms-833ms之間,認為是正確的 報警一次,小于714ms,報警兩次,大于833ms,報警三次,目前程序邏輯上還有問題,希望大家能找出來
單片機源程序如下:
#include "NUC029xAN.h"
#include "timer.h"
#include <stdio.h>
#include "gpio.h"
#include <string.h>
void SYS_Init(void)
{
SYS_UnlockReg();
CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));
CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);
CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);
CLK_EnableModuleClock(PWM01_MODULE);
CLK_EnableModuleClock(TMR0_MODULE);
SYS_LockReg();
}
void GPIO_Init(void)
{
GPIO_SetMode(P4,BIT3,GPIO_PMD_OUTPUT);//BUZZER
P43=0;
GPIO_SetMode(P2, BIT7, GPIO_PMD_INPUT);//檢測電路
}
static void delay_ms(uint16_t nDelay)
{
uint16_t nIndex;
for(nIndex = 0; nIndex < nDelay; nIndex++)
{
CLK_SysTickDelay(1000);
}
}
uint8_t i;
void beep(int count)
{
for(i = 0; i < count; i++)
{
// 打開蜂鳴器
P43 = 1;
delay_ms(200); // 延遲一段時間,產生蜂鳴器聲音
// 關閉蜂鳴器
P43 = 0;
delay_ms(200); // 延遲一段時間,產生間隔
}
}
void Timer0_Init(void)
{
TIMER_Open(TIMER0, TIMER_PERIODIC_MODE, 1000); // 設置定時器0為周期模式,定時1ms
TIMER_EnableInt(TIMER0); // 使能定時器0的中斷
NVIC_EnableIRQ(TMR0_IRQn); // 使能定時器0的中斷向量
TIMER_Start(TIMER0); // 啟動定時器0
}
void TMR0_IRQHandler(void)
{
uint8_t state = 1; // 0表示低電平,1表示高電平
uint16_t high = 0; // 高電平加
uint16_t low = 0; // 低電平加
if (P27 == 0) // 檢測到低電平
{
if (state == 1) // 如果之前是高電平狀態,則開始計時低電平持續時間
{
state = 0;
low = 0;
}
low++;
}
else
{
if (state == 0) // 如果之前是低電平狀態,則開始計時高電平持續時間
{
state = 1;
high = 0;
}
high++;
}
if (high==low && high + low >=714&& high + low <= 833)
{
beep(1);
}
else if (high + low < 714 && high+low>0)
{
beep(2);
}
else if (high + low > 833)
{
beep(3);
}
TIMER_ClearIntFlag(TIMER0); // 清除定時器0的中斷標志
}
/*---------------------------------------------------------------------------------------------------------*/
/* MAIN function */
/*---------------------------------------------------------------------------------------------------------*/
int main(void)
{
SYS_UnlockReg();
SYS_Init();
SYS_LockReg();
LcmInit();
GPIO_Init();
while(1)
{
}
}
|