作者apol1033 (Frog )
看板C_and_CPP
标题[问题] 控制8051的C语言程式!
时间Mon Apr 13 19:53:16 2009
这个程式是用Keil uVision3来控制或模拟8051
而控制的方法是一开始都不会动作
之後触发某只脚会输入high讯号,之後会开始动作(触发脚设为P1_7)
而触发脚的high就要恢复为low(大约就等於弹簧按钮会复归原位)
之後再触发一次动作会停止
这是c语言的程式,我觉得大概方向是对的
在动作方面虽然启动触发正常,但是在结束的触发就没反应
不知道是不是在宣告变数那边要换别种类型?
希望有大大能帮解惑^^"
#include<AT89X51.H>
void delayms(unsigned int time);
main()
{
while(1)
{
unsigned char j,k = 0;
if(P1_7 == 0)
{
k = ~k;
}
while(k)
{
for(j=0x01; j<0x80; j<<=1)
{
P2 = j;
delayms(200);
}
for(j=0x80; j>0x01; j>>=1)
{
P2 = j;
delayms(200);
}
if(P1_7 == 0)
{
k = ~k;
}
}
}
}
void delayms(unsigned int time)
{
unsigned int n;
while( time>0 )
{
n = 120;
while(n>0) n--;
time--;
}
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.126.27.237
1F:推 areyo:是左右来回跑的灯嘛? 04/13 21:01
2F:→ apol1033:恩...动作是左右移的灯,不过主要问题在触发那边 04/13 22:24
3F:推 TroyLee:要记得你按下按钮到放开, 中间有一段时间差 04/13 23:26
4F:→ TroyLee:所以第二次触发跳出while(k)回圈马上又进入上面的触发侦测 04/13 23:28
5F:→ TroyLee:while(k)马上又成立了.. 04/13 23:28
6F:→ TroyLee:另外就是按钮会有弹跳的问题也要考虑到 04/13 23:29
7F:→ apol1033:那将第2个按钮触发拿掉,只用第一个来触发不知道还缺什麽 04/13 23:46
8F:推 TroyLee:会掉进无穷回圈喔.. 04/13 23:59
9F:推 TroyLee:或是拿掉第二个, 把while(k)改成if(k)也许可以成功 04/14 00:03
10F:→ apol1033:拿掉第2个触发改成if的话动作会变成,按钮h>开始动作> 04/14 00:10
11F:→ apol1033:按钮0>停止动作,变成触发复原之後影响到状态= =" 04/14 00:11
12F:推 TroyLee:P1_7 要的二次变成 0 才会停止动作吧? 04/14 00:19
把修改的主程式部分贴上来
main()
{
while(1)
{
unsigned char j,k = 0;
if(P1_7 == 0)
{
k = ~k;
}
if(k)
{
for(j=0x01; j<0x80; j<<=1)
{
P2 = j;
delayms(200);
}
for(j=0x80; j>0x01; j>>=1)
{
P2 = j;
delayms(200);
}
}
}
}
是有拿掉第二个触发跟改成if,不过这样子好像也有按钮反应时间的问题
※ 编辑: apol1033 来自: 59.126.27.237 (04/14 00:22)
13F:→ apol1033:不知道可不可以还是有第二个触发跟用while,不过第二触发 04/14 00:29
14F:→ apol1033:判断後跳回的地方不会直接跟第一个触发接触到? 04/14 00:29
最後想到一个烂招,将第二触发内加上延迟,不过按钮的时间间隔就要自己算好
main()
{
while(1)
{
unsigned char j,k = 0;
if(P1_7 == 0)
{
k = ~k;
}
while(k)
{
for(j=0x01; j<0x80; j<<=1)
{
P2 = j;
delayms(2000);
}
for(j=0x80; j>0x01; j>>=1)
{
P2 = j;
delayms(2000);
}
if(P1_7 == 0)
{
k = ~k;
delayms(5000);
}
}
}
}
感觉蛮烂的= ="不稳定,不知道有没有大大能提出一些意见或者修改@@"
※ 编辑: apol1033 来自: 59.126.27.237 (04/14 00:48)