三、应广单片机 I/O 设定

本文介绍了嵌入式系统中IO配置的方法,包括T16M、ADCC、ADCM和INTEN等缓存器的设定语法。通过特定的语法如$IOxx,xx,可以方便地设置中断源及定时器等参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【IO的设定】

    在设定 T16M、ADCC、ADCM、INTEN、INTRQ 等缓存器时,有些人使用如下语法。


        $ ADCM  /16, 12BIT;         //  ADCM    =   100_0100_0b;
        $ ADCC  Enable, PB0;        //  ADCC    =   1_0_000_00b;
        $ T16M  EOSC, /1, BIT15;    //  T16M    =   0xA7;
    显然,就方便性和可读性来看,$ IO xx, xx 的语法似乎也是不错的选择。
你可从 Include files:xxx.INC 中,得到更多语法的了解,如下例。


    T16M        IO_RW       0x06
        $ 7 ~ 5 :   STOP, SYSCLK, X, X, IHRC, EOSC, ILRC, PA0
        $ 4 ~ 3 :   /1, /4, /16, /64
        $ 2 ~ 0 :   BIT8, BIT9, BIT10, BIT11, BIT12, BIT13, BIT14, BIT15
    ADCM        IO_RW       0x21
        $ 7 ~ 5 :   8BIT, 9BIT, 10BIT, 11BIT, 12BIT
        $ 3 ~ 1 :   /1, /2, /4, /8, /16, /32, /64, /128
    INTEN       IO_RW       0x04
        $ 3 :   X, AD
        $ 2 :   X, T16
        $ 1 :   X, PB0
        $ 0 :   X, PA0

    在 T16M 的定义中,可以知道 T16M 由 3 种字段组成,
而关键词 STOP、SYSCLK、IHRC、EOSC、ILRC、PA0 皆可用在 $ T16M 的语法中。
而 X 表示不存在的状态,如 $ 7 ~ 5  :  STOP, SYSCLK, X, X, IHRC, EOSC, ILRC, PA0,
相同的,/1, /4, /16, /64,BIT8 ~ BIT15 等关键词,也皆可用在 $ T16M 的语法中。

如果不想使用某种中断来源,只要不去宣告使用,????缺少的字段,组译器将以 0 取代该字段。

    在 INTEN 的定义中,有数种中断来源,如 AD、T16、PB0、PA0。
你可以将想设定为 1 的中断来源填入,没有填入的中断来源,组译器将以 0 取代该字段。
如下例:
        $ INTEN     PA0;        // INTEN = 0001B,只有 INTEN.PA0 = 1,其余为 0。
        $ INTEN     PB0, AD;    // INTEN = 1010B,只有 INTEN.PB0/AD = 1,其余为 0。
    当然,如果你只想改变 INTEN 中的某一项中断来源,也可以用如下语法:

        INTEN.PA0   =   1;      //  等同于  set1    INTEN.0
        INTRQ.T16   =   0;      //  等同于  set0    INTRQ.2
    在 $ IO  xx, yy 的语法中,如果少了某些字段,组译器将以默认值 (通常是 0)

设定该字段。如下例:


        $ T16M      SYSCLK, /16;    // 等同于 $ T16M    SYSCLK, /16, BIT8;
        $ T16M      STOP;           // T16M =   0; 或  $ T16M  STOP, /1, BIT8

    请不要自行更改 Include files:xxx.INC 的内容,否则,会造成组译的错误。


应广单片机(如PMS171B)进行ADC电压采集的实现方法主要涉及硬件配置与软件编程两个方面。以下是具体的实现方案: ### ADC初始化配置 在开始电压采集之前,需要对单片机的ADC模块进行初始化设置。这包括选择ADC输入引脚、设置采样分辨率、参考电压等参数。例如,在PMS171B中,ADC的参考电压通常使用VDD(5V),并通过寄存器配置使能ADC功能[^2]。 ```c void IO_Init (void) { $ ADC_IN in; // 设置PA.0为ADC输入 $ LED_OUT Out,High; // 设置PA.6为输出,用于LED控制 adcrgc = 0b0_000000; // 使用VDD作为ADC参考电压 } ``` ### 电压采样与处理 通过调用自定义函数`Gat_Adc()`来启动ADC转换并读取结果。该函数内部使用循环多次采样以提高精度,并将多次采样的值取平均(右移3位即除以8)作为最终结果。每次采样时需等待转换完成标志(AD_Done)置位后才读取数据。 ```c void Gat_Adc (void) { BYTE i; $ ADCC Enable, ADC_IN; // 启动ADC并选择输入通道 i = 8; AdcCnt = 0; while (i--) { AD_Start = 1; // 开始一次ADC转换 .wait1 AD_Done; // 等待转换完成 AdcCnt += ADCR; // 累加ADC结果 } AdcCnt = AdcCnt >> 3; // 取8次采样的平均值 } ``` ### 电压判断与控制逻辑 根据采集到的ADC数值进行电压判断,若AdcCnt大于等于127,则表示输入电压≥2.5V,此时点亮LED;否则关闭LED。这种比较方式基于10位ADC分辨率和5V参考电压的计算关系$$^2$$。 ```c if(AdcCnt >= 127) { // 检测是否达到2.5V(2.5/5*255) LED_OUT = 1; } else { LED_OUT = 0; } ``` ### 完整主程序结构 主程序中持续调用ADC采集函数并执行相应的判断逻辑,同时加入延时以避免高频刷新造成不稳定[^2]。 ```c void FPPA0 (void) { ADJUST_IC SYSCLK=IHRC/4, IHRC=16MHz, VDD=5V; IO_Init(); while (1) { Gat_Adc(); if(AdcCnt >= 127) LED_OUT = 1; else LED_OUT = 0; .delay 4000; // 延时约4ms } } ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值