打印
[其它应用]

为什么进不了adc中断?

[复制链接]
1403|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wenfen|  楼主 | 2019-5-6 23:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <SH79F083.H>
#include <INTRINS.H>
#include <define.h>

bit flag=0;

//unsigned char code eeprom[2048] _at_ 0x3000;
void init(void)//初始化寄存器
{
   

EA=0;

EA=1;
}
void initadc(void)
{
ADT = Bin(11100000); //T(ad) = 32*(1/16M) = 2us
//ADCH = Bin(00000001); //AN0,AN1,AN2
//ADCON = Bin(10000000); //ADC enable,ref为vdd
//ADCON |=  Bin(00000001); //start converse from AN0~
ADCH = Bin(00000010); //AN0,AN1,AN2
ADCON = Bin(10010000); //ADC enable,ref为p1.0
ADCON |=  Bin(00000010); //start converse from AN1~
IEN0    |=Bin(01000000);//enable adc interuppt
}

void delay(int n)
{
int i=0,m=0,x=0;
for(m=0;m<n;m++)
{
for(i=0;i<100;i++)
{
x=0;
}
}
}

void main()
{
//// unsigned char i,m;
unsigned int adc;
init();
initadc();

while(1)
{

if(flag==1)
{
adc=ADDH;

delay(10);
adc=ADDL;
delay(10);
flag=0;
ADCON|=0X1;
}

}  
   
}

使用特权

评论回复
沙发
zhuhuis| | 2019-5-6 23:54 | 只看该作者
应该是漏了一句,启动的ADC转换。

使用特权

评论回复
板凳
wenfen|  楼主 | 2019-5-6 23:57 | 只看该作者

使用特权

评论回复
地板
bqyj| | 2019-5-7 21:43 | 只看该作者
启动ADC转换步骤:
1.选择模拟输入通道以及基准电压
2.使能ADC模块
3.GO/DONE置1开始ADC转换
4.等待GO/DONE=0或者ADCIF=1,如果ADC中断使能,则ADC中断将会产生,用户需要软件把ADCIF清0
5.从ADDH/ADDL获得转换数据
6.重复步骤3~5开始另一次转换
启动数字比较功能步骤:
1.选择模拟输入通道以及基准电压
2.写入ADDH/ADDL,设置比较值
3.EC置1使能数字比较功能
4.使能ADC模块
5.GO/DONE置1开始数字比较功能
6.如果模拟输入的值比设置的比较值大,ADIF会被置1。如果ADC中断使能,则ADC中断将会产生,用户需要软件把ADCIF清0
7.数字比较功能会持续工作,直到GO/DONE清0

使用特权

评论回复
5
wenfen|  楼主 | 2019-5-7 21:46 | 只看该作者


哦,我看看

使用特权

评论回复
6
happy_10| | 2019-5-7 21:50 | 只看该作者
应用例程:
/************************************************************
外部晶振为12m
************************************************************/
#include <CPU516.H>
#include <INTRINS.H>
#include <define.h>
bit flag=0;
//unsigned char code eeprom[2048] _at_ 0x3000;
void init(void)//初始化寄存器
{
//CLKCON = 0x0;
EA=0;
T2CON=0x30;//接收和发送时钟为定时器2
SCON=0x50;//模式1 ,允许接收
ES=1;//串口中断势能
RCAP2H=0xFF;//
RCAP2L=0xee;//65536-SYSCLOCK/32/BAUDRATE SYSCLOCK=16.6m/12,默认12分频波特率2400
TH2=0XFF;
TL2=0Xee;//12m,2400
TR2=1;
EA=1;
}
void initadc(void)
{
ADT = Bin(10000000); //T(ad) = 12*(1/12M) = 1us
//T(s) = (14+1)*T(ad) = 15*T(ad) < 16*T(ad)
//T(converse) = 12*T(ad) + T(s) = 14us
//ADCH = Bin(00000001); //AN0,AN1,AN2
//ADCON = Bin(10000000); //ADC enable,ref为vdd
//ADCON |= Bin(00000001); //start converse from AN0~
ADCH = Bin(00000010); //通道选择
ADCON = Bin(10010000); //ADC enable,ref为p1.0
ADCON |= Bin(00000010); //start converse from AN1~
IEN0 |=Bin(01000000);//enable adc interuppt
}
void delay(int n)
{
int i=0,m=0,x=0;
for(m=0;m<n;m++)
{
for(i=0;i<100;i++)
{
x=0;
}
}
}
void main()
{
unsigned char i,m;
init();
initadc();
while(1)
{
if(flag==1)
{
SBUF=ADDH;
delay(10);
SBUF=ADDL;
delay(10);
flag=0;
ADCON|=0X1;
}
}
}
void receive(void) interrupt 4
{
if(RI==1)
{
RI=0;
}
if(TI==1)
{
TI=0;
}
}

void ADC_ISP(void) interrupt 6
{
ADCON&=0Xbe;//清中断标志
flag=1;
}

使用特权

评论回复
7
wenfen|  楼主 | 2019-5-7 21:52 | 只看该作者
是的感谢,没有启动ADC。

使用特权

评论回复
8
huwr| | 2019-5-7 21:56 | 只看该作者
下面的这个例程可能有错误,这个例程启用ADC有问题的。

使用特权

评论回复
9
wenfen|  楼主 | 2019-5-7 22:24 | 只看该作者

哦,我再看看

使用特权

评论回复
10
wenfen|  楼主 | 2019-5-7 22:27 | 只看该作者
我这里有AD的列程,需要可以发给你。

使用特权

评论回复
11
songqian17| | 2019-5-7 22:32 | 只看该作者
我只看出来了初始化寄存器没什么问题!!!

使用特权

评论回复
12
chenho| | 2019-5-7 22:35 | 只看该作者
默认12分频波特率2400,楼主你用的是什么类型的晶振啊??

使用特权

评论回复
13
gongche| | 2019-5-7 22:38 | 只看该作者
你这里有sh79f084a的例程吗,求发给我,谢谢

使用特权

评论回复
14
huwr| | 2019-5-7 22:41 | 只看该作者
你这个ADC是16位的吗?如果是10位的怎么用呢

使用特权

评论回复
15
huanghuac| | 2019-5-7 22:44 | 只看该作者
看看初始化寄存器函数,感觉有点问题啊

使用特权

评论回复
16
wenfen|  楼主 | 2019-5-7 22:48 | 只看该作者
结贴了,多谢大家讨论这么多哈,呵呵

使用特权

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

本版积分规则

737

主题

8940

帖子

8

粉丝