例程 应广单片机_应广单片机例程 - CSDN
  • 应广单片机Otp单核系列主要有以下几个系列,15x系列为纯iO,13x系列为带12bit的adc,17x系列为带8bit的adc,现在我用pms132B写个adc/pwm例程,方便大家快速上手.不多说,上代码. #include "extern.h" /**********adc***...

             应广单片机Otp单核系列主要有以下几个系列,15x系列为纯iO,13x系列为带12bit的adc,17x系列为带8bit的adc,现在我用pms132B写个adc/pwm例程,方便大家快速上手.不多说,上代码.

    #include    "extern.h"


    /**********adc*****************/
    Word usAdcSum;
    Word usAdcSumBak;

    BIT        THR             :PB.0;
    BIT        PWM             :PA.3;
    /*定时器初始化*/
    void PwmTmr2Init ( void )
    {
        tm2ct = 0x0;/*计数值*/
        //pwm duty
        tm2b = 0;//START_PWM_CNT;
        //8 位 pwm, 预分频 = 64, 分频 = 2, frq=970hz
        tm2s = 0b0_11_00000;
        //0010=HIRC输出 ,01= PB2,10=PA3,11=PB4, PWM模式,禁用极性反转
        tm2c = 0b0010_10_1_0;
    }

    void GetAdc(void)    //ADC采样处理
    {
         BYTE  ucCnt;
         
         $ ADCC Enable, THR    ;
         
         //8次采样做平均/
         ucCnt=8;
         //初始化
         usAdcSum=0;
         while ( ucCnt-- )
         {
             AD_Start=1;
            .wait1    AD_Done;
            //adc 采样值,12bit实际使用8bit
            usAdcSum +=ADCRH;
         }    
         //取平均值输出
         usAdcSum=usAdcSum>>3;  //temp除以8
    }


    void    FPPA0 (void)
    {
        .ADJUST_IC    SYSCLK=IHRC/2        //    SYSCLK=IHRC/2

        //    Insert Initial Code
        $ THR  in;
        $ PWM  out,low;


        /*bit config start
        b7:5@001=2V参考;000=VDD;
        b4@0f通道选择器
        b3:2@f通道band-gap参考电压选择
        b1:0@00=rsv
        bit config end*/
        adcrgc=0b000_0_00_00;

        
        PwmTmr2Init();
        while (1)
        {
            /**/
            GetAdc();
            /*当pwm占空比为0,会有关不断的现象,要做特殊处理*/
            if(usAdcSumBak!=usAdcSum)
            {
                usAdcSumBak=usAdcSum;

               /*更新占空比*/
                tm2b=usAdcSum$0;

               /*pwm输出为0*/
                if(!usAdcSum$0)
                {

                   /*关闭pwm输出*/
                    tm2c = 0b0010_00_1_0;
                    PWM=0;
                } 
                else
                {

                   /*打开pwm输出*/
                    tm2c = 0b0010_10_1_0;
                }
            }

        }
    }


    void    Interrupt (void)
    {
        pushaf;

        if (Intrq.T16)
        {    //    T16 Trig
            //    User can add code
            Intrq.T16    =    0;
            //...
        }

        popaf;
    }

    /*有啥问题可以留言,也可以联系本人QQ85547259*/

    展开全文
  • 应广单片机开发案例

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

            应广单片机价格美丽,性价比高,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;
             

                 /*有按键按下,充电和按键唤醒*/
                  if(KEY_HIT==0)
                  { 
                        /*退出低功耗*/
                        break; 
                  }
               
            }
            /*ILRC->IHRC ,
                 b7:5@001=IHRC/8,
                 b4@1=IHRC
                 
                 b3@1=模式1
                 b2@ 1=ILRC启动
                 b1@ 1=看门狗开启
                 b0@ 0=Pa5;
                 
                 模式口1;开看门狗*/
            CLKMD=0b001_1_1110;

            ucLedSt=1;
            ucSysSt=LED_CLOSE;
            StartLowPowTmr();
        }
        
    }

    void UpdateLedTmr(void)
    {
       /*使能,闪灯*/    
       if(ubEnLedFlash)
       {
             /*1ms进行一次计数*/
            ucFlashTmrCnt++;
            if(ucFlashTmrCnt>250)
            {
                ucFlashTmrCnt=0;
                /*标记*/
                ubMsFlag=1; 
            }
       }

    }

    /*闪灯*/
    void FlashLed(void)
    {
        /*定时时间到*/
        if(ubMsFlag)
        {
            /*闪灯*/
            GRE_LED_FLASH;
            ubMsFlag=0;
        }
    }


    /*端口检测*/
    void ResetKeyTmr(void)
    {

        if(KEY_HIT)
        {
            ucKeyHitHigtCnt=KEY_DEBOUNCE_CNT;
        }
        /*当前状态为0*/
        else
        {
            ucKeyHitLowCnt=KEY_DEBOUNCE_CNT;
        }

        
    }


    /*1ms任务函数*/
    void UpDateKeyTmr(void)
    {
          /*重新设置计数值*/ 
         ResetKeyTmr();
          /*KeyHit高电平计数值*/
         if(ucKeyHitHigtCnt)
         {
             ucKeyHitHigtCnt--;
            if(!ucKeyHitHigtCnt)
            {
                /*高电平倒计时完成说明当前为低*/
                ucKeyHitSt=LOW;
            }
         }
         /*高电平计数值为0*/
         else
         {
             usKeyHitLoPreCnt++;
            /*做饱和加*/
            if(usKeyHitLoPreCnt>20000)
            {
                usKeyHitLoPreCnt=20000;
            }
            
            if(usKeyHitLoPreCnt==usKeyHitLoPreCntSet)
            {
                /*10s 钟定信号*/
                ucKeyHitPreSt=1;
            }
         }

          /*KeyHit低电平计数值*/
         if(ucKeyHitLowCnt)
         {
             ucKeyHitLowCnt--;
            if(!ucKeyHitLowCnt)
            {
                /*低电平倒计时完成,说明当前为高*/
                ucKeyHitSt=HIGH;

                usKeyHitLoPreCnt=0;
                ucKeyHitPreSt=0;
            }
         }


    }

    void MsTask(void)
    {
        
        /*按键*/
        UpDateKeyTmr();

        UpdateLedTmr();
        
        FlashLed();

        
        /*低功耗定时器*/
        if(ueLowPowAltTm)
        {
            ueLowPowAltTm--;
        }
        
        LowPow();
        
    }


    void UpDateLedSt(void)
    {
        
        ucSysSt++;
        if(ucSysSt>1)
        {
            ucSysSt=0;
        }

        switch(ucSysSt)
        {
            /*开闪烁*/
            case 0:
                ubEnLedFlash=1;
                break;
                
            
            /*关灯*/
            case 1:
                ueLowPowAltTm=LOW_POW_TIMING_TMR;
                ubEnLedFlash=0;
                /*关灯,关闪烁*/
                GRE_LED_OFF;
                /*关灯*/
                break;
            default:
            break;
        }
        
    }


    /*状态切换*/
    void GetKeySt(void)
    {
       /*状态有变化*/
       if(ucKeyHitSt!=ucKeyHitBak)
       {
              /*保存当前状态*/
              ucKeyHitBak=ucKeyHitSt;
           
           if(!ucKeyHitSt)
           {    
                 /*更新倒计时*/
                    StartLowPowTmr();
                 /*状态切换*/
                 UpDateLedSt(); 
           }
          
       }
    }

    /*端口状态初始化*/
    void KeyAppInit(void)
    {
        
        if(KEY_HIT)
        {
            ucKeyHitSt=HIGH;
            ucKeyHitBak=HIGH;
        }
        else
        {
            ucKeyHitSt=LOW;
            ucKeyHitBak=LOW;
        }

       ucKeyHitHigtCnt=KEY_DEBOUNCE_CNT;
       ucKeyHitLowCnt=KEY_DEBOUNCE_CNT;
       usKeyHitLoPreCnt=0;
       ucKeyHitPreSt=0;
       
    }


    void    FPPA0 (void)
    {
        .ADJUST_IC    SYSCLK=IHRC/8, IHRC=16MHz, VDD=3.0V;
        $ CLKMD IHRC/8,En_IHRC,En_ILRC,En_WatchDog;
        /**/
        .delay 40000;
        
        $  LED_G    OUT,HIGH;          
        $  KEY_HIT    IN,PULL;   
        
        TIME16_Init();
        
        KeyAppInit();

       
        ucLedSt=1;

        ubMsFlag=0;

        ubEnLedFlash=0;
        
        /*长按键时间*/
        usKeyHitLoPreCntSet=3000;
        ucSysSt=LED_CLOSE;
        
        engint;
        while (1)
        {

                wdreset;

             /*1ms定时时间到*/
             if ( FLAG_NMS )
             {
              
                MsTask();

                /*清除标记*/
                FLAG_NMS=0;
            }
            
            /*取得按键状态*/
            GetKeySt();

            
        }
    }

    void    Interrupt ( void )
    {
        pushaf;

        if ( Intrq.T16 )  
        {

            Intrq.T16    =    0;
            
            STT16 T16COUNTER;

            
            
            if ( count>0 )
            {
                count--;
            }
            else
            {
                count   =   9;
                /*1ms*/
                FLAG_NMS=   1;      
            }

        }

        popaf;
    }

    /*end create by zhongvv QQ:85547259*/

     

    展开全文
  • 应广单片机主要应用于消费电子,资源有限,只有一个定时器,因此用好T16定时器就非常关键了.可以说是整个单片机系统的核心配置 不说那么多了,直接上代码. BIT LED_G : PA.3; #define GRE_LED_FLASH {if(LED_G){LED_G...

            应广单片机主要应用于消费电子,资源有限,只有一个定时器,因此用好T16定时器就非常关键了.可以说是整个单片机系统的核心配置

    不说那么多了,直接上代码.

    BIT     LED_G           :        PA.3;

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


    /*****************LED*******************/
    word ucFlashTmrCnt;
    BIT ubMsFlag; 

    /****************系统时钟*********************/
    bit     FLAG_NMS;
    byte    count;
    word    usTmrCnt;

    /**************T16*************************/
    void    TIME16_Init(void)
    {

      /*设置计数值*/
        usTmrCnt=488;

        ubMsFlag=0;
        /*定时器配置*/
        $    T16M    IHRC,/1,BIT11;   
        INTEN.T16 =1;/*开启定时中断*/
        
        Intrq.T16 =0;/*清除中断请求*/
    }

    void UpdateLedTmr(void)
    {
         
         /*1ms进行一次计数*/
        ucFlashTmrCnt++;
        if(ucFlashTmrCnt>250)
        {
            ucFlashTmrCnt=0;
            /*闪灯*/
            GRE_LED_FLASH;
        }
      

    }

    void    FPPA0 (void)
    {
        .ADJUST_IC    SYSCLK=IHRC/8, IHRC=16MHz, VDD=3.0V;
        $ CLKMD IHRC/8,En_IHRC,En_ILRC,En_WatchDog;

       /*上电延时*/
        .delay 40000;
        /*端口配置*/
        $  LED_G     OUT,HIGH;          
     
        /*定时器配置*/
        TIME16_Init();
        
           ENGINT //全局中断开启

        while (1)
        {
                wdreset;
             /*1ms定时时间到*/
             if ( FLAG_NMS )
             {
              
                 UpdateLedTmr();

                /*清除标记*/
                FLAG_NMS=0;
            }

        }
    }

    void    Interrupt ( void )
    {
        pushaf;

        if ( Intrq.T16 )  
        {

            Intrq.T16    =    0;
            /*重新设置计数值*/
            STT16 usTmrCnt;

            
            
            if ( count>0 )
            {
                count--;
            }
            else
            {
                count   =   9;
                /*1ms*/
                FLAG_NMS=   1;      
            }

        }

        popaf;
    }
     

     

    展开全文
  • 应广单片机demo

    2020-07-30 23:32:10
    应广单片机demo pmc131 pms132 pms150
  • 应广单片机代码

    2020-07-30 23:30:03
    pms131 demo,mini_c工程代码,入门好帮手,基本包括单片机所有外设资源基本操作.
  • 应广单片机查表

    2019-12-19 11:40:16
    如果又要用到表格怎么办,别急,应广单片机可以查rom表. 下面用数码管输出为例子,做个简单的表格.注意表格只支持byte类型;最多可以放入255个数据. 包括以下内容: 1.查表 2.循环 3.数码管显示. #include "extern...

            由于RAM有限,一般不建议在RAM中建立表格.如果又要用到表格怎么办,别急,应广单片机可以查rom表.

    下面用数码管输出为例子,做个简单的表格.注意表格只支持byte类型;最多可以放入255个数据.

    包括以下内容:

    1.查表

    2.循环

    3.数码管显示.


    #include    "extern.h"

    /*端口定义*/
    BIT     LED           :        PA.3;  

    byte ucNum;
    byte ucSeg;
    /* 共阳led表,共阴取反即可*/
    void ReadLedTab ( void )
    {    
        _pcadd
        {
            ret     0x3f;/*0*/
            ret    0x06;/*1*/
            ret    0x5b;/*2*/
             ret    0x4f;/*3*/
            ret    0x66;/*4*/
            ret    0x6d;/*5*/
            ret    0x7d;/*6*/
            ret    0x07;/*7*/
            ret    0x7f;/*8*/
            ret    0x6f;/*9*/
        }
    }

    /*相应于main函数*/
    void    FPPA0 (void)
    {
        /*系统时钟为 IHRC默认为16M,因此,IHRC/2=8M*/
        .ADJUST_IC    SYSCLK=IHRC/2    

        /*输入值*/
        ucNum=0;
        /*输出值*/
        ucSeg=0;


        /*主循环*/
        while (1)
        {

            /*更新输入值*/
              ucNum++;
            if(ucNum>10)
            {
                /*循环*/
                ucNum=1;
            } 
            /*查表输入*/
           A=ucNum;
           /*查表*/
           ReadLedTab();
           /*查表输出*/
           ucSeg=A;


        
        }
    }

    展开全文
  • 这一节开始从一个个实际例子,向大家展示应广单片机的各项功能。由于看本文的读者层次不相同,这里全部按照初学者视之。废话少说,上例程://======================================================== #include &...

            上一节介绍基础,由于时间仓促,写得十分模糊。这一节开始从一个个实际例子,向大家展示应广单片机的各项功能。由于看本文的读者层次不相同,这里全部按照初学者视之。

    废话少说,上例程:

    //========================================================
    #include "extern.h"
    
    KeyBounce  equ 30*1000    //30ms
    
    void FPPA0(void)
    {
    .ADJUST_IC SYSCLK=IHRC/2;
    pac = 0b_1111_1110;
    pa = 0b_0000_0000;
    paph = 0b_0000_0001;
    $ padier 0b_1111_1001;
    
    while (1)
    {
        if( pa.0 == 0 )
        {
            if(--KeyBounce  == 0)
            {
                if( pa.0 == 0 )
                {
                    A = pa.3;
                    A ~= 0b00001000;
                    pa = A; 
                }
            }
        }
    }
    }
    //========================================================

    以上例程非常简单

    #include "extern.h"

    是程序的头文件。

    void FPPA0(void)

    相当于程序的 main() 函数。

    .ADJUST_IC SYSCLK=IHRC/2;

    是对芯片时钟的设定,具体参考使用的单片机芯片来设定。

    pac = 0b_1111_1110;
    pa = 0b_0000_0000;
    paph = 0b_0000_0001;
    $ padier 0b_1111_1001;

    是对芯片引脚设定。这里设定 pa.0 为输入,启用上拉电阻。具体设置可参考芯片手册。

    while (1)

    无限循环函数,与大多数函数相似。

    if( pa.0 == 0 )
    判断 pa.0 是否被人按下了。如果不是,直接跳过。如果被按下。

    if(--KeyBounce  == 0)

    程序连续判断了30 * 1000 次后还是 被按下。执行:

    A = pa.3;
    A ~= 0b00001000;
    pa = A; 
    取反 pa.3 的电平。程序的外围器件将 pa.3 的引脚连接 LED 灯,取反 pa.3 的电平时,实现点亮或者熄灭一颗灯的效果。












    展开全文
  • 应广单片机点灯

    2019-12-19 11:39:36
    单片机入门都是从点灯开始的..让为了让新入手者能够尽快能够看到学习成果.我也来一个点灯.程序我每一句都 写上注释.有问题可以联系我. 程序包含包含以下内容: 1.IO口设置 2.系统时钟设置 3.延时 #include ...
  • 应广单片机-IO口的使用 今年入职了一家做方案的公司,有用到台湾广的单核单片机,对于一款新的单片机,开发环境跟标准C也有所区别,笔者学习这款单片机也是花了一些时间,目前还在学习中,网上相关的资料真的很少...
  • 应广单片机PMC150程序解析,工程新建及代码的实现方法,单路PWM输出
  • 应广单片机内部没有EEPROM,那么怎么解决每个单片机有不同的地址/ID呢?滚码就是一个解决方式.先写好代码,然后在烧录的时候可以设置一个初始值和滚动步长.,在初始值的基础上,每烧录一个单片机,码字按步长增加.这样就...
  • 只能向上计数,计数初始值可以通过stt16指令来设置,待会看代码里面,用来做中断就是当计数溢出是触发中断,具体的看例程吧。 /*****************************************************************************...
  • 单片机应用中,数码管是经常用的是器件之一.如果把一个简单的单片机系统看成是一台电脑,那么数码管就相当于一台电脑的显示器.现用一个2位半的数码管做个范例,循环显示0-199,稍作改造就可以做成一个计算器.使用8pin...
  • 在使用应广MINI-C过程中经常会看到有$这个符号,很多人问,这是啥意思. 比如 $ CLKMD IHRC/4,En_IHRC,En_ILRC,En_WatchDog;
  • 应广 Mini-c编程指南,pdf文档,Mini-c语法规则和举例
  • 采用PMC/PMS153芯片,选用哪一种芯片只需在文件中选定对应芯片即可。 定时器中断,1ms进一次中断,用示波器看过频率是正常的,误差小于1us。 /////////////////////////////////////////////////////////////////...
  • 如果说51单片机是通用型的单片机,那么应广单片是实用型的,适用于玩具,消费电子等产品开发.单片机内部集成了1.2V的band-gap参考电压,同时集成了比较器,这对于一些电池供电的产品,更具实用意义. 下面我就贴上比较器...
  • 应广带12位ADC单片机

    2018-11-18 10:00:25
    型号 SOP8 SOP14 SOP16 SOP20 ADC PWM 存储空间 PMS131 有 有 有 无 12位 有 2k PMS132 有 有 有 无 12位 有 2k ... 3k...
  • 例程所用的芯片是PMS132B-S14 这个demo主要介绍通过按键来点灯,按键扫描跟其他的开发环境的大同小异,主要有长按短按功能,比较简单,直接看代码吧,不懂得可以留言。基本上是用标准c的格式来写的,mini-c里面的...
  • 在实际应用中各类产品使用广泛,所用mini c资源,电子类 小风扇,无线充电,在实际中运用广泛的 吗,minic语言
1 2 3 4 5 ... 17
收藏数 334
精华内容 133
热门标签
关键字:

例程 应广单片机