完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
求助坛里的各位高手,我想在一块四路输出的单片机上实现当在5秒的时间内,有三次触发信号后,输出口依次闭合2秒,这是我写的程序,这个程序有两个问题,一个是信号只有一次触发输出口就开始闭合了,而不是我要求的三次才开始闭合,二是这个程序在板一直处于待机状态时只能连续工作几次(次数不定,有可以10次,有时是3次,搞不明的),请各位指点指点。
#include #define uchar unsigned char//宏定义无符号字符型 #define uint unsigned int //宏定义无符号整型 ] uchar sec; //定时器0计算秒数 uint tcnt; //定时器0中断 次数 uchar sec0; //定时器1计算秒数 uint tcnt0; //定时器1中断 次数 uchar temp; //触发信号次数 /******************************************************************** 初始定义 *********************************************************************/ /*定义八位输入为单片机P1口*/ ***it IN0=P1^0; ***it IN1=P1^1; //***it IN2=P1^2; //***it IN3=P1^3; /*定义八位输出为单片机P2口*/ ***it K1=P2^0; ***it K2=P2^1; ***it K3=P2^2; ***it K4=P2^3; /******************************************************************** 延时函数 *********************************************************************/ void delay(uchar t) { uchar i,j; for(i=150;i for(j=130;j>0;j--); { ; } } } void key() { if((IN0==0)&&(temp==0)) { sec=0; tcnt=0; temp++; TR0=1; } while((!IN0)&&(temp<3))temp++; // if((IN0==0)&&(temp==1)) // { // while(!IN0); // } // if((IN0==0)&&(temp==2)) // { // temp++; // while(!IN0); // } } /******************************************************************** 定时中断服务函数 *********************************************************************/ void t0(void) interrupt 1 using 0 //定时中断服务函数 { tcnt++; //每过250us tcnt 加一 if(tcnt==4000) //计满4000 次(1秒)时 { tcnt=0; //重新再计 sec++; if((sec<=5)&&(temp==3)) //5秒内供电3次 { sec=0; temp=0; K1=0; //K1闭合通电 TR0=0; //关定时0 TR1=1;//开定时器1 } if((temp==3)&&(sec>5))temp=0; } } void t1(void) interrupt 3 using 0 //定时中断服务函数 { tcnt0++; //每过250ust tcnt 加一 if(tcnt0==4000) //计满4000 次(1 秒)时 { tcnt0=0; //重新再计 sec0++; if(sec0==2) //K1通电2秒 { K1=1;delay(50); //K1打开不通电 K2=0; //K2闭合通电 } if(sec0==4) //K1通电2秒 { K2=1;delay(50); //K2打开不通电 K3=0; //K3闭合通电 } if(sec0==6) //K1通电2秒 { K3=1;delay(50); //K1打开不通电 K4=0; //K2闭合通电 } if(sec0==8) //K2通电2秒 { sec0=0; K4=1; //K2打开不通电 TR1=0; } } } /******************************************************************** 主函数 *********************************************************************/ void main() { TMOD=0x22; //定时器工作在方式2 TH0=0x06; //对TH0 TL0 赋值 TL0=0x06; TH1=0x06; //对TH0 TL0 赋值 TL1=0x06; ET0=1; ET1=1; EA=1; sec=0; while(1) { key(); // key2(); } } /******************************************************************** 结束 *********************************************************************/ |
|
相关推荐
4个回答
|
|
个人愚见:第一:你是什么触发信号,如果是好像按键之类的肯定要去抖动,否则就出现你所说的,以此触发信号就会开始闭合了。
第二:你在定时器1里面又调用了延时2s的延时函数,那在中断的时候不能再进入中断了,那么sec0得值是不准确的。 |
|
|
|
|
|
|
|
中断函数里面的处理时间是不是过长了点啊,进入中断里面处理时间尽可能的短
|
|
|
|
我没仔细看你的程序,但貌似发现你的按键居然没有延时消抖-这样你稍微触发一下基本上都识别到连续触发几次了。此外,对于你的简单要求,仅需一个定时器提供时间基准就足够了,完全没必要用两个定时器。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
464 浏览 0 评论
478 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
439 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
994 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
1056 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11793 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 22:14 , Processed in 0.716685 second(s), Total 79, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号