社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 2311|回复: 3

[求助] STC 12C5608AD 的AD转换问题

[复制链接]

8

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2016-12-9 22:14:25 | 显示全部楼层 |阅读模式
    各位老师好,向各位老师求助STC12C5608AD的AD转换问题,这个问题已经折磨了我将近两周,采用的芯片为LQFP32封装,P1.1脚为AD转换输入,电压用两个1K电阻分压,输出用HT1621三位半液晶段码显示。内部晶振,显示没有问题,现在的问题集中表现在一,AD转换没有,显示为0.0,原先以为在某宝上买的芯片有假,直接从生产厂家订购,换好后依旧显示0.0 。二,PXM0、PXM1在AD转换情况下的设定。三,是否我的KEIL有问题,因为以前刚上过。线路图如下,电容为700微法,电阻都是10K。



程序如下:

#include<stc12c5630ad.h>
#include<intrins.h>

#define uchar  unsigned char
#define uint   unsigned int
#define _Nop() _nop_(); _nop_(); _nop_();_nop_();_nop_();_nop_();_nop_()                  //一共七个空操作

#define BIAS     0X52        //BIAS设置

#define SYSDIS   0X00        //关系统振荡器和LCD偏压发生器
#define SYSEN    0X02        //打开系统振荡器

#define LCDOFF   0X04   //关LCD偏压
#define LCDON    0X06        //打开LCD偏压

#define XTAL     0X28        //外部接时钟
#define RC256    0X30        //内部时钟

#define TONEON   0X12        //打开声音输出
#define TONEOFF  0X10        //关闭声音输出

#define WDTDIS   0X0A         //禁止看门狗


/*
//液晶模块接口定义,根据自己的需要更改 CLK DA CS
sbit HT1621_DAT = P3^7;         //SDA
sbit HT1621_WR  = P3^6;         //CLK
sbit HT1621_CS  = P2^7;         //CS
sbit key = P3^4;
*/

sbit HT1621_WR  = P2^2;         //CLK          WR外部写脉冲
sbit HT1621_DAT = P1^7;         //SDA          串行数据
sbit HT1621_CS  = P2^3;         //CS          时序基准脉冲,可以用系统时钟输出,也可以用I/O口模拟时序输出


sbit BLA=P2^1;


