找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 952|回复: 6
收起左侧

单片机汇编语言有办法能转成C语言吗?

[复制链接]
ID:1026744 发表于 2022-5-15 16:27 | 显示全部楼层 |阅读模式
K1       BIT     P1.4                    ;加速键
K2       BIT     P1.5                    ;减速键
K3       BIT     P1.6                    ;正反键
CLK      BIT     P0.0                    ;速度控制信号
ZF       BIT     P0.1                    ;正反控制信号
PWMH     EQU     30H                     ;调宽值,定时器所赋值
PWML     EQU     31H
ORG     0000H
LJMP    MAIN
ORG     000BH                         ;中断1控制周期
LJMP    TIMER1
ORG     001BH                         ;中断3控制脉宽
LJMP    TIMER2
ORG     0030H
MAIN:    MOV PWMH,#00H
         MOV PWML,#0FH
         MOV TMOD,#11H              ;两个定时器都工作在方式1
                  MOV TH0,#00H               ;65.536mm定时
         MOV TL0,#00H
                   MOV TH1,PWMH               ;脉宽
                   MOV TL1,PWML
         SETB EA                    ;CPU允许中断
         SETB ET0                   ;允许定时器T0中断
         SETB ET1                   ;允许定时器T1中断
         SETB TR0                   ;定时器T0计数
         CLR  CLK
LOOP:    JB   K3,LOOPZF             ;高电平逆时针转,低电平顺时针转
         CLR  ZF                    ;针转
         LJMP LOOPK1
LOOPZF:  SETB ZF
LOOPK1:  JB   K1,LOOPK2             ;K1按下加速
         LCALL  DELAY
         MOV  A,PWML
         ADD  A,#1                   ;调宽值低4位加1
         MOV  PWML,A
         MOV  A,PWMH
         ADDC A,#0                   ;调宽值高4位加1
         MOV  PWMH,A
         JNC  LOOPK2                 ;最大值时
         MOV  PWMH,#0FFH
LOOPK2:  JB   K2,OVER                ;K2按下减速
         LCALL   DELAY
         MOV  A,PWML
         CLR  C
         SUBB A,#1                   ;调宽值低4位减1
         MOV  PWML,A
         MOV  A,PWMH
         SUBB A,#0                   ;调宽值高4位减1
         MOV  PWMH,A
         JNC  OVER
         MOV  PWMH,#00H              ;最小值时
OVER:    LJMP LOOP
TIMER1:  CLR  TR1
         MOV  TH0,#00H
         MOV  TL0,#00H
         MOV  TH1,PWMH               ;赋调宽值
         MOV  TL1,PWML
         SETB TR1
         CLR  CLK
         RETI
TIMER2:  CLR   TR1
         SETB  CLK
         RETI
DELAY:   MOV   R4,#10H
D1:      DJNZ  R4,D1
         RET
         END   
回复

使用道具 举报

ID:650411 发表于 2022-5-15 18:30 | 显示全部楼层
自己用C语言编几行就搞定了
回复

使用道具 举报

