书上的第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单片机等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)