打印

利用STC12C5A60AD进行电压采集

[复制链接]
3009|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
guofan1943|  楼主 | 2011-12-12 10:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 guofan1943 于 2011-12-12 11:04 编辑

想用STC12C5A60AD的P1口及其内部的AD进行电压采集,看了关于STC12C5A60AD的AD转换的资料,写了下面这样的程序,调了两三天,可是在液晶上显示就是零,不知是怎么回事,各位帮忙指点一下,谢谢!
STC12c5a60ad.rar (3.46 KB)
#include<stcdycj.h>
#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);

}

相关帖子

沙发
Tinnal| | 2011-12-12 12:51 | 只看该作者
你要发在程序的版面。

使用特权

评论回复
板凳
guofan1943|  楼主 | 2011-12-13 10:20 | 只看该作者
谁用过STC12C5A60AD中AD转换器,帮忙看指点一下,谢谢!

使用特权

评论回复
地板
guofan1943|  楼主 | 2011-12-13 12:03 | 只看该作者
1、采集的电压是3.6伏左右,用P1.0口做采集电压做AD的输入,P1ASF赋的值是0x07,AUXR1赋的值是0x04(ADRJ赋值为1,取十位AD转换数据)。
2、用的是中断方式,总中断和AD中断都打开了,先启动AD的电源,延时了一段时间再启动的AD转换,通过几天的程序调试感觉能进入AD中断,我在AD中断函数中进行数据处理,然后写到夜晶上面,可是液晶显示就是零,不知是怎么样回事。

使用特权

评论回复
5
corset| | 2011-12-13 15:14 | 只看该作者
粗看了一下,你主程序的循环里面,有启动ADC转换的语句或信号吗?

使用特权

评论回复
6
guofan1943|  楼主 | 2011-12-13 15:30 | 只看该作者
在主程序中调用了 init() 初始化程序,在初始化程序中有启动AD转换的语句。

使用特权

评论回复
7
corset| | 2011-12-13 17:03 | 只看该作者
你要不停的循环触发试试

使用特权

评论回复
8
guofan1943|  楼主 | 2011-12-14 07:33 | 只看该作者
好,我试一下

使用特权

评论回复
9
guofan1943|  楼主 | 2011-12-14 14:36 | 只看该作者
问题已经弄懂了,计算电压值时,应将ADC-RES中的值先乘以5再除以256(后来改用八位AD了),就能得到正确的值,如果将ADC-RES中的值先除以256,就会变成小数了,整数部分是零,再赋给uchar型的变量,那变量的值就是零了。
我就是先除以256,再赋给uchar型的变量,然后变量的整数部分就是零了,结果送出的值就是零,液晶显示结果就是零。

使用特权

评论回复
10
xiaoarchos| | 2021-4-15 23:19 | 只看该作者
很好经验

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

116

主题

423

帖子

0

粉丝