用汇编语言写一个红外遥控接收板程序代码

发布时间:2023-01-30  

用STC的MCU的IO方式控制74HC595驱动8位数码管。

红外接收程序。适用于市场上用量最大的NEC编码。查询方式, Timer0十六位自动重装, 100us

应用层查询 B_IR_Press标志为,则已接收到一个键码放在IR_code中,

数码管左起4位显示用户码, 最右边两位显示数据, 均为十六进制.

Fosc_KHZ EQU 22118 ;22118KHZ, 用户只需要改动这个值以适应自己实际的频率

STACK_POIRTER EQU 0D0H ;堆栈开始地址

Timer0_Reload EQU (65536 - (Fosc_KHZ+5)/10) ; Timer 0 中断频率, 10000次/秒

DIS_DOT EQU 020H

DIS_BLACK EQU 010H

DIS_ EQU 011H

AUXR DATA 08EH

P4 DATA 0C0H

P5 DATA 0C8H

P0M1 DATA 0x93 ;

P0M0 DATA 0x94 ;

P1M1 DATA 0x91 ;

P1M0 DATA 0x92 ;

P2M1 DATA 0x95 ;

P2M0 DATA 0x96 ;

P3M1 DATA 0xB1 ;

P3M0 DATA 0xB2 ;

P4M1 DATA 0xB3 ;

P4M0 DATA 0xB4 ;

P5M1 DATA 0xC9 ;

P5M0 DATA 0xCA ;

P6M1 DATA 0xCB ;

P6M0 DATA 0xCC ;

P7M1 DATA 0xE1 ;

P7M0 DATA 0xE2 ;

P_HC595_SER BIT P4.0 ; //pin 14 SER data input

P_HC595_RCLK BIT P5.4 ; //pin 12 RCLk store (latch) clock

P_HC595_SRCLK BIT P4.3 ; //pin 11 SRCLK Shift data clock

Flag0 DATA 20H

B_1ms BIT Flag0.0 ; 1ms标志

LED8 DATA 30H ; 显示缓冲 30H ~ 37H

display_index DATA 38H ; 显示位索引

cnt_1ms DATA 39H ;

;红外接收程序变量声明

P_IR_RX BIT P3.6 ;定义红外接收输入IO口

P_IR_RX_temp BIT Flag0.1 ;用户不可操作, Last sample

B_IR_Sync BIT Flag0.2 ;用户不可操作, 已收到同步标志

IR_SampleCnt DATA 3AH ;用户不可操作, 采样计数

IR_BitCnt DATA 3BH ;用户不可操作, 编码位数

IR_UserH DATA 3CH ;用户不可操作, 用户码(地址)高字节

IR_UserL DATA 3DH ;用户不可操作, 用户码(地址)低字节

IR_data DATA 3EH ;用户不可操作, 数据原码

IR_DataShit DATA 3FH ;用户不可操作, 数据移位

B_IR_Press BIT Flag0.3 ;用户使用, 按键动作发生

IR_code DATA 40H ;用户使用, 红外键码

UserCodeH DATA 41H ;用户使用, 用户码高字节

UserCodeL DATA 42H ;用户使用, 用户码低字节

ORG 0000H ;reset

LJMP F_Main

ORG 000BH ;1 Timer0 interrupt

LJMP F_Timer0_Interrupt

ORG 0100H ;reset

F_Main:

CLR A

MOV P0M1, A ;设置为准双向口

MOV P0M0, A

MOV P1M1, A ;设置为准双向口

MOV P1M0, A

MOV P2M1, A ;设置为准双向口

MOV P2M0, A

MOV P3M1, A ;设置为准双向口

MOV P3M0, A

MOV P4M1, A ;设置为准双向口

MOV P4M0, A

MOV P5M1, A ;设置为准双向口

MOV P5M0, A

MOV P6M1, A ;设置为准双向口

MOV P6M0, A

MOV P7M1, A ;设置为准双向口

MOV P7M0, A

MOV SP, #STACK_POIRTER

MOV PSW, #0 ;选择第0组R0~R7

USING 0 ;选择第0组R0~R7

MOV display_index, #0

MOV R0, #LED8

MOV R2, #8

L_ClearLoop:

MOV @R0, #DIS_

INC R0

DJNZ R2, L_ClearLoop

MOV R0, #LED8+4

MOV @R0, #DIS_BLACK ;上电消隐

INC R0

MOV @R0, #DIS_BLACK ;上电消隐

CLR TR0

ORL AUXR, #(1 SHL 7) ; Timer0_1T();

ANL TMOD, #NOT 04H ; Timer0_AsTimer();

ANL TMOD, #NOT 03H ; Timer0_16bitAutoReload();

