ADC0832模数转换与显示中的问题

2019-07-16 00:09发布

#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define delay4us() {_nop_();_nop_();_nop_();_nop_();}
//ADC0832Òý½Å¶¨Òå
sbit CS=P1^0;
sbit CLK=P1^1;
sbit DIO=P1^2;
//LCD1602 ¶Ë¿Ú¶¨Òå
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
//ÒÔΪÕûÊý£¬Á½Î»Ð¡ÊýµÄÊý×ÖµçѹÏÔʾ»º³å
uchar Display_Buffer[]="0.00V";
//LCDµÚÒ»ÐÐÏÔʾµÄÐÅÏ¢
uchar code Line1[]="Current Voltage:";
//ÑÓʱ×Ó³ÌÐò
void DelayMS(uint ms)
{
uchar t;
while(ms--) for(t=0;t<120;t++);
}
//LCDæ״̬¼ì²â
bit LCD_Busy_Check()
{
bit result;
RS=0;RW=1;E=1;delay4us();result=(bit)(P0&0x80);E=0;
return result;
}
//ЩLCDÃüÁî
void LCD_Write_Command(uchar cmd)
{
while(LCD_Busy_Check());
RS=0;RW=0;E=0;_nop_();_nop_();P0=cmd;delay4us();
E=1;delay4us();E=0;
}
//ÉèÖÃLCDÏÔʾλÖÃ
void Set_Disp_Pos(uchar pos)
{
LCD_Write_Command(pos|0x80);
}
//дLCDÊý¾Ý
void LCD_Write_Data(uchar dat)
{
while(LCD_Busy_Check());
RS=1;RW=0;E=0;
P0=dat;delay4us();
E=1;delay4us();E=0;
}
//LCD³õʼ»¯
void LCD_Initialise()
{
LCD_Write_Command(0x38);DelayMS(1);
LCD_Write_Command(0x0C);DelayMS(1);
LCD_Write_Command(0x06);DelayMS(1);
LCD_Write_Command(0x01);DelayMS(1);
}
//»ñÈ¡ADת»»½á¹û
uchar Get_AD_Result()
{
uchar i,dat1=0,dat2=0;
//Æðʼ¿ØÖÆλ
CS=0;
CLK=0;
DIO=1; _nop_();_nop_();
CLK=1;  _nop_();_nop_();
CLK=0;DIO=1;_nop_();_nop_();
CLK=1;      _nop_();_nop_();
CLK=0;DIO=0;_nop_();_nop_();
CLK=1;DIO=1;_nop_();_nop_();
CLK=0;DIO=1;_nop_();_nop_();
for(i=0;i<8;i++)
{
CLK=1;  _nop_();_nop_();
CLK=0;  _nop_();_nop_();
dat1=dat1<<1|DIO;
}
for(i=0;i<8;i++)
{
dat2=dat2|((uchar)(DIO)<<i);
CLK=1;  _nop_();_nop_();
CLK=0;  _nop_();_nop_();
}
CS=1;
}
void main()
{
uchar i;
uint d;
LCD_Initialise();
DelayMS(10);
while(1)
{
d=Get_AD_Result()*500.0/255 ;
Display_Buffer[0]=d/100+'0';
Display_Buffer[2]=d/10%10+'0';
Display_Buffer[3]=d%10+'0';
Set_Disp_Pos(0x01);
i=0;
while(Line1[i]!='')
LCD_Write_Data(Line1[i++]);
Set_Disp_Pos(0x46);
i=0;
while(Display_Buffer[i]!='')
LCD_Write_Data(Display_Buffer[i++]);
}
}

我不明白主程序其中的d=Get_AD_Result()*500.0/255 ;是什么意思 在PROTUSE中仿真,给5V  显示0.01V 给0V显示0.00V  在2.25V事从0.00V变换为0.01V
求大神给予解答啊   还有我发现我对0832的理解还不够,能够给指点迷津吗···
360截图20130611100657303.jpg
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
huatengfei
1楼-- · 2019-07-16 00:38
{:12:}{:12:}
wes7856863
2楼-- · 2019-07-16 03:06
huatengfei 发表于 2013-6-11 10:30

你知道出了什么问题了吗···我真的很急··
wes7856863
3楼-- · 2019-07-16 05:51
额··自己找到错误了 在ADC0832的转换程序中 没有返回值  加  return(dat1==dat2)? dat1:0;  后仿真成功了   ···可是还是不明白为什么要乘上500···
wes7856863
4楼-- · 2019-07-16 10:14
 精彩回答 2  元偷偷看……
