(二)ADC0832的时序图:
我们在LCD1602的第一行分别显示“H0:通道0的电压值” 以及”H1:通道1的电压值”。程序如下:
/****************http://bbs.cepark.com/register.php?fromuid=2975 ********
显示格式(单位V):
H0:4.03
H1:4.03
bbs.cepark.com
/*Writen by kidcao1987
2009-3-7*/
/****************http://bbs.cepark.com/register.php?fromuid=2975 *********/
#include <REG52.H>
#define uint unsigned int
#define uchar unsigned char
sbit lcd_rs=P1^0;
sbit lcd_rw=P1^1;
sbit lcd_en=P1^2; //液晶控制端
sbit cs="P2"^0;
sbit clk="P3"^6;
sbit dodi="P3"^7;//adc0832控制端
uchar temp;
float result;
uchar code name[]="bbs.cepark.com";
void lcd_delay(uint m)
//延时函数
{
while(m--);
}
void read1602()
//忙检测
{
uchar i;
i=254;
P0=0xff;
lcd_rs=0;
lcd_rw=1;
lcd_en=1;
while((i--)&&(P0&0x80));//若一段时间以后仍低,则认为是不忙
lcd_en=0;
}
void write1602(uchar wdata,bit rw)//向LCD1602写数据(rw=1)或者命令(rw=0)
{
read1602();
P0=wdata;
lcd_rs=rw;
lcd_rw=0;
lcd_en=1;
lcd_delay(1);
lcd_en=0;
}
void lcd_init()
//LCD1602液晶的初始化
{
lcd_delay(1500);
write1602(0x38,0);
lcd_delay(500);
write1602(0x38,0);
lcd_delay(500);
write1602(0x38,0);
write1602(0x38,0);
write1602(0x0c,0);
write1602(0x06,0);
write1602(0x01,0);
//清屏
}
void lcd_printf(uchar *str)//显示字符串
{
while(*str!='\0')
{
write1602(*str,1);
//写入数据
str++;
}
}
void lcd_moveto(uchar x,uchar y)//指定显示的行列坐标
{
if(x==0)
write1602(0x80|y,0);
if(x==1)
write1602(0xc0|y,0);
}
uchar readadc0832(bit ch)
//获取数值
{
uchar i,data1=0,data2=0;
clk=0;
dodi=1;
cs=0;//cs=0时ADC0832有效
clk=1;
clk=0;//第一个脉冲,开始位
dodi=1;
clk=1;
clk=0;//第二个脉冲,模式选择
dodi=ch;//通道选择
clk=1;
clk=0;
//第三个脉冲,通道选择
dodi=1;
for(i=0;i<8;i++)
//第一次读数从高到低 ,时钟下降沿有效
{
clk=1;
clk=0;
if(dodi)data1|=0x80>>i;
}
for(i=0;i<8;i++)
//第二次从低到高读数,下降沿有效
{
if(dodi)data2|=0x01<<i;
clk=1;
clk=0;
}
cs=1;
dodi=1;
clk=1;
if(data1==data2)return(data1);
}
void main()//测试用MAIN函数
{
lcd_init();
lcd_moveto(1,1);
lcd_printf(name);
while(1)
{
lcd_moveto(0,0);//定位在第一行第一列
lcd_printf("H0:");
temp=readadc0832(0);//读取通道0的电压值
result=temp*0.01953125;//得到实际的电压值
temp=(uchar)(result);//取得电压值的整数部分
write1602(temp+48,1);//显示电压值的整数部分
write1602('.',1);//显示小数点
result=(result-temp)*10;
temp=(uchar)(result);//获得电压值的小数点后第一位
write1602(temp+48,1);
result=(result-temp)*10;
temp=(uchar)(result); //获得电压值的小数点后第二位
write1602(temp+48,1);
lcd_moveto(0,8); //定位在第一行第八列
lcd_printf("H1:");
temp=readadc0832(1); //读取通道1的电压值
result=temp*0.01953125; //得到实际的电压值
temp=(uchar)(result); //取得电压值的整数部分
write1602(temp+48,1); //显示电压值的整数部分
write1602('.',1); //显示小数点
result=(result-temp)*10;
temp=(uchar)(result); //获得电压值的小数点后第一位
write1602(temp+48,1);
result=(result-temp)*10;
temp=(uchar)(result); //获得电压值的小数点后第二位
write1602(temp+48,1);
}
}
-----------------------------------------------------------------------------------------------------------------
以下为数码管显示:
/******************************************************
适用于CEPARK开发板。
功能:利用ADC0832,通过数码管显示电压能精确到小数点后3位,有跳线连接方式同上。
作者:hnrain
版本:V1.0
时间:2008/03/15
我的技术BLOG:hnrain.cepark.com
******************************************************/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar reg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; //段码
uchar dis[4]={0}; //段码缓存
sbit clk_adc0832=P3^6; //定义各个控制引脚
sbit cs_adc0832=P2^0;
sbit di_adc0832=P3^7;
sbit do_adc0832=P3^7;
sbit c1=P1^0; //位码控制
sbit c2=P1^1;
sbit c3=P1^2;
sbit c4=P1^3;
float temp; //定义一个浮点型变量
uchar i;
void delay(uchar i) //延时
{
for(;i>0;i--)
{
uchar j="244";while(--j);
}
}
uchar getvalue0832(bit channel) //ADC0832数据读取
{
uchar i,dat1=0,dat2=0;
clk_adc0832=0; di_adc0832=1; cs_adc0832=0;
clk_adc0832=1; clk_adc0832=0; //第一个脉冲,开始
di_adc0832=1; clk_adc0832=1; clk_adc0832=0; //第二个脉冲,模式选择
di_adc0832=channel; //第三个脉冲,通道选择
clk_adc0832=1; clk_adc0832=0;
di_adc0832=1; //释放总线
for(i=0;i<8;i++) //从高到低取一次
{
clk_adc0832=1;
clk_adc0832=0;
if(do_adc0832) dat1|=0x80>>i;
}
for(i=0;i<8;i++) //从低到高取一次
{
if(do_adc0832) dat2|=0x01<<i;
clk_adc0832=1;
clk_adc0832=0;
}
cs_adc0832=1; di_adc0832=1; clk_adc0832=1; //释放总线
if(dat1==dat2)
return dat1; //校验数据是不是正确
}
void display() //动态扫描显示
{
P1=0xff;
P0=reg[dis[0]]&0x7f;
c1=0;
delay(5);
c1=1;
P0=reg[dis[1]];
c2=0;
delay(5);
c2=1;
P0=reg[dis[2]];
c3=0;
delay(5);
c3=1;
P0=reg[dis[3]];
c4=0;
delay(5);
c4=1;
}
void Hex2Bcd() //这里是重点,如何取的供显示数据
{
i=getvalue0832(0); //读取ADC0832送来的数据
temp=i*0.01953125; //这里得到对应的电压
dis[0]=(uchar)(temp); //这里用到了强制定义类型,取的整数部分
temp=temp-dis[0]; //取的小数点后第一位数据
temp=temp*10;
dis[1]=(uchar)(temp);
temp=temp-dis[1]; //取的小数点后第二位数据
temp=temp*10;
dis[2]=(uchar)(temp);
temp=temp-dis[2]; //取的小数点后第三位数据
temp=temp*10;
dis[3]=(uchar)(temp);
}
void main() //主函数
{
while(1)
{
Hex2Bcd();
display();
}
}
文章评论(0条评论)
登录后参与讨论