久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3215|回復(fù): 10
打印 上一主題 下一主題
收起左側(cè)

如何給單片機(jī)遙控器加掉電喚醒模式?匯編語言

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
遙控器是控制燈的   15f104w單片機(jī)芯片
程序是通過反編譯改過來的     怎么加入掉電喚醒模式   我試了很多次都沒成功
程序里有一段不加入(如圖) 遙控成功率就降低很多是什么原因


;    LED燈遙控程序
;   
;          15F104W  12C5A60S2                 11.0592M
;==========================================================================
;標(biāo)號==============指令================================地址===機(jī)器碼=======
;==========================================================================
                                   count_1      EQU 08H;  
                                   count_2      EQU 09H;

                               set_count_1  EQU 0CH;
                                   set_count_2  EQU 0DH;
                                   irdata                EQU 0EH;         
                                   ircode            EQU 0FH;
                                   
                                   keyflag EQU 20H.0;  按鍵標(biāo)志位         按下=1
                               irflag  EQU 20H.1;  紅外發(fā)射標(biāo)志         發(fā)射=1        

                                   KA   EQU  P3.0;           開關(guān)
                               KB   EQU  P3.1;           變光
                               KC   EQU  P3.2;           亮度加
                               KD   EQU  P3.3;           亮度減
                                   IR   EQU  P3.4;           輸出
                                   LED  EQU  P3.5;           指示燈

                                   SETB KA;           
                                   SETB KB;           
                                   SETB KC;           
                                   SETB KD;           
                                   
                   ORG 0000H
                   LJMP     main;   ;開始時(shí)跳轉(zhuǎn)轉(zhuǎn)到初始化程序中   
;==========================================================================
                   ORG 000BH  
                   LJMP     timer0;
;==========================================================================
main:                           MOV      SP,#0x20;
                   LCALL    timer0_init;          //定時(shí)0初始化                 
                   MOV   count_1,#00H    //中斷計(jì)數(shù)先清0     
                   MOV   count_2,#00H                     
                   CLR   irflag   //紅外發(fā)射標(biāo)志先置0  
;==========================================================================
C01C4:            LCALL    keyscan;  //鍵值掃描  
                                  JNB      keyflag,C01C4         //若有按鍵按下
                                  CLR LED;  
                                  LCALL DELAY20MS;
                                  LCALL DELAY20MS;
                                  LCALL    ir_send;  //發(fā)送紅外編碼
                                  JNB KA,$;
                                  JNB KB,$;
                                  LCALL DELAY20MS;
                                  JNB KA,$;
                                  JNB KB,$;
                                CLR      keyflag; //按鍵標(biāo)志清零
                                  SETB LED;
                                  SJMP     C01C4                                                   
//---------------------------------------------------------------------------
//void keyscan() // 按鍵掃描  
keyscan:
                     LCALL DELAY20MS;
                                         JB       ka,C01EE;                //A鍵按下                                    
                                      MOV      irdata,#0x01;
                                         SETB     keyflag;
                                         RET;         

C01EE:               JB       kb,C01F6;                //B鍵按下                                       
                                      MOV      irdata,#0x06;
                                         SETB     keyflag;
                                         RET;

C01F6:               JB       kc,C01FE;                //C鍵按下
                                      MOV      irdata,#0x12;
                                      SETB     keyflag;
                                         RET

C01FE:               JB       kd,C0206;                //D鍵按下
                                      MOV      irdata,#0x1E;
                                      SETB     keyflag;
