完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我使用了RB0,RB1, RB2, RB3作为电平变化中断管脚,当RB0按下时,使得继电器1闭合(由RD0控制,继电器1控制交流220v电路的通断),当RB2按下时,使得继电器1断开,当RB2按下时,使得继电器2闭合(由RD1控制,继电器2控制交流220v电路的通断),当RB3按下时,使得继电器2断开.
现在的问题是:当RB0和RB2按下时,大约50%的概率不能使得继电器1、2闭合,程序是否有需要改进的地方 谢谢大家! 我的程序如下: //*******************************************************************// // 系统初始化 //*******************************************************************// void System_Init(void) { OSCCON = 0b01101000; //内部4MHz,不使能4xPLL OSCTUNE= 0b00000000; //出厂校准 // PORTA用于读取端口的电平 TRISA = 0b00111111; //RA0-RA5输入、RA6-RA7输出 ANSELA = 0b00000000; //RA0-RA7均为数字I/O LATA = 0x00; //用于向端口写数据 TRISB = 0b00011111; //RB0-RB4输入,RB5-RB7输出 ANSELB = 0b00000000; //RB0-RB7均为数字I/O LATB = 0x00; //用于向端口写数据 WPUB = 0b00000000; //无上拉 IOCBN = 0b00001111; //检测RB0-RB3下降沿,会产生中断 TRISC = 0b00000000; //RC0-RC7输出 LATC = 0x00; //用于向端口写数据 TRISD = 0b00111100; //RD0-RD1输出,RD2-RD5输入,RD6-RD7输出 ANSELD = 0b00000000; //RD0-RD7均为数字I/O LATD = 0x00; //用于向端口写数据 TRISE = 0b00000000; //RE0-RE2输出 ANSELE = 0b00000000; //RE0-RE2均为数字I/O WPUE = 0b00000000; //无上拉 LATE = 0x00; //用于向端口写数据 } //*******************************************************************// // 中断程序部分 //*******************************************************************// void interrupt portb_int(void) { if(IOCIE && IOCIF && IOCBF0) { RB0; IOCBF0 = 0; //清中断标志位 RD0 = 0; //继电器1断电 RD1 = 0; //继电器2断电 IOCBF0_FLAG = 1; //设置标志 } else if(IOCIE && IOCIF && IOCBF1) { RB1; IOCBF1 = 0; //清中断标志位 RD1 = 0; //继电器2断电 RD0 = 1; //继电器1上电 IOCBF1_FLAG = 1; //设置标志 } else if(IOCIE && IOCIF && IOCBF2) { RB2; IOCBF2 = 0; //清中断标志位 RD1 = 0; //继电器2断电 RD0 = 0; //继电器1断电 IOCBF2_FLAG = 1; //设置标志 } else if(IOCIE && IOCIF && IOCBF3) { RB3; IOCBF3 = 0; //清中断标志位 RD0 = 0; //继电器1断电 RD1 = 1; //继电器2上电 IOCBF3_FLAG = 1; //设置标志 } } //*******************************************************************// // 主程序部分 //*******************************************************************// void main(void) { __delay_ms(100); System_Init(); //系统初始化 IOCIE = 1; //电平变化中断使能 GIE = 1; //总中断允许 IOCBF0 = 0; IOCBF1 = 0; IOCBF2 = 0; IOCBF3 = 0; IOCBF4 = 0; while(1) { if(RA1 == 0)//手动模式 { if(IOCBF0_FLAG == 1) { RD0 = 0;//继电器1断电 RD1 = 0;//继电器2断电 IOCBF0_FLAG = 0; } else if(IOCBF1_FLAG == 1) { RD1 = 0;//继电器2断电 RD0 = 1;//继电器1上电 IOCBF1_FLAG = 0; } else if(IOCBF2_FLAG == 1) { RD1 = 0;//继电器2断电 RD0 = 0;//继电器1断电 IOCBF2_FLAG = 0; } else if(IOCBF3_FLAG == 1) { RD0 = 0;//继电器1断电 RD1 = 1;//继电器2上电 IOCBF3_FLAG = 0; } } } } |
|
相关推荐
4 个讨论
|
|
只有小组成员才能发言,加入小组>>
求解外围电路实现的是4脚给持续低电平复位并正常工作,高电平不工作的原因
1930 浏览 1 评论
2999 浏览 3 评论
PIC1946程序有一个变量在运行过程中恢复初始值其他变量保持不变
2185 浏览 2 评论
2570 浏览 0 评论
PIC16F1825的RC5引脚,在主程序中操作无效,在中断中可以改变是为什么?
3699 浏览 5 评论
651浏览 0评论
用XC8编译PIC18F25K80时提示下面Error,求怎么解决这个问题
3139浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-4-27 01:14 , Processed in 0.717257 second(s), Total 71, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号