毁了C语言观的几行单片机代码。麻烦分帮忙分析分析

weilaiqing 2013-06-23 12:01:17
加精
P0与P1两个IO口分别接了2组,8个LED/组。
打算实现两者交替亮灭。
写了个几行的代码
#include <reg52.h>

void delayms( unsigned char xms);

void main()
{
unsigned char x;
while(1)
{
P0 = 0x00;
x = P0;
P1 = x;

delayms(5000);

P0 = 0xFF;
x = P0;
P1 = x;
}
}

void delayms(unsigned char xms)
{
unsigned char i,j;
for(i = xms; i>0; i--)
for(j = 120; j>0; j--);
}


从C语言的角度看,代码没问题。但是Keil运行调试的时候只有P0端口的电平有变化。而P1端口的电平一直为0x00,不再变化。

P1与P0口的LED交替亮灭,我已经重新写了另外的代码实现了。

只是不明白,这段看起来没问题的代码,问什么却不能跟自己的想法一样呢?哪位可以帮忙分析分析吗?

几行的代码,就毁了C语言的观。
...全文
8486 81 打赏 收藏 转发到动态 举报
写回复
用AI写文章
81 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_26151661 2016-01-04
  • 打赏
  • 举报
回复
char. 溢出了
qq_16557407 2015-10-10
  • 打赏
  • 举报
回复
不给延迟,瞬间又赋值为0x00了
fushaobing2010 2015-07-10
  • 打赏
  • 举报
回复
这样的程序完全可以用KEIL仿真,单步调试的。 不能仿真是因为程序有问题。 IO口要么设置为输出,要么设置为输入。设置为输出后,就不要去读它了。
fushaobing2010 2015-07-10
  • 打赏
  • 举报
回复
引用 9 楼 u011004181 的回复:
代码执行到14行停住,下面的代码执行不了。你这延时函数有问题,溢出。
怎么可能停住呢?就是数据溢出,导致延时时间变短了而已。 5000%256=136. 实际上,delayms(5000); 变成了delayms(136);
fushaobing2010 2015-07-10
  • 打赏
  • 举报
回复
结贴有bug. unsigned char (0~256)。 应该是0~255吧?
jeep_1981 2015-07-06
  • 打赏
  • 举报
回复
xms定义的是char型,5000超过char行
三体人 2015-06-14
  • 打赏
  • 举报
回复
过来积累些经验,我才初学,看了这么多帖子,就这贴的代码亲切
csdn_cqupt 2015-06-07
  • 打赏
  • 举报
回复
原来如此,涨姿势了
Linux-小企鹅 2015-04-18
  • 打赏
  • 举报
回复
针对这个现象:Keil运行调试的时候只有P0端口的电平有变化。而P1端口的电平一直为0x00,不再变化。 while循环里面的确实一个延时函数,延时函数传参溢出
cxd0812 2015-03-11
  • 打赏
  • 举报
回复
你这个是高电平驱动还是低电平,如果是高电平的话你P0肯定有上拉电阻,你P1有吗,没有的话可驱动不了LED的,这个还得结合电路图分析了,还有那个延时,一般没事,你是unsigned char的,你输入了5000实际值应该是5000%256,
纯情的毛象 2014-09-21
  • 打赏
  • 举报
回复
看君一破贴,省我十本书;
Corey_Wong 2014-06-06
  • 打赏
  • 举报
回复
看不懂汇编怎么办
小黄人软件 2014-05-14
  • 打赏
  • 举报
回复
跟溢出没关系。关键是keil程序把单片机引脚分成2组。1.当作输出Pins,2,当作入P0。
单片机工程师 2013-09-03
  • 打赏
  • 举报
回复
还有一个问题,unsigned取不到5000吧?
单片机工程师 2013-09-03
  • 打赏
  • 举报
回复
因为P1为高电平,后边没有加延时。
jamas111 2013-09-01
  • 打赏
  • 举报
回复
明显的延时函数问题 unsigned char为无符号字符型数据都大于0的,所以你懂的
mapleleafjimmy 2013-08-18
  • 打赏
  • 举报
回复
新手有问 while(1) { led|=P1+P2: delayms(5000); }这样可以,为什么
七剑追魂 2013-07-18
  • 打赏
  • 举报
回复
第一个问题是你的延迟函数是定义的char类型的,只能装255以内的正整数,5000明显大了。。还有你可以试试给x的变量定义为:
volatile unsigned char x;
Lonely_neo 2013-07-16
  • 打赏
  • 举报
回复
晕死,你P1=x那后面加个延时好不好,哎!!!
WizardOz 2013-07-04
  • 打赏
  • 举报
回复
引用 1 楼 css201 的回复:
你这个是高电平点亮吧?这个不是语言的问题,而是你还没懂单片机。你读P0读到的是P0端口的电平并不是你写进去的数据,而P0端口的电平一直没有改变。所以P1肯定是一样的。
正解,gpio的读和写是两回事。你把它设置为输出,那么你就不能用它来输入。
加载更多回复(61)

27,382

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