C0206:               RET   
;==========================================================================
//發(fā)送紅外數(shù)據(jù)  void ir_send()
ir_send:           MOV   set_count_1,#02H; //發(fā)送編碼中的引導(dǎo)碼(9ms高電平+4.5ms低電平)  
                   MOV   set_count_2,#9EH;                  
                   SETB  irflag  ////紅外發(fā)射標(biāo)志      
                                   LCALL TX_TIME;   //定時(shí)器發(fā)送
                                                
                   MOV   set_count_1,#01H; //發(fā)送編碼中的4.5ms低電平
                   MOV   set_count_2,#50H;                 
                   CLR   irflag      //紅外發(fā)射標(biāo)志   低電平則不發(fā)射   
                                   LCALL TX_TIME;    //定時(shí)器發(fā)送  
                                                
                   MOV   ircode,#80H;   //發(fā)送16位用戶碼的前1-8位   
                   LCALL ir_sendbyte    //紅外發(fā)送一個(gè)字節(jié)數(shù)據(jù)
                                                
                   MOV   ircode,#7FH;   //發(fā)送16位用戶碼的前9-16位
                   LCALL ir_sendbyte    //紅外發(fā)送一個(gè)字節(jié)數(shù)據(jù)  
                                                
                   MOV   ircode,irdata; //發(fā)送8位數(shù)據(jù)碼     
                   LCALL ir_sendbyte    //紅外發(fā)送一個(gè)字節(jié)數(shù)據(jù)
                                                
                   MOV   A,irdata;
                   CPL   A ;              取反                  
                   MOV   ircode,A       //發(fā)送8位數(shù)據(jù)反碼      
                   LCALL ir_sendbyte    //紅外發(fā)送一個(gè)字節(jié)數(shù)據(jù)  

                   MOV   set_count_1,#00H; //發(fā)送編碼中的0.56ms高電平
                   MOV   set_count_2,#23H;               
                   SETB  irflag        //紅外發(fā)射標(biāo)志
                                   LCALL TX_TIME;   //定時(shí)器發(fā)送   

;                                   SETB  IR    ;//發(fā)射完了關(guān)閉紅外發(fā)射二極管  
;                       RET;
;   不加入下面這部分程序 遙控成功概率變低很多               
                   LCALL DELAY23MS   //延時(shí)23ms(編碼中的23ms低電平)                  
                   MOV   set_count_1,#02H;  //發(fā)送編碼中的引導(dǎo)碼(9ms高電平+4.5ms低電平)  
                   MOV   set_count_2,#9EH;           
                   SETB  irflag  
                                   LCALL TX_TIME;  //定時(shí)器發(fā)送                                                           
                   MOV   set_count_1,#01H    //發(fā)送編碼中的4.5ms低電平  
                   MOV   set_count_2,#50H                  
                   CLR   irflag   
                   LCALL TX_TIME;  //定時(shí)器發(fā)送   
                   MOV   set_count_1,#00H     //發(fā)送編碼中的0.56ms高電平   
                   MOV   set_count_2,#23H;                    
                   SETB  irflag  
                   LCALL TX_TIME;  //定時(shí)器發(fā)送                             
                                   SETB  IR    ;//發(fā)射完了關(guān)閉紅外發(fā)射二極管  
                       RET;                                                                                                
;----------------------------------------------------------------------------------
//紅外發(fā)送一個(gè)字節(jié)數(shù)據(jù)
ir_sendbyte:       MOV   R7,#0x00;
Q0223:             MOV   set_count_1,#00H; //發(fā)送編碼中的0.56ms高電平
                   MOV   set_count_2,#23H;                 
                   SETB  irflag   //紅外發(fā)射標(biāo)志  啟動紅外發(fā)射二極管發(fā)射   
                                   LCALL TX_TIME;  //定時(shí)器發(fā)送
                                   MOV   A,ircode        //判斷紅外編碼最低位,若為1則1.69ms的低電平
                   JNB   ACC.0,Q024C               
                   MOV   set_count_1,#00H;    //為0則0.565ms的低電平  
                   MOV   set_count_2,#82H;                  
                   SJMP  Q0252                        
Q024C:             MOV   set_count_1,#00H;                    
                   MOV   set_count_2,#0x2B;               
