我又来请教高手了,哈哈

[复制链接]
 楼主| 辉扬的心 发表于 2009-5-5 15:30 | 显示全部楼层 |阅读模式
单片机P0口高4位接上拉电阻接4个LED灯,低4位开关接GND。P00合上,P04的LED亮,P01合上,P05的LED亮,依次,P03合上,P07的LED亮。开关合上就接地了,高4位输出0,灯就亮了。<br />我的程序编好了,效果也出来了,如下:<br />思路1<br />#include&nbsp;&ltreg52.h&gt<br />#define&nbsp;uint&nbsp;unsigned&nbsp;int<br />#define&nbsp;uchar&nbsp;unsigned&nbsp;char<br />void&nbsp;main()&nbsp;&nbsp;&nbsp;&nbsp;<br />{<br />&nbsp;uchar&nbsp;a,b,c,m,n,i;<br />&nbsp;<br />&nbsp;b=0xff;&nbsp;<br />&nbsp;P0=0xff;<br />&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;a=0x01;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(c=0;c&lt5;c++)<br /><br />{&nbsp;&nbsp;m=P0|(~a);<br />&nbsp;&nbsp;&nbsp;&nbsp;if(m==(~a))&nbsp;&nbsp;&nbsp;&nbsp;//检测P1_0按键是否按下<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i=a;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b=(b&(~i))&(~(i&lt&lt4));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P0=b;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b=((b|i)|(i&lt&lt4));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P0=b;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a=a&lt&lt1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(m=0;m&lt255;m++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(n=0;n&lt200;n++);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}}<br />&nbsp;&nbsp;&nbsp;}<br />用的是循环,教材上是用的低4位逐一判断,然后输出,很易懂。<br /><br />我又尝试这样的思路:首先将P0口的状态读入赋给a,然后a=((a&lt&lt4)|(a&0x0f)),再把a赋给P0口,这样不是简单很多,程序如下:<br />#include&nbsp;&ltreg52.h&gt<br />#define&nbsp;uint&nbsp;unsigned&nbsp;int<br />#define&nbsp;uchar&nbsp;unsigned&nbsp;char<br />void&nbsp;main()&nbsp;&nbsp;&nbsp;&nbsp;<br />{<br />&nbsp;uchar&nbsp;a,n;<br />&nbsp;while(1)<br />&nbsp;{<br />&nbsp;&nbsp;&nbsp;a=P0;<br />&nbsp;&nbsp;&nbsp;a=((a&lt&lt4)|(a&0x0f));<br />&nbsp;&nbsp;&nbsp;P0=a;<br />&nbsp;&nbsp;&nbsp;for(n=0;n&lt200;n++);<br />&nbsp;}<br />}<br />结果肯定错了,不然我也不会上来请教了,想了半宿,硬是没有想通,哪里错了。<br /><br />最后再问一个Keil51软件的问题,如图:程序仿真时,port0框内,P0栏8个状态位和下面的Pins状态位有什么关系?为什么有时上下状态一致有时不一致?为什么聂?<br /><br />搬个板凳坐到等,^_^
 楼主| 辉扬的心 发表于 2009-5-6 23:49 | 显示全部楼层

.......

木有人.<br /><br />不过到单片机版块解决问题了<br /><br />圈圈给的提示很重要,是根本.<br /><br />引用下:<br />引用俺书里的一段:&nbsp;<br /><br />“这样就可以看到P2口的每个引脚电平了,打勾的表示高电平1,没打勾的表示低电平0。显示有两行,上面一行表示程序设置的状态,而下面一行表示管脚实际的电平状态,如图2.11.10所示。<br />&nbsp;&nbsp;&nbsp;&nbsp;我们可以修改下面一行的值,来模拟外部电平输入。注意,51单片机在输出低电平时,是强驱动的,这时我们不能强行将一个高电平加在端口上。在仿真中也是如此,如果上面一行没打勾,而将下面一行打勾时,就会弹出一个出错的对话框。输出为高电平时,是弱驱动,可以直接将低电平加在端口上。因此当我们需要将IO口作为输入口使用时,应该给将对应的端口设置为1。这个特性就是所谓的准双向IO口,51单片机的特色之一。<br />”<br />&nbsp;<br />&nbsp;<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

312

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部