完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最初设定是P0口控制8盏灯以1秒的频率慢闪,中断控制中间的一个灯以500ms的频率快闪。结果编译出来后只有一个灯在中断后长亮,好像没有再切回主程序了。。这是什么情况?求解
//C51单片机头文件 #include //宏定义,定义IO口名称 ***it LED_power=P0^5 ; //函数声明 void timer0_Init(void); void Delay_ms(unsigned int ms); //定义数据类型 static unsigned char sun; unsigned char i; //主函数 void main(void) { P0=0x00; Timer0_Init(); while(1); { LED_power=0; Delay_ms(1000); P0=0xff; Delay_ms(1000); } } void Timer0_Init(void) { TMOD=0X01; //设置定时器T0和T1工作方式,0000 0001 TH0=0X4C; //十六位计数器中的高8位赋值 TL0=0x00; //十六位计数器中的低8位赋值 EA=1; //全局中断控制 ET0=1; //打开T0中断 TR0=1; //允许T0 } void Timer0_ISR(void) interrupt 1 //定时器0的序号为1,若用定时器2需要写成 interrupt 3 { TH0=0X4C; //重装定时器 TL0=0x00; sun++; if(sun==20) { sun=0; LED_power=1; } } //延时 void Delay_ms(unsigned int ms) { unsigned int i; while((ms--)!=0) { for(i=0;i<600;i++); } } |
|
相关推荐
11个回答
|
|
你的程序跑不起来主要原因是while(1);多了分号,另外两个变量定义不恰当。
static unsigned char sun;应该放在中断里,unsigned char i;是重复多余的。 #include //宏定义,定义IO口名称 ***it LED_power=P0^5; //函数声明 void Timer0_Init(void); void Delay_ms(unsigned int ms); //定义数据类型 //static unsigned char sun; //unsigned char i; //主函数 void main(void) { P0=0x00; Timer0_Init(); while(1)//; { LED_power=0; Delay_ms(1000); P0=0xff; Delay_ms(1000); } } void Timer0_Init(void) { TMOD=0X01; //设置定时器T0和T1工作方式,0000 0001 TH0=0X4C; //十六位计数器中的高8位赋值 TL0=0x00; //十六位计数器中的低8位赋值 EA=1; //全局中断控制 ET0=1; //打开T0中断 TR0=1; //允许T0 } void Timer0_ISR(void) interrupt 1 //定时器0的序号为1,若用定时器2需要写成 interrupt 3 { static unsigned char sun; TH0=0X4C; //重装定时器 TL0=0x00; sun++; if(sun==20) { sun=0; LED_power=1; } } //延时 void Delay_ms(unsigned int ms) { unsigned int i; while((ms--)!=0) { for(i=0;i<600;i++); } }
最佳答案
评分
|
||
|
||
|
|
主程序的 while(1);
{ LED_power=0; Delay_ms(1000); P0=0xff; Delay_ms(1000); }里的LED_power=0;应该改成P0=0x00; 增加一个全局变量unsigned char led_status = 0;然后定时中断改为 sun++; if(sun>=20) { sun=0; if(led_status == 0) { LED_power=1; led_status = 1; } if(led_status == 1) { LED_power=0; led_status = 0; } } 最好能确定一下定时时间 |
|
|
|
|
|
|
|
灯是高电平点亮的,我本是想主程序循环P0=0x00将所有灯灭掉,然后中断时间到了将其中一个灯点亮,中断执行完后回到主程序再次灭到所有的灯等待下个中断,这样来实现LED闪烁。问题是我现在灯亮后就没有灭掉了,这说明中断后没有回主程序还是继续中断。(我把中断的LED亮改成取反就能闪烁) |
|
|
|
while(1);
{ LED_power=0; Delay_ms(1000); P0=0xff; Delay_ms(1000); }里的LED_power=0;应该改成P0=0x00; 评分
|
||
|
||
我只是想通过灯的闪烁来确定程序完成中断后还会回到主程序。但现在的情况是程序到了中断后没有跳回主程序执行关灯的循环(P0=0x00) |
|
|
|
写0x00还是这样,这LED灯是高电平点亮的,我程序开始全部给低电平,在灯灭后等0.5秒中断点亮一个灯之后因该回主程序循环灭灯的,但是灯一直都没有被灭掉。。。很无奈 |
|
|
|
你应该好好理一理程序,你的源程序的主程序里并没有P0=0x00,主程序的循环只包括while(1)里的部分
评分
|
||
|
||
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
过采样提高12位ADC精度在STM32主控上的实现(附电路及代码)
385 浏览 0 评论
飞凌嵌入式-ELFBOARD 解决PCB布线时无法捕捉到焊盘中心的问题
826 浏览 0 评论
Openharmony软件评估指南-米尔瑞芯微RK3568开发板
1172 浏览 0 评论
STM32CUBEMX(7)--移植雅特力AT32F403AVGT(兼容STM32F103VGT6),DAC输出电压
1204 浏览 0 评论
【RA-Eco-RA0E1-32PIN-V1.0开发板试用】开发板简介与上电测试
1243 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11085 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-14 17:09 , Processed in 0.882293 second(s), Total 103, Slave 79 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号