/**************************************************************************************
实验现象: 下载程序后,打开串口调试助手,波特率设置为9600,可以用一根导线
将P06管脚与3.3V或者GND连接测试,可在串口助手上显示对应的AD值(0-4095)。
当然也可以将外部模拟信号接入到P06口,模拟信号范围0-5V
接线说明: 1:STC8A单片机-->模拟信号
P06-->3.3V/GND
注意事项: USB连接线给开发板通电下载程序,STC下载软件中内部IRC时钟选择11.0592MHZ
***************************************************************************************/
#include "STC8.H"
#include "intrins.h"
#include "uart.h"
#define MAIN_Fosc 11059200L //定义主时钟
#define uint8 unsigned char
#define uint16 unsigned int
uint8 code table2[]="ADC_VAL:"; //要显示的内容2放入数组table2
/**************************************
功能描述:延时函数
入口参数:uint16 x ,该值为1时,延时1ms
返回值:无
***************************************/
void delay_ms(uint16 x)
{
uint16 j,i;
for(j=0;j<x;j++)
{
for(i=0;i<1100;i++);
}
}
/**************************************
功能描述:ADC口初始化
入口参数:无
返回值:无
***************************************/
void ADC_config(void)
{
ADC_CONTR|=0x80; //开AD转换电源
delay_ms(10); //适当延时等待AD转换供电稳定
ADC_CONTR|=0x0E; //选择P0.6作为模拟功能AD使用
ADC_CONTR&=0xFE; //选择P0.6作为模拟功能AD使用
ADCCFG&=0xFC; //AD转换速度为96个时钟周期转换一次
ADCCFG|=0x0C; //AD转换速度为96个时钟周期转换一次
ADC_CONTR&=0xDF; //清AD转换完成标志
EADC=0; //禁止ADC转换中断
ADCCFG|=0x20; //ADC转换结果ADC_RES存高4位,ADC_RESL存低8位
ADC_CONTR|=0x40; //启动AD转换,ADC_START=1
}
/**************************************
功能描述:ADC口检测AD转换值函数
入口参数:无
返回值:ADC 12位数据
***************************************/
uint16 Get_ADC12bitResult(void)
{
uint16 AD_Dat=0;
ADC_CONTR&=0xDF; // 将ADC_FLAG清0
ADC_CONTR&=0xBF; //关闭AD转换,ADC_START=0
//12位AD结果的高4位放ADC_RES的低4位,低8位在ADC_RESL
AD_Dat = ADC_RES; //将ADC_RES低4位移到应在的第9位至第12位
AD_Dat <<= 8;
AD_Dat|= ADC_RESL; //将ADC_RESL的8位移到应在的低8位
ADC_CONTR|=0x40; //启动AD转换,ADC_START=1
return AD_Dat;
}
/***************************************************************************
* 描 述 : 主函数
* 入 参 : 无
* 返回值 : 无
**************************************************************************/
int main()
{
uint16 TempPhoto,Temp;
uint8 strPhoto[6];
P3M1 &= 0xFE; P3M0 &= 0xFE; //设置P3.0为准双向口
P3M1 &= 0xFD; P3M0 |= 0x02; //设置P3.1为推挽输出
ADC_config(); //ADC初始化
UartInit(); //串口1初始化
delay_ms(10); //初始化后延时
while (1)
{
memset(strPhoto, 0, sizeof(strPhoto)); //strTemp数组清零
TempPhoto = Get_ADC12bitResult(); //实时读取P0.6通道的AD转换结果
delay_ms(100);
strPhoto[0] = TempPhoto/1000+48; //千位
strPhoto[1] = (TempPhoto%1000)/100+48; //百位
strPhoto[2] = ((TempPhoto%1000)%100)/10+48; //十位
strPhoto[3] = ((TempPhoto%1000)%100)%10+48; //个位
//通过串口1将ADC检测值上报
U1SendString(table2);
U1SendString(strPhoto);
U1SendString(" ");
U1SendString("\r\n"); //输出回车换行符,方便观察数据
delay_ms(1000); //1000ms检测一次,此时间可调,但不宜过小
}
}