求助STC15W408AS AD转换不能进入中断。

[复制链接]
1620|5
手机看帖
扫描二维码
随时随地手机跟帖
woniu0222|  楼主 | 2016-5-11 12:39 | 显示全部楼层 |阅读模式
//STC15W408AS AD转换并用共阳极3461四位数码管显示
#include<reg52.h>
#include<intrins.h>
//----------定义特殊寄存器-------------
P1ASF=0x9d;
ADC_CONTR=0xbc;
ADC_RES=0xbd;
ADC_RESL=0xbe;
CLK_DIV=0x97;
//------全局变量申明-----------
unsigned char code weima[]={0xfe,0xfd,0xfb,0xf7};    //四位显示
unsigned char code duanma[]={0x05,0x7d,0x46,0x54,0x3c,0x94,0x84,0x5d,0x04,0x14};//段码以P30对应G,P31=C,P32=DP,P33=D,P34=E,P35=A,P36=F,P37=B
//                             0 ,  1,   2,   3,   4,   5,   6,   7,   8,   9
char wm;                                            //位码权
unsigned int ch;
//---------------函数原型-------------------
void yanshi100ms(void); //延时函数原型
void yanshi500ms(void); //延时函数原型
void shuju(unsigned int chat);         //ADC转换完成后数据处理函数原型
void xianshi(unsigned char duan);     //显示程序原型
//----------------ADC转换-------------------
int main(void)
{
   ADC_RES=0x00;
   ADC_RESL=0x00;
   P1ASF=0x01;         //以P1.0为模拟信号输入口
   ADC_CONTR=0x80;     //开启ADC控制电源
   yanshi100ms();      //调用延时函数
   ADC_CONTR =0x88;    //开启ADC转换,AD转换速度540个时钟周期转换一次;以P1.0作为A/D输入来用.
   IE=0xa0;            //开启ADC中断。
   while(1)
      {
       shuju(ch);                      //调用显示程序
           }
}
//--------延时----------------
void yanshi100ms(void)
{
   unsigned int i;
   for(i=0;i<100;i++)
        _nop_();
}
//--------ADC中断--------------
void aea1_zhongduan(void) interrupt 5
{  
   ADC_CONTR &=0xef;                 //清零中断标志位
   ADC_CONTR |=0x04;                 //ADC转换开始位置1
   ch=(ADC_RES*4+ADC_RESL);          //将转换好的数据传给ch
}
//------------ADC数据处理-------
void shuju(unsigned int chat)
{
   int qianwei;                         //千位
   int baiwei;                                 //百位
   int shiwei;                                 //十位
   int gewei;                                 //个位
   qianwei=baiwei=shiwei=gewei=0;
   qianwei=chat/1000;
   chat=chat%1000;                       //取模数
   baiwei=chat/100;                    
   chat=chat%100;                        //取模数
   shiwei=chat/10;                     
   gewei=chat%10;
   xianshi(duanma[qianwei]);         //显示千位
   yanshi500ms();
   xianshi(duanma[baiwei]);          //显示百位
   yanshi500ms();
   xianshi(duanma[shiwei]);          //显示十位
   yanshi500ms();
   xianshi(duanma[gewei]);           //显示个位
   yanshi500ms();       
}
//---------------显示延时程序-------------
void yanshi500ms(void)
{
   unsigned int yan;
   for(yan=0;yan<500;yan++)
        _nop_();
}
//---------------显示程序--------------------
void xianshi(unsigned char duan)
{
   P2=weima[wm++];
   P3=duan;
   if(wm>=4)
       wm=0;
}




以上问题是不管我怎么调接P1.0口输入电压,四位数码管时钟显示0000,请大侠帮忙分析。谢谢!

相关帖子

JY-DX-JY| | 2016-5-13 13:04 | 显示全部楼层
是不是AD中断没配置好?

使用特权

评论回复
2shift| | 2016-5-13 16:57 | 显示全部楼层
特殊功能寄存器定义,少了sfr。开启下次中断之前们最好先把结果保存起来,再开中断。中断服务程序里面,ADC_CONTR |=0x04; 这里错了,改成ADC_CONTR |=0x08;

使用特权

评论回复
saintjatyy| | 2016-9-21 08:35 | 显示全部楼层
楼主的AD上电为什么设置100毫秒?1毫秒不够用吗?

使用特权

评论回复
nwjjdwx| | 2017-1-15 11:09 | 显示全部楼层
楼主您好,您的问题解决了吗?我也有一个类似的应用,想借鉴您的经验,

使用特权

评论回复
DIY小幸福| | 2017-6-2 16:00 | 显示全部楼层
在嘛  你这个adc采集出来准不准???

使用特权

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

本版积分规则

1

主题

1

帖子

0

粉丝