beidewensike 发表于 2012-4-19 17:59:07

求助:STC12C5A60S2自带A/D转换检测电源电压LCD显示实验!!!

最近在做关于STC12C5A60S2AD转换的实验,看到了 论坛之中的贴http://www.ourdev.cn/thread-4840209-1-1.html   我用的LCD是 YJD1602A-2型!!在看完帖子后,把程序复制了一下。。下载到单片机中却不能显示。。LCD屏幕指示两者。。没有字符!!这是为什么那???我的程序如下:


#include<reg51.h>
#include "intrins.h"

#define uchar unsigned char
#define uint unsigned int

uchar Vo;                //A/D转换后换算的电压值

/*Declare SFR associated with the ADC */
sfr ADC_CONTR   =   0xBC;         //ADC control register
sfr ADC_RES   =   0xBD;         //ADC high 8-bit result register
                                 //sfr ADC_RESL    =   0xBE;                        
sfr ADC_LOW2    =   0xBE;         //ADC low 2-bit result register
sfr P1ASF       =   0x9D;         //P1 secondary function control register
                                                                        
/*Define ADC operation const for ADC_CONTR*/
#define ADC_POWER   0x80            //ADC power control bit
#define ADC_FLAG    0x10            //ADC complete flag      模数转换结束标志位
#define ADC_START   0x08            //ADC start control bit         模数转换                                             ///启动控制位

//转换速度控制位SPEED0和SPEED1,共四种状态,对应四种转换速度
#define ADC_SPEEDLL 0x00            //540 clocks
#define ADC_SPEEDL0x20            //360 clocks
#define ADC_SPEEDH0x40            //180 clocks
#define ADC_SPEEDHH 0x60            //90 clocks

uchar tCount;

sbit RS=P3^7;    //寄存器选择位,将RS位定义为P3.7引脚
sbit RW=P3^6;    //读写选择位,将RW位定义为P3.6引脚
sbit EN=P2^7;   //使能信号位,将E位定义为P2.7引脚

void DelayMS(uint ms)
{
uint i;
while(ms--)
{
          for(i=0;i<120;i++);
}
}

/*----------------------------
Software delay function
----------------------------*/
void Delay(uint n)
{
    uint x;

    while (n--)
    {
      x = 5000;
      while (x--);
    }
}


/*----------------------------
Initial ADC sfr
----------------------------*/
void InitADC()
{
    P1ASF = 0x01;                   //选择P1.0作为A/D输入通道
    ADC_RES = 0;                  //清0
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL;   //0x10|0x00=0x10:开电源和设置A/D                                     //转换速度
    Delay(2);                     //ADC power-on and delay
}


/*----------------------------
Get ADC result
----------------------------*/
uchar GetADCResult(uchar ch)
{
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;//0x00|0x00|ch|0x08:选择A/D输入通道,开始A/D转换
    _nop_();         //Must wait before inquiry ,
    _nop_();      //设置ADC_CONTR寄存器后需加4个CPU时钟周期的延时,才能保证值被写入ADC_CONTR寄存器
    _nop_();
    _nop_();
    while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
    ADC_CONTR &= ~ADC_FLAG;         //Close ADC

   Vo=ADC_RES*5*10/256;               //Return ADC result(为显示整数,这                                       //里将电压值扩大了十倍)
    return Vo;
}


uchar Read_LCD_State()
{
      uchar state;
      RS=0;
      RW=1;
      EN=1;
      DelayMS(1);
      state=P2;
      EN = 0;
      DelayMS(1);
      return state;                                       
}


void LCD_Busy_Wait()
{
          while((Read_LCD_State()&0x80)==0x80);
      DelayMS(5);
}

void Write_LCD_Data(uchar dat)   //写数据到1602
{
          LCD_Busy_Wait();
      RS=1;
      RW=0;
      EN=0;
      P2=dat;
      EN=1;
      DelayMS(5);
      EN=0;
}

void Write_LCD_Command(uchar cmd)    //写命令
{
          LCD_Busy_Wait();
      RS=0;
      RW=0;
      EN=0;
      P2=cmd;
      EN=1;
      DelayMS(5);
      EN=0;
}

void Init_LCD()   //1602初始化
{
      Write_LCD_Command(0x38);
      DelayMS(5);
      Write_LCD_Command(0x01);          //清屏
      DelayMS(5);
      Write_LCD_Command(0x06);         //
      DelayMS(5);
      Write_LCD_Command(0x0c);
      DelayMS(5);
}

void Set_LCD_POS(uchar p)
{
          Write_LCD_Command(p|0x80);
}

void Display_LCD_String(uchar p,uchar *s) //1602显示
{
          uchar i;
      Set_LCD_POS(p);
      for(i=0;i<16;i++)
      {
                  Write_LCD_Data(s);
                  DelayMS(5);
      }
}


void Format_DateTime(uchar d,uchar *a)
{
          a=d/10+'0';
          a=d%10+'0';
}


//写入液晶第二行
void display(uchar add,uchar date)
{
      uchar shi,ge;
      shi=date/10+'0';                                       
      ge=date%10+'0';
      Write_LCD_Command(0x80+0x40+add);
      Write_LCD_Data(shi);
      Write_LCD_Data(ge);
}

//写入液晶第一行
void display1(uchar add,uchar date)
{
      uchar shi,ge;
      shi=date/10;
      ge=date%10;
      Write_LCD_Command(0x80+add);
      Write_LCD_Data(0x30+shi);//0x30即48(十进制)对应的ASCAII码为字符                                       //‘0’
      Write_LCD_Data(0x30+ge);
}

void main()
{
      Init_LCD();                  
    InitADC();
                        
      while (1)
      {
                GetADCResult(0);
                Display_LCD_String(0,"dianya:");
                display1(7,Vo);
                Display_LCD_String(9,"V      ");
                DelayMS(1000);
      }
}

我的程序大部分和原帖中的一模一样,但是小弟才疏学浅,不清楚问题出在哪里????单片机P1.0作为A/D输入通道。。还有原帖中的晶振为什么是12M我们的开发板都是22.118M对结果有影响吗????

rclong 发表于 2012-4-19 18:00:16

将ADC和LCD分开来调试
就容易找出问题所在

niepan 发表于 2012-4-19 22:52:43

晶振换了,延时就不一样了,时序也就不对了

beidewensike 发表于 2012-4-20 09:23:45

niepan 发表于 2012-4-19 22:52 static/image/common/back.gif
晶振换了,延时就不一样了,时序也就不对了

哦 。。好的,我来试试看!

颜靖峰 发表于 2014-4-27 12:46:50

为什么我在程序加了P1ASF=0x01;就运行不了

magsino 发表于 2014-4-27 18:57:33

学习了 楼主是否可以加好友详聊下

aliguy 发表于 2014-8-26 14:26:08

你好问下用STC12C5A60S2单片机做16路采集电路,而且用ADS1100芯片的话,这单片机和芯片怎么连啊?单片机没有IIC的么,我学的时间不长,问的低级的请见谅
页: [1]
查看完整版本: 求助:STC12C5A60S2自带A/D转换检测电源电压LCD显示实验!!!