原创 电子电路基础知识 总结

2009-4-17 16:42 1925 10 10 分类: 工程师职场
挝瘢豪每宓淖试矗迪值缪沟牟杉⒃�font face="Times New Roman ">LCD1602上将电压值(单位:伏)显示出来。


CEPARK-51实验板的配套实验教程中,我们已经分别清楚了LCD1602的显示原理,已经ADC0832的读取操作,这个综合试验主要是通过对两个实验进行综合,使从ADC0832采集到的电压数据在LCD1602上正确的显示出来。

LCD1602ADC0832两个器件的操作都要求按时序进行控制,我们先回顾一下这两个器件的时序图。
(一)LCD1602的时序图:
1602 进行操作主要有四种,如下:
1、读状态,输入:RSLRWHEH。输出:D0D7=状态字
2、写指令,输入:RSLRWLD0D7=指令,E=高脉冲。输出:无
3、读数据,输入:RSHRWHEH。输出:D0D7=数据
4、写数据,输入:RSHRWLD0D7=数据,E=高脉冲。输出:无
这里我们只用到写操作的时序。
attachimg.gif 点击看大图
下载 (17.43 KB)

2009-3-15 12:10






(二)ADC0832的时序图:




attachimg.gif 点击看大图


下载 (48.61 KB)

2009-3-15 12:10






我们此实验的目的是读取ADC0832的;两个通道的电压值,由前面第十六课的内容可知,ADC0832未工作时其CS输入端应为高电平,此时芯片禁用,CLKDO/DI的电平可任意。当要进行A/D转换时,须先将CS使能端置低电平并且保持低电平直到转换完全结束。由实验板的原理图知,通道CH0连在10K的滑动变阻器上,通过调节滑动变阻器可以得到不同的输入电压值(当然前提是先把滑动变阻器旁边的跳线用跳冒连好),如果想同时用通道CH1进行电压采集,则将原理图中S11con4)中间的两针用跳冒连接。我们此实验是进行的双通道的电压采集,故将以上两个跳冒都安装好。(如下图所示)
attachimg.gif 3
下载 (19.74 KB)

2009-3-15 12:10







我们在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();
}
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
10
关闭 站长推荐上一条 /3 下一条