求助各位大神,我没接触过汇编,下面这个程序怎么用C语言写出来

[复制链接]
986|4
 楼主| chenxiaoting 发表于 2017-6-7 20:44 | 显示全部楼层 |阅读模式
ADC                EQU                35H
CLOCK        BIT                P2.4                        ;定义ADC0808时钟位
ST                 BIT         P2.5
EOC         BIT         P2.6
OE                 BIT         P2.7
PWM                BIT                P3.7
                ORG         00H
                SJMP        START
                ORG                0BH
                LJMP        INT_T0

START:        MOV                TMOD,#02H                  ;
                MOV                TH0,#20
                MOV                TL0,#00H
                MOV                IE,#82H
                SETB        TR0

WAIT:         CLR         ST                                 
                SETB         ST
                CLR         ST                                ;启动AD转换
                JNB         EOC,$                        ;等待转换结束
                SETB         OE
                MOV         ADC,P1                        ;读取AD转换结果
                CLR         OE
                SETB        PWM                                   ;PWM输出
                MOV         A,ADC
                LCALL        DELAY
                CLR                PWM
                MOV                A,#255
                SUBB        A,ADC
                LCALL        DELAY
                SJMP         WAIT

INT_T0:        CPL                CLOCK                         ;提供ADC0808时钟信号
                RETI

DELAY:        MOV                R6,#1
D1:                DJNZ        R6,D1
                DJNZ        ACC,D1
                RET

                END
linqing171 发表于 2017-6-7 22:04 | 显示全部楼层
  1. #include <ADUC841.H>


  2. unsigned char ADC  ;
  3. sbit CLOCK  = P2^4;// ;定义ADC0808时钟位
  4. sbit ST     =P2^5;
  5. sbit EOC    = P2^6;
  6. sbit OE     = P2^7        ;
  7. sbit PWM    = P3^7        ;

  8. void DELAY(unsigned char a1)  ;

  9. void main()
  10. {
  11.         TMOD=2;
  12.         TH0=20;
  13.         TL0=0;
  14.         IE=0x82;
  15.         TR0=1;
  16.         while(1)   
  17.         {
  18.                 ST=0;
  19.                 ST=1;
  20.                 ST=0; //;启动AD转换
  21.                 while(EOC==0)
  22.                 {
  23.                         ;                   //;;等待转换结束
  24.                 }         
  25.                 OE=1;
  26.                 ADC=P1;                   // ;读取AD转换结果
  27.                 OE=0;
  28.                 PWM=1;                        //;PWM输出
  29.                 DELAY(ADC);
  30.                 PWM=0;                       
  31.                 DELAY(255-ADC);
  32.                 //goto WAIT;
  33.         }   
  34. }

  35. void DELAY(unsigned char a1)  
  36. {  
  37.         unsigned char i=1;
  38.         do
  39.         {
  40.                 do
  41.                 {
  42.                
  43.                 }while(--i);
  44.         }while(--a1);
  45. }


  46. void INT_T0() interrupt 1
  47. {
  48.         CLOCK =!CLOCK;//                        ;提供ADC0808时钟信号
  49. }



linqing171 发表于 2017-6-7 22:05 | 显示全部楼层
原先汇编代码的两个bug:
1 SUBB        A,ADC  之前没有清空ACC,导致计算结果可能会大了1.
2 延时函数的i在内层,从0开始减少了,循环时间变大了。
 楼主| chenxiaoting 发表于 2017-6-11 20:35 | 显示全部楼层
linqing171 发表于 2017-6-7 22:05
原先汇编代码的两个bug:
1 SUBB        A,ADC  之前没有清空ACC,导致计算结果可能会大了1.
2 延时函数的i ...

谢谢
 楼主| chenxiaoting 发表于 2017-6-11 20:37 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

10

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部