51单片机按位取反的问题.致谢大神!
4个回答
展开全部
初值和你的单片机IO口工作状态有关,如果你的P1^0连接了LED,那么默认情况下,应该是为低电平,也就是D1=0, 而你的 D1=~D1放在了定时器中断里面,那么定时器溢出产生中断,且a=100时,D1会取反,也就是下次,D1=1,再下次D1又为0,也就是P1^0循环取反,所以与之相连的LED就会闪烁。
追问
也就是D1在我不给初值的情况下默认为低电平0,在这个前提下进行取反的?如果是这样我就懂了
追答
因为P0口和P1,2,3口内部结构不同,它们的输入输出配置也不同,前者漏极开路,后者集电极开路,有些可以对IO设置为弱上拉,强上拉,高阻,推挽。这个暂不用考虑,因为不同情况下的默认值可能会有所不同,但无论如何,在你所说的电路中,要么是0,要么是1,怎样取反,功能都可以实现。
展开全部
就是将D1这个变量的位值取反,1变为0,0变为1,假设D1=0,执行D1=~D1后,D1=1。这个处理在定时器0的中断程序中执行,定时器0周期性中断,就将D1的位值周期性取反,接于P1.0的灯就闪烁了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这句就是将p1.0的电平取反,由高电平到低电平,或者低电平到高电平,每次进入就翻转一次。
这段程序,使用定时中断,对p1.0定时翻转。
电路上,p1.0应该接了led,在外面看电路状态就是led灯一亮一灭的闪烁了。
修改a==100这个值,可以改变闪烁的频率。
另,每次进入中断,a会自加1,等到a加到100时可进入翻转led灯一次,然后a归零,再次进入,不断循环。
这段程序,使用定时中断,对p1.0定时翻转。
电路上,p1.0应该接了led,在外面看电路状态就是led灯一亮一灭的闪烁了。
修改a==100这个值,可以改变闪烁的频率。
另,每次进入中断,a会自加1,等到a加到100时可进入翻转led灯一次,然后a归零,再次进入,不断循环。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
其实 原文代码不规范, 虽然没有影响结果.
正确是 用!, 比如 P1_0 =! P1_0; 表示该bool 类型数据取反,
而原文 用了~ , 这个是对每一位取反, 比如 char a=0x01; b=~a;
则 b=0xFE, 也就是 a的8个位全部取反, 所以~表示对 char, int类型的数据每bit取反.
同样判断bool的数据 应该写 if(P1_0) 或者 if(!P1_0), 而不能写if(P1_0==1) .
好好学习, 研究C语言, 不要自己觉得, 看正规教材, 总是不会错的,
正确是 用!, 比如 P1_0 =! P1_0; 表示该bool 类型数据取反,
而原文 用了~ , 这个是对每一位取反, 比如 char a=0x01; b=~a;
则 b=0xFE, 也就是 a的8个位全部取反, 所以~表示对 char, int类型的数据每bit取反.
同样判断bool的数据 应该写 if(P1_0) 或者 if(!P1_0), 而不能写if(P1_0==1) .
好好学习, 研究C语言, 不要自己觉得, 看正规教材, 总是不会错的,
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
更多回答(2)
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询