打印

一个最简单(hello world级)的AT89C52闪灯程序为何不正常?

[复制链接]
2572|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
52mcu|  楼主 | 2010-11-17 14:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一个最简单(hello world级)的AT89C52闪灯程序为何不正常?
电路如下:低电平点亮LED。
  
   P1^2-------|<|------|VCC   
我用keil C51 9.0编译程序1 在proteus7.5的电路上模拟运行灯是常亮,看不到亮灭闪烁的效果。
但稍作修改成程序2就可以闪烁了。这是咋回事呢?
//程序1
#include <reg52.h>
#include <intrins.h>
sbit P12 =P1^2;
bit b;
main()
{
  int i=0;
  while(1)
  {
     
     P12 ^= 1;  //亮灭LED  不能正常亮灭
     for(i=20000;i>0;i--)//延时
       _nop_();
  }
}   
//程序2
#include <reg52.h>
#include <intrins.h>
sbit P12 =P1^2;
bit b;
main()
{
  int i=0;
  while(1)
  {
     b  ^=1;
     P12 = b;  //亮灭LED  可正常亮灭
     for(i=20000;i>0;i--)//延时
       _nop_();
  }
}

相关帖子

沙发
ayb_ice| | 2010-11-17 14:53 | 只看该作者
可能是硬件设计问题

使用特权

评论回复
板凳
52mcu|  楼主 | 2010-11-17 20:13 | 只看该作者
硬件也很简单啊,就是下图所示的一个发光管而已。

                   //
P1^2-------|<|------|VCC 5v

使用特权

评论回复
地板
zdhlixiang2006| | 2010-11-17 22:20 | 只看该作者
P12 ^= 1;属于读-修改-写的指令,你的电路接**让导致MCU读取该IO时状态不定

使用特权

评论回复
5
QuakeGod| | 2010-11-18 04:09 | 只看该作者
本帖最后由 QuakeGod 于 2010-11-18 04:10 编辑

外部的强上拉将IO口钳位在了高电平,真纳闷,LED怎么不接限流电阻呢?不怕烧掉吗?
而P12^=1,视乎C语言优化的程度,结果有所不同,
假如编译成汇编为
MOV C,P12
CPL C
MOV P12,C

MOV C,P12
RLC A
XRL A,#01H
RRC A
MOV P12,C
那么因为读的是IO状态,就会造成读取的数值不准确。
假如编译成汇编变成
CPL P12
或者
XRL P1,#04H
那么因为 读-修改-写 指令读取的是端口寄存器的值,不涉及端口具体状态,那么就会得到正确的结果。

当然,我们写程序的时候,要尽量避免这种状态,
原则就是,凡是输出的端口,就不要试图去读它的状态。

使用特权

评论回复
6
huangqi412| | 2010-11-18 08:44 | 只看该作者
LED居然不接个电阻。。。

使用特权

评论回复
7
smile_luo| | 2010-11-18 09:59 | 只看该作者
路过:lol

使用特权

评论回复
8
sun_shun| | 2010-11-18 12:42 | 只看该作者
同意楼上的说法
P12^=1这条语句假如编译成汇编为
MOV C,P12
CPL C
MOV P12,C

MOV C,P12
RLC A
XRL A,#01H
RRC A
MOV P12,C
那么因为读的是IO状态,就会造成读取的数值与你想的不相同。
你把数码管直接接VCC,如果你给数码管的IO输出0,数码管点亮,但是这时的IO以经不是低电平了,假设LED的导通压降大约1.8V到2.2左右,是时IO口的电压就是VCC-Vled,如果VCC=5V,大约有3V左右的电压,而这时你拿IO口的当前状态与1异或,得到的结果又是0,所以你的LED常亮
如果P12^=1这条语句假如编译成汇编为CPL P12
这时是对P1口的寄存器进行操作,这个里面的值你写的是多少就是多少,不会随IO的电压变化,
这个问题就是读IO口状态与读IO寄存器的问题,你好好看看51单片机IO内部原理就知道为什么了

使用特权

评论回复
9
sun_shun| | 2010-11-18 12:43 | 只看该作者
你可以生成LST文件看看P12^=1;语句生成的是什么汇编语句。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

157

主题

292

帖子

0

粉丝