应广单片机开发_应广单片机开发c - CSDN
  • 这是应广单片机PADAUK开发环境V0.81版本,传上来当做是备份,方便大家下载。以后官网上面都是最新版本,想找到老版本估计都比较费劲。
  • 应广单片机开发 数组与指针.C
  • 应广单片机开发案例

    千次阅读 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*/

     

    展开全文
  • 一、应广单片机的Mini-C语言基础

    万次阅读 2018-05-07 13:59:15
    一、概述 项目需要性价比高一点的芯片,在澄海这边,台湾的芯片占了很大的市场...看了一下简介,应广单片机支持Mini-C语言,一看就跟C语言有关,我们来了解一下:二、Mini-C介绍 广科技的MINI-C语法结构,是一种...

    一、概述

            项目需要性价比高一点的芯片,在澄海这边,台湾的芯片占了很大的市场。台湾芯片的特点是便宜,没办法,玩具出口生产量太大,1分钱的差价都有可能累积出大价钱。选型时选了应广单片机。对于用惯了C开发的人,用汇编来开发还是有些抗拒的。看了一下简介,应广单片机支持Mini-C语言,一看就跟C语言有关,我们来了解一下:

    二、Mini-C介绍

           应广科技的MINI-C语法结构,是一种界于标准C和汇编的一种语言,对于小资源的MCU来说,该语法非常精简实用。

        

    也就是说,对比汇编程序,它的编写方法基本保留了C语言的风格。非常适合刚入手这款芯片的朋友。

    三、基础规则

            1、变量定义:大多数新手在C51中用 unsigned char 定义8位变量,unsigned int 定义16位变量,但是在Mini-C里。实验使用:    BYTE      为 8-BIT  数据型态;

                  WORD   为 16 BIT;

                  EWORD 为 24 BIT;

                  DWORD 为 32 BIT。

    相当于 #define  BYTE  unsigned char  ; #define  WORD  unsigned int 已经内部帮你设置好了。对比中应该看到我用了大写,我们知道在汇编中,没有大小写的区分,在这个 Mini-C 语言中,也没有大小写的区分

             所有的 WORD 变量,皆可以当 Point 使用。读取 ROM 的方法,一般有如下三种语法:

            ○  *Point$L    (取 Low Byte)。
            ○  *Point$H    (取 High Byte)。

            ○  *Point$W    (取 WORD)。

    四、程序表达

            C语言作为面向过程的语言,在这个Mini-C里表现的尤为彻底,先说一个短板,函数表达式不能带参数,也不能传出参数。这个玩法确实有点坑,不过好在汇编的语法它也支持一点,这样就好办了,我们用 累加器A 充当帮运工,带进数据和带出数据。

            优点在于,程序表达是保留了很多指令,这就为程序设计提供了很好的便捷性了。举个例子:

                WORD    ww;
                BIT     Bit_1;
                Bit_1   =   1;     //  等同于 SET1  Bit_1
                Bit_1   =   0;     //  等同于 SET0  Bit_1
                ww.15   =   1;  //  等同于 SET1  ww.15,等同于 SET1  hb@ww.7
                .DELAY    50;   //延时50个指令周
    通过查阅芯片的中文手册,即可得到芯片支持的指令。对于未知指令是否支持,也可以使用一下方法来查询:

    语法:_SYS(OP:指令) :   如果指令存在,则回传 1。
            指令的格式,采用各系列 IC 的 datasheet 的指令集命名方法。
        
            #if _SYS (OP:SWAPC IO.n)            // 判断是否有 swapc IO.n 的指令
                swapc_  EQU     swapc           // 将 swapc_ 直接代换成 swapc 指令
            #else
                swapc_  macro   iob             // 以宏指令取代 swapc 指令
                    iob =   0;
                    t0sn    CF;
                    iob =   1;
                endm
            #endif

            swapc_  IO_Bit;                     //  swapc_ 就可变成通用命令。


        其他类似命令,如    _SYS (OP:COMP A I)      //  A 跟立即值比较
                            _SYS (OP:PUSHW index)   //  pushw word_memory
                            _SYS (OP:SWAP M)        //  swap  byte_memory
                            _SYS (OP:XOR IO A)      //  xor   register, A
                            _SYS (OP:STOPEXE)       //
                            _SYS (OP:PMODE N)       //

        都可以用来判断指令是否支持。





    展开全文
  • 二、应广单片机点亮一个灯

    千次阅读 2018-06-18 00:48:09
    这一节开始从一个个实际例子,向大家展示应广单片机的各项功能。由于看本文的读者层次不相同,这里全部按照初学者视之。废话少说,上例程://======================================================== #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 的电平时,实现点亮或者熄灭一颗灯的效果。












    展开全文
  • 应广单片机优点之--$符号的说明

    千次阅读 2020-03-20 22:55:12
    在使用应广MINI-C过程中经常会看到有$这个符号,很多人问,这是啥意思. 比如 $ CLKMD IHRC/4,En_IHRC,En_ILRC,En_WatchDog;

            在使用应广单片机MINI-C过程中经常会看到有$这个符号,很多人问,这是啥意思?

     比如  $ CLKMD IHRC/4,En_IHRC,En_ILRC,En_WatchDog;

    相应的出处在:

    IDE的帮助也有说明.

     

     

            我们可以把$的指令看成是一种脚本或伪指令,主要是方便大家使用,方便大家快速上手,这也是应广单片机的优点之一.

    比如 $ T16M    IHRC, /1,BIT9;

    实际上可以用 T16M=0xXX;

    还可以 T16M=0B_XXXX_XXXX;

    相比之下,使用$进行配置的比较直观,相应的注释都可以省了.

    寄存器的配置都可以在项目文件.*.INC中找到.

     

    到此为止,欢迎探讨!

    展开全文
  • 应广单片机定时器中断配置

    千次阅读 2020-01-02 15:22:25
    应广单片机主要应用于消费电子,资源有限,只有一个定时器,因此用好T16定时器就非常关键了.可以说是整个单片机系统的核心配置 不说那么多了,直接上代码. BIT LED_G : PA.3; #define GRE_LED_FLASH {if(LED_G){LED_G...
  • 应广带12位ADC单片机

    千次阅读 2018-11-18 10:00:25
    型号 SOP8 SOP14 SOP16 SOP20 ADC PWM 存储空间 PMS131 有 有 有 无 12位 有 2k PMS132 有 有 有 无 12位 有 2k ... 3k...
  • 现针对应广单片机,以乘法为例,现做了一个程序,用于测量乘法所消耗的时间.不多说,上代码. /****************系统时钟*********************/ //byte count; word usTmrCnt; //bit FLAG_NMS; ...
  • 应广单片机adc和pwm例程

    千次阅读 2020-03-20 23:01:36
    应广单片机Otp单核系列主要有以下几个系列,15x系列为纯iO,13x系列为带12bit的adc,17x系列为带8bit的adc,现在我用pms132B写个adc/pwm例程,方便大家快速上手.不多说,上代码. #include "extern.h" /**********adc***...
  • 应广单片机比较器检测电池欠压

    千次阅读 2020-01-19 22:29:36
    如果说51单片机是通用型的单片机,那么应广单片是实用型的,适用于玩具,消费电子等产品开发.单片机内部集成了1.2V的band-gap参考电压,同时集成了比较器,这对于一些电池供电的产品,更具实用意义. 下面我就贴上比较器...
  • 应广单片机IO口配置

    2019-12-19 13:59:20
    应广单片机IO口主要由 3个寄存器进行设置 ,表中为PA.0的说明,其他端口同样适用. 例如io口有如下定义 BIT ADC_IN : PB.0; BIT USB_IN : PB.1; BIT LED : ...
  • 应广单片机-IO口的使用 今年入职了一家做方案的公司,有用到台湾广的单核单片机,对于一款新的单片机,开发环境跟标准C也有所区别,笔者学习这款单片机也是花了一些时间,目前还在学习中,网上相关的资料真的很少...
  • 应广IDE使用手册,新入手者可以看看 提供 101 条指令  绝大部分指令都是单周期(1T)指令  可程序设定的堆栈深度  提供数据与指令的直接、间接寻址模式  提供位(Bit)处理指令  所有的数据存储器都...
  • 稍作修改就可以用在pms152,pms132B灯应广其他系列的单片机中.不多说,上代码.一切尽在代码中. #include "extern.h" /*定时时间是否到了cinit*/ bit FLAG_NMS; /*计数值cinit*/ byte count; /*定时器初始化cinit*...
  • 学习51单片机最小开发系统需要准备一下工具 1.单片机(这不废话么)2.烧录软件(一般由单片机厂商提供)3.keilc(来源你懂的)4.驱动程序安装(单片机厂商提供) 下面是重点 1.建立新工程 2.在Atmel中选择...
  • 应广单片机-按键长短按功能

    千次阅读 2020-03-07 16:29:39
    这个demo主要介绍通过按键来点灯,按键扫描跟其他的开发环境的大同小异,主要有长按短按功能,比较简单,直接看代码吧,不懂得可以留言。基本上是用标准c的格式来写的,mini-c里面的一些指令用的很少。 ///////////...
  • 单片机应用中,数码管是经常用的是器件之一.如果把一个简单的单片机系统看成是一台电脑,那么数码管就相当于一台电脑的显示器.现用一个2位半的数码管做个范例,循环显示0-199,稍作改造就可以做成一个计算器.使用8pin...
  • 初学单片机应该要掌握的几个不易明白的概念
  • 原题链接 Eight Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 29854   Accepted: 12989   Special Judge Description ...The 15-puzzle has been around for ove
1 2 3 4 5 ... 20
收藏数 3,219
精华内容 1,287
关键字:

应广单片机开发