/**************************************************** P1M1|=0X00 P1M0|=0XC3 P1.0 PCC1 PWM输出 (转强推挽,电阻接地) P3.7 PCC2中断(上升沿) INT3(下降沿)(高阻态,仅输入) P1.1 自动清洗内壁(可附加润壁功能)(转强推挽,电阻接地) p3.3 p3.4 p3.5 p3.6四路AD转换接口(高阻态,仅输入) P1.6 开启封水碗(转强推挽,电阻接地) P1.7 关闭封水碗并补水(转强推挽,电阻接地) ***************************************************/ #include <stc8g.h> #include<intrins.h> sbit P1_0=P1^0; sbit P3_7=P3^7; sbit P1_1=P1^1; sbit P3_3=P3^3; sbit P3_4=P3^4; sbit P3_5=P3^5; sbit P3_6=P3^6; sbit P1_6=P1^6; sbit P1_7=P1^7; unsigned int adcResults[4]; // 定义 ADC 结果存储数组 void ADC_Init() // ADC 初始化函数 { ADC_CONTR = 0x80; // 打开 ADC 电源 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();/*等待电压稳定*/ ADCCFG=0X26; /*转换结果右对齐,转换速度SYSclk/2/6*/ } void ADC_Convert() // 执行 ADC 转换并获取结果函数 { unsignedchar channel; for (channel=11;channel < 15;channel++) { ADC_CONTR &= 0x80; // 清除通道选择位 ADC_CONTR |= channel; // 选择通道 ADC_CONTR |= 0x40; // 启动转换 while (~ (ADC_CONTR &= 0x20) ); // 等待转换完成 adcResults[channel ] = (ADC_RES << 8) | ADC_RESL; // 保存结果 ADC_CONTR &= ~0x20; // 清除转换完成标志 } } void Timer0_Init() { AUXR |= 0x80; //定时器时钟1T模式 TMOD = 0x01; // 设置定时器 0 为模式 1 TH0 = (65536 - 1000) / 256; // 定时器初始值,1ms 中断一次 TL0 = (65536 - 1000) % 256; TF0 = 0; //清除TF0标志 TR0 = 1; // 启动定时器 0 } void delay_ms_type1 (unsigned longms01) //延时函数01(p3_7=1有效) { unsigned long i; for(i = 0; i < ms01; i++) { while (!TF0); // 等待定时器溢出 TF0 = 0; // 清除溢出标志 if (P3_7==0) // 检查停止标志 { TR0 = 0; // 停止定时器 return; // 退出延时 } } TR0 = 0; // 停止定时器 } void delay_ms_type2 (unsigned longms02) //延时函数02 (p3_7=0有效) { unsigned long i; for( i = 0; i < ms02; i++) { while (!TF0); // 等待定时器溢出 TF0 = 0; // 清除溢出标志 if (P3_7==1) // 检查停止标志 { TR0 = 0; // 停止定时器 return; // 退出延时 } } TR0 = 0; // 停止定时器 } void pwm_Init() //PCC模块的PWM和中断初始化 { CMOD=0x80; /*#10000000B 空闲模式下停止PCA计数器工作, 选择PCA时钟源为Fosc/12,ECF=0禁止PCA定时器溢出时中断*/ CCON=0; /*清零PCA计数器溢出中断请求标志位CF,CR=0不允许PCA计数器计数,清零PCA各模块中断请求标志位CCFn*/ CL=0;CH=0; //清零PCA计数器的值 CCAPM2=0X21; // 设置PCA模块2的上升沿中断(P3_7) CCAP1H=(adcResults[14]* 256/1024); /* PCA模块1的PWM控制 (P1_0)*/ } void main() { P1M1=0X00; /*仅设置P1口为推挽输出(P1_1P1_6P1_7驱动器件就近10K电阻接地,P1_0主板上面通过3.3K电阻接地)P3口默认不变(为高阻态仅输入)*/ P1M0|=0XC3; ADC_Init(); // ADC 初始化函数 ADC_Convert(); // 执行 ADC 转换并获取结果函数 INTCLKO|=0X20; // 使能外部中断3 EA = 1; // 开总中断 Timer0_Init(); pwm_Init(); } voidCCP2() interrupt 7 //CCP2捕获中断,上升沿有效 { CCF2=0; //清零PCC2的中断标志位 CCAPM1=0x42; // 设置CCP1为PWM输出方式(开启风机) CR=1; // PCA计数器开始运行 delay_ms_type1 (500); //延时500毫秒 P1_6=1; //打开封水碗 delay_ms_type1(adcResults[13]*120000/1024); //最多延时120 000ms P1_6=0; //封水碗打开完成 } void INT3() interrupt 11 // 外部中断 3服务函数,下降沿有效。 { P1_1=1; //打开自动清洗内壁 delay_ms_type2(adcResults[12]*120000/1024); //最多延时120 000ms P1_1=0; //关闭自动清洗内壁 P1_7=1; //关闭封水碗 delay_ms_type2 (500); //延时500ms CCAPM1 = 0x00; //关闭 PCC1 的 PWM 模式(关闭风机) CR=0; // 关闭 PCA 计数器 delay_ms_type2 (adcResults[11]*120000/1024); //最多延时120 000ms P1_7=0; //封水碗关闭后补水完成 }
|