中断没有反应,什么动作也没有.哪里错了呢?
/****************************************************P1M1|=0X00P1M0|=0XC3P1.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; // 定义 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 = (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* 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*120000/1024); //最多延时120 000ms P1_6=0; //封水碗打开完成 } void INT3() interrupt 11 // 外部中断 3服务函数,下降沿有效。 { P1_1=1; //打开自动清洗内壁 delay_ms_type2(adcResults*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*120000/1024);//最多延时120 000ms P1_7=0; //封水碗关闭后补水完成 }Lkck8210 发表于 2024-9-11 11:42
必须要写While(1)吗?
是,因为不加while(1),程序会跑飞,然后复位
你觉得这个时间够不够你输出一个脉冲 ...
请贴出修改后的代码 Lkck8210 发表于 2024-9-10 15:02
主函数的while(1)呢?
主函数没有while(1),导致程序跑飞 xiaoxia9623 发表于 2024-9-10 23:07
因为直流电源的消耗,为了省电,节约能耗,每次都断电的,所以它平时也没有电.每次使用都需要重新上电就 ...
必须要写While(1)吗?
是,因为不加while(1),程序会跑飞,然后复位
你觉得这个时间够不够你输出一个脉冲?{:titter:} DebugLab 发表于 2024-9-10 14:25
8G系列上电高阻,先设置PxMx
设置过,也是不行 xiaoxia9623 发表于 2024-9-10 23:10
哦,这个没有设置,设置过也不工作的.
p3只用到输入 haiyang201 发表于 2024-9-10 15:00
P3口没有初始化,端口没有配置
哦,这个没有设置,设置过也不工作的. DebugLab 发表于 2024-9-10 14:25
8G系列上电高阻,先设置PxMx
仅输入啊,没设置的引脚,就是只用输入呢,P1口有设置. Lkck8210 发表于 2024-9-10 15:02
主函数的while(1)呢?
因为直流电源的消耗,为了省电,节约能耗,每次都断电的,所以它平时也没有电.每次使用都需要重新上电就复位了.主函数执行一遍就行,没想让它循环啊.它只工作在这两个中断状态当中,主要是想用这两个中断.必须要写While(1)吗? Lkck8210 发表于 2024-9-10 15:02
主函数的while(1)呢?
他刚开始写程序还没有形成习惯。
页:
[1]
2