- void
Read_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即可) - }
-
-
- unsigned
char 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_DATA); //返回A/D转换结果(8位) - }
-
以上- 8位ADC程序模块(适用于STC12C2052AD系列)
-
-
- #include
<STC12C2052AD.H> //单片机头文件 - #include
<intrins.h> //51基本运算(包括_nop_空函数) -
-
- void
DELAY_MS (unsigned int a){ -
unsigned int i; -
while( a-- != 0){ -
for(i = 0; i < 600; i++); -
} - }
-
-
-
- void
UART_init (void){ -
//EA = 1; //允许总中断(如不使用中断,可用//屏蔽) -
//ES = 1; //允许UART串口的中断 -
-
TMOD = 0x20; //定时器T/C1工作方式2 -
SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收) -
TH1 = 0xF3; //定时器初值高8位设置 -
TL1 = 0xF3; //定时器初值低8位设置 -
PCON = 0x80; //波特率倍频(屏蔽本句波特率为2400) -
TR1 = 1; //定时器启动 - }
-
-
-
- void
UART_T (unsigned char UART_data){ //定义串口发送数据变量 -
SBUF = UART_data; //将接收的数据发送回去 -
while(TI == 0); //检查发送中断标志位 -
TI = 0; //令发送中断标志位为0(软件清零) - }
-
-
- void
Read_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即可) - }
-
-
- unsigned
char 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_DATA); //返回A/D转换结果(8位) - }
-
-
- void
main (void){ -
unsigned char R; -
UART_init();//串口初始程序 -
Read_init(0);//ADC初始化 -
P1M0 = 0x01; //P1.7~.0:0000 0001(高阻)//注意:更改ADC通道时须同时将对应的IO接口修改为高阻输入。 -
P1M1 = 0x00; //P1.7~.0:0000 0000(强推) -
while(1){ -
R = Read (); -
UART_T (R); //串口小秘书,将ADC读出值送入串口显示 -
} - }
以上- 8位ADC应用实例(适用于STC12C2052AD系列)
-
- void
Read_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即可) - }
-
-
- 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中) - }
以上- 10位ADC程序模块(适用于STC12C5A60S2系列)
-
-
- #include
<STC12C5A60S2.H> //单片机头文件 - #include
<intrins.h> //51基本运算(包括_nop_空函数) -
-
- void
DELAY_MS (unsigned int a){ -
unsigned int i; -
while( a-- != 0){ -
for(i = 0; i < 600; i++); -
} - }
-
-
-
- void
UART_init (void){ -
//EA = 1; //允许总中断(如不使用中断,可用//屏蔽) -
//ES = 1; //允许UART串口的中断 -
-
TMOD = 0x20; //定时器T/C1工作方式2 -
SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收) -
TH1 = 0xF3; //定时器初值高8位设置 -
TL1 = 0xF3; //定时器初值低8位设置 -
PCON = 0x80; //波特率倍频(屏蔽本句波特率为2400) -
TR1 = 1; //定时器启动 - }
-
-
-
- void
UART_T (unsigned char UART_data){ //定义串口发送数据变量 -
SBUF = UART_data; //将接收的数据发送回去 -
while(TI == 0); //检查发送中断标志位 -
TI = 0; //令发送中断标志位为0(软件清零) - }
-
-
- void
Read_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即可) - }
-
-
- void
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转换, - }
-
-
- void
main (void){ -
UART_init();//串口初始程序 -
Read_init(0);//ADC初始化 -
P1M1 = 0x01; //P1.7~P1.0:0000 0001(高阻)//注意:更改ADC通道时须同时将对应的IO接口修改为高阻输入。 -
P1M0 = 0x00; //P1.7~P1.0:0000 0000(强推) -
while(1){ -
ADC_Read ();//调用ADC转换程序 -
UART_T (ADC_RES); //串口小秘书,将ADC读出值高8位送入串口 0000 0000 -
UART_T (ADC_RESL); //串口小秘书,将ADC读出值低2位送入串口 XXXX XX00 -
} - }