应广PMS150C单片机开发案例

2023-12-01 20:41:00
fanhaiwei
原创
580
摘要:应广PMS150C单片机开发案例

本篇文章将介绍一个基于应广PMS150C单片机的开发案例。该单片机具有高性能、低功耗、高集成度等优点,被广泛应用于各种嵌入式系统开发中。通过这个案例,读者可以了解应广PMS150C单片机的基本使用方法、硬件设计、软件编程以及实际应用等方面的知识。

一、硬件设计

在本案例中,我们采用了应广PMS150C单片机作为主控制器,并选择了常见的外设器件,如LED灯、按键和蜂鸣器等。硬件设计主要包括单片机最小系统、外设电路和扩展电路三个部分。

1.单片机最小系统

单片机最小系统是整个硬件设计的核心部分,它包括单片机芯片、时钟电路、复位电路和电源电路等。在本案例中,我们采用了12MHz的晶振作为时钟源,并搭建了一个简单的复位电路和电源电路。

2.外设电路

外设电路主要包括LED灯、按键和蜂鸣器等。LED灯用于指示单片机的不同工作状态,按键用于输入信号,蜂鸣器用于发出声音提示。在本案例中,我们采用了三个LED灯分别表示电源、运行和故障状态,两个按键分别实现手动复位和模式切换,一个蜂鸣器用于发出声音提示。

3.扩展电路

扩展电路主要包括存储器和DAC等。存储器用于存储程序代码和数据,DAC用于输出模拟信号。在本案例中,我们采用了SPI接口的EEPROM芯片用于存储程序代码和数据,DAC则用于输出模拟信号。

二、软件编程

在本案例中,我们采用了C语言进行编程。软件编程主要包括初始化、按键处理、LED灯控制、DAC输出和蜂鸣器控制等部分。

1.初始化

初始化主要包括时钟配置、IO口配置和外设初始化等。在本案例中,我们配置了时钟源为12MHz,并将IO口配置为相应的输入输出模式。同时,我们初始化了EEPROM芯片、DAC和蜂鸣器等外设。

2.按键处理

按键处理主要包括按键按下和释放事件的检测和处理。在本案例中,我们采用了中断处理的方式进行按键检测,当按下按键时触发中断,然后在中断处理程序中读取按键状态并做出相应处理。

3.LED灯控制

LED灯控制主要包括LED灯的亮灭状态的切换。在本案例中,我们根据不同的工作状态控制相应的LED灯的亮灭状态。

4.DAC输出

DAC输出主要包括通过SPI接口输出模拟信号。在本案例中,我们通过配置DAC的寄存器输出相应的模拟信号。

5.蜂鸣器控制

蜂鸣器控制主要包括发出声音提示。在本案例中,我们通过控制蜂鸣器的频率和持续时间发出一系列声音提示。

三、实际应用

在本案例中,我们实现了一个基于应广PMS150C单片机的开发案例。该案例包括硬件设计和软件编程两个部分,并可以应用于各种嵌入式系统开发中。例如可以实现一种智能家居控制系统,通过应广PMS150C单片机控制家居电器的开关状态以及工作模式等。同时也可以应用于一些智能仪表和数据采集系统中,通过应广PMS150C单片机实现对模拟信号的采集和数据处理等功能。

     应广单片机价格美丽,性价比高,mini-c好用,适用于消费电子开发。但是案例demo太少了,为了方便大家能够快速入门。这里贴出了一份经典PMS150C的点灯程序代码。不是Hello world!那种,是偏向于实际产品的那种。


涉及到的内容有不少,包括应广单片机PMS150C:


1.端口输入输出配置


2.Tmr16中断配置(systick),倒计时


3.按键检测,包括防抖,可以用于长按键检测


4.低功耗,睡眠配置


5.唤醒


6.系统时钟配置,系统时钟切换


7.看门狗应用


8.状态机应用


其他比如PMS152,PMS132设置也类似,希望大家喜欢!


 


#include    "extern.h"


#define     HIGH    1

#define  LOW    0


#define DISABLE 0

#define ENABLE 1


#define EMPTY 0

#define FULL 1


#define ON 1

#define OFF 0


#define LED_OPEN 0


#define LED_FLASH 1


#define LED_BREATH 2


#define LED_CLOSE  3


//#define RUN_TMR  60000

/*单位 ms*/

#define RUN_TMR     15000


#define LOW_POW_TIMING_TMR  3000


BIT     LED_G           :        PA.3;

BIT     KEY_HIT            :        PA.4;


#define KEY_DEBOUNCE_CNT  20

#define KEY_LONG_PRESS_TIMER 1200


#define GRE_LED_FLASH  {if(LED_G){LED_G=0;}else{ LED_G=1;}}


/*计数值Cinit*/

word ucFlashTmrCnt;

/*cinit*/

BIT ubMsFlag; 


/*cinit*/

BIT  ubEnLedFlash; 


/*cinit*/

bit ubMod;

byte ucSysSt;

//byte ucLedPwmDt;


/*定时时间是否到了cinit*/

bit     FLAG_NMS;

/*计数值cinit*/

byte    count;

/*定时器初始化cinit*/

word    T16COUNTER;


Eword ueLowPowAltTm;


byte ucKeyHitHigtCnt;

byte ucKeyHitLowCnt;

byte ucKeyHitSt;

byte ucKeyHitBak;

word usKeyHitLoPreCnt;

word usKeyHitLoPreCntSet;

bit ucKeyHitPreSt;


byte ucLedSt;



void UpDateLedSt(void);

/***************************************/

void    TIME16_Init(void)

{

    /*计数值清零*/

    T16COUNTER    =488;

    /*ms标记reset*/

    FLAG_NMS    =0;

    

    /*使能定时器*/

    $    INTEN    T16;

    /*关中断*/

    INTRQ        =    0;

    

    /*停止定时器*/

       T16M.5        =0;               


    STT16 T16COUNTER;

    

    /*计算方法16M/*/

    $    T16M    IHRC,/1,BIT11;     

    


}


void StartLowPowTmr(void)

{

    ueLowPowAltTm=RUN_TMR;

}


/*低功耗*/

void LowPow(void)

{

    /*退出功能则进入低功耗*/

   if((!ueLowPowAltTm) )

   {

           ubEnLedFlash=0;

           GRE_LED_OFF;


        wdreset;

        /*IHRC ->ILRC,关看门狗*/

        CLKMD=0xf4;

        /*禁用IHRC*/

        CLKMD.4=0;

        

        while(1)

        {

             /*低功耗*/

             STOPSYS;

         


             /*有按键按下,充电和按键唤醒*/