找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4780|回復: 4
收起左側

幫忙將一個C函數(shù)寫成匯編語言

[復制鏈接]
ID:168155 發(fā)表于 2017-3-10 17:53 | 顯示全部樓層 |閱讀模式
100黑幣
單片機程序
void receive() //接收數(shù)據
{
        uchar count;
        uchar i=0x00;
        uint k=0x00;
        DATA=0;
        i=0x00;
        if(!in)
        {
                while(!in)                 //前導電平,4*48us
                {
                        k++;                 //4+2+3+4=13
                        delay80us();//(40us)+1+2+2+2+2+3+3=15+40us
                        if(k>220)
                        {DATA=0;return;}         //同步碼 低位限時(10000~~21000us)
                }
                if(k<104)
                        {DATA=0;return;}  //同步碼 低位限時
                for(count=0;count<24;count++)  //開始收集
                {
                        if(in)                       
                        {
                                DATA=DATA<<1;
                                i=0;
                                while(in)        //高位計數(shù)i*44.75us
                                {
                                        delay80us();
                                        i++;  //4+(2+1+2+3+3)=15
                                        if(i>23)
                                        {DATA=0;return;}//高位限時解碼<(2013us)
                                }
                                if(i<10)
                                {
                                        if((2<i)&&(i<9));//記低電平(220us-805us)
                                        else
                                        {DATA=0;return;}
                                }
                                else
                                {                       
                                        if((12<i)&&(i<23))
                                        {DATA=DATA|0x01;}//記高電平(940-2013)實際1450us
                                        else
                                        {DATA=0;return;}
                                }       
                        }
                        while(!in)
                                {delay80us();}//位計數(shù)
                }
        }
}

void sjzh()                                                 //轉換接收到的數(shù)據
{
        char i=0;
        if(DATA>0)
        {
                for(i=2;i>=0;i--)
                {
                        D[i]=DATA;
                        DATA>>=8;
                }
        }
        DATA=0;
}

回復

使用道具 舉報

ID:155507 發(fā)表于 2017-3-10 17:53 | 顯示全部樓層
  1.              ; FUNCTION receive (BEGIN)

  2. ;---- Variable 'i' assigned to Register 'R5' ----
  3.               CLR     A
  4.               MOV     R5,A

  5. ;---- Variable 'k' assigned to Register 'R2/R3' ----
  6.               MOV     R3,A
  7.               MOV     R2,A

  8.               MOV     P0,A

  9.             JB      in,?C0012

  10.         ?C0009:

  11.             JB      in,?C0010

  12.                 INC     R3
  13.             CJNE    R3,#00H,?C0035
  14.                 INC     R2
  15.          ?C0035:

  16.       R     LCALL   delay80us

  17.                 SETB    C
  18.                 MOV     A,R3
  19.               SUBB    A,#0DCH
  20.                 MOV     A,R2
  21.               SUBB    A,#00H
  22.               JC      ?C0009
  23.               SJMP    ?C0039
  24.          ?C0010:
  25.                 CLR     C
  26.                 MOV     A,R3
  27.               SUBB    A,#068H
  28.               MOV     A,R2
  29.               SUBB    A,#00H
  30.               JNC     ?C0013
  31.     ?C0036:
  32.               SJMP    ?C0039
  33.     ?C0013:
  34. ;---- Variable 'count' assigned to Register 'R4' ----
  35.             CLR     A
  36.             MOV     R4,A
  37.   ?C0014:
  38.             JNB     in,?C0027
  39.             MOV     A,P0
  40.             ADD     A,ACC
  41.             MOV     P0,A
  42.             CLR     A
  43.             MOV     R5,A
  44.   ?C0018:
  45.             JNB     in,?C0019
  46.       R     LCALL   delay80us
  47.             INC     R5
  48.             MOV     A,R5
  49.             SETB    C
  50.             SUBB    A,#017H
  51.             JC      ?C0018
  52.   ?C0037:
  53.             SJMP    ?C0039
  54.     ?C0019:
  55.               MOV     A,R5
  56.               CLR     C
  57.               SUBB    A,#0AH
  58.               JNC     ?C0021
  59.               MOV     A,#02H
  60.               CLR     C
  61.               SUBB    A,R5
  62.               JNC     ?C0022
  63.               MOV     A,R5
  64.               CLR     C
  65.               SUBB    A,#09H
  66.               JC      ?C0027
  67.     ?C0022:
  68.     ?C0038:
  69.               SJMP    ?C0039
  70.     ?C0021:
  71.               MOV     A,#0CH
  72.               CLR     C
  73.               SUBB    A,R5
  74.               JNC     ?C0025
  75.               MOV     A,R5
  76.             CLR     C
  77.             SUBB    A,#017H
  78.             JNC     ?C0025
  79.             ORL     P0,#01H
  80.             SJMP    ?C0027
  81.   ?C0025:
  82.   ?C0039:
  83.             CLR     A
  84.             MOV     P0,A
  85.             RET     
  86.   ?C0027:
  87.             JB      in,?C0016
  88.       R     LCALL   delay80us
  89.             SJMP    ?C0027
  90.   ?C0016:
  91.             INC     R4
  92.             MOV     A,R4
  93.             XRL     A,#018H
  94.             JNZ     ?C0014
  95.   ?C0012:
  96.             RET     
  97.              ; FUNCTION receive (END)

  98.              ; FUNCTION sjzh (BEGIN)
  99. ;---- Variable 'i' assigned to Register 'R7' ----
  100.             MOV     A,P0
  101.             SETB    C
  102.             SUBB    A,#00H
  103.             JC      ?C0029
  104.             MOV     R7,#02H
  105.   ?C0030:
  106.       R     MOV     A,#LOW D
  107.             ADD     A,R7
  108.             MOV     R0,A
  109.             MOV     @R0,P0
  110.             MOV     P0,#00H
  111.             DEC     R7
  112.             CLR     C
  113.             MOV     A,R7
  114.             XRL     A,#080H
  115.             SUBB    A,#080H
  116.             JNC     ?C0030
  117.   ?C0029:
  118.             CLR     A
  119.             MOV     P0,A
  120.             RET     
  121.              ; FUNCTION sjzh (END)
復制代碼
回復

使用道具 舉報

ID:168155 發(fā)表于 2017-3-10 17:55 | 顯示全部樓層
延時函數(shù)DELAY80US:   ;誤差 0us     MOV R6,#0BH DL0:     MOV R5,#02H     DJNZ R5,$     DJNZ R6,DL0     RET
回復

使用道具 舉報

ID:168155 發(fā)表于 2017-3-13 11:49 | 顯示全部樓層
本帖最后由 wolfe~alone 于 2017-3-13 13:54 編輯

麻煩問一下,P0是什么,作一個存儲單元用嗎MOV。校,#01
MOV A,P0
XRL。粒#埃埃
JNC。樱眨茫茫牛樱
發(fā)現(xiàn)從P0中讀出的結果永遠是0呢?無法進入SUCCESS

回復

使用道具 舉報

ID:168155 發(fā)表于 2017-3-13 20:23 | 顯示全部樓層
wolfe~alone 發(fā)表于 2017-3-13 11:49
麻煩問一下,P0是什么,作一個存儲單元用嗎MOV。校,#01
MOV。粒校
XRL。,#00 ...

好似知道了,我用的是STC15F102,發(fā)現(xiàn)就P3口可以用,但不知道為什么P0不能用
回復

使用道具 舉報

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

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表