#include <intrins.h>
#include <string.h>
#include <STC12C5620AD.h>
#include <absacc.h>
#include <stdlib.h>
#include <stdio.h>
sfr P1ASF = 0x9D; //P1 secondary function control register
sfr ADC_RES = 0xBD; //ADC high 8-bit result register
#define DATA_P P0
#define uChar8 unsigned char //定义无符号 char 类型
#define uInt unsigned int //定义无符号 int 类型
//以下选择 ADC 转换速率,只能选择其中一种
// SPEED1 SPEED0 A/D转换所需时间
//#define AD_SPEED 0x60 //0110,0000 1 1 270个时钟周期转换一次,
// CPU工作频率27MHz时,
// A/D转换速度约100KHz
//#define AD_SPEED 0x40 //0100,0000 1 0 540个时钟周期转换一次
//#define AD_SPEED 0x20 //0010,0000 0 1 810个时钟周期转换一次
//#define AD_SPEED 0x00 //0000,0000 0 0 1080个时钟周期转换一次
//看门狗刷新
sbit WDCLEAR = P3^3; //
uInt DogCount = 0;
//---------------------------------程序过程调用-------------------------------
//bit CallTouCoinsFlag = 0; //调用投币函数标志
//---------------------------------程序过程调用-------------------------------
uChar8 channel = 0; //转换通道
uChar8 P10ADTimes = 0; //P10 A/D 转化次数
uChar8 P11ADTimes = 0; //P10 A/D 转化次数
uInt P10ADValue[4] = 0; //P10 A/D 转化 值
uInt P11ADValue[4] = 0; //P11 A/D 转化 值
//uInt P10ADLastValue = 0; //P10 A/D 最新 转化 值
//uInt P11ADLastValue = 0; //P11 A/D 最新 转化 值
uInt P10ADAvgValue = 0; //P10 A/D 平均 转化 值
uInt P11ADAvgValue = 0; //P11 A/D 平均 转化 值
char P10ADAvgValues[5] = {0}; //P10 A/D 平均 转化 值
char P11ADAvgValues[5] = {0}; //P11 A/D 平均 转化 值
char P11SendADValues1[11] = {0}; //P11 A/D 发送 值1
//char P11SendADValues2[12] = {0}; //P11 A/D 发送 值1
//-----------------------------------函数声明------------------------------
/*
函数原型:void Delays(uInt i,uInt y)
入口参数:i,y 分别为循环 次数
作用描述:延时
*/
void Delays(uInt i,uInt y); //延时
//-----------------------------------函数定义------------------------------
/*
函数原型:void Delays(uInt i,uInt y)
入口参数:i,y 分别为循环 次数
作用描述:延时
*/
void Delays(uInt i,uInt y) //延时
{
uInt j = 0;
uInt k = 0;
for(j = 0; j < i; j ++)
{
for(k = 0; k < y; k++)
{
WDT_CONTR = 0x3c; //喂狗
}
}
}
void get_AD_result(void)
{
uChar8 i = 0;
ADC_DATA = 0;
ADC_LOW2 = 0;
ADC_CONTR = 0xE0; //1110,0000 清 ADC_FLAG, ADC_START 位和低 3 位
switch(channel)
{
case 0: //P1.0
ADC_CONTR &= 0xf8; // CHS0 CHS1 CHS2 0/0/0
//P10ADTimes ++; //P10 A/D 转化次数
break;
case 1: //P1.1
ADC_CONTR &= 0xfe; // CHS0 CHS1 CHS2 0/0/1
//P11ADTimes ++; //P11 A/D 转化次数
break;
default:
break;
}
Delays(1,2); //使输入电压达到稳定
ADC_CONTR |= 0x08; //0000,1000 令 ADCS = 1, 启动A/D转换,
while (1) //等待A/D转换结束
{
if (ADC_CONTR & 0x10) //0001,0000 测试A/D转换结束否
{ break; }
}
ADC_CONTR &= 0xE7; //1111,0111 清 ADC_FLAG 位, 关闭A/D转换,
channel ++;
if(channel > 1)
{
channel = 0;
}
}
void main()
{
Delays(10,10); //延时
//P0口初始化
P0=0xff;
//P1口初始化
P1=0xff;
//P2口初始化
P2=0xff;
//P3口初始化
P3=0xff;
WDT_CONTR = 0x3c; //内部看们
Delays(50,50); //延时
EA = 0;
TMOD = 0x21; //定时器1模式1 定时器0模式1
//---------------------------处理串口中断---------------------------------------
SCON = 0x50; //串行口工作方式1, 10 位异步收发,波特率由定时器控制
PCON |= 0x00;
TL1 = 0xFA;
TH1 = 0xFA; //22.1184M晶振 波特率9600
//---------------------------处理串口中断---------------------------------------
//------------------------------处理中断喂狗------------------------------------
TH0 =0xb8; //预置计数初值,每 8 ms 中断一次 晶振 22.1184
TL0 =0x00;
//------------------------------处理中断喂狗------------------------------------
EA = 1 ; //允许中断
ES = 1 ; //允许串行中断
// ET0 = 1; //T/C0 开中断(定时器0/计数器0)
ET1 = 0; //T/C0 开中断(定时器0/计数器0)
TR1 = 1; //启动定时器1/计数器1
//TR0 = 1; //启动定时器0/计数器0
P1ASF = 0xff; //Open 8 channels ADC function
ADC_RES = 0; //Clear previous result
P1M0 = 0xff;
P1M1 = 0xff;
//P1 口设定
//P1M0[7:0] P1M1[7:0]
//1 0 仅为输入(高阻),如果该 I/O 口需要作为 A/D 使用,可选此模式
//1 1 开漏(Open Drain),如果该 I/O 口需要作为 A/D 使用,可选此模式
ADC_CONTR |= 0x80; //1000,0000 打开 A/D 转换电源
//CHS0 CHS1 CHS2
ADC_CONTR |= 0x40; //SPEED1 1
ADC_CONTR &= 0xd0; //SPEED0 0
//540 个时钟周期
while(1)
{
DogCount ++;
if(DogCount >= 10)
{
DogCount = 0;
WDCLEAR = ~WDCLEAR; //喂狗
WDT_CONTR = 0x3c; //内部看们狗
}
get_AD_result( );
}
}
现在问题出在:
while (1) //等待A/D转换结束
{
if (ADC_CONTR & 0x10) //0001,0000 测试A/D转换结束否
{ break; }
}
程序运行不出来。
各位大哥,我哪里错了?
谢谢! |