****************************** 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); //數碼管顯示值的大小
}
}