wes7856863
5楼-- · 2019-07-16 14:49
改了下程序
#include<reg52.h> //°üº¬Í·Îļþ£¬Ò»°ãÇé¿ö²»ÐèÒª¸Ä¶¯£¬Í·Îļþ°üº¬ÌØÊ⹦ÄܼĴæÆ÷µÄ¶¨Òå

sbit RS = P0^5; //Pin4
sbit RW = P0^6; //Pin5
sbit EN = P0^7; //Pin6
unsigned char Display_Buffer[]="0.00V";

#define RS_CLR RS=0
#define RS_SET RS=1
#define RW_CLR RW=0
#define RW_SET RW=1
#define EN_CLR EN=0
#define EN_SET EN=1
/******************************************************************/
/*                    Î¢ÃëÑÓʱº¯Êý                                */
/******************************************************************/
void delay_us(unsigned int n) //ÑÓʱ Èç¹ûÐèÒª¸ß¾«¶ÈÑÓʱ ÇëǶÈë»ã±à
{
if (n == 0)
  {  
  return ;  
  }
  while (--n);
}
/******************************************************************/
/*                    ºÁÃ뺯ÊýÉùÃ÷                                */
/******************************************************************/
void delay_ms(unsigned char i)
{
unsigned char a, b;
for (a = 1; a < i; a++)
{
   for (b = 1; b; b++)
   {   ;   }
    }
}
/******************************************************************/
/*                   дÈëÃüÁÊý                                 */
/******************************************************************/
void LCD_write_com(unsigned char com)
{  
RS_CLR;
RW_CLR;
EN_SET;
P1 = com;
delay_us(5);
EN_CLR;
}
/******************************************************************/
/*                   дÈëÊý¾Ýº¯Êý                                 */
/******************************************************************/
void LCD_write_Data(unsigned char Data)
{
RS_SET;
RW_CLR;
EN_SET;
P1 = Data;
delay_us(5);
EN_CLR;
}
/******************************************************************/
/*                   ÇåÆÁº¯Êý                                     */
/******************************************************************/
void LCD_clear(void)
{
LCD_write_com(0x01);
delay_ms(5);}
/******************************************************************/
/*                   дÈë×Ö·û´®º¯Êý                               */
/******************************************************************/
void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s)
{     
if (y == 0)
{     
LCD_write_com(0x80 + x);     
}
else
{     
LCD_write_com(0xC0 + x);     
}        
while (*s)
{     
LCD_write_Data( *s);     
s ++;     
}
}
/******************************************************************/
/*                   дÈë×Ö½Úº¯Êý                                 */
/******************************************************************/
void LCD_write_char(unsigned char x,unsigned char y,unsigned char Data)
{     
if (y == 0)
{     
LCD_write_com(0x80 + x);     
}   
else
{     
LCD_write_com(0xC0 + x);     
}        
LCD_write_Data( Data);  
}
/******************************************************************/
/*                   ³õʼ»¯º¯Êý                                   */
/******************************************************************/
void LCD_init(void)
{
   LCD_write_com(0x38);    /*ÏÔʾģʽÉèÖÃ*/
   delay_ms(5);
   LCD_write_com(0x38);
   delay_ms(5);
   LCD_write_com(0x38);
   delay_ms(5);
   LCD_write_com(0x38);  
   LCD_write_com(0x08);    /*ÏÔʾ¹Ø±Õ*/
   LCD_write_com(0x01);    /*ÏÔʾÇåÆÁ*/
   LCD_write_com(0x06);    /*ÏÔʾ¹â±êÒƶ¯ÉèÖÃ*/
   delay_ms(5);
   LCD_write_com(0x0C);    /*ÏÔʾ¿ª¼°¹â±êÉèÖÃ*/
   }
   
/******************************************************************/
/*                   Ö÷º¯Êý                                       */
/******************************************************************/   
void main(void)
{
unsigned char i;

delay_ms(100);
LCD_init();
while (1)
{  

LCD_clear();  
LCD_write_str(2,0,"Welcome to");
i=0;   
while(Display_Buffer[i]!='')
LCD_write_str(2,1,Display_Buffer[i++]);
delay_ms(250);
}
}
····为什么会有错啊··求解答啊   求解答

一周热门 更多>