实验5 STC单片机ADC转换实验-V20170317 联系客服

发布时间 : 星期二 文章实验5 STC单片机ADC转换实验-V20170317更新完毕开始阅读0af7acdb6aec0975f46527d3240c844768eaa052

/************************************************************** * 晶振频率 :选取用RC 11.0592MHz * 文件名 :ADC.c * 功能说明 :STC12C5A16S2单片机的A/D转换演示实验 * 制作 :www.frotech.com * 变更记录 :2013.05.5 * 变更内容 :新建造 **************************************************************/ /************* 用户系统配置 **************/ #define MAIN_Fosc 11059200L //定义主时钟, 模拟串口和和延时会自动适应。5~35MHZ /************* 以下宏定义用户请勿修改 **************/ #include \#define uchar unsigned char #define uint unsigned int /****************特殊寄存器声明************************/ sfr P1ASF = 0x9D; //12C5A60AD/S2系列模拟输入(AD或LVD)选择 sfr ADC_CONTR = 0xBC; //带AD系列 sfr ADC_RES = 0xBD; //带AD系列 sfr ADC_RESL = 0xBE; //带AD系列 #define ADC_OFF() ADC_CONTR = 0 //ADC转换关 #define ADC_ON (1 << 7) //ADC转换开 #define ADC_90T (3 << 5) //90个时钟周期转换一次 #define ADC_180T (2 << 5) //180个时钟周期转换一次 #define ADC_360T (1 << 5) //360个时钟周期转换一次 #define ADC_540T 0 //540个时钟周期转换一次 #define ADC_FLAG (1 << 4) //软件清0 #define ADC_START (1 << 3) //开始ADC转换 #define ADC_CH0 0 //P1_0作为AD转换通道 #define ADC_CH1 1 //P1_1作为AD转换通道 #define ADC_CH2 2 //P1_2作为AD转换通道 #define ADC_CH3 3 //P1_3作为AD转换通道 #define ADC_CH4 4 //P1_4作为AD转换通道 #define ADC_CH5 5 //P1_5作为AD转换通道 #define ADC_CH6 6 //P1_6作为AD转换通道 #define ADC_CH7 7 //P1_7作为AD转换通道 /************* 本地变量声明 **************/ sbit P_TXD1 = P3^1; /************* 本地函数声明 **************/ void Tx1Send(uchar dat); void PrintString(unsigned char code *puts); void delay_ms(unsigned char ms); uint adc10_start(uchar channel); //channel = 0~7 /*************************************************************

* 函数名:main( void ) * 输入:无 * 输出:无 * 功能描述:串口初始化参数为9600 8 N 1. * 程序一开始执行输出\,然后将A/D转换的 * 值通过串口输出 **************************************************************/ void main(void) { uint j; PrintString(\上电后串口发送一条提示信息 择 ADC_CONTR = ADC_360T | ADC_ON; while(1) { delay_ms(250); delay_ms(250); delay_ms(250); delay_ms(250); j = adc10_start(0); // P1_0 开启AD转换 Tx1Send('A'); Tx1Send('D'); Tx1Send('0'); Tx1Send('='); Tx1Send(j/1000 + '0'); Tx1Send(j00/100 + '0'); Tx1Send(j0/10 + '0'); Tx1Send(j + '0'); Tx1Send(0x0d); Tx1Send(0x0a); } } /************************************************************* * 函数名:adc10_start(uchar channel) * 输入:需要转换的ADC通道 * 输出:无 * 功能描述:串口初始化参数为9600 8 N 1. * 程序一开始执行输出\,然后将A/D转换的 * 值通过串口输出 **************************************************************/

P1ASF = (1 << ADC_CH0); //STC12C5A16S2的模拟输入(AD转换通道)选

uint adc10_start(uchar channel) { uint adc; uchar i; ADC_RES = 0; //AD转换结果高位寄存器清零 ADC_RESL = 0; //AD转换结果低位寄存器清零 ADC_CONTR = (ADC_CONTR & 0xe0) | ADC_START | channel; //AD转换控制寄存器设置 i = 250; do{ if(ADC_CONTR & ADC_FLAG) //如果AD转换结束 { ADC_CONTR &= ~ADC_FLAG; //软件清0 AD转换结束标志位 adc = (uint)ADC_RES; //获取AD转换的高位 adc = (adc << 2) | (ADC_RESL & 3); //获取AD转换的低位 return adc; //返回AD转换值 } }while(--i); return 1024; } /************************************************************* * 函数名:delay_ms(unsigned char ms) * 输入:延时数 * 输出:无 * 功能描述:产生毫秒级别延时 **************************************************************/ void delay_ms(unsigned char ms) { unsigned int i; do{ i = MAIN_Fosc / 14000; while(--i) ; //14T per loop }while(--ms); } /************************************************************* * 函数名:BitTime(void) * 输入:无 * 输出:无 * 功能描述:位操作时间函数 **************************************************************/ void BitTime(void) //位时间函数 { uint i; i = ((MAIN_Fosc / 100) * 104) / 140000L - 1; //根据主时钟来计算

位时间 while(--i); } /************************************************************* * 函数名: Tx1Send(uchar dat) * 输入:发送字符 * 输出:无 * 功能描述:串口初始化参数为9600 8 N 1. * 通过串口发送一个字符 **************************************************************/ void Tx1Send(uchar dat) { uchar i; EA = 0; P_TXD1 = 0; BitTime(); for(i=0; i<8; i++) { if(dat & 1) P_TXD1 = 1; else P_TXD1 = 0; dat >>= 1; BitTime(); } P_TXD1 = 1; EA = 1; BitTime(); BitTime(); } /************************************************************* * 函数名:PrintString(unsigned char code *puts) * 输入:无 * 输出:无 * 功能描述:通过串口输出字符串 **************************************************************/ void PrintString(unsigned char code *puts) { for (; *puts != 0; puts++) Tx1Send(*puts); //遇到停止符0结束 } 4.3 程序执行效果

第一步:关闭STC-ISP软件,S1开关拨打至左边,让DB9与STC单片机相连,打开串口调试助手软件,配置串口参数,如图4.1所示:

图4.1 串口参数配置

第二步:给12号节点上电,可以看到串口助手返回的AD值信息,如图4.2所示:

图4.2 ADC运行结果