完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
下面是51单片机的一个简单的电机程序,想问一下各位朋友,在中断函数void Interruped() interrupt 1里面为什么要将P1口的值暂存?看书上解释说,是为了使高四位不受到影响,但是如果我直接对P1操作也可以电机转起来的,即
if(beat != 0) { P1 = P1 & 0xF0; P1 = P1 | Beat[index]; index ++; index = index & 0x07; beat--; } 请问有什么区别吗?新手入门不是很理解啊,求解答 #include unsigned long beat = 0; void StartMotor(unsigned long angle); void mian() { EA = 1; TMOD = 0x01; TH0 = 0xF8; TL0 = 0xCD; ET0 = 1; TR0 = 1; StartMotor(360*2 + 180); while(1); } void StartMotor(unsigned long angle) { EA = 0; beat = (angle*4076)/360; EA = 1; } void Interruped() interrupt 1 { unsigned char tmp; static unsigned char index = 0; unsigned char code Beat[8]={ 0x0E ,0x0C ,0x0D, 0x09, 0x0B, 0x03, 0x07, 0x06 }; TH0 = 0xF8; TL0 = 0xCD; if(beat != 0) { tmp = P1; //将P1口当前值暂存 tmp = tmp & 0xF0; tmp = tmp | Beat[index]; P1 = tmp; index ++; index = index & 0x07; beat--; } else { P1 = P1 | 0x0F; } } |
|
相关推荐
11个回答
|
|
一般I/O口可以直接赋值或逻辑运算赋值,你的程序里P1高四位还有其它用途,所以用&逻辑运算后不易出错,且容易理解;而直接赋值则需要很了解程序的人才知道,要是小白自己修改则会出错了。
以上是我的看法,若觉得满意请采纳,谢谢!
最佳答案
|
|
|
|
因为你的电路上 P1 口的高还有其它功能,采用这种逻辑操作是避免修改其它功能端口的状态。
|
|
|
|
对啊,我也觉得没什么区别,,,然而范例这么写应该有一定道理吧,要不然多此一举了 |
|
|
|
houjue 发表于 2017-7-27 10:13 谢谢解答 |
|
|
|
|
|
|
|
houjue 发表于 2017-7-27 10:13 与运算那里我是懂的。但是跟下面有一位朋友的想法一样,范例中把P1的值先赋给临时变量,然后又把临时变量的值赋给了P1,这跟直接用P1有啥区别,,,不是相当于直接赋值了吗,,, |
|
|
|
|
|
受益匪浅
|
|
|
|
受益匪浅啊,楼主还是厉害
|
|
|
|
受益匪浅啊,楼主还是厉害
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
205 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1253 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
848 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
853 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
1073 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12013 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 06:27 , Processed in 0.757888 second(s), Total 62, Slave 56 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号