完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
求助
#ifndef _ad_H_ #define _ad_H_ #include "stc12c5a60s2.h" #include #include #define ADC_POWER 0x80 #define ADC_FLAG 0x10 #define ADC_START 0x08 #define ADC_SPEEDLL 0x00 #define ph_ch 1 #define zhuodu_ch 0 #define UART1_send_const_size 11 //串口发送数据缓冲区数组大小定义 #define unchar unsigned char #define unint unsigned int void ADC_Init(void); void delay2(unsigned int s); void DelayXus(unsigned char n); void timerInit(void); void InitUART(void); void UART_1send(void); void UART_1SendOneByte(unsigned char d); extern xdata unsigned char sendBuf[UART1_send_const_size]; //串口1发送数据缓冲区数组 extern xdata unsigned char Readph; //ph数据寄存器 extern xdata unsigned char Readzhuodu; //浊度数据寄存器 extern unsigned int ZhuoDu_ADC_service(); extern unsigned int zhuodu_ad_result; extern unsigned int ADC_service(); extern xdata unsigned int ph_ad_result; extern xdata unsigned char ch; extern unsigned char AD_FLAG; #endif #include"ad.h" unsigned int count=0; //用于采集数据定时 xdata unsigned int c=0; xdata unsigned char Readph=0; //ph数据寄存变量 xdata unsigned char Readzhuodu=0; //浊度数据寄存变量 xdata unsigned int ph_ad_result; //ph的AD数据保存寄存器 xdata unsigned char ch=0; //AD通道口 unsigned char AD_FLAG=0; //AD中断标志,0代表要进行ph的AD转换,1代表正在进行AD转换,2表示要浊度的AD转换 unsigned int zhuodu_ad_result; void ADC_Init(void) { ADC_RES=0; //清零转换结果寄存器高8位 ADC_RESL=0; //清零转换结果寄存器低2位 P1ASF=0xdf; //除了P1^5口以外,其余P1所有口作为模拟AD口 ADC_CONTR=0x80; //开启AD电源 delay2(6); //初次打开AD电源要延时,电压稳定后才启动AD转换 EADC=1; //开启ADC中断 } unint ADC_service() //取AD结果函数,它是十位AD转换,每五十次平均,最后取高八位作为AD采样数据 { ch=ph_ch; //ph的ADC通道选择 ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ch; //start置1开始进行AD转换 AD_FLAG=1; // ADC_CONTR=0x89; return (ph_ad_result); //八位数据 } unint ZhuoDu_ADC_service() //取AD结果函数,它是十位AD转换,每十次平均,最后取高八位作为AD采样数据 { ch=zhuodu_ch; //ADC通道选择 ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ch; //start置1开始进行AD转换 // ADC_CONTR=0x88; return (zhuodu_ad_result); } void ADC_ZD()interrupt 5 using 3 { ADC_CONTR=0x80; //清除中断标志 if(ch==ph_ch) //ADC通道是PH时 { ph_ad_result=ADC_RES; //保存数据 AD_FLAG=2; //标志置2,表示已经进行完AD中断,可以继续进行采集 } else if(ch==zhuodu_ch) //ADC通道是浊度时 { zhuodu_ad_result=ADC_RES; //保存数据 //UART_1SendOneByte(ADC_RES); //UART_1SendOneByte(ADC_RES>>8); AD_FLAG=0; //标志置0,表示已经进行完AD中断,进行ph采集 } } /********************************延时函数*************************************/ void delay2(unint s) { unint x,y; for(x=s;x>0;x--) for(y=110;y>0;y--); } /************************************** 延时大于10微秒(STC12C5A60S2@11.0592M) 2-85微秒 **************************************/ void DelayXus(unchar n) { while (--n); } void UART_1SendOneByte(unsigned char d) { if(RI==0) { TI=0; //清空发送完成中断请求标志 SBUF=d; while(!TI); //若TI=0,在此等待 TI = 0; } } void InitUART(void) { PCON = 0X00; SCON = 0x50; //串口1工作在方式1 8位异步收发 REN=1允许接收 EA = 1; //开总中断 ES = 1; //开串口1中断 // TR1 = 1; //定时器1开始计数 IP = 0XB0; //优先级设置,由高到低为串口1中断,定时器1中断和定时器0中断,ADC中断和PCA中断,低压检测中断 IPH = 0X1A; S2CON = 0x50; //串口2工作在方式1 8位异步收发 S2REN=1允许接收 BRT = 0xFD; //独立波特率发生器初值 AUXR |= 0x10; //BRTR=1 独立波特率发生器运行,开始计时,波特率不加倍,12T IE2 =0x01; //开串口2中断 ES2=1 IPH2=0X01; IP2=0X01; //串口2中断最高优先级 } void UART_1send(void) { sendBuf[0]=Readph; //ph数据 sendBuf[1]=Readzhuodu; //浊度数据 for(c=0;c<2;c++) //发送数据 { UART_1SendOneByte(sendBuf[c]); } } void TimerInit(void) //定时器1中断时间为100微秒@11.0592MHz,定时器0中断时间为100微秒@11.0592MHz { AUXR |= 0xD1; //定时器0为1T模式,定时器1为1T模式,BRTR=1 独立波特率发生器运行, //UART2波特率不加倍,独立波特率发生器每12时钟计数一次,串口1使用独立波特率发生器 TMOD = 0x11; //设置定时器0和定时器1均工作在16位定时器模式 TL0 = 0xAE; //设置定时初值 TH0 = 0xFB; //设置定时重载值,100微秒 TH1 = 0xFB; //定时器1初值,100微秒 TL1 = 0xAE; EA = 1; //系统允许有开放的中断 ET0 = 1; //允许定时0中断 TF0 = 0; //清除TF0标志 TR0 = 1; //定时器0开始计时 ET1 = 1; //允许定时0中断 TF1 = 0; //清除TF0标志 TR1 = 1; //定时器1开始计数 } void timer1_interrupt(void) interrupt 3 { TF1 = 0; count++; TH1 = 0xFB; //定时器1初值,100微秒 TL1 = 0xAE; } void main() { InitUART(); //串口初始化 ADC_Init(); //AD转换初始化 TimerInit(); //定时器初始化 P1M1=0xdf; //p1口为AD口,设置为输入模式,p1^6口设置为输出模式 P1M0=0x20; while(1) { UART_1send(); if(count==5000) { if(AD_FLAG==0) //AD标志位为0,表示要进行ph的AD转换 { Readph=ADC_service(); //ph采集函数 Readph=(Readph*5*10)/256; //计算电压 } else if(AD_FLAG==2) //AD标志位为2,表示要进行浊度的AD转换 { Readzhuodu=ZhuoDu_ADC_service(); //浊度采集函数 Readzhuodu=(Readzhuodu*5*10)/256; //计算电压 } count=0; //计时器清零 } } } |
|
相关推荐
1个回答
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-使用AHT20进行环境监测之AHT20传感器介绍
510 浏览 0 评论
792 浏览 0 评论
833 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
797 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
1244 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11812 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-28 10:27 , Processed in 0.513364 second(s), Total 70, Slave 53 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号