Q0252:             CLR   irflag    //紅外發(fā)射標(biāo)志    低電平則不發(fā)射   
                            LCALL TX_TIME;   //定時(shí)器發(fā)送
                                   MOV   A,ircode        //判斷紅外編碼最低位,若為1則1.69ms的低電平  
                   CLR   C                       
                   RRC   A       //將數(shù)據(jù)右移,即從低位到高位發(fā)送           
                   MOV   ircode ,A                     
                   INC   R7                          
                   CJNE  R7,#0x08,Q0223              
                   RET  
;------------------------------------------------------------------------------------------------                                                               
//定時(shí)器發(fā)送                                            
TX_TIME:           MOV   count_1,#00H;  //中斷計(jì)數(shù)先清0               
                   MOV   count_2,#00H;                  
                   SETB  TR0          //開啟定時(shí)器0            
Q0232:             CLR   C            //等待發(fā)送完            
                   MOV   A,count_2;
                   SUBB  A,set_count_2;
                   MOV   A,count_1;
                   SUBB  A,set_count_1;
        
                   JC    Q0232                     
                   CLR   TR0          //關(guān)閉定時(shí)器0              
                                   RET;      
;==========================================================================
//定時(shí)器0中斷  timer0_interrupt  
timer0:                                                                                            
                             PUSH  ACC                          
                   INC   count_2;
                   MOV   A,count_2;
                   JNZ   Q02B3                  
                   INC   count_1;
Q02B3:             JNB   irflag,Q02BA ; //有發(fā)射標(biāo)志,則發(fā)射38khz的矩形波         
                   CPL   IR;      
                   SJMP  Q02BC                       
Q02BA:             SETB  IR;//否則不發(fā)射,即相當(dāng)于發(fā)射編碼中的低電平      
Q02BC:             POP   ACC  

                   RETI   
;==========================================================================
//定時(shí)器0初始化
timer0_init:       MOV   TMOD,#02H    //定時(shí)0 8位自動重裝模式               
                                   MOV   TH0,#0F3H;   //定時(shí)13us,38K紅外矩形波        
                   MOV   TL0,#0E6H;                  
                                   SETB  EA   
                   SETB  ET0                          ;
               ;    SETB  TR0
                   RET                                                                 
;==========================================================================
//延時(shí)  
DELAY20MS:   ;誤差 -0.000000000003us                        單片機(jī)小精靈生成  11.0592        1T
    MOV R7,#0C1H
DL1:
    MOV R6,#72H
DL0:
    MOV R5,#01H
    DJNZ R5,$
    DJNZ R6,DL0
    DJNZ R7,DL1
    RET

;==========================================================================
DELAY23MS:   ;誤差 -0.054253472225us                        單片機(jī)小精靈生成  11.0592        1T
    MOV R7,#38H
DL3:
    MOV R6,#0FCH
DL2:
    MOV R5,#03H
    DJNZ R5,$
    DJNZ R6,DL2
    DJNZ R7,DL3
    MOV R5,#01H
    DJNZ R5,$
    RET            
//---------------------------------------------------------------------------
DELAY500MS:   ;誤差 -0.000000000063us                        單片機(jī)小精靈生成  11.0592        1T
    MOV R7,#5DH
DL5:
    MOV R6,#0B2H
DL4:
    MOV R5,#52H
    DJNZ R5,$
    DJNZ R6,DL4
    DJNZ R7,DL5
    RET              

;==========================================================================

END;




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:624769 發(fā)表于 2021-9-11 15:54 | 只看該作者
粗看了一遍你的代碼,

C01C4:            LCALL    keyscan;  //鍵值掃描  
                                  JNB      keyflag,C01C4         //若有按鍵按下
                                  CLR LED;  
                                  LCALL DELAY20MS;
                                  LCALL DELAY20MS;
                                  LCALL    ir_send;  //發(fā)送紅外編碼
                                  JNB KA,$;
                                  JNB KB,$;
                                  LCALL DELAY20MS;
                                  JNB KA,$;
                                  JNB KB,$;
                                CLR      keyflag; //按鍵標(biāo)志清零
                                  SETB LED;
                                  SJMP     C01C4      

