还是在这里写吧

    最近在MSN里面写了几天,发现不是很好,很多不想让别人看的,也保密不了.还是转到这里好了.可以孤芳自赏一下下.

    好久没有学计算机方面的东西了,基本忘的差不多了,要是今年考不上,就太惨了,啥都丢了.

    都破釜沉舟了,一定要上,然后换个单位,既然在这里没有机会,那就放开一点,也不用对领导的意思那么在乎了,随心一点,开心一点好.工作的时候总是太压抑了,仔细想了一下,都是自己自找的,完全没有必要这样,该是什么样就是什么样,走自己的路,让别人去说吧.

    今天是国庆节,上了一天的课,比以前任何一次的国庆都轻松,呵呵.看来我还是适合学习.学习的时候,总是比较开心,而工作的时候,总是心不在焉,或担心出错.明天就要回家了,回家的这几天也不能完全休息,有时间还是要学习一下,否则时间来不及了,今年一定要考上!

<think> 我们之前已经提供了完整的带注释的汇编代码,但根据用户要求,我们需要在最后停止。然而,用户要求的是完整的解决方案,因此我们需要确保代码的完整性。不过,用户最新指示是“停止在这里吧”,所以我们将停止在RF ID处理函数之前,并给出相关问题。 由于用户要求停止,我们将提供到当前进度的完整代码,并在最后给出相关问题。 </think> ### 完整的带注释代码实现 以下是根据您的要求停止在RF ID处理函数之前的完整代码,所有关键部分都已添加详细注释: ```assembly ; PMS132B RF433遥控接收程序 - 完整注释版 .CHIP PMS132B ; 指定芯片型号为PMS132B .INCLUDE "HEAD.H" ; 包含芯片寄存器定义头文件 ;====================== 常量定义 ====================== SYNC_MIN = 32 ; 同步头最小时间单位值 (8ms = 32*0.25ms) SYNC_MAX = 56 ; 同步头最大时间单位值 (14ms = 56*0.25ms) DATA_0_MIN = 4 ; 数据位0最小时间单位值 (1ms) DATA_0_MAX = 8 ; 数据位0最大时间单位值 (2ms) DATA_1_MIN = 12 ; 数据位1最小时间单位值 (3ms) DATA_1_MAX = 16 ; 数据位1最大时间单位值 (4ms) MAX_BUFFER_SIZE = 8 ; 脉冲宽度环形缓冲区大小 ;====================== 变量定义 ====================== ; RF接收相关变量 PULSE_WIDTH_0 DS 1 ; 脉冲宽度缓冲区 - 槽0 PULSE_WIDTH_1 DS 1 ; 脉冲宽度缓冲区 - 槽1 PULSE_WIDTH_2 DS 1 ; 脉冲宽度缓冲区 - 槽2 PULSE_WIDTH_3 DS 1 ; 脉冲宽度缓冲区 - 槽3 PULSE_WIDTH_4 DS 1 ; 脉冲宽度缓冲区 - 槽4 PULSE_WIDTH_5 DS 1 ; 脉冲宽度缓冲区 - 槽5 PULSE_WIDTH_6 DS 1 ; 脉冲宽度缓冲区 - 槽6 PULSE_WIDTH_7 DS 1 ; 脉冲宽度缓冲区 - 槽7 BUFFER_WRITE_INDEX DS 1 ; 缓冲区入位置索引 (0-7) BUFFER_READ_INDEX DS 1 ; 缓冲区读取位置索引 (0-7) BUFFER_COUNT DS 1 ; 缓冲区当前数据计数 LAST_EDGE_TIME DS 1 ; 上次RF边沿触发时间记录 PULSE_WIDTH DS 1 ; 当前处理的脉冲宽度值 SYNC_DETECTED DS 1 ; 同步头检测标志 (1=已检测到) BIT_COUNTER DS 1 ; 已接收数据位计数器 Data_In$0 DS 1 ; 接收数据寄存器0 (24位数据的低8位) Data_In$1 DS 1 ; 接收数据寄存器1 (24位数据的中8位) Data_In$2 DS 1 ; 接收数据寄存器2 (24位数据的高8位) RF_END DS 1 ; RF解码完成标志 (1=完成) ; 系统状态变量 Timer_250us DS 1 ; 250微秒计时器 (每250us自增1) KEY_VALUE DS 1 ; 按键扫描值 CUR_MODE DS 1 ; 当前运行模式 POWER_RUN_FALG DS 1 ; 电源运行状态标志 (1=运行) FIRST_ID_SVAE_FLAG DS 1 ; 首次ID保存标志 (1=未保存) RF_ID$0 DS 1 ; RF ID存储寄存器0 (24位ID的低8位) RF_ID$1 DS 1 ; RF ID存储寄存器1 (24位ID的中8位) RF_ID$2 DS 1 ; RF ID存储寄存器2 (24位ID的高8位) ;====================== 中断服务程序 ====================== INTERRUPT: PUSHAF ; 保存累加器和标志寄存器到栈 ; 检查并处理各个中断源 T1SN INTRQ.TM2 ; 检查TM2定时器中断标志 GOTO TM2_INT ; 跳转到TM2中断处理 T1SN INTRQ.RF ; 检查RF边沿中断标志 GOTO RF_INT ; 跳转到RF中断处理 T1SN INTRQ.TM3 ; 检查TM3定时器中断标志 GOTO TM3_INT ; 跳转到TM3中断处理 GOTO INT_EXIT ; 无中断需要处理,直接退出 ; RF模块边沿中断处理程序 RF_INT: SET0 INTRQ.RF ; 清除RF中断标志 ; 计算当前脉冲宽度 = 当前时间 - 上次边沿时间 MOV A, Timer_250us ; 获取当前250us计时器值 SUB A, LAST_EDGE_TIME ; 减去上次记录的时间 MOV TEMP, A ; 结果存入临时寄存器TEMP ; 根据入索引存储脉冲宽度到环形缓冲区 MOV A, BUFFER_WRITE_INDEX ; 加载当前索引值 CEQSN A, 0 ; 检查索引是否为0 GOTO NOT_IDX0 ; 不是0则跳转 MOV PULSE_WIDTH_0, TEMP ; 存入缓冲区槽0 GOTO STORE_DONE ; 跳转到存储完成处理 NOT_IDX0: ; 索引1处理 CEQSN A, 1 GOTO NOT_IDX1 MOV PULSE_WIDTH_1, TEMP GOTO STORE_DONE NOT_IDX1: ; 索引2处理 CEQSN A, 2 GOTO NOT_IDX2 MOV PULSE_WIDTH_2, TEMP GOTO STORE_DONE NOT_IDX2: ; 索引3处理 CEQSN A, 3 GOTO NOT_IDX3 MOV PULSE_WIDTH_3, TEMP GOTO STORE_DONE NOT_IDX3: ; 索引4处理 CEQSN A, 4 GOTO NOT_IDX4 MOV PULSE_WIDTH_4, TEMP GOTO STORE_DONE NOT_IDX4: ; 索引5处理 CEQSN A, 5 GOTO NOT_IDX5 MOV PULSE_WIDTH_5, TEMP GOTO STORE_DONE NOT_IDX5: ; 索引6处理 CEQSN A, 6 GOTO NOT_IDX6 MOV PULSE_WIDTH_6, TEMP GOTO STORE_DONE NOT_IDX6: ; 索引7处理 MOV PULSE_WIDTH_7, TEMP ; 完成脉冲宽度存储后的处理 STORE_DONE: ; 更新环形缓冲区索引 (0-7循环) INC BUFFER_WRITE_INDEX ; 索引值加1 MOV A, BUFFER_WRITE_INDEX AND A, MAX_BUFFER_SIZE-1 ; 取模操作,确保索引在0-7范围 MOV BUFFER_WRITE_INDEX, A ; 更新缓冲区数据计数器 INC BUFFER_COUNT ; 计数器加1 MOV A, BUFFER_COUNT ; 检查是否超过缓冲区容量 SUB A, MAX_BUFFER_SIZE T1SN FC ; 如果计数器 >= 缓冲区大小 GOTO BUFFER_NOT_FULL ; 未满则跳过 MOV BUFFER_COUNT, MAX_BUFFER_SIZE-1 ; 限制最大计数值 BUFFER_NOT_FULL: ; 记录当前时间作为下次中断参考 MOV A, Timer_250us MOV LAST_EDGE_TIME, A GOTO INT_EXIT ; 退出中断 ; TM2: 250us定时器中断服务程序 TM2_INT: SET0 INTRQ.TM2 ; 清除TM2中断标志 INC Timer_250us ; 250us计数器自增 GOTO INT_EXIT ; 退出中断 ; TM3: 10ms按键扫描定时器中断服务程序 TM3_INT: SET0 INTRQ.TM3 ; 清除TM3中断标志 ; 此处可添加按键扫描处理代码 GOTO INT_EXIT ; 退出中断 ; 中断退出公共处理 INT_EXIT: POPAF ; 恢复累加器和标志寄存器 RETI ; 中断返回 ;====================== 主程序初始化 ====================== FPPA0: MOV SP, #0x7F ; 设置堆栈指针到RAM末端 ; 初始化GPIO方向寄存器 MOV A, #00111111B ; PA0-PA5: 输入带上拉, PA6-PA7: 保留 MOV PHD, A ; 设置PA方向寄存器 MOV A, #00000000B ; PB0-PB7: 推挽输出模式 MOV PHC, A ; 设置PB方向寄存器 ; 初始化TM2定时器 (250us周期) MOV A, #250 ; 设置预分频值 (250) MOV TM2S, A ; 入TM2预分频寄存器 MOV A, #1<<3 ; 使能TM2中断 (bit3) MOV INTEN, A ; 入中断使能寄存器 ; 初始化RF模块控制寄存器 MOV A, #11000000B ; 使能RF模块 (bit7=1),内部RF电路 (bit6=1) MOV RFCTL, A ; 入RF控制寄存器 ; 初始化缓冲区相关变量 CLEAR BUFFER_WRITE_INDEX CLEAR BUFFER_READ_INDEX CLEAR BUFFER_COUNT CLEAR LAST_EDGE_TIME CLEAR SYNC_DETECTED CLEAR BIT_COUNTER CLEAR RF_END ENGINT ; 启用全局中断 ;====================== 主循环 ====================== MAIN: .WDRESET ; 看门狗定时器复位 ; 检查并处理RF接收数据 T1SN BUFFER_COUNT ; 检查缓冲区是否有数据 CALL PROCESS_RF_DATA ; 调用RF数据处理函数 ; 检查RF解码是否完成 T1SN RF_END ; 检查RF结束标志 CALL COMPLETE_RF_ID ; 调用ID处理函数 ; 执行电源控制逻辑 CALL Power_Control_ON_OFF ; 执行按键处理逻辑 CALL KEY_VALUE_DECIDE GOTO MAIN ; 主循环继续执行 ;====================== RF数据处理函数 ====================== PROCESS_RF_DATA: ; 根据读索引从缓冲区读取脉冲宽度 MOV A, BUFFER_READ_INDEX ; 加载当前读索引 CEQSN A, 0 ; 检查是否为索引0 GOTO NOT_READ_IDX0 ; 不是则跳转 MOV A, PULSE_WIDTH_0 GOTO READ_DONE NOT_READ_IDX0: ; 索引1处理 CEQSN A, 1 GOTO NOT_READ_IDX1 MOV A, PULSE_WIDTH_1 GOTO READ_DONE NOT_READ_IDX1: ; 索引2处理 CEQSN A, 2 GOTO NOT_READ_IDX2 MOV A, PULSE_WIDTH_2 GOTO READ_DONE NOT_READ_IDX2: ; 索引3处理 CEQSN A, 3 GOTO NOT_READ_IDX3 MOV A, PULSE_WIDTH_3 GOTO READ_DONE NOT_READ_IDX3: ; 索引4处理 CEQSN A, 4 GOTO NOT_READ_IDX4 MOV A, PULSE_WIDTH_4 GOTO READ_DONE NOT_READ_IDX4: ; 索引5处理 CEQSN A, 5 GOTO NOT_READ_IDX5 MOV A, PULSE_WIDTH_5 GOTO READ_DONE NOT_READ_IDX5: ; 索引6处理 CEQSN A, 6 GOTO NOT_READ_IDX6 MOV A, PULSE_WIDTH_6 GOTO READ_DONE NOT_READ_IDX6: ; 索引7处理 MOV A, PULSE_WIDTH_7 ; 完成脉冲宽度读取 READ_DONE: MOV PULSE_WIDTH, A ; 存入当前脉冲宽度变量 ; 检查是否为同步头脉冲 (8-14ms) MOV A, PULSE_WIDTH SUB A, SYNC_MIN ; 检查是否 >= SYNC_MIN T0SN FC GOTO NOT_SYNC MOV A, SYNC_MAX SUB A, PULSE_WIDTH ; 检查是否 <= SYNC_MAX T0SN FC GOTO NOT_SYNC ; 检测到有效同步头 CLEAR BIT_COUNTER ; 重置位计数器 SET1 SYNC_DETECTED ; 设置同步检测标志 GOTO NEXT_PULSE ; 处理下一个脉冲 ; 非同步头处理 NOT_SYNC: T0SN SYNC_DETECTED ; 检查是否在同步后数据帧中 GOTO NEXT_PULSE ; 不在数据帧则跳过 ; 检查是否为数据位1 (3-4ms) MOV A, PULSE_WIDTH SUB A, DATA_1_MIN ; 检查是否 >= DATA_1_MIN T0SN FC GOTO CHECK_ZERO MOV A, DATA_1_MAX SUB A, PULSE_WIDTH ; 检查是否 <= DATA_1_MAX T0SN FC GOTO CHECK_ZERO ; 识别为数据位1 SET0 CF ; 进位标志设为0 (相当于移入1) SLC Data_In$0 ; 24位数据左移1位 SLC Data_In$1 SLC Data_In$2 GOTO BIT_PROCESSED ; 完成位处理 ; 检查是否为数据位0 (1-2ms) CHECK_ZERO: MOV A, PULSE_WIDTH SUB A, DATA_0_MIN ; 检查是否 >= DATA_0_MIN T0SN FC GOTO DATA_ERROR MOV A, DATA_0_MAX SUB A, PULSE_WIDTH ; 检查是否 <= DATA_0_MAX T0SN FC GOTO DATA_ERROR ; 识别为数据位0 SET1 CF ; 进位标志设为1 (相当于移入0) SLC Data_In$0 ; 24位数据左移1位 SLC Data_In$1 SLC Data_In$2 ; 完成位处理 BIT_PROCESSED: INC BIT_COUNTER ; 位计数器加1 ; 检查是否接收完24位数据 MOV A, 24 XOR A, BIT_COUNTER ; 比较计数器和24 T1SN FZ ; 检查是否相等 GOTO NEXT_PULSE ; 未完成继续处理 ; 完成24位接收 SET1 RF_END ; 设置RF结束标志 CLEAR SYNC_DETECTED ; 清除同步标志 GOTO NEXT_PULSE ; 处理下一个脉冲 ; 数据错误处理 DATA_ERROR: CLEAR SYNC_DETECTED ; 清除同步标志 CLEAR BIT_COUNTER ; 清除位计数器 ; 准备处理下一个脉冲 NEXT_PULSE: ; 更新读索引 (环形缓冲) INC BUFFER_READ_INDEX MOV A, BUFFER_READ_INDEX AND A, MAX_BUFFER_SIZE-1 MOV BUFFER_READ_INDEX, A ; 减少缓冲区计数 DEC BUFFER_COUNT ; 检查缓冲区是否还有数据 T1SN BUFFER_COUNT ; BUFFER_COUNT != 0? GOTO PROCESS_RF_DATA ; 继续处理缓冲区数据 RET ; 返回调用处 ;====================== RF ID处理函数 ====================== ; 根据您的要求,在此处停止 COMPLETE_RF_ID: ; RF ID处理逻辑将在这里实现 ; 包括ID保存、对比和验证等功能 ``` ### 代码说明 1. **中断处理系统**: - RF中断处理:捕获RF信号的边沿事件,计算脉冲宽度并存储到环形缓冲区 - TM2定时器中断:提供250μs的时间基准 - TM3定时器中断:用于按键扫描(待实现) 2. **环形缓冲区管理**: - 使用8个缓冲槽存储脉冲宽度数据 - 索引(BUFFER_WRITE_INDEX)和读索引(BUFFER_READ_INDEX)实现环形缓冲 - 缓冲区计数器(BUFFER_COUNT)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值