ID:624769 发表于 2022-5-15 19:10 | 显示全部楼层


  1. <p><p>sbit K1 = P1^4;  //;加速键
  2. sbit K2 = P1^5;  //;减速键
  3. sbit K3 = P1^6;  // ;正反键
  4. sbit CLK = P0^0;  // ;速度控制信号
  5. sbit ZF = P0^1;  // ;正反控制信号
  6. unsigned char PWMH,PWML;  //   ;调宽值,定时器所赋值</p><p>void Delay()
  7. {
  8. char i;
  9. i = 0x10;
  10. while(--i);
  11. }</p><p>void main()
  12. {
  13. PWMH = 0x00;
  14. PWML = 0x0F;
  15. TMOD = 0x11;//         ;两个定时器都工作在方式1
  16.         TH0 = 0x00;//         ;65.536mm定时
  17.         TL0 = 0x00;
  18.         TH1 = PWMH;//               ;脉宽
  19.         TL1 = PWML;
  20.         EA  = 1;//                  ;CPU允许中断
  21.         ET0 = 1;//                   ;允许定时器T0中断
  22.         ET1 = 1;//                   ;允许定时器T1中断
  23.         TR0 = 1;//                   ;定时器T0计数
  24.         CLK = 0; //</p><p> while(1)
  25. {
  26.   if(K3) //             ;高电平逆时针转,低电平顺时针转
  27.   {
  28.    ZF = 1;
  29.   }
  30.   else
  31.   {
  32.    ZF = 0;//                    ;针转
  33.   }
  34.   if(!K1)
  35.   {
  36.    Delay();
  37.    if(++PWML == 0x00) //                 ;调宽值低4位加1
  38.    {
  39.     if(++PWMH == 0x00) PWMH = 0xff;
  40.    }
  41.   }
  42.   if(!K2) //                ;K2按下减速
  43.   {
  44.    Delay();
  45.    if(--PWML == 0xff)
  46.    {
  47.     if(--PWMH == 0xff)  PWMH == 0x00;
  48.    }  
  49.   }
  50. }</p><p>}</p><p>
  51. void TIMER1() interrupt 1 // ORG     000BH                         ;中断1控制周期
  52. {
  53. TR1 = 0;
  54.         TH0 = 0x00;
  55. TL0 = 0x00;
  56.         TH1 = PWMH;//               ;赋调宽值
  57.         TL1 = PWML;
  58.         TR1 = 1;
  59.         CLK = 0;
  60. }</p><p>void TIMER2() interrupt 3 //    ;中断3控制脉宽
  61. {
  62. TR1 = 0;
  63.         CLK = 1;
  64. }</p>
复制代码



回复

使用道具 举报

ID:624769 发表于 2022-5-15 19:21 | 显示全部楼层
sbit        K1 = P1^4;                //;加速键
sbit        K2 = P1^5;                //;减速键
sbit        K3 = P1^6;                // ;正反键
sbit        CLK = P0^0;                // ;速度控制信号
sbit        ZF = P0^1;                // ;正反控制信号
unsigned char PWMH,PWML;                //   ;调宽值,定时器所赋值

void        Delay()
{
        char i;
        i = 0x10;
        while(--i);
}

void        main()
{
        PWMH = 0x00;
        PWML = 0x0F;
        TMOD = 0x11;//         ;两个定时器都工作在方式1
        TH0 = 0x00;//         ;65.536mm定时
        TL0 = 0x00;
        TH1 = PWMH;//               ;脉宽
        TL1 = PWML;
        EA  = 1;//                  ;CPU允许中断
        ET0 = 1;//                   ;允许定时器T0中断
        ET1 = 1;//                   ;允许定时器T1中断
        TR0 = 1;//                   ;定时器T0计数
        CLK = 0; //

        while(1)
        {
                if(K3)        //             ;高电平逆时针转,低电平顺时针转
                {
                        ZF = 1;
                }
                else
                {
                        ZF = 0;//                    ;针转
                }
                if(!K1)
                {
                        Delay();
                        if(++PWML == 0x00) //                 ;调宽值低4位加1
                        {
                                if(++PWMH == 0x00)        PWMH = 0xff;
                        }
                }
                if(!K2)        //                ;K2按下减速
                {
                        Delay();
                        if(--PWML == 0xff)
                        {
                                if(--PWMH == 0xff)         PWMH == 0x00;
                        }               
                }
        }

}


void        TIMER1()        interrupt 1        // ORG     000BH                         ;中断1控制周期
{
        TR1 = 0;
        TH0 = 0x00;
        TL0 = 0x00;
        TH1 = PWMH;//               ;赋调宽值
        TL1 = PWML;
        TR1 = 1;
        CLK = 0;
}

void        TIMER2()        interrupt 3        //    ;中断3控制脉宽
{
        TR1 = 0;
        CLK = 1;
}

回复

使用道具 举报

ID:688692 发表于 2022-5-15 21:41 | 显示全部楼层
#include <reg51.h>
void DELAY();
//K1       BIT     P1.4                    ;加速键
sbit K1=P1^4;

//K2       BIT     P1.5                    ;减速键
sbit K2=P1^5;

//K3       BIT     P1.6                    ;正反键
sbit K3=P1^6;

//CLK      BIT     P0.0                    ;速度控制信号
sbit CLK=P0^0;

//ZF       BIT     P0.1                    ;正反控制信号
sbit ZF=P0^1;

