找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3420|回复: 4
打印 上一主题 下一主题
收起左侧

帮忙将一个C函数写成汇编语言

[复制链接]
跳转到指定楼层
楼主
ID:168155 发表于 2017-3-10 17:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
100黑币
单片机程序
void receive() //接收数据
{
        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)        //高位计数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();}//位计数
                }
        }
}

void sjzh()                                                 //转换接收到的数据
{
        char i=0;
        if(DATA>0)
        {
                for(i=2;i>=0;i--)
                {
                        D[i]=DATA;
                        DATA>>=8;
                }
        }
        DATA=0;
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:155507 发表于 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 发表于 2017-3-10 17:55 | 只看该作者
延时函数DELAY80US:   ;误差 0us     MOV R6,#0BH DL0:     MOV R5,#02H     DJNZ R5,$     DJNZ R6,DL0     RET
回复

使用道具 举报

地板
ID:168155 发表于 2017-3-13 11:49 | 只看该作者
本帖最后由 wolfe~alone 于 2017-3-13 13:54 编辑

麻烦问一下,P0是什么,作一个存储单元用吗MOV P0,#01
MOV A,P0
XRL A,#00H
JNC SUCCESS
发现从P0中读出的结果永远是0呢?无法进入SUCCESS

回复

使用道具 举报

5#
ID:168155 发表于 2017-3-13 20:23 | 只看该作者
wolfe~alone 发表于 2017-3-13 11:49
麻烦问一下,P0是什么,作一个存储单元用吗MOV P0,#01
MOV A,P0
XRL A,#00 ...

好似知道了,我用的是STC15F102,发现就P3口可以用,但不知道为什么P0不能用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表