這里構(gòu)成了死循環(huán), 單片機(jī)會一直周而復(fù)始復(fù)始的反復(fù)執(zhí)行這段代碼. 你LCALL出去的分支,也都有RET回來。也沒有找到 類似 MOV  PCON,#02H 這類關(guān)機(jī)指令; 那么,你為什么需要掉電喚醒呢? 不存在掉電,何來喚醒?
回復(fù)

使用道具 舉報(bào)

板凳
ID:261025 發(fā)表于 2021-9-11 17:11 | 只看該作者
188610329 發(fā)表于 2021-9-11 15:54
粗看了一遍你的代碼,

C01C4:            LCALL    keyscan;  //鍵值掃描  

我發(fā)的是沒加掉電喚醒的源程序    我試著加掉電喚醒只是led亮了 看電流沒有發(fā)射就死機(jī)了  不知道應(yīng)該怎么加
回復(fù)

使用道具 舉報(bào)

地板
ID:624769 發(fā)表于 2021-9-11 17:55 | 只看該作者
418854190 發(fā)表于 2021-9-11 17:11
我發(fā)的是沒加掉電喚醒的源程序    我試著加掉電喚醒只是led亮了 看電流沒有發(fā)射就死機(jī)了  不知道應(yīng)該怎么 ...

不是…… 掉電喚醒的定義,你理解么?
你先讓單片機(jī)關(guān)機(jī)(自主掉電 PowerDown),然后通過中斷觸發(fā),單片機(jī)又開機(jī),這個(gè)過程叫掉電喚醒。掉電喚醒一般是沒有程序的,只要開了外部中斷,當(dāng)你執(zhí)行了ShutDown指令之后,就能通過外部中斷喚醒,換句話說,大多的掉電喚醒,都是只有看到關(guān)機(jī)指令通常是: MOV PCON,#02H , 而沒有喚醒指令的,所以,你說你加掉電喚醒“源程序”,啥程序?
回復(fù)

使用道具 舉報(bào)

5#
ID:401564 發(fā)表于 2021-9-11 19:04 | 只看該作者
用什么"單片機(jī)小精靈"呀,STC下載器那有,官方的它不行嗎?
MOV PCON,#02H就是掉電了
想要喚醒是要開啟中斷的,你想要哪個(gè)喚醒就開啟哪個(gè)中斷
比如,你要外部中斷INT0喚醒,
那就:
CLR EI0;這個(gè)要先清除
SETB EX0;
SETB  EA;
然后,當(dāng)外部中斷觸發(fā)之后,就會進(jìn)入中斷程序
還有,ORG 0000H前面不要有指令,main標(biāo)號前面也要有一個(gè)ORG 100H,要跳過中斷向量區(qū)的
你這程序太亂了...............你應(yīng)該用C,沒事別亂玩匯編
回復(fù)

使用道具 舉報(bào)

6#
ID:261025 發(fā)表于 2021-9-11 20:12 | 只看該作者
Y_G_G 發(fā)表于 2021-9-11 19:04
用什么"單片機(jī)小精靈"呀,STC下載器那有,官方的它不行嗎?
MOV PCON,#02H就是掉電了
想要喚醒是要開啟中斷 ...

不習(xí)慣用官方的計(jì)算器  
加了ORG 100H掉電喚醒正常了之前沒加 喚醒后就死機(jī)了
現(xiàn)在INT0 INT1 INT2 INT3 INT4都可以喚醒了
沒專門學(xué)過編程  都是自己沒事琢磨玩的 C語言改不明白 一改就錯(cuò)  匯編還能改改編編   
回復(fù)

使用道具 舉報(bào)

7#
ID:401564 發(fā)表于 2021-9-11 21:17 | 只看該作者
418854190 發(fā)表于 2021-9-11 20:12
不習(xí)慣用官方的計(jì)算器  
加了ORG 100H掉電喚醒正常了之前沒加 喚醒后就死機(jī)了
現(xiàn)在INT0 INT1 INT2 INT ...

