
#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值,怎样把数字量转换成温度等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)