MOV TH0, #Timer0_Reload / 256 ;Timer0_Load(Timer0_Reload);

MOV TL0, #Timer0_Reload MOD 256

SETB ET0 ; Timer0_InterruptEnable();

SETB TR0 ; Timer0_Run();

SETB EA ; 打开总中断

MOV cnt_1ms, #10

L_Main_Loop:

JNB B_1ms, L_Main_Loop ;1ms未到

CLR B_1ms

JNB B_IR_Press, L_Main_Loop ;未检测到收到红外键码

CLR B_IR_Press ;检测到收到红外键码

MOV A, UserCodeH

SWAP A

ANL A, #0FH

MOV LED8+0, A ;用户码高字节的高半字节

MOV A, UserCodeH

ANL A, #0FH

MOV LED8+1, A ;用户码高字节的低半字节

MOV A, UserCodeL

SWAP A

ANL A, #0FH

MOV LED8+2, A ;用户码低字节的高半字节

MOV A, UserCodeL

ANL A, #0FH

MOV LED8+3, A ;用户码低字节的低半字节

MOV A, IR_code

SWAP A

ANL A, #0FH

MOV LED8+6, A ;遥控数据的高半字节

MOV A, IR_code

ANL A, #0FH

MOV LED8+7, A ;遥控数据的低半字节

LJMP L_Main_Loop

T_Display: ;标准字库

; 0 1 2 3 4 5 6 7 8 9 A B C D E F

DB 03FH,006H,05BH,04FH,066H,06DH,07DH,007H,07FH,06FH,077H,07CH,039H,05EH,079H,071H

; black - H J K L N o P U t G Q r M y

DB 000H,040H,076H,01EH,070H,038H,037H,05CH,073H,03EH,078H,03dH,067H,050H,037H,06EH

; 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1

DB 0BFH,086H,0DBH,0CFH,0E6H,0EDH,0FDH,087H,0FFH,0EFH,046H

T_COM:

DB 001H,002H,004H,008H,010H,020H,040H,080H ; 位码

F_Send_595:

PUSH AR2 ;R2入栈

MOV R2, #8

L_Send_595_Loop:

RLC A

MOV P_HC595_SER,C

SETB P_HC595_SRCLK

CLR P_HC595_SRCLK

DJNZ R2, L_Send_595_Loop

POP AR2 ;R2出栈

RET

F_DisplayScan:

PUSH DPH ;DPH入栈

PUSH DPL ;DPL入栈

PUSH AR0 ;R0 入栈

MOV DPTR, #T_COM

MOV A, display_index

MOVC A, @A+DPTR

CPL A

LCALL F_Send_595 ;输出位码

MOV DPTR, #T_Display

MOV A, display_index

ADD A, #LED8

MOV R0, A

MOV A, @R0

MOVC A, @A+DPTR

LCALL F_Send_595 ;输出段码

SETB P_HC595_RCLK

CLR P_HC595_RCLK ; 锁存输出数据

INC display_index

MOV A, display_index

ANL A, #0F8H ; if(display_index >= 8)

JZ L_QuitDisplayScan

MOV display_index, #0; ;8位结束回0

L_QuitDisplayScan:

POP AR0 ;R0 出栈

POP DPL ;DPL出栈

POP DPH ;DPH出栈

RET

F_Timer0_Interrupt: ;Timer0 1ms中断函数

PUSH PSW ;PSW入栈

PUSH ACC ;ACC入栈

PUSH AR7 ;SampleTime

LCALL F_IR_RX_NEC

DJNZ cnt_1ms, L_Quit_1ms

MOV cnt_1ms, #10

LCALL F_DisplayScan ; 1ms扫描显示一位

SETB B_1ms ; 1ms标志

L_Quit_1ms:

POP AR7

POP ACC ;ACC出栈

POP PSW ;PSW出栈

RETI

;this programme is used for Receive IR Remote (NEC Code).

;data format: Synchro, AddressH, AddressL, data, /data, (total 32 bit).

;send a frame(85ms), pause 23ms, send synchro of continue frame, pause 94ms

;data rate: 108ms/Frame

;Synchro: low=9ms, high=4.5 / 2.25ms, low=0.5626ms

;Bit0: high=0.5626ms, low=0.5626ms

;Bit1: high=1.6879ms, low=0.5626ms

;frame rate = 108ms ( pause 23 ms or 96 ms)

;红外采样时间宏定义, 不要随意修改

D_IR_sample EQU 100 ;查询时间间隔, 100us, 红外接收要求在60us~250us之间

D_IR_SYNC_MAX EQU (15000/D_IR_sample) ;SYNC max time

D_IR_SYNC_MIN EQU (9700 /D_IR_sample) ;SYNC min time

