xiaoxia9623 发表于 2024-9-10 13:49:34

中断没有反应,什么动作也没有.哪里错了呢?

/****************************************************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 发表于 2025-1-13 10:02:30

Lkck8210 发表于 2024-9-11 11:42
必须要写While(1)吗?
是,因为不加while(1),程序会跑飞,然后复位
你觉得这个时间够不够你输出一个脉冲 ...

请贴出修改后的代码

小飞侠 发表于 2024-9-15 15:28:34

Lkck8210 发表于 2024-9-10 15:02
主函数的while(1)呢?

主函数没有while(1),导致程序跑飞

Lkck8210 发表于 2024-9-11 11:42:22

xiaoxia9623 发表于 2024-9-10 23:07
因为直流电源的消耗,为了省电,节约能耗,每次都断电的,所以它平时也没有电.每次使用都需要重新上电就 ...

必须要写While(1)吗?
是,因为不加while(1),程序会跑飞,然后复位
你觉得这个时间够不够你输出一个脉冲?{:titter:}

xiaoxia9623 发表于 2024-9-10 23:13:12

DebugLab 发表于 2024-9-10 14:25
8G系列上电高阻,先设置PxMx

设置过,也是不行

xiaoxia9623 发表于 2024-9-10 23:11:40

xiaoxia9623 发表于 2024-9-10 23:10
哦,这个没有设置,设置过也不工作的.

p3只用到输入

xiaoxia9623 发表于 2024-9-10 23:10:51

haiyang201 发表于 2024-9-10 15:00
P3口没有初始化,端口没有配置

哦,这个没有设置,设置过也不工作的.

xiaoxia9623 发表于 2024-9-10 23:09:30

DebugLab 发表于 2024-9-10 14:25
8G系列上电高阻,先设置PxMx

仅输入啊,没设置的引脚,就是只用输入呢,P1口有设置.

xiaoxia9623 发表于 2024-9-10 23:07:26

Lkck8210 发表于 2024-9-10 15:02
主函数的while(1)呢?

因为直流电源的消耗,为了省电,节约能耗,每次都断电的,所以它平时也没有电.每次使用都需要重新上电就复位了.主函数执行一遍就行,没想让它循环啊.它只工作在这两个中断状态当中,主要是想用这两个中断.必须要写While(1)吗?

liuzonggong 发表于 2024-9-10 17:02:47

Lkck8210 发表于 2024-9-10 15:02
主函数的while(1)呢?

他刚开始写程序还没有形成习惯。
页: [1] 2
查看完整版本: 中断没有反应,什么动作也没有.哪里错了呢?