标题:
用STC12C5616AD单片机的AD模块碰到了一些问题
[打印本页]
作者:
loveDNF四
时间:
2019-7-2 21:33
标题:
用STC12C5616AD单片机的AD模块碰到了一些问题
大家好,最近有个项目可能会用到标题中的12C5616AD单片机,在用它的AD模块时遇到了一些障碍代码如下,基本就是检测一个IO口的电压,然后通过这个电压来控制另一个IO口的高低,但是烧进去之后并没有反应,仿真之后发现,
ADC_CONTR这个寄存器虽然被赋值了,但是AD根本没有启动转换,ADC_FLAG这一位始终没有变1。
特来请教,有没有同样遇到这个问题的。
头文件什么的还用过STC12C5630AD.H,KEIL中device也选的STC对应型号,但是仿真发现,ADC_CONTR寄存器根本不能赋值。
单片机源程序如下:
#include <reg52.h>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
//-----------------------------------------------
#define FOSC 11059200L
#define T1MS (65536-FOSC/1000) //1T模式
sfr AUXR = 0x8e;
sfr ADC_CONTR = 0xC5; //ADC control register
sfr ADC_DATA = 0xC6; //ADC high 8-bit result register
sfr ADC_LOW2 = 0xBE; //ADC low 2-bit result register
sfr P1M0 = 0x91; //P1 mode control register0
sfr P1M1 = 0x92;
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;
#define ADC_POWER 0x80 //ADC电源控制位10000000
#define ADC_FLAG 0x10 //ADC完成标志00010000
#define ADC_START 0x08 //ADC起始控制位00001000
#define ADC_SPEED 0x60 //90个时钟
void Delay(u16 n);
void InitADC();
u16 ADC();
u8 ch = 7; //ADC通道号
u16 i;
void main()
{
InitADC(); //初始化ADC
while (1)
{
i=ADC();
if(i>512)
{
P10 = 1;
}
else P10 = 0;
}
}
void InitADC()
{
P1M0 = P1M1 = 0x80;
ADC_DATA = 0; //Clear previous result
ADC_CONTR |= 0x80;
Delay(256); //ADC上电并延时
}
u16 ADC()
{
ADC_DATA=0;
ADC_CONTR=0x60;
ADC_CONTR=0xE0;
ADC_CONTR=0xE7;
Delay(256);
ADC_CONTR=0xEF;
while(1)
{
if(ADC_CONTR & 0x10) //1110 1111 & 0001 0000
{
break;
}
}
ADC_CONTR=0xE7;//1110 0111
return ((ADC_DATA<<8)|ADC_LOW2);
}
void Delay(u16 n)
{
u16 x;
while (n--)
{
x = 5000;
while (x--);
}
}
复制代码
作者:
angmall
时间:
2019-7-3 21:57
12C5616AD单片机 KEIL不能仿真AD转换
给你改了,对比一下就知道哪里错了。
#include <reg52.h>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
//-----------------------------------------------
#define FOSC 11059200L
#define T1MS (65536-FOSC/1000) //1T模式
sfr AUXR = 0x8e;
sfr ADC_CONTR = 0xC5; //ADC control register //ADC控制寄存器
sfr ADC_DATA = 0xC6; //ADC high 8-bit result register //ADC转换结果高位寄存器
sfr ADC_LOW2 = 0xBE; //ADC low 2-bit result register //ADC转换结果低位寄存器
sfr P1M0 = 0x91; //P1 mode control register0
sfr P1M1 = 0x92;
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;
#define ADC_POWER 0x80 //ADC电源控制位10000000
#define ADC_FLAG 0x10 //ADC完成标志00010000
#define ADC_START 0x08 //ADC起始控制位00001000
#define ADC_SPEED 0x60 //90个时钟
void Delay(u16 n);
void InitADC();
u16 ADC();
u8 ch = 7; //ADC通道号 //设置 P1.7 为ADC 采样通道
u16 i;
void main()
{
InitADC(); //初始化ADC
while (1)
{
i=ADC();
if(i>512)
{
P10 = 1;
}
else P10 = 0;
}
}
void InitADC()
{
P1M0 = P1M1 = 0x80;
ADC_DATA = 0; //Clear previous result
ADC_CONTR = 0x80; //ADC_POWER 80 | ADC_SPEEDLL 00
Delay(256); //ADC上电并延时
}
u16 ADC()
{
u16 ADCResult=0;
//ADC_DATA=0;
//ADC_CONTR=0x60;
//ADC_CONTR=0xE0;
//ADC_CONTR=0xE7;
//Delay(256);
ADC_CONTR=0x8F; // ADC_POWER 80 | ADC_SPEEDLL 00 | ch 07 | ADC_START 08
_nop_(); //Must wait before inquiry
_nop_(); //等待4个NOP
_nop_();
_nop_();
while(1) //等待ADC转换完成
{
if(ADC_CONTR & 0x10) //1110 1111 & 0001 0000
{
break;
}
}
//ADC_CONTR=0xE7;//1110 0111
ADC_CONTR &= ~0x10; //Close ADC
ADCResult= ADC_DATA; //ADC转换高位结果
ADCResult= ((ADCResult<<8)| ADC_LOW2); //ADC转换结果
return (ADCResult); //Return ADC result
}
void Delay(u16 n)
{
u16 x;
while (n--)
{
x = 5000;
while (x--);
}
}
复制代码
作者:
buzm
时间:
2019-7-4 21:01
借用了adc初始化函数和ADC转换函数,但不知道怎么改引脚(ADC转换通道),能帮一下忙吗?谢谢。
作者:
老来所学
时间:
2023-4-20 21:28
angmall 发表于 2019-7-3 21:57
12C5616AD单片机 KEIL不能仿真AD转换
给你改了,对比一下就知道哪里错了。
AD程序没反应
作者:
coody_sz
时间:
2023-4-21 13:31
到STC官网下一个例子试试吧,很老的IC了。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1