****************************** Copyright(C) CaKe ************************************
========================================================================================
==============**版权信息 : CaKen工作室 ==============
==============**文件名 : main.c ==============
==============**作者 : CaKen ==============
==============**版本号 : V1.0 ==============
==============**时间 : 2014.08.30 ==============
==============**功能描述 : ADC实验测试 ==============
========================================================================================
==============**新浪微博 :CaKen ==============
****************************************************************************************
#include"STC12C5A60S2.H"
#include"intrins.h"
sbit SMG1 = P2^4; //数码管1
sbit SMG2 = P2^5; //数码管2
sbit SMG3 = P2^6; //数码管3
sbit SMG4 = P2^7; //数码管4
unsigned char code Tab[]=
{0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e}; //阳
****************************************************************************************
函数名:毫秒级CPU延时函数
调 用:DELAY_MS (?);
参 数:1~65535(参数不可为0)
返回值:无
结 果:占用CPU方式延时与参数数值相同的毫秒时间
备 注:应用于1T单片机时i<600,应用于12T单片机时i<125
****************************************************************************************/
void DELAY_MS (unsigned int a)
{
unsigned int i;
while( --a != 0){
for(i = 0; i < 600; i++);
}
}
***************************************************************************************
函数名:延时程序
调 用:delay();
参 数:
返回值:
结 果:
备 注: 0.1ms延时程序(12MHz 10倍于51单片机速度时)
****************************************************************************************/
void delay (unsigned int a)
{
unsigned char i;
while( --a != 0)
{
for(i = 0; i < 12; i++);
}
}
****************************************************************************************
** 函数名: Display_smg(?);
** 说明 : 数码管显示程序
** 输入值:
** 输出值: 无
** 返回值: 无
*****************************************************************************************/
void Display_smg(unsigned int x)
{
P0 = Tab[x/1000];
SMG1 = 0;
delay(2);
SMG1 = 1;
P0 = Tab[x00/100];
SMG2 = 0;
delay(2);
SMG2 = 1;
P0 = Tab[x0/10];
SMG3 = 0;
delay(2);
SMG3 = 1;
P0 = Tab[x];
SMG4 = 0;
delay(2);
SMG4 = 1;
}
*********************************************************************************************
函数名:10位A/D转换初始化函数
调 用:ADC_Init (?);
参 数:输入的端口(0000 0XXX 其中XXX是设置输入端口号,可用十进制0~7表示,0表示P1.0,7表示P1.7)
返回值:无
结 果:开启ADC功能并设置ADC的输入端口
备 注:使用ADC功能时需要将对应的IO接口设置为高阻输入方式(例如:P1M1 = 0x01;)
**********************************************************************************************/
void ADC_Init (unsigned char CHA)
{
unsigned char AD_FIN=0; //存储A/D转换标志
CHA &= 0x07; //选择ADC的8个接口中的一个(0000 0111 清0高5位)
ADC_CONTR = 0x40; //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)
_nop_();
ADC_CONTR |= CHA; //选择A/D当前通道
_nop_();
ADC_CONTR |= 0x80; //启动A/D电源
DELAY_MS(1); //使输入电压达到稳定(1ms即可)
}
*********************************************************************************************
函数名:10位A/D转换函数
调 用:? = ADC_Read();
参 数:无
返回值:10位ADC数据高(从0到1023(十进制))
结 果:读出指定ADC接口的A/D转换值,并返回数值
备 注:适用于STC12C5A60S2系列单片机(必须使用STC12C5A60S2.H头文件)
**********************************************************************************************/
unsigned int ADC_Read (void)
{
unsigned char AD_FIN=0; //存储A/D转换标志
ADC_CONTR |= 0x08; //启动A/D转换(0000 1000 令ADCS = 1)
_nop_();
_nop_();
_nop_();
_nop_();
while (AD_FIN ==0) //等待A/D转换结束
{
AD_FIN = (ADC_CONTR & 0x10); //0001 0000测试A/D转换结束否
}
ADC_CONTR &= 0xE7; //1111 0111 清ADC_FLAG位, 关闭A/D转换,
return (ADC_RES*4+ADC_RESL); //返回A/D转换结果(10位ADC数据高8位在ADC_RES中,低2位在ADC_RESL中)
}
********************************************************************************************
函数名:主函数
调 用:无
参 数:无
返回值:无
结 果:程序开始处,无限循环
备 注:
********************************************************************************************/
void main(void)
{
unsigned int m;
ADC_Init (0); //初始化P1^0
P1M1 = 0X01; //设置为高阻输入P1^0
P1M0 = 0X00;
while(1)
{
m = ADC_Read(); //把数模转换的数值给m
Display_smg(m); //数码管显示值的大小
}
}