T0 T1 DPTR 的赋值

本文介绍了在51单片机中DPTR与T0两种16位寄存器在赋值操作上的不同之处。DPTR仅能作为整体进行16位赋值,而T0则可以拆分为两个8位寄存器分别赋值。

T0  T1  dptr 都是16位的寄存器, 都可以拆开成2个8位寄存器

 

赋值时有区别

 

DPTR 只能作为16位寄存器赋值  如 mov  dptr ,  # 2000h, 不可以写成   mov  dph, #20h

 

而T0 正好相反, 不可以写成  mov  t0, # 1000h;  只能写成  mov  th0,  #10h  mov  tl0,  #00h

 

 

 

一点心得记于此 呵呵

请按要求修改如下 应广单片机 PMS132B 汇编语言子程序,由PB.3 IO 生成输出PWM 驱动RGB 5050灯珠中 G LED , 定时器T16已经设置成 1 MS 中断,PWM 频率为5KHZ,亮度占空比20%-100% ,分6级,开机亮度为50%, 周期10S循环, 要求配合RGB 色相使用, Duty_G_RGB_A;绿色占空比数据; Duty_R_RGB_A;红色占空比数据; Duty_B_RGB_A;蓝色占空比数据; G_VAL;绿色色相数据 R_VAL;红色相数据 B_VAL;蓝色色相数据 标志用BIT_FLAG,立即数不用#符号,可直接赋值,数据转移要通过A 累加器实现,要求使用应广专用指令 进位标志是:FC, 程序中要求加入色相值使用,配合RGB灯产生各种颜色, 每一行加注说明 ; 主程序开始 ORG 0000H GOTO MAIN ; 中断向量表 ORG 0X10H GOTO TIMER_ISR ; 定义数据段 ORG 0200H G_VAL: DB 20,40,60,80,100,80 ; 色相值数组(占空比) DUTY_CYCLE_STEPS EQU 6 ; 占空比级数 current_step DB 0 ; 当前色相步骤 flag_1ms DB 0 ; 1ms标志位 OCR1A DB 0 ; PWM输出寄存器模拟 ; 主程序入口 MAIN: CALL INIT_PWM ; 初始化PWM SET1 EA ; 允许全局中断 SET1 ET1 ; 启用定时器1中断 SET1 TR1 ; 启动定时器1 MOV R0, 0 ; 初始步骤寄存到R0 MOV current_step, R0 ; 更新当前步骤 LOOP: JNB flag_1ms, LOOP ; 等待1ms中断完成 CLR flag_1ms ; 清除1ms标志 ; 根据G_VAL数组更新当前占空比 MOV A, current_step ; 当前色相步骤加载到A MOV DPTR, G_VAL ; 指向G_VAL数组 MOVC A, @A+DPTR ; 取出对应色相值 MOV OCR1A, A ; 更新OCR寄存器 ; 设置PA3为输出 SET1 PA3DIR ; 设置PA3为输出方向 ; 根据OCR1A控制PA3输出(模拟PWM) CMP A, #50 ; 如果占空比 >= 50% JGE SET_HIGH ; 跳转至设置高电平 $ PA.3 out,LOW ; 否则设为低电平 SJMP NEXT_STEP SET_HIGH: $ PA.3 out,HIGH ; 设置PA3为高电平 NEXT_STEP: ; 更新当前步骤 INC A ; 增加当前步骤 MOV B, DUTY_CYCLE_STEPS ; 将最大步骤数放入B CMP A, B ; 比较A和B JEQ RESET_STEP ; 如果等于,则重置为0 MOV current_step, A ; 否则更新当前步骤 SJMP LOOP RESET_STEP: MOV A, 0 MOV current_step, A ; PWM初始化子程序 INIT_PWM: MOV P1DIR, 0FFH ; 设置P1口为输出(可选) MOV PWMCON, 0C3H ; 配置PWM模式(具体值根据手册调整) MOV PWMCLK, 08H ; 设置PWM时钟分频 MOV Duty_G_RGB_A, 20 ; 初始占空比设置为20% RET ; 定时器中断服务程序 TIMER_ISR: PUSH ACC ; 保存累加器 PUSH PSW ; 保存PSW状态字 SET1 flag_1ms ; 设置1ms标志位 POP PSW ; 恢复状态字 POP ACC ; 恢复累加器 RETI ; 返回主程序 ; 结束 END ;============================================================ PPOP: ;呼吸灯模式PWM L-H-H-L各 1.685S T0SN INITIALIZE_SET_STARTING_UP_FALG ; GOTO STARTING_ICE_PWM_MDDE_CHARGO ; MOV A,1 ; MOV PWM_DATA_TEMP_SAVE_H_LEVEL_R,A ; MOV A,224;190; ; MOV PWM_DATA_TEMP_SAVE_L_LEVEL_R,A ; SET1 INITIALIZE_SET_STARTING_UP_FALG STARTING_ICE_PWM_MDDE_CHARGO: T0SN REVERSE_RUN_FLAG ; GOTO REVERSE_WORK_MODE_CHARGO T0SN H_L_LEVEL_FLAG ; GOTO H_L_H_CHARGO ; ; PB.0=1; ; PB.1=1; ; PB.7=1; PA.6=1; INC H_L_LEVEV_COUNT_R ; MOV A,PWM_DATA_TEMP_SAVE_H_LEVEL_R XOR A,H_L_LEVEV_COUNT_R ; T1SN FZ ; RET ;RET CLEAR H_L_LEVEV_COUNT_R INC PWM_DATA_TEMP_SAVE_H_LEVEL_R DEC PWM_DATA_TEMP_SAVE_L_LEVEL_R SET1 H_L_LEVEL_FLAG ; H_L_H_CHARGO: ; PB.0=0; ; PB.1=0; ; PB.7=0; PA.6=0; INC H_L_LEVEV_COUNT_R ; MOV A,PWM_DATA_TEMP_SAVE_L_LEVEL_R XOR A,H_L_LEVEV_COUNT_R ;X T1SN FZ ; RET ;RET SET0 H_L_LEVEL_FLAG ; CLEAR H_L_LEVEV_COUNT_R ; MOV A,224;190; ; XOR A,PWM_DATA_TEMP_SAVE_H_LEVEL_R T1SN FZ ; RET ; ;---------- MOV A,224;190; ; MOV PWM_DATA_TEMP_SAVE_H_LEVEL_R,A MOV A,1 ; MOV PWM_DATA_TEMP_SAVE_L_LEVEL_R,A SET0 H_L_LEVEL_FLAG ; SET1 REVERSE_RUN_FLAG ; REVERSE_WORK_MODE_CHARGO: T0SN H_L_LEVEL_FLAG ; GOTO REVERSE_H_L_MODE_CHARGO ; PB.0=1; ; PB.1=1; ; PB.7=1; PA.6=1; INC H_L_LEVEV_COUNT_R ; MOV A,PWM_DATA_TEMP_SAVE_H_LEVEL_R XOR A,H_L_LEVEV_COUNT_R ; T1SN FZ ; RET ; CLEAR H_L_LEVEV_COUNT_R ; DEC PWM_DATA_TEMP_SAVE_H_LEVEL_R ; INC PWM_DATA_TEMP_SAVE_L_LEVEL_R ; SET1 H_L_LEVEL_FLAG ; REVERSE_H_L_MODE_CHARGO: ; PB.0=0; ; PB.1=0; ; PB.7=0; PA.6=0; INC H_L_LEVEV_COUNT_R ; MOV A,PWM_DATA_TEMP_SAVE_L_LEVEL_R ; XOR A,H_L_LEVEV_COUNT_R ; T1SN FZ ; RET ; SET0 H_L_LEVEL_FLAG ; CLEAR H_L_LEVEV_COUNT_R ; MOV A,224;190; ; XOR A,PWM_DATA_TEMP_SAVE_L_LEVEL_R ; T1SN FZ ; RET ; SET0 H_L_LEVEL_FLAG ; SET0 REVERSE_RUN_FLAG ; SET0 INITIALIZE_SET_STARTING_UP_FALG ; MOV A,1 ; MOV PWM_DATA_TEMP_SAVE_H_LEVEL_R,A ; MOV A,224;190; ; MOV PWM_DATA_TEMP_SAVE_L_LEVEL_R,A ; RET ;
09-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值