找回密码
 立即注册
查看: 769|回复: 20

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

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:137
  • 最近打卡:2025-05-01 00:01:04

6

主题

277

回帖

1108

积分

金牌会员

积分
1108
发表于 2024-9-10 13:49:34 | 显示全部楼层 |阅读模式
/****************************************************
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/12ECF=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模块1PWM控制    (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;          // 设置CCP1PWM输出方式(开启风机)
                       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;                      //封水碗关闭后补水完成
         }

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:294
  • 最近打卡:2025-03-06 09:25:41

8

主题

318

回帖

1835

积分

金牌会员

积分
1835
发表于 2025-1-13 10:02:30 | 显示全部楼层
Lkck*** 发表于 2024-9-11 11:42
必须要写While(1)吗?
是,因为不加while(1),程序会跑飞,然后复位
你觉得这个时间够不够你输出一个脉冲 ...

请贴出修改后的代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:394
  • 最近打卡:2025-05-01 03:26:07

16

主题

702

回帖

2470

积分

金牌会员

积分
2470
发表于 2024-9-15 15:28:34 | 显示全部楼层
Lkck*** 发表于 2024-9-10 15:02
主函数的while(1)呢?

主函数没有while(1),导致程序跑飞
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:294
  • 最近打卡:2025-03-06 09:25:41

8

主题

318

回帖

1835

积分

金牌会员

积分
1835
发表于 2024-9-11 11:42:22 | 显示全部楼层
xiaoxi*** 发表于 2024-9-10 23:07
因为直流电源的消耗,为了省电,节约能耗,每次都断电的,所以它平时也没有电.每次使用都需要重新上电就 ...

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

点评

今天早上就加上了,在main函数的末尾,就是执行完成之后,停在最末尾这里。也是进入不了中断。  发表于 2024-9-11 15:18
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:137
  • 最近打卡:2025-05-01 00:01:04

6

主题

277

回帖

1108

积分

金牌会员

积分
1108
发表于 2024-9-10 23:13:12 | 显示全部楼层
Debu*** 发表于 2024-9-10 14:25
8G系列上电高阻,先设置PxMx

设置过,也是不行
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:137
  • 最近打卡:2025-05-01 00:01:04

6

主题

277

回帖

1108

积分

金牌会员

积分
1108
发表于 2024-9-10 23:11:40 | 显示全部楼层
xiaoxi*** 发表于 2024-9-10 23:10
哦,这个没有设置,设置过也不工作的.

p3只用到输入
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:137
  • 最近打卡:2025-05-01 00:01:04

6

主题

277

回帖

1108

积分

金牌会员

积分
1108
发表于 2024-9-10 23:10:51 | 显示全部楼层
haiya*** 发表于 2024-9-10 15:00
P3口没有初始化,端口没有配置

哦,这个没有设置,设置过也不工作的.
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:137
  • 最近打卡:2025-05-01 00:01:04

6

主题

277

回帖

1108

积分

金牌会员

积分
1108
发表于 2024-9-10 23:09:30 | 显示全部楼层
Debu*** 发表于 2024-9-10 14:25
8G系列上电高阻,先设置PxMx

仅输入啊,没设置的引脚,就是只用输入呢,P1口有设置.
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:137
  • 最近打卡:2025-05-01 00:01:04

6

主题

277

回帖

1108

积分

金牌会员

积分
1108
发表于 2024-9-10 23:07:26 | 显示全部楼层
Lkck*** 发表于 2024-9-10 15:02
主函数的while(1)呢?

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

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:176
  • 最近打卡:2025-02-19 17:24:49

15

主题

265

回帖

1387

积分

金牌会员

积分
1387
发表于 2024-9-10 17:02:47 | 显示全部楼层
Lkck*** 发表于 2024-9-10 15:02
主函数的while(1)呢?

他刚开始写程序还没有形成习惯。

点评

是的呢  发表于 2024-9-10 23:25
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:40 , Processed in 0.187444 second(s), 117 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表