你要去看一下這個(gè)單片機(jī)的中斷向量最高地址是多少,不跳過的話,程序一執(zhí)行就進(jìn)入中斷,進(jìn)入中斷之后就亂,后果不可知,ORH 100H是一個(gè)大概值,反正空間有的是
用匯編要很了解硬件的,而且代碼量是很大的,像你這種直接復(fù)制的,估計(jì)過一段時(shí)間再看,基本就是什么思路都找不著了
回復(fù)

使用道具 舉報(bào)

8#
ID:261025 發(fā)表于 2021-9-11 21:59 | 只看該作者
Y_G_G 發(fā)表于 2021-9-11 21:17
你要去看一下這個(gè)單片機(jī)的中斷向量最高地址是多少,不跳過的話,程序一執(zhí)行就進(jìn)入中斷,進(jìn)入中斷之后就亂,后 ...

官方提供的INT4中斷入口是ORG   0083H    是不是在主程序前加的比它大就行
回復(fù)

使用道具 舉報(bào)

9#
ID:401564 發(fā)表于 2021-9-12 07:11 | 只看該作者
418854190 發(fā)表于 2021-9-11 21:59
官方提供的INT4中斷入口是ORG   0083H    是不是在主程序前加的比它大就行

對呀,這所謂的"向量地址"就是中斷的地址,中斷被觸發(fā)后,程序就會跳轉(zhuǎn)到這個(gè)地址,執(zhí)行完中斷之后,由RETI返回之前的代碼,但不跳過的話,匯編是一條一條指令執(zhí)行下來,那就是直接進(jìn)入中斷了,雖然說中斷不開啟,但執(zhí)行的結(jié)果是"未知"的
回復(fù)

使用道具 舉報(bào)

10#
ID:960619 發(fā)表于 2021-9-12 10:57 | 只看該作者
紅外遙控喚醒掉電模式,紅外接收我接外部中斷0腳,進(jìn)入掉進(jìn)模式后,喚醒首先是進(jìn)入外部中斷0中斷程序關(guān)閉該IO口的外部中斷,這樣該腳就能接收紅外解碼的功能了,還有將掉電模式標(biāo)志清0,開機(jī)就不會再進(jìn)入掉電模式。 按關(guān)機(jī)的話,標(biāo)志位置1,先打開外部中斷0允許中斷,再進(jìn)入掉電模式
回復(fù)

使用道具 舉報(bào)

11#
ID:123289 發(fā)表于 2021-9-13 09:20 | 只看該作者
不是軟件問題!
1、檢測出掉電。(電源輸入通道上,設(shè)置一個(gè)電壓檢測電路)
2、通知到CPU。(例如,使用INT0)
3、對應(yīng)中斷響應(yīng)后,退出休眠。(大多是自然,退出)
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩久久精品 | 成人美女免费网站视频 | 国产在线视频在线观看 | 国产精品一区二区三区在线 | 成人福利影院 | 日韩插插 | 三级黄色大片网站 | 日韩av免费在线观看 | 国产高清一区二区三区 | 国产精品久久久久久影视 | 精品视频一区二区 | h在线看 | 人人爽日日躁夜夜躁尤物 | 作爱视频免费看 | 日韩欧美中文字幕在线观看 | 神马久久久久久久久久 | 不卡一区 | 日韩一区二区三区在线观看 | 亚洲一区二区三区免费视频 | 四季久久免费一区二区三区四区 | 日韩高清成人 | 亚洲在线一区 | 亚洲精品视频在线看 | 91视频a| 日日操网站 | 久草资源在线视频 | 一级特黄a大片 | 一区二区视频在线 | 日韩中文字幕在线视频 | 91.色| 精品一区二区三区四区视频 | 国产精品久久二区 | 国产精品日韩欧美一区二区三区 | 99一级毛片| 国产精品视频一区二区三区不卡 | 日韩av一区二区在线观看 | 色综合久久久久 | 久久久视频在线 | 国产成人麻豆免费观看 | 久久久久9999亚洲精品 | 99这里只有精品视频 |