D_IR_SYNC_DIVIDE EQU (12375/D_IR_sample) ;decide data 0 or 1

D_IR_DATA_MAX EQU (3000 /D_IR_sample) ;data max time

D_IR_DATA_MIN EQU (600 /D_IR_sample) ;data min time

D_IR_DATA_DIVIDE EQU (1687 /D_IR_sample) ;decide data 0 or 1

D_IR_BIT_NUMBER EQU 32 ;bit number

F_IR_RX_NEC:

INC IR_SampleCnt ;Sample + 1

MOV C, P_IR_RX_temp ;Save Last sample status

MOV F0, C

MOV C, P_IR_RX ;Read current status

MOV P_IR_RX_temp, C

JNB F0, L_QuitIrRx ;Pre-sample is high

JB P_IR_RX_temp, L_QuitIrRx ;and current sample is low, so is fall edge

MOV R7, IR_SampleCnt ;get the sample time

MOV IR_SampleCnt, #0 ;Clear the sample counter

MOV A, R7 ; if(SampleTime > D_IR_SYNC_MAX) B_IR_Sync = 0

SETB C

SUBB A, #D_IR_SYNC_MAX

JC L_IR_RX_1

CLR B_IR_Sync ;large than the Maxim SYNC time, then error

RET

L_IR_RX_1:

MOV A, R7 ; else if(SampleTime >= D_IR_SYNC_MIN)

CLR C

SUBB A, #D_IR_SYNC_MIN

JC L_IR_RX_2

MOV A, R7 ; else if(SampleTime >= D_IR_SYNC_MIN)

SUBB A, #D_IR_SYNC_DIVIDE

JC L_QuitIrRx

SETB B_IR_Sync ;has received SYNC

MOV IR_BitCnt, #D_IR_BIT_NUMBER ;Load bit number

RET

L_IR_RX_2:

JNB B_IR_Sync, L_QuitIrRx ;else if(B_IR_Sync), has received SYNC

MOV A, R7 ; if(SampleTime > D_IR_DATA_MAX) B_IR_Sync = 0, data samlpe time too large

SETB C

SUBB A, #D_IR_DATA_MAX

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    光,并将该光信号转变成电信号,进行放大、解调的装置,称为红外遥控接收头。   1.2 红外接收头的内部构造   接收头内部框架如图1所示,主要包括接收......
    机顶盒遥控接收头_数字电视与网络机顶盒应用的区别;遥控红外线接收头和机顶盒接收头其实没有很大的区别,现在很多的红外接收头都是在不同产品上可以通用的,只要红外接收头的工作电压、载波频率、波长一样,更主要的是满足你的红外遥控接收......
    电路、红外解码、电源和应用电路组成。红外遥控接收器的主要作用是将遥控发射器发来的红外光信好转换成电信号,再放大、限幅、 检波、整形,形成遥控指令脉冲,输出至遥控微处理器。 由于红外接收头......
    电路时都要看清引脚的序号(插座上打有序号),搞错了就不好了。图三是元件中的一体化红外遥控接收头和三极管9012的引脚示意图,要注意的是图中的9012的引脚示意图只是我购买到的9012的引脚极性示意图,可能......
    小可以改变发射距离。 3.2 红外遥控接收电路设计 如图3所示,该图为红外遥控接收电路图。 如图3所示,单片机的左半部分是万能红外接收头IR1838,其管脚1为输出,管脚2,3分别是接地和电源的输入,电源电压仍然为5......
    模式的STC12C5A60S2单片机,之所以用STC12系列而没用更快的STC15系列时因为12系列DIP40封装与传统8051完全兼容,直接插51开发板上就能用。红外遥控接收头为HS0038,输出......
    一体化,接收头输出的是解调后的数据信号,单片机里面需要相应的读取程序。具体详细的使用参数和时序请参考官方技术手册。 4.23.1.2在STM32实验系统中红外系统的组成 在我们是试验中使用的是红外线遥控器。因为红外线遥控......
    后 知识介绍 :HS0038红外探头 HS0038是一款红外接收探头,接收红外信号频率为38kHz,周期约26μs 红外遥控 红外遥控是利用红外光进行通信的设备,由红外LED将调制后的信号发出,由专用的红外接收头......
    注意优化代码结构、提高执行效率以及降低功耗等方面的问题。 四、红外遥控接收机设计 设计原理 红外遥控接收机主要由红外接收管、解调电路、解码电路和电源电路等部分组成。红外接收管接收红外......
    红外遥控接收模块+普中51单片机+江科大自化协;1 实验现象   LCD1602上显示红外解码遥控器地址、键值。通过红外遥控器,按下某个按键时,遥控器通过红外发光二极管发射红外线,红外......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>