单片机c语言测电压编程,51单片机ADC0832电压测量液晶1602显示的C程序与proteus仿真...

本文介绍了如何使用51单片机结合ADC0832芯片进行电压测量,并将结果显示在液晶1602显示器上。提供了完整的C程序代码和Proteus仿真电路图,适合单片机初学者学习AD转换。程序包括LCD接口和ADC0832接口,实现了电压值的转换和液晶屏上的数字显示。
摘要由CSDN通过智能技术生成

原标题:51单片机ADC0832电压测量液晶1602显示的C程序与proteus仿真

很早对AD转换感兴趣,也想自己业余做块 ,让广大的 爱好者学习使用 。

今天通过搜索,整理了7可以仿真通过的基于+电压采集并通过显示电压的C程序及电路连接图,希望对大家有所帮助。

程序是谁写的谁修改的并不主要,主要的是学会并使用单片机AD转换,这才是王道。

电路连接图如下:

8d31310f8a2935e00e55009c4af73a6e.png

C程序如下:

#include

#include

#include

/**********************************8/

/**********LCD接口程序**********/

#define DD P2

sbit Rs=P3^0;

sbit Rw=P3^1;

sbit E=P3^2;

sbit busy_p=ACC^7;

/********************************/

void delay_1ms(unsigned char i) //最小延时1ms

{ unsigned char j;

while(i--)

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

}

void delay_10ns(unsigned char i) //最小延时10ns

{ unsigned char j;

while(i--)

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

}

void write_com(unsigned char com,bit p) //写指令

{if(p)

delay_10ns(5);

E=0;

Rs=0;

Rw=0;

DD=com;

delay_10ns(50); //>40ns

E=1;

delay_1ms(2); //>150ns

E=0;

delay_10ns(4); //>25+10ns

}

void write_date(unsigned char DATA) //写数据

{

delay_10ns(50);

E=0;

Rs=1;

Rw=0;

DD=DATA;

delay_10ns(50);

E=1;

delay_10ns(50);

E=0;

delay_10ns(4);

}

voiddr_x_y(unsigned char x,bit y) //写坐标,定位置

{ unsigned char temp=0x80;

if(y)

{temp|=0x40;}

temp|=x;

write_com(temp,0);

}

void desplay_char(unsigned char x,bit y,unsigned char p)

//在指定位置显示一个字符。

{ addr_x_y(x,y);

write_date(p);

}

void init(void)

{delay_1ms(15);

write_com(0x38,0);

delay_1ms(5);

write_com(0x38,0);

delay_1ms(5);

write_com(0x38,0);

delay_1ms(5);

write_com(0x38,1);

write_com(0x08,1);

write_com(0x01,1);

write_com(0x06,1);

write_com(0x0c,1);

}

void xs_int(unsigned int shuju,bit t) //显示一个数字

{unsigned char huancun[6]={0};

unsigned char biaozhi=0,i;

if (shuju < 10) biaozhi = 1;

else if(shuju < 100) biaozhi = 2;

else if(shuju < 1000) biaozhi = 3;

else if(shuju < 10000) biaozhi = 4;

else if(shuju < 65535) biaozhi = 5;

switch(biaozhi)

{case 5:huancun[5] = shuju/10000;

case 4:huancun[3] = shuju%10000/1000;

case 3:huancun[2] = shuju%1000/100;

case 2:huancun[1] = shuju%100/10;

case 1:huancun[0] = shuju%10;

break;

default:break;

}

for(i=6;i>1;i--)

{if(i==5)desplay_char(10,1,'.');

else desplay_char(15-i,t,0x30+huancun[i-1]); }

desplay_char(15,t,'V');

}

/************************************************************/

/**********ADC0832接口程序************************************/

sbit ADC_CS =P3^4;

sbit ADC_CLK=P3^5;

sbit ADC_DO =P3^6;

sbit ADC_DI =P3^7;

/*******************************************************************/

void Delay(unsigned char j)

{

unsigned char i;

for(i=0;i

}

unsigned char ADC0832(void) //把模拟电压值转换成8位并返回

{

unsigned char i,data_c;

data_c=0;

ADC_CS=0;

ADC_DO=0;//片选,DO为高阻态

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

{;}

ADC_CLK=0;

Delay(2);

ADC_DI=1;

ADC_CLK=1;

Delay(2); //第一个脉冲,起始位

ADC_CLK=0;

Delay(2);

ADC_DI=1;

ADC_CLK=1;

Delay(2); //第二个脉冲,DI=1表示双通道单极性输入

ADC_CLK=0;

Delay(2);

ADC_DI=1;

ADC_CLK=1;

Delay(2); //第三个脉冲,DI=1表示选择通道1(CH2)

ADC_DI=0;

ADC_DO=1;//DI转为高阻态,DO脱离高阻态为输出数据作准备

ADC_CLK=1;

Delay(2);

ADC_CLK=0;

Delay(2);//经实验,这里加一个脉冲AD便能正确读出数据,

//不加的话读出的数据少一位(最低位d0读不出)

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

{

ADC_CLK=1;

Delay(2);

ADC_CLK=0;

Delay(2);

data_c=(data_c<<1)|ADC_DO;//在每个脉冲的下降沿DO输出一位数据,最终ch为8位二进制数

}

ADC_CS=1;//取消片选,一个转换周期结束

return(data_c);//把转换结果返回

}

void main(void)

{

unsigned int data_temp=0;

while(1)

{ data_temp=ADC0832();

init();

xs_int(196*data_temp,1);

}

}

以上经过仿真测试通过。

责任编辑:

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值