打印

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

[复制链接]
813|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 | 只看该作者
#include <ADUC841.H>


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

void DELAY(unsigned char a1)  ;

void main()
{
        TMOD=2;
        TH0=20;
        TL0=0;
        IE=0x82;
        TR0=1;
        while(1)   
        {
                ST=0;
                ST=1;
                ST=0; //;启动AD转换
                while(EOC==0)
                {
                        ;                   //;;等待转换结束
                }         
                OE=1;
                ADC=P1;                   // ;读取AD转换结果
                OE=0;
                PWM=1;                        //;PWM输出
                DELAY(ADC);
                PWM=0;                       
                DELAY(255-ADC);
                //goto WAIT;
        }   
}

void DELAY(unsigned char a1)  
{  
        unsigned char i=1;
        do
        {
                do
                {
               
                }while(--i);
        }while(--a1);
}


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



使用特权

评论回复
板凳
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 ...

谢谢

使用特权

评论回复
5
chenxiaoting|  楼主 | 2017-6-11 20:37 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

10

帖子

0

粉丝