stc12C5A60S2内部AD应用.docx

上传人:b****5 文档编号:3114532 上传时间:2022-11-17 格式:DOCX 页数:15 大小:27.49KB
下载 相关 举报
stc12C5A60S2内部AD应用.docx_第1页
第1页 / 共15页
stc12C5A60S2内部AD应用.docx_第2页
第2页 / 共15页
stc12C5A60S2内部AD应用.docx_第3页
第3页 / 共15页
stc12C5A60S2内部AD应用.docx_第4页
第4页 / 共15页
stc12C5A60S2内部AD应用.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

stc12C5A60S2内部AD应用.docx

《stc12C5A60S2内部AD应用.docx》由会员分享,可在线阅读,更多相关《stc12C5A60S2内部AD应用.docx(15页珍藏版)》请在冰豆网上搜索。

stc12C5A60S2内部AD应用.docx

stc12C5A60S2内部AD应用

系统说明:

本人想用STC12C5A60S2自带的A/D对电源电压进行检测(暂定3.3V),晶振:

12M,电压从P1.0口输入,检测后的电压值在1602上进行显示,附上硬件大致原理图,硬件部分是照STC12C5A60S2芯片资料上设计,大家看看有错没?

硬件原理简图(原文件名:

clip_image001.gif)

程序的A/D部分也是从官网资料上搬下来的,只自己稍微改了一下对读取到的A/D转换结果的数据处理,液晶部分是前阵子写的搬过来的。

大家帮我看看哪出问题了?

程序如下:

#include

#include"intrins.h"

#defineucharunsignedchar

#defineuintunsignedint

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

/*DeclareSFRassociatedwiththeADC*/

sfrADC_CONTR  =  0xBC;        //ADCcontrolregister

sfrADC_RES    =  0xBD;        //ADChigh8-bitresultregister

sfrADC_RESL  =  0xBE;            

//sfrADC_LOW2  =  0xBE;        //ADClow2-bitresultregister

sfrP1ASF    =  0x9D;        //P1secondaryfunctioncontrolregister  

                                    

/*DefineADCoperationconstforADC_CONTR*/

#defineADC_POWER  0x80        //ADCpowercontrolbit

#defineADC_FLAG  0x10        //ADCcompleteflag    模数转换结束标志位

#defineADC_START  0x08        //ADCstartcontrolbit      模数转换启动控制位

//转换速度控制位SPEED0和SPEED1,共四种状态,对应四种转换速度

#defineADC_SPEEDLL0x00        //540clocks

#defineADC_SPEEDL  0x20        //360clocks

#defineADC_SPEEDH  0x40        //180clocks

#defineADC_SPEEDHH0x60        //90clocks

uchartCount;

sbitRS=P0^4;

sbitRW=P0^5;

sbitEN=P0^6;

voidDelayMS(uintms)

{

  uinti;

  while(ms--)

  {

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

  }

}

/*----------------------------

Softwaredelayfunction

----------------------------*/

voidDelay(uintn)

{

  uintx;

  while(n--)

  {

      x=5000;

      while(x--);

  }

}

/*----------------------------

InitialADCsfr

----------------------------*/

voidInitADC()

{

  P1ASF=0x01;            //选择P1.0作为A/D输入通道

  ADC_RES=0;              //清0

  ADC_CONTR=ADC_POWER|ADC_SPEEDLL;  //0x10|0x00=0x10:

开电源和设置A/D转换速度

  Delay

(2);                //ADCpower-onanddelay

}

/*----------------------------

GetADCresult

----------------------------*/

ucharGetADCResult(ucharch)

{

  ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START;//0x00|0x00|ch|0x08:

选择A/D输入通道,开始A/D转换

  _nop_();      //Mustwaitbeforeinquiry,

  _nop_();    //设置ADC_CONTR寄存器后需加4个CPU时钟周期的延时,才能保证值被写入ADC_CONTR寄存器

  _nop_();

  _nop_();

  while(!

(ADC_CONTR&ADC_FLAG));//Waitcompleteflag

  ADC_CONTR&=~ADC_FLAG;      //CloseADC

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

  returnVo;

}

ucharRead_LCD_State()

{

    ucharstate;

    RS=0;

    RW=1;

    EN=1;

    DelayMS

(1);

    state=P2;

    EN=0;

    DelayMS

(1);

    returnstate;                      

}

voidLCD_Busy_Wait()

{

      while((Read_LCD_State()&0x80)==0x80);

    DelayMS(5);

}

voidWrite_LCD_Data(uchardat)    //写数据到1602

{

      LCD_Busy_Wait();

    RS=1;

    RW=0;

    EN=0;

    P2=dat;

    EN=1;

    DelayMS

(1);

    EN=0;

}

voidWrite_LCD_Command(ucharcmd)  //写命令

{

      LCD_Busy_Wait();

    RS=0;

    RW=0;

    EN=0;

    P2=cmd;

    EN=1;

    DelayMS

(1);

    EN=0;

}

voidInit_LCD()    //1602  初始化

{

      Write_LCD_Command(0x38);

    DelayMS

(1);

    Write_LCD_Command(0x01);      //清屏

    DelayMS

(1);

    Write_LCD_Command(0x06);      //

    DelayMS

(1);

    Write_LCD_Command(0x0c);

    DelayMS

(1);

}

voidSet_LCD_POS(ucharp)

{

      Write_LCD_Command(p|0x80);

}

voidDisplay_LCD_String(ucharp,uchar*s)//1602显示

{

      uchari;

    Set_LCD_POS(p);

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

    {

          Write_LCD_Data(s);

          DelayMS

(1);  

    }

}

voidFormat_DateTime(uchard,uchar*a)

{

      a[0]=d/10+'0';

      a[1]=d%10+'0';

}

//写入液晶第二行

voiddisplay(ucharadd,uchardate)

{

    ucharshi,ge;

    shi=date/10+'0';                    

    ge=date%10+'0';

    Write_LCD_Command(0x80+0x40+add);

    Write_LCD_Data(shi);

    Write_LCD_Data(ge);

}

//写入液晶第一行

voiddisplay1(ucharadd,uchardate)

{

    ucharshi,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);

}

voidmain()

{

    Init_LCD();            

  InitADC();

                

    while

(1)

    {

        GetADCResult(0);

        Display_LCD_String(0,"dianya:

");

        display1(7,Vo);

        Display_LCD_String(9,"V    ");

        DelayMS(1000);

    }

}

 

程序二:

*文件名:

AD_CAIYANG.C

*功能:

使用AD采

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1