找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1013|回复: 1
打印 上一主题 下一主题
收起左侧

芯片是NUC029LAN,单片机检测高低电平的周期

[复制链接]
跳转到指定楼层
楼主
ID:1091366 发表于 2023-9-5 22:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用单片机来检测方波信号的周期,设定在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)
{                 

}
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:123289 发表于 2023-9-6 17:15 | 只看该作者
算是考试吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表