uchar code HT1621Tab[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uchar code LCD_A[10]={0x05,0x00,0x06,0x02,0x03,0x03,0x07,0x01,0x07,0x03};                 //定义LCD屏每一位前半段数据
uchar code LCD_B[10]={0x0f,0x06,0x0b,0x0f,0x06,0x0d,0x0d,0x07,0x0f,0x0f};                 //        定义LCD屏每一位后半段数据

unsigned int  U,U1,U2;
uchar i,j,t;
uchar n;


/************************************************
          延时微秒  delay us
***************************************************/
void Delay(uchar ms)
{
  uint i;
  for(i=0;i<ms;i++);

}



/*****************************************************
     延时豪秒 delay ms
*******************************************************/
void DelayMS(uint MS)
{
  uint i,j;
   for(i = 0; i < MS; i++)
   for(j = 0; j < 65; j++)
   Delay(1);
}




/******************************************************
写数据函数,cnt为传送数据位数,数据传送为低位在前
*****************************************************/
void HT1621Wr_Data(uchar Data, uchar cnt)                                        //写数据         Data为数据,cnt为该数据的位数
{
uchar i;
for(i = 0; i < cnt; i++)                                                                   //传送数据位数,并以传送数据位数为循环次数
{
  HT1621_WR = 0;                                                                                //此时WR写数据脉冲为低电平,应该是低电平有效
  _Nop();                                                                                                 //经过7步空操作
  HT1621_DAT = Data&0x80;                                                                 //从低位开始串行发送一位数据。&0x80 按位与,确保最高一位有效,其他位为0
  _Nop();                                                                                                //再次经过7步空操作
  HT1621_WR = 1;                                                                                //写数据标志位关闭
  _Nop();                                                                                                 //第三次经过7步空操作
  Data<<=1;                                                                                                 //数据左移一位
}
}

/********************************************************
写命令函数
*************************************************************/
void HT1621Wr_Cmd(uchar Cmd)                                 //给1621写指令的函数,执行一次该函数,写一条指令,这个要与数据区分开
{
HT1621_CS = 0;                                                                                         //
_Nop();
HT1621Wr_Data(0x80,4);                                         //写入命令标志位100
HT1621Wr_Data(Cmd,8);                                         //写入命令数据
HT1621_CS = 1;
_Nop();
}

/**************************************************************
   在指定地址写入数据函数
   HT1621数据位是4位,所以实际写入的数据是参数的后4位
***************************************************************/
void HT1621WrOneData(uchar Addr, uchar Data)
{
  HT1621_CS = 0;                          //CS=0        开始写入数据  低电平有效
  HT1621Wr_Data(0xa0,3);         // 写入数据标志101                  0xa0(1010 0000)的后三位
  HT1621Wr_Data(Addr<<2,6);         // 写入地址数据 sigen          先左移两位,共6位数据
  HT1621Wr_Data(Data<<4,4);         //  写入数据
  HT1621_CS = 1;                         //CS=1                写数据完成,关闭CS标志
  _Nop();
}

/****************************************************************
HT1621数据位是4位,此处每次数据为8位,写入数据总数按8位计算
******************************************************************/
void HT1621WrAllData(uchar Addr, uchar *P, uchar cnt)
{
  uchar i;
  HT1621_CS = 0;                                 //开写数据标志位
  HT1621Wr_Data(0xa0,3);                 //写入数据标志
  HT1621Wr_Data(Addr<<2,6);                 //写入地址数据
  for(i = 0; i<cnt; i++)                 //循环*P数据包的数据总个数次
  {
          HT1621Wr_Data(*P,8);
        P++        ;
  }
  HT1621_CS = 1;
  _Nop();
}
/*************************************************************

  HT1621初始化,
**************************************************************/
void HT1621_Init()
{
        HT1621_CS = 1;
        HT1621_WR = 1;
        HT1621_DAT= 1;
        DelayMS(100);
        HT1621Wr_Cmd(BIAS);
        HT1621Wr_Cmd(RC256);
        HT1621Wr_Cmd(SYSDIS);
        HT1621Wr_Cmd(WDTDIS);
        HT1621Wr_Cmd(SYSEN);
        HT1621Wr_Cmd(LCDON);

}



void display_U(U)
{
        U1=U/10;
        U2=U%10;

       
        DelayMS(100);

          HT1621WrAllData(0,HT1621Tab,16);        //清 屏
       

            HT1621WrOneData(0x00,0x05);
                HT1621WrOneData(0x01,0x0e);
                HT1621WrOneData(0x02,LCD_A[U1]);
                HT1621WrOneData(0x03,LCD_B[U1]);
                HT1621WrOneData(0x04,LCD_A[U2]|0x08);
                HT1621WrOneData(0x05,LCD_B[U2]);
                 
}



/***********************AD******************************/


ADC_interrupt()interrupt 5                   //AD转换服务程序,中断号为5
{
    ADC_CONTR =0x89;         //AD转换控制寄存器,ADC电源开启,540个时钟转换一次,转换结束控制位清0,
          _nop_();
  _nop_();
  _nop_();
  _nop_();
    U=ADC_DATA*5/256;                 //计算电压值,基准电压为5V
    ADC_CONTR=0x89;                    //开启AD转换

}

void init_adc()
{
  ADC_CONTR=0x89;
  ADC_DATA=0;
  ADC_LOW2=0;


  _nop_();
  _nop_();
  _nop_();
  _nop_();
  AUXR&=0xfb;
}



main()
{
   P0M0=0x0e;
   P0M1=0x0f;
   P1M0=0x01;
   P1M1=0x83;
   P2M0=0x1f;
   P2M1=0x1f;
   P3M0=0xa0;
   P3M1=0xbc;


         HT1621_Init();             //上电初始化
         init_adc();
         AUXR |= 0x10;
         EA=1;

         ADC_CONTR=0x89;
       


         BLA=1;


         while(1)
         {

                     display_U(U);
                           
         }
}


此帖出自单片机论坛
AD试验-Model.jpg


回复

使用道具 举报

8

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

 楼主| 发表于 2016-12-9 22:23:52 | 显示全部楼层
补发电路图,原先的没有标注
AD试验PCB-Model1.jpg


回复

使用道具 举报

3136

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2016-12-10 23:56:05 | 显示全部楼层
太长了,你搞具体点,第一次转换有没有数据?


回复

使用道具 举报

8

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

 楼主| 发表于 2016-12-12 21:23:08 | 显示全部楼层
huo_hu 发表于 2016-12-10 23:56
太长了,你搞具体点,第一次转换有没有数据?

谢谢版大回复,AD问题已经解决,可是为什么打开AD后,设定的几个按钮却不好使了,乱蹦,这是为什么?


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2018-6-24 15:11 , Processed in 0.125164 second(s), 17 queries , Gzip On, Redis On.

快速回复 返回顶部 返回列表