单片机汇编语言,用书上的三种方式编程实现AD转换,但第一种“定时传送方式”不会写,网上也找不到

单片机汇编语言,用书上的三种方式编程实现AD转换,但第一种“定时传送方式”不会写,网上也找不到,第1张

书上的第2种,查询方式,你会写吧,那就差一行指令啊。

查询方式下,启动转换了,要等待EOC=1,转换结束,就读取转换结果了。

汇编是:JNB EOC , $ ;等待转结束

那么第1种,定时方式,不是告诉你了吗,写一个延时子程序,这延时子程序写过吧。

就把查询方式的等待EOC指令改成调延时子程序指令就行了,

ACALL DELAY ; 调延时子程序

只改这一行,其它都不用变哪。当然,你要写一个延时子程序DELAY,就OK了。

0000H和000BH是固定的,000BH是中断入口地址

那个0100H应该是根据程序的长短来定的,要看你单片机的程序存储器有多大,还有程序的前面要放多少东西了。7FF8H

这个是0809AD转换器的地址,51单片机的P2口默认为十六位地址的高八位地址,要根据是不是有其它的外围设备来定地址,如果没接的话,可以随便来定!!MOVX

@DPTR,A这句是用来启动0809,不用知道A里放的是什么东西,有这句的话0809就会被启动了

HERE

SJMP

HERE

这句无限循环

应该是用来等待中断的

end的话程序会被终止,中断程序也不会再被执行了

LED那个你需要知道LED的结构很简单,网上很容易找

硬件地址的分配是看你接的那几根线了,原则上只要不重复应该都可以

有一些

是电路直接与单片机I/0口连接,而没有经过AD转换,请问什么“情况下可以进行这样的处理,也就是说,单片机I/0口可以接多大的电流或者电压?”这句电压的话一般是5V,但是那个AD不是因为电压不匹配才接的,单片机要的是数字量,AD是将模拟两转换成数字量的!

用十位的二进制,除以10,余数就是个位;

商,继续除以10,余数就是十位;

依次类推,可得出百位、千位。

十位的二进制,除以10,可以使用二字节除以一字节的除法子程序,这个子程序可见我前几天写出的答案:

>

#include <msp430x14xh>

void main(void)

{

WDTCTL = WDTPW+WDTHOLD; // Stop watchdog timer

P6SEL |= 0x01; // Enable A/D channel A0

ADC12CTL0 = ADC12ON+SHT0_2; // Turn on ADC12, set sampling time

ADC12CTL1 = SHP; // Use sampling timer

ADC12MCTL0 = SREF_2; // Vr+ = VeREF+ (external)

ADC12CTL0 |= ENC; // Enable conversions

while (1)

{

ADC12CTL0 |= ADC12SC; // Start conversion

while ((ADC12IFG & BIT0)==0);

_NOP(); // SET BREAKPOINT HERE

}

}

这是TI公司的例程

ui_AD_data=(ui_ADCH<<8)|UI_ADcl; 就是这里我没有看懂

看你这个程序,转换结果应该是右对齐的,假定转换结果为1023(0x03ff),那么ADCL = 0XFF,ADCH = 0X03

ui_ADCL=ADCL;也就等于0xff

ui_ADCH=ADCH;也就等于0x03

ui_ADCH<<8,那么ui_ADCH就等于0x0300,再和ui_ADCL做或运算,则ui_AD_data=0x3ff,你所说的返回最大也才255,不知道是怎么来的

可以发送16进制数或ASCII码格式的数据

发送16进制的数据,例如:

SBUF=ADC1;//ADC1是AD转换的结果,16进制数据

发送ASC码的格式数据,例如:

SBUF=0X30+ADC1/100; //发送百位数字

SBUF=0X30+(ADC1%100)/10;//发送十位数字

SBUF=0X30+(ADC1%100)%10;//发送个位数字

#include "reg51h"

#define data_point P0

sbit EOC=P2^0;

sbit ADDA=P2^1;

sbit ADDB=P2^2;

sbit ADDC=P2^3;

sbit OE=P2^5;

sbit START=P2^6;

sbit CLK=P2^7;

sbit ALE=P2^6;

unsigned char disp[3]={0,0,0};

char code dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

unsigned char t0count=0;

unsigned int temp;

double sum;

unsigned char val_Integer; //整数

unsigned int val_Decimal; //小数

sbit k1 = P1^0;

sbit k2 = P1^1;

sbit k3 = P1^2;

sbit k4 = P1^3;

void delay(unsigned char ms)

{

unsigned char i;

while(ms--)

for(i=0;i<125;i++);

}

void display()

{

disp[0]=disp[0]&0x7f;

P3= disp[0];

k1 = 1;

delay(2);

k1 = 0;

P3= disp[1];

k2 = 1;

delay(2);

k2 = 0;

P3= disp[2];

k3 = 1;

delay(2);

k3 = 0;

P3= disp[3];

k4 = 1;

delay(2);

k4 = 0;

}

unsigned char ADC0808()

{

unsigned char d;

ADDC=0;

ADDB=0;

ADDA=0;

TR1=1;

ALE=1;ALE=0;

START=1;START=0;

while(EOC==0);

OE=1;

d=data_point;

OE=0;

TR1=1;

return d;

}

void covert(unsigned char x)

{

sum=x00201378;

val_Integer=(unsigned char)sum;

val_Decimal=(unsigned int)((sum-val_Integer)1000);

disp[3]=dispcode[val_Decimal%10];

disp[2]=dispcode[val_Decimal/10%10];

disp[1]=dispcode[val_Decimal/100];

disp[0]=dispcode[val_Integer];

}

void main()

{

TMOD=0x21;

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

TH1=256-2;

ET0=1;

ET1=1;

EA=1;

TR0=1;

OE=0;

START=0;

EOC=1;

while(1)

{

display();

}

}

void time0() interrupt 1

{

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

t0count++;

if(t0count==100)

{

t0count=0;

covert(ADC0808());

}

}

void time1() interrupt 3

{

CLK=~CLK;

}

以上就是关于单片机汇编语言,用书上的三种方式编程实现A/D转换,但第一种“定时传送方式”不会写,网上也找不到全部的内容,包括:单片机汇编语言,用书上的三种方式编程实现A/D转换,但第一种“定时传送方式”不会写,网上也找不到、问几个关于汇编程序的问题、关于10位AD转换的汇编程序—12C5410AD单片机等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9440606.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存