本篇文章将介绍一个基于应广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;
/*有按键按下,充电和按键唤醒*/