怎样利用液晶1602显示AD转换数据以下是本人所写的程序。

怎样利用液晶1602显示AD转换数据以下是本人所写的程序。,第1张

#include<reg51h>

#define uint unsigned int

#define uchar unsigned char

sbit sta=P3^4;

sbit eoc=P3^3;

sbit oe=P3^2;

sbit clk=P3^1;

sbit lcdrs=P3^5;

sbit lcdrw=P3^6;

sbit lcdoe=P3^7;

uchar code table1[]="Voltage!";

uchar code table2[]="(V)";

uchar tt0;

void delay(uint x)

{

uchar t;

while(x--) for(t=0;t<120;t++);

}

void timer0() interrupt 1

{

TH0=(65536-1000)/256;

TL0=(65536-1000)%256;

clk=~clk;

}

void write_com(uchar com)

{

lcdrs=0;

lcdoe=0;

P0=com;

lcdoe=1;

delay(5);

lcdoe=0;

delay(5);

}

void write_dat(uchar dat)

{

lcdrs=1;

lcdoe=0;

P0=dat;

lcdoe=1;

delay(5);

lcdoe=0;

delay(5);

}

void init_lcd()

{

uchar i;

lcdrw=0;

write_com(0x38);

write_com(0x0c);

write_com(0x06);

write_com(0x01);

write_com(0x84);

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

{

write_dat(table1[i]);

delay(5);

}

write_com(0x80+0x48);

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

{

write_dat(table2[i]);

delay(5);

}

}

void display(uchar dat)

{

uchar votc;

votc=dat;

write_com(0x80+0x44);

write_dat(0x30+votc/51);

write_com(0x80+0x45);

write_dat('');

write_com(0x80+0x46);

write_dat(0x30+votc%51/51);

write_com(0x80+0x47);

write_dat(0x30+(votc%51%10));

}

void main()