//PWMH     EQU     30H                     ;调宽值,定时器所赋值
//PWML     EQU     31H
unsigned int PWM _at_ 0x30;
#define PWMH ((unsigned char *)(&PWM))[0]
#define PWML ((unsigned char *)(&PWM))[1]
//ORG     0000H
//LJMP    MAIN
//-----

//ORG     000BH                         ;中断1控制周期
//LJMP    TIMER1
//void TIMER0() interrupt 1

//ORG     001BH                         ;中断3控制脉宽
//LJMP    TIMER2
//void TIMER1() interrupt 3

//ORG     0030H
void main()
{
//MAIN:    MOV PWMH,#00H
        PWMH=0x00;
//         MOV PWML,#0FH
        PWML=0x0F;
//         MOV TMOD,#11H              ;两个定时器都工作在方式1
        TMOD=0X11;
//         MOV TH0,#00H               ;65.536mm定时
        TH0=0X00;
//         MOV TL0,#00H
        TL0=0X00;
//         MOV TH1,PWMH               ;脉宽
        TH1=PWMH;
//         MOV TL1,PWML
        TL1=PWML;
//         SETB EA                    ;CPU允许中断
        EA=1;
//         SETB ET0                   ;允许定时器T0中断
        ET0=1;
//         SETB ET1                   ;允许定时器T1中断
        ET1=1;
//         SETB TR0                   ;定时器T0计数
  TR0=1;
//         CLR  CLK
  CLK=0;
  while(1)
        {
//LOOP:    JB   K3,LOOPZF             ;高电平逆时针转,低电平顺时针转
//         CLR  ZF                    ;针转
//         LJMP LOOPK1
//LOOPZF:  SETB ZF
                ZF=K3;
//LOOPK1:  JB   K1,LOOPK2             ;K1按下加速
                if(K1==0)
                {
//         LCALL  DELAY
                        DELAY();
//         MOV  A,PWML
//         ADD  A,#1                   ;调宽值低4位加1
//         MOV  PWML,A
//         MOV  A,PWMH
//         ADDC A,#0                   ;调宽值高4位加1
//         MOV  PWMH,A
//         JNC  LOOPK2                 ;最大值时
//         MOV  PWMH,#0FFH
                        PWM++;
                        if(PWM==0x00)
                        {
                                PWMH=0xFF;
                        }
                }
//LOOPK2:  JB   K2,OVER                ;K2按下减速
                if(K2==0)
                {
//         LCALL   DELAY
                DELAY();
//         MOV  A,PWML
//         CLR  C
//         SUBB A,#1                   ;调宽值低4位减1
//         MOV  PWML,A
//         MOV  A,PWMH
//         SUBB A,#0                   ;调宽值高4位减1
//         MOV  PWMH,A
//         JNC  OVER
//         MOV  PWMH,#00H              ;最小值时
                        PWM--;
                        if(PWM==0xFFFF)
                        {
                                PWMH=0x00;
                        }
                }
//OVER:    LJMP LOOP
        }
}
void TIMER0() interrupt 1
{
//TIMER0:  CLR  TR1
        TR1=0;
//         MOV  TH0,#00H
        TH0=0;
//         MOV  TL0,#00H
        TL0=0;
//         MOV  TH1,PWMH               ;赋调宽值
        TH1=PWMH;
//         MOV  TL1,PWML
        TL1=PWML;
//         SETB TR1
        TR1=1;
//         CLR  CLK
        CLK=0;
//         RETI
}
void TIMER1() interrupt 3
{
//TIMER1:  CLR   TR1
        TR1=0;
//         SETB  CLK
        CLK=1;
//         RETI
}
void DELAY()
{
//DELAY:   MOV   R4,#10H
        unsigned char i;
        i=0x10;
//D1:      DJNZ  R4,D1
        do
        {
        --i;
        }while(i);
//         RET
}
//         END   
回复

使用道具 举报

ID:123289 发表于 2022-5-16 10:55 | 显示全部楼层
1、无有现成的工具。
2、理论很难达成。
如果你真的学精了单片机,就无此一问了。
回复

使用道具 举报

ID:319585 发表于 2022-5-16 17:32 来自手机 | 显示全部楼层
这个汇编翻译成c,可以翻译,但是比中文翻译成英文要难一些。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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