/*************************************************************************************************
******************************************完成加热的控制******************************************
**************************************************************************************************
1.包含函数:
1>.MADC_INIT() //ADC功能初始化
2>.MGet_ADC_DATA() //分时采集当前的ADC数据,并根据ADC数据,做相应的数据操作
3>.MADC_CH_PRO(BYTE gLocal_ADC,BYTE gLocal_NUM) //每一路信号的处理
4>.MADC_Timer() //所用到的定时器
5>.MADC_STATE_COUNT() //防区状态符计算
2.修改时间:2008年12月17号
**************************************************************************************************
*************************************************************************************************/
#include "STC12C2052AD.H"
#include "A02_ADC_Work.H"
/*************************************************************************************************
****通讯码说明:
****在收到查询码后,返回码是gSEND_ADC_STATE[4]和gTouch_Time_PRE[8]
****gSEND_ADC_STATE[4]防区的状态,通过gFlag_ADC_STATE计算出来的
****gTouch_Time_PRE[8]记录对应防区上一次触发的时间间隔
****gFlag_ADC_STATE记录防区的状态,每一位对应一个防区,0表示防区的线尾阻的波动范围小于+/-20%
**** 1表示防区的线尾阻的波动范围大于+/-20%
*************************************************************************************************/
BYTE gADC_Course_CON; //8路AD分时转换
BYTE gADC_BASIC_Time; //基时钟,计时一秒
BYTE gADC_Time_SEC[8]; //计时60S,8路防区检测,每一路对应一个计时器
BYTE gTouch_Time_PRE[8]; //记录8路防区上一次触发的时间间隔
BYTE gTouch_Time_CUR[8]; //记录8路防区本次触发的时间间隔
BYTE gFilter_Time[8]; //ADC信号触发时的延时滤波 100ms
BYTE gADC_State_Delay[8]; //状态符生成后,计时5S的计时器
BYTE gFlag_ADC_Touch; //8位对应8路AD的触发状态
//有触发,对应的位就为1,触发结束就为0
BYTE gFlag_ADC_STATE; //防区状态符标志,8个防区,华每一位对应一个防区
//相应的状态符位为1时,开启定时器 gADC_State_Delay
BYTE gFlag_ADC_Check; //8位对应8路ADC信号
//开机后,没有收到报警信号时为0,从收到第一个报警信号后就为1
//相应的位为1后,开启相应的定时器 gTouch_Time_CUR
BYTE gSEND_Check_Byte; //效验字节,发送码的和
BYTE code TAB_ADC_CH[8] = { //码位
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
};
BYTE gSEND_ADC_STATE[4]; //每半个字节表示一个防区的状态符
//gSEND_ADC_STATE[0]的低4位表示P1.0防区的状态
//gSEND_ADC_STATE[0]的高4位表示P1.1防区的状态
//gSEND_ADC_STATE[1]的低4位表示P1.2防区的状态
//gSEND_ADC_STATE[1]的高4位表示P1.3防区的状态
//gSEND_ADC_STATE[2]的低4位表示P1.4防区的状态
//gSEND_ADC_STATE[2]的高4位表示P1.5防区的状态
//gSEND_ADC_STATE[3]的低4位表示P1.6防区的状态
//gSEND_ADC_STATE[3]的高4位表示P1.7防区的状态
BYTE gTest_Save[8]; //测试用,方便把ADC采集到的数据保存,跟随ADC
#define pMACRO_OUT1 P3_2
#define pMACRO_OUT2 P3_3
#define pMACRO_OUT3 P3_4
#define pMACRO_OUT4 P3_5
/*************************************************************************************************
****1.ADC功能初始化
*************************************************************************************************/
void MADC_INIT(){
BYTE gLocal_1;
ADC_CONTR = ADC_CONTR | 0x80; //开ADC转换电源
P1M0 = 0xff;
P1M1 = 0x00; //P1口为高阻状态
P1 = 0xff;
for(gLocal_1 = 0;gLocal_1 < 8;++gLocal_1){
gTouch_Time_PRE[gLocal_1] = 0;
gTouch_Time_CUR[gLocal_1] = 0;
gFilter_Time[gLocal_1] = 0;
gADC_State_Delay[gLocal_1] = 0;
gADC_Time_SEC[gLocal_1] = 0;
}
gSEND_ADC_STATE[0] = 0;
gSEND_ADC_STATE[1] = 0;
gSEND_ADC_STATE[2] = 0;
gSEND_ADC_STATE[3] = 0;
gADC_Course_CON = 0;
gFlag_ADC_Touch = 0;
gFlag_ADC_STATE = 0;
gFlag_ADC_Check = 0;
gADC_BASIC_Time = 0;
return;
}
/*************************************************************************************************
****2.分时采集当前的ADC数据,并根据ADC数据,做相应的数据操作
**** 1ms调用一次,每调用3次采集一个端口的AD数据,24次一个周期(24MS)
*************************************************************************************************/
void MGet_ADC_DATA(){
BYTE gLocal_1;
switch(gADC_Course_CON){
case 0: //切换到P1.0通道ADC转换
ADC_CONTR = ADC_Power_On_Speed_Channel_0;
break;
case 1: //启动P1.0通道转换
ADC_DATA = 0;
ADC_CONTR = ADC_CONTR|0x08;
break;
case 2: //接收P1.0通道的转换数据
if(ADC_CONTR&0x10){
ADC_CONTR = ADC_CONTR&0xe7; //停止AD转换
gLocal_1 = ADC_DATA; //通道0的当前值
gTest_Save[0] = ADC_DATA;
MADC_CH_PRO(gLocal_1,0);
if(gFlag_ADC_Touch & TAB_ADC_CH[0]) pMACRO_OUT1 = 1;
else pMACRO_OUT1 = 0;
}
break;
//-------------------------------------------------------------------
case 3: //切换到P1.1通道ADC转换
ADC_CONTR = ADC_Power_On_Speed_Channel_1;
break;
case 4: //启动P1.1通道转换
ADC_DATA = 0;
ADC_CONTR = ADC_CONTR|0x08;
break;
case 5: //接收P1.1通道的转换数据
if(ADC_CONTR&0x10){
ADC_CONTR = ADC_CONTR&0xe7; //停止AD转换
gLocal_1 = ADC_DATA; //通道1的当前值
gTest_Save[1] = ADC_DATA;
MADC_CH_PRO(gLocal_1,1);
if(gFlag_ADC_Touch & TAB_ADC_CH[1]) pMACRO_OUT1 = 1;
else pMACRO_OUT1 = 0;
}
break;
//-------------------------------------------------------------------
case 6: //切换到P1.2通道ADC转换
ADC_CONTR = ADC_Power_On_Speed_Channel_2;
break;
case 7: //启动P1.2通道转换
ADC_DATA = 0;
ADC_CONTR = ADC_CONTR|0x08;
break;
case 8: //接收P1.2通道的转换数据
if(ADC_CONTR&0x10){
ADC_CONTR = ADC_CONTR&0xe7; //停止AD转换
gLocal_1 = ADC_DATA; //通道2的当前值
gTest_Save[2] = ADC_DATA;
MADC_CH_PRO(gLocal_1,2);
if(gFlag_ADC_Touch & TAB_ADC_CH[2]) pMACRO_OUT2 = 1;
else pMACRO_OUT2 = 0;
}
break;
//-------------------------------------------------------------------
case 9: //切换到P1.3通道ADC转换
ADC_CONTR = ADC_Power_On_Speed_Channel_3;
break;
case 10: //启动P1.3通道转换
ADC_DATA = 0;
ADC_CONTR = ADC_CONTR|0x08;
break;
case 11: //接收P1.3通道的转换数据
if(ADC_CONTR&0x10){
ADC_CONTR = ADC_CONTR&0xe7; //停止AD转换
gLocal_1 = ADC_DATA; //通道3的当前值
gTest_Save[3] = ADC_DATA;
MADC_CH_PRO(gLocal_1,3);
if(gFlag_ADC_Touch & TAB_ADC_CH[3]) pMACRO_OUT2 = 1;
else pMACRO_OUT2 = 0;
}
break;
//-------------------------------------------------------------------
case 12: //切换到P1.4通道ADC转换
ADC_CONTR = ADC_Power_On_Speed_Channel_4;
break;
case 13: //启动P1.4通道转换
ADC_DATA = 0;
ADC_CONTR = ADC_CONTR|0x08;
break;
case 14: //接收P1.4通道的转换数据
if(ADC_CONTR&0x10){
ADC_CONTR = ADC_CONTR&0xe7; //停止AD转换
gLocal_1 = ADC_DATA; //通道4的当前值
gTest_Save[4] = ADC_DATA;
MADC_CH_PRO(gLocal_1,4);
if(gFlag_ADC_Touch & TAB_ADC_CH[4]) pMACRO_OUT3 = 1;
else pMACRO_OUT3 = 0;
}
break;
//-------------------------------------------------------------------
case 15: //切换到P1.5通道ADC转换
ADC_CONTR = ADC_Power_On_Speed_Channel_5;
break;
case 16: //启动P1.5通道转换
ADC_DATA = 0;
ADC_CONTR = ADC_CONTR|0x08;
break;
case 17: //接收P1.5通道的转换数据
if(ADC_CONTR&0x10){
ADC_CONTR = ADC_CONTR&0xe7; //停止AD转换
gLocal_1 = ADC_DATA; //通道5的当前值
gTest_Save[5] = ADC_DATA;
MADC_CH_PRO(gLocal_1,5);
if(gFlag_ADC_Touch & TAB_ADC_CH[5]) pMACRO_OUT3 = 1;
else pMACRO_OUT3 = 0;
}
break;
//-------------------------------------------------------------------
case 18: //切换到P1.6通道ADC转换
ADC_CONTR = ADC_Power_On_Speed_Channel_6;
break;
case 19: //启动P1.6通道转换
ADC_DATA
没有合适的资源?快使用搜索试试~ 我知道了~
一个C写的控制模块程序
共28个文件
lst:5个
obj:5个
h:4个
需积分: 10 12 下载量 16 浏览量
2009-04-01
23:03:55
上传
评论
收藏 34KB RAR 举报
温馨提示
stc12c2052ad例程,用KEIL C51实现,包括AD采集,RS485输出
资源推荐
资源详情
资源评论
收起资源包目录
XN模块20081220.rar (28个子文件)
SY0801A1
STARTUP.LST 11KB
A00_MAIN.LST 8KB
SY0801A1.Uv2 2KB
A09_ReadMe.lst 6KB
SY0801A1.Opt 2KB
A01_UART_COMM.obj 1KB
SY0801A1.lnp 126B
A02_ADC_Work.obj 3KB
A00_MAIN.C 4KB
A00_MAIN.OBJ 2KB
A02_ADC_Work.lst 26KB
STARTUP.A51 5KB
include
A00_Define.H 494B
STC12C2052AD.H 5KB
A02_ADC_Work.H 2KB
A01_UART_COMM.C 4KB
A01_UART_COMM.H 631B
A09_ReadMe.C 4KB
A02_ADC_Work.C 12KB
SY0801A1_Opt.Bak 3KB
SY0801A1_Uv2.Bak 2KB
A01_UART_COMM.lst 7KB
SY0801A1.M51 5KB
SY0801A1.hex 3KB
STARTUP.OBJ 273B
SY0801A1.plg 5KB
SY0801A1 3KB
A09_ReadMe.obj 212B
共 28 条
- 1
资源评论
wangbo0241
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功