{

init_lcd();

TH0=(65536-1000)/256;

TL0=(65536-1000)%256;

TMOD=0x01;

EA=1;

ET0=1;

TR0=1;

while(1)

{

sta=0;

sta=1;

sta=0;

while(eoc==0);

oe=1;

display(P2);

oe=0;

}

这是我以前做过的测试程序,或许对你有所帮助,不明白的话可以加976434210,也有ADC0832的测试程序。

给你一个AD转换子程序,转换结果注释了,你自己根据需要改下就行了。

你的仿真图中,ADS7825的控制脚看不清,你根据自己的仿图改一下引脚定义就行了。

引脚定义为

BYTE BIT P12 ;ADS7825定义引脚

BUSY BIT P13

CS BIT P14

RC BIT P15

转换子程序如下:

;AD转换子程序

ADSConvert: ;通道选择在R6中

MOV A , #0FCH

ADD A , R6

MOV P1, A ;P1口选择模拟量输入通道

CLR CS

CLR RC

SETB RC

JNB BUSY,$ ;等待转换结束

CLR BYTE ;先读高8位

MOV adnumh,P0 ;从P0口读出高8位,放在adnumh中,自己改成30H或32H

SETB BYTE ;后读低8位

MOV adnuml,P0 ;从P0口读出低8位,放在adnuml中,自己改成31H或33H

SETB CS

RET ;转换结束在adnumh,adnumh中

最后要说明一点,ADS7825输入的模拟电压范围是正负10V的,不知你的仿真图的电压是多少?

还有,读出的数据结果是16位的带符号数,即模拟电压是负时,转换的结束是负数。电压是正时,转换结果是正数。你要处理好正负数的显示。

这个主要还是看你的热敏电阻是不是线性的,如果是铂电阻这种,线性度很好的话,可以采用楼上的方法,原理就是注重学的已知两点,求一条直线,前提是你要知道两个已知的点。

如果你的电阻线性度不好,偏差比较大,有两种方法,

一、将阻值与温度的关系看做是折线,多求几条直线,根据不同的AD值范围采用不同的折线。

第二种方法就是做一张表,将温度值和AD值用一个表格表示出来,转换时直接查表就行了。

#include <msp430x44xh>

#define REFVOL 25 //参考电压25V

unsigned char adc_Flag;

unsigned int result[6][100];

unsigned char RXDATA_BUF[10];

unsigned int RX_count=0;

unsigned char count_cov;

/延时函数/

void delay(unsigned int t)

{

unsigned int i;

unsigned int j;

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

{

for(j=0; j<100; j++)

{;}

}

}

/初始化AD/

void init_ADC12(void)

{

ADC12CTL0 = ADC12ON + REFON + REF2_5V + SHT0_6 + MSC;

ADC12CTL1 = SHS_0 + SHP + CONSEQ_3;

ADC12MCTL0 = INCH_0 + SREF_1; //通道0,单片机P60口

ADC12MCTL1 = INCH_1 + SREF_1; //通道1,单片机P61口

ADC12MCTL2 = INCH_2 + SREF_1; //通道2,单片机P62口

ADC12MCTL3 = INCH_3 + SREF_1; //通道3,单片机P63口

ADC12MCTL4 = INCH_4 + SREF_1; //通道4,单片机P64口

ADC12MCTL5 = INCH_10 + SREF_1 + EOS; //通道10,内部温度传感器

ADC12CTL1 &= 0x0fff; //设置起始采样通道为ADC12MCTL0所对应的通道

ADC12CTL0 |= ENC; //使能转换;

}

/启动AD/

void start_ADC12()

{

ADC12IE = 0x0020; //使能中断;

ADC12CTL0 |= ADC12SC; //开始采样

adc_Flag = 0;

}

/中断向量/

#pragma vector = ADC_VECTOR

__interrupt void ADC_Interrupt(void)

{

switch(ADC12IFG)

{

case 0x003F:

{

result[0][count_cov] = ADC12MEM0;

result[1][count_cov] = ADC12MEM1;

result[2][count_cov] = ADC12MEM2;

result[3][count_cov] = ADC12MEM3;

result[4][count_cov] = ADC12MEM4;

result[5][count_cov] = ADC12MEM5;

count_cov++;

if(count_cov>100 || count_cov==100)

{

count_cov = 0;

adc_Flag = 1;

ADC12IE &= 0xffdf;

}

}

break;

default:

break;

}

}

/数据格式转换/

void format_Data(void)

{

unsigned char m,n,p;

for(m=0; m<5; m++)

{

for(n=0; n<100; n++)

{

result[m][n] = (int)(((REFVOL result[m][n]) / 4096) 1000); //计算出来的为采样端口电压的值的1000倍

}

}

for(p=0; p<100; p++)

{

result[5][p] = (int)(((REFVOL result[5][p]) / 4096 - 0986) / 000355); //计算出来的为通道10的温度值

}

}

/初始化串口/

void init_uart(void)

{

unsigned int i;

FLL_CTL1 |= XT2OFF + SELM_XT2 + SELS; //选择MCLK时钟源

do //等待时钟稳定

{

IFG1 &= ~OFIFG;

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

}while((FLL_CTL0 & XT2OF) == XT2OF);

UCTL0 |= SWRST; //控制寄存器位

UCTL0 |= CHAR;

UTCTL0 = SSEL0+SSEL1; //选择发送时钟源复位

UBR00 = 0XA0; //波特率9600

UBR10 = 0X01;

UMCTL0 = 0X5E;

UCTL0 &= ~SWRST; //选择发送时钟源置位

ME1 |= URXE0 + UTXE0; //使能发送,接收功能

IE1 |= URXIE0; //使能接收中断

IFG1 = 0X00; //清标志位

P2SEL |= 0X30; //模块选用P24,5作为串口线

P2DIR |= 0X10; //输出方向

// for(i=0; i<10; i++) {RXDATA_BUF[i]=0;}//清接收缓存

}

/---------------------------------------------------------/

void uart_start(void) //启动发送

{

unsigned char i,j,k;

unsigned char temp1;

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

{

for(j=0; j<100; j++)

{

temp1 = result[i][j] >> 8;

for(k=0; k<2; k++)

{

TXBUF0 = temp1;

temp1 = result[i][j];

delay(10);

}

}

}

}

/----------------------------------------------------------/

void uart_receive(void) //接收

{

RXDATA_BUF[RX_count]=RXBUF0;

RX_count++;

}

/-----------------------------------------------------------/

#pragma vector=USART0RX_VECTOR //接收中断

__interrupt void UART0_RX_ISR()

{

uart_receive();

}

/main/

void main(void)

{

WDTCTL = WDTHOLD + WDTPW;

init_ADC12();

init_uart();

_EINT();

while(1)

{

start_ADC12();

while(adc_Flag == 0);

format_Data();

uart_start();

}

}

以上程序是F449的ADC多通道多次采样的程序,采样后通过串口发送至上位机,自己可以根据不同要求改一下控制寄存器的值,以实现其他采样方式。

您好,/

此程序通过对DAC0832 *** 作,实现D/A转换。按INT1键DAC0832输出电压变高,按s3键DAC0832电压变低。

输出接口是"D/A OUT"

/

#include<reg51h>

//////////////////////

sbit le1=P1^0;/ic1 74hc373使能端/

sbit dac0832_cs=P3^7;

sbit dac0832_wr=P1^1;

sbit int1_k=P3^3;

sbit s3_k=P3^6;

sbit blight=P0^6;

void s_q00();

void s_q01();

void s_q02();

void s_q03();

void s_q04();

void s_q05();

void s_q06();

void s_q07();

void c_q00();

void c_q01();

void c_q02();

void c_q03();

void c_q04();

void c_q05();

void c_q06();

void c_q07();

//void delay1();

void delayms(unsigned int i);

void delay100us() ;

void initi_lcd();

void initi();

void c_rw();

void s_rw();

void c_e();

void s_e();

void c_rs(void);

void s_rs(void);

void display(unsigned int addr,char a);

void out_74ls164(unsigned char i);

unsigned char q1=0;

unsigned char da_out_74ls164=0,pwm1=0;

void d_to_a(unsigned char dat)//DAC0832写函数。

{

out_74ls164(dat);

//c_q14(); /片选/

dac0832_cs=0;

//c_q13(); /写数据/

//s_q13();

dac0832_wr=0;

dac0832_wr=1;

// s_q14();/禁止转换/

dac0832_cs=1;

}

main()

{

unsigned char dat=0;

initi_lcd();

display(0,'o');

display(1,'u');

display(2,'t');

display(3,'p');

display(4,'u');

display(5,'t');

display(6,':');

display(7,0x30+dat/100);display(8,0x30+dat%100/10);display(9,0x30+dat%10);

while(1)

{

if(int1_k==0) {dat++;display(7,0x30+dat/100);display(8,0x30+dat%100/10);display(9,0x30+dat%10);}

if(s3_k==0) {dat--;display(7,0x30+dat/100);display(8,0x30+dat%100/10);display(9,0x30+dat%10);}

blight=1;

d_to_a(dat);

delayms(60);

}

}

void display(unsigned int addr,char a)

{

s_e();

c_rs();

c_rw();

// P0=0x80+i;

out_74ls164(0x80+addr); /写地址/

c_e();

delay100us();

s_e();

s_rs();

//P0=a;

out_74ls164(a);/写数据/

c_e();

delay100us();

s_e();

}

void delayms(unsigned int i)

{

unsigned int j;

for(;i>0;i--)

for(j=100;j>0;j--);

}

void initi_lcd()

{

delayms(10);

c_rw();

s_e();

c_rs();

// P0=0x01;

out_74ls164(0x01);

c_e();

delayms(5);

s_e();

c_rs();

// P0=0x38;

out_74ls164(0x38);

c_e();

delayms(5);

s_e();

//P0=0x0f;

out_74ls164(0x0f);

c_e();

delayms(5);

s_e();

// P0=0x04;

out_74ls164(0x04);

c_e();

delayms(5);

s_e();

}

void out_74ls164(unsigned char i)

{

unsigned char j,i_tem;

// s_q27();

for(j=0;j<8;j++)

{

i_tem=i<<j;

if(i_tem&0x80)s_q01();/74ls164数据/

else c_q01();

c_q00();/74ls164时钟/

s_q00();

}

}

void s_rs(){s_q05();}

void c_rs(){c_q05();}

void s_rw(){s_q06();}

void c_rw(){c_q06();}

void s_e(){s_q07();}

void c_e(){c_q07();}

void delay100us() { unsigned int i=2; for(;i>0;i--); }

///////////////////////////////////////////////////////

//////////////////////////////////////////////////

/74hc373扩展接口函数:s表示置1,c表示置0,q1表示ic1 74hc373 ,

q2表示ic2 74hc373 ,仅接着的数字表示相应输出Q的序号 /

void s_q00(){q1=q1|0x01; P0=q1; le1=1; le1=0; }

void s_q01(){q1=q1|0x02; P0=q1; le1=1; le1=0; }

void s_q02(){q1=q1|0x04; P0=q1; le1=1; le1=0; }

//void s_q03(){q1=q1|0x08; P0=q1; le1=1; le1=0; }

void s_q04(){q1=q1|0x10; P0=q1; le1=1; le1=0; }

void s_q05(){q1=q1|0x20; P0=q1; le1=1; le1=0; }

void s_q06(){q1=q1|0x40; P0=q1; le1=1; le1=0; }

void s_q07(){q1=q1|0x80; P0=q1; le1=1; le1=0; }

void c_q00(){q1=q1&(~0x01); P0=q1; le1=1; le1=0;}

void c_q01(){q1=q1&(~0x02); P0=q1; le1=1; le1=0;}

void c_q02(){q1=q1&(~0x04); P0=q1; le1=1; le1=0;}

//void c_q03(){q1=q1&(~0x08); P0=q1; le1=1; le1=0;}

void c_q04(){q1=q1&(~0x10); P0=q1; le1=1; le1=0;}

void c_q05(){q1=q1&(~0x20); P0=q1; le1=1; le1=0;}

void c_q06(){q1=q1&(~0x40); P0=q1; le1=1; le1=0;}

void c_q07(){q1=q1&(~0x80); P0=q1; le1=1; le1=0;}

以上就是关于怎样利用液晶1602显示AD转换数据以下是本人所写的程序。全部的内容,包括:怎样利用液晶1602显示AD转换数据以下是本人所写的程序。、请教一个关于AD转换器的程序问题,必须用汇编语言、怎样写用热敏电阻测温度的程序,用单片机AD测的热敏电阻的AD值,怎样把数字量转换成温度等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/10119565.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存