0
问答首页 最新问题 热门问题 等待回答标签广场
我要提问

利用STC12C5A60AD进行电压采集



想用STC12C5A60AD的P1口及其内部的AD进行电压采集,看了关于STC12C5A60AD的AD转换的资料,写了下面这样的程序,调了两三天,可是在液晶上显示就是零,不知是怎么回事,各位帮忙指点一下,谢谢!
STC12c5a60ad.rar(3.46 KB, 下载次数: 20)2011-12-12 10:49 上传点击文件名下载附件
#include
#define uchar unsigned char
#define uint unsigned int

#define    comm    0
#define    dat   1

sfr16 DPTR=0x82;
sbit a=P1^3;
sbit b=P1^4;
sbit rs=P2^7;
sbit rw=P2^6;
sbit e=P2^5;

long v;
uchar bai,shi,ge;

void delay(uint z)
{
         uint x,y;

         for(x=z;x>0;x--)

         for(y=110;y>0;y--);
}


void wr_lcd (uchar dat_comm,uchar content);

void init_lcd (void)
{

        wr_lcd (comm,0x30);        /*30---基本指令动作*/

        wr_lcd (comm,0x01);        /*清屏,地址指针指向00H*/

        wr_lcd (comm,0x06);        /*光标的移动方向*/

        wr_lcd (comm,0x0c);         /*开显示,关游标*/
}

void wr_lcd (uchar dat_comm,uchar content)      //液晶时序
{
         if(dat_comm)
         {

                rs=1;         //data

                rw=0;        //write

         }

        else

        {

                 rs=0;                 //command

                rw=0;                   //write

         }

            P0=content;                 //output data or comm

            e=1;

            delay(10);

            e=0;
}

void wrs(uchar p,uchar ba,uchar sh,uchar gee)           //写液晶
{

              wr_lcd(comm,0x30);

              delay(10);

              wr_lcd(comm,p);

              delay(10);

              wr_lcd(dat,0x30+ba);

              delay(10);

              wr_lcd(dat,0x30+sh);

              delay(10);

              wr_lcd(dat,0x30+gee);
}


void init()
{

             /*ADC初始化*/

            AUXR1=0x04;              //十位ADC个人认为为右对齐。

            P1ASF=0x07;                //取P1口前三个口为模拟输入端

            ADC_CONTR=0x80;        //此寄存器后需加四个CPU时钟延时才能保证电源被打开

            delay(30);

            EA=1;

            EADC=1;

            init_lcd ();

           a=0;

           b=0;

           bai=0;

           shi=0;

           ge=0;
      
           ADC_CONTR=0x88;              //启动AD转换

           delay(1);

}
void main()
{

           init();

          while(1);
}
void adc() interrupt 5
{
        DPH=ADC_RES;

        DPL=ADC_RESL;              //将ADC转换的结果送给DPTR

        v=DPTR;

         v=v/1024;

         v=v*5;         //转换成十进制数

         bai=v/100;

         shi=v%100/10;

         ge=v%10;

         ADC_CONTR=0x80;           ///此处要加AD中断标志清零

        delay(30);

         wrs(0x83,bai,shi,ge);           //将数据送到液晶显示

         delay(10);

         ADC_CONTR=0x88;           //此寄存器后需加四个CPU时钟延时才能保证参数被写入

         delay(1);

}
提问者:Elva_chen 地点:- 浏览次数:7846 提问时间:05-08 05:18
我有更好的答案
提 交
8条回答
dahairenlyy 05-16 03:35
你要发在程序的版面。
iecctv 05-10 15:52
谁用过STC12C5A60AD中AD转换器,帮忙看指点一下,谢谢!
riverdj 05-17 20:13
1、采集的电压是3.6伏左右,用P1.0口做采集电压做AD的输入,P1ASF赋的值是0x07,AUXR1赋的值是0x04(ADRJ赋值为1,取十位AD转换数据)。
2、用的是中断方式,总中断和AD中断都打开了,先启动AD的电源,延时了一段时间再启动的AD转换,通过几天的程序调试感觉能进入AD中断,我在AD中断函数中进行数据处理,然后写到夜晶上面,可是液晶显示就是零,不知是怎么样回事。
xf20160629 05-09 23:30
粗看了一下,你主程序的循环里面,有启动ADC转换的语句或信号吗?
深圳市名晟电子 05-15 02:25
在主程序中调用了 init() 初始化程序,在初始化程序中有启动AD转换的语句。
60user42 05-15 00:13
你要不停的循环触发试试
哇哈哈1209 05-09 14:16
好,我试一下
jjdwe 05-15 13:16
问题已经弄懂了,计算电压值时,应将ADC-RES中的值先乘以5再除以256(后来改用八位AD了),就能得到正确的值,如果将ADC-RES中的值先除以256,就会变成小数了,整数部分是零,再赋给uchar型的变量,那变量的值就是零了。
我就是先除以256,再赋给uchar型的变量,然后变量的整数部分就是零了,结果送出的值就是零,液晶显示结果就是零。
撰写答案
提 交
1 / 3
1 / 3