NEC单片机 0527系列编程解读

部分代码Io配置:

一;端口配置

n = 0x55 ;

P1 = 0xff;          //P1口赋初值

PM1 = 0x00 ;   //设置P1口为输出模式

P1 = n ;            //从P1口输出数据55H

P0 = 0x00;          //P0口赋初值

PM0 = 0xff ;   //设置P0口为输入模式

 n = P0 ;            //从P0口读入数据到变量n中

二,其他配置

PCC=0x00;    //主系统时钟振荡允许,CPU使用主系统时钟,时钟频率为fx

三,(1)模数AD转换

  转换方法采用逐次逼近法,转换结果存放在8位A/D转换结果寄存器ADCR中。

关系为:ADCR = INT(256* Vin /A Vref  + 0.5)

式中   INT( )------把()内的值取数;

           Vin------模拟输入电压

           A Vref------基准电压端子的电压值

           ADCR------ad转换结果寄存器的值

ADM = 0x01  //ANI0 模拟通道;

(2)数模(D/A)转换器

  从D/A转换器的输出引脚ANO0/P130.ANO1/P131 输出的模拟电压值由下式决定:

 ANOn输出电压

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于51单片机NEC协议状态机编程示例: ```c #include <reg51.h> #define IR_IN P3_2 // NEC协议定义的高低电平时间 #define T1 560 #define T2 1690 #define T3 45000 #define T4 22500 // 状态定义 #define STATE_IDLE 0 #define STATE_START 1 #define STATE_BIT 2 // 全局变量 unsigned char ir_state = STATE_IDLE; // 初始化为IDLE状态 unsigned char ir_code = 0; unsigned char ir_count = 0; void delay_us(unsigned int us) { while(us--) { _nop_(); } } // NEC协议解码函数 void ir_decode(unsigned char code) { // 解码操作 } void ir_timer_handler() { static unsigned int ir_timer_count = 0; static unsigned char ir_last_state = 0; // 读取当前状态 unsigned char ir_cur_state = IR_IN; // 状态转移 switch (ir_state) { case STATE_IDLE: if (ir_cur_state == 0 && ir_last_state == 1) { ir_timer_count = 0; ir_state = STATE_START; } break; case STATE_START: if (ir_cur_state == 1 && ir_last_state == 0) { if (ir_timer_count >= T1 && ir_timer_count <= T2) { ir_code = 0; ir_count = 0; ir_state = STATE_BIT; } else { ir_state = STATE_IDLE; } } break; case STATE_BIT: if (ir_cur_state == 1 && ir_last_state == 0) { if (ir_timer_count >= T1 && ir_timer_count <= T2) { ir_code >>= 1; if (ir_timer_count > T2 - T1) { ir_code |= 0x80; } ir_count++; if (ir_count >= 8) { ir_decode(ir_code); ir_state = STATE_IDLE; } } else { ir_state = STATE_IDLE; } } break; default: ir_state = STATE_IDLE; break; } // 更新last_state并清零计数器 ir_last_state = ir_cur_state; ir_timer_count = 0; } void main() { TMOD = 0x01; // 定时器0工作在模式1 TH0 = 0xFC; // 定时器初值 TL0 = 0x67; ET0 = 1; // 打开定时器0中断 EA = 1; // 打开总中断 while(1) { // 等待中断处理 } } // 定时器0中断 void timer0_isr() interrupt 1 { TH0 = 0xFC; // 定时器初值 TL0 = 0x67; ir_timer_handler(); // 处理红外信号 } ``` 以上代码通过定时器0中断处理来实现NEC协议的红外信号解码。整个解码过程是通过状态机实现的,分为三个状态:IDLE、START和BIT。在IDLE状态下,等待红外信号开始;在START状态下,检测红外信号开始;在BIT状态下,解码红外信号。在定时器中断处理函数中,会根据当前状态和红外信号的高低电平时间来进行状态转移和解码操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值