搜索
bottom↓
回复: 13

急急!!新手,写了个51的led流水灯程序在仿真中不能实现

[复制链接]

出0入0汤圆

发表于 2013-4-20 22:58:21 | 显示全部楼层 |阅读模式
#include "reg51.h"
#include "intrins.h"

unsigned char i=0x01;
//unsigned char j=0x01;
void initTimer(void)
{
TMOD=0x01;
TH0=0xd8;
TL0=0xf0;
}

void timer0(void) interrupt 1
{
TH0=0xd8;
TL0=0xf0;
//add your code here.

}

void int0(void) interrupt 0
{
IE0=0;

}


void main(void)
{
while(1)
  {
        //0b0000_0001
    P0 = ~i;
    if(i == 0x80)//0b1000_0000
    i = 0x01;
    else
    i = i << 1;        //0b0000_0010
        //i --  ;       

/*  P3 = ~j;
    if(j == 0x80)//0b1000_0000
    j = 0x01;
    else
    j =j << 1;        //0b0000_0010
   */
  }




IT0=1;
EX0=1;
initTimer();
TR0=1;
ET0=1;
EA=1;





  }

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-4-21 00:45:56 | 显示全部楼层
记得当初我写流水灯的时候很正常的啊,就是那种带尾巴的

出0入0汤圆

发表于 2013-4-21 01:30:42 | 显示全部楼层
新手更加不能急...

出0入0汤圆

发表于 2013-4-21 01:32:51 | 显示全部楼层
仿真不过,不一定就不行的,仿真过了,也不一定行的,仿真之作参考,真正要调程序还是找块芯片调吧

出0入0汤圆

发表于 2013-4-21 01:38:58 | 显示全部楼层
你把while{}后面的东西放在前面,现在好像是你的程序直接进到while循环里,在这之前没开定时器(也是学习者,班门弄斧,有错还望大家指点)

出0入0汤圆

发表于 2013-4-21 01:44:46 | 显示全部楼层
不好意思,你好像没用定时器,每次状态改变都没有延时。这样的话即使闪烁,闪烁频率也太高了,看不出来效果得。可以用定时器计数进行延时,这样的话就应该可以看出闪烁效果了

出0入0汤圆

发表于 2013-4-21 05:44:33 | 显示全部楼层
本帖最后由 shangdawei 于 2013-4-21 05:50 编辑
  1. #include "reg51.h"
  2. #include "intrins.h"

  3. unsigned char i = 0x01;
  4. //unsigned char j=0x01;
  5. void initTimer( void )
  6. {
  7.   TMOD = 0x01;
  8.   TH0 = 0xd8;
  9.   TL0 = 0xf0;
  10. }

  11. void timer0( void )
  12. interrupt 1
  13. {
  14.   TH0=0xd8;
  15.   TL0=0xf0;
  16.   //add your code here.
  17. }

  18. void int0( void )
  19. interrupt 0
  20. {
  21.   IE0=0;
  22. }

  23. void main( void )
  24. {
  25.   <font color="#ff0000">while ( 1 )</font>
  26.   {
  27.     P0 = ~i;          //0b0000_0001
  28.     if ( i == 0x80 )  //0b1000_0000
  29.       i = 0x01;
  30.     else
  31.       i = i << 1;     //0b0000_0010
  32.       //i --  ;        

  33.     /*  P3 = ~j;
  34.      if(j == 0x80)    //0b1000_0000
  35.      j = 0x01;
  36.      else
  37.      j =j << 1;       //0b0000_0010
  38.      */
  39.   }
  40.   
  41.   <font color="#ff0000">// 从这里开始的这些语句从未被执行的, 从而LED状态变化没有延时</font>
  42.   <font color="#ff0000">IT0 = 1;
  43.   EX0 = 1;
  44.   initTimer( );
  45.   TR0 = 1;
  46.   ET0 = 1;
  47.   EA = 1;</font>
  48. }
复制代码

出0入0汤圆

发表于 2013-4-21 05:52:48 | 显示全部楼层
代码无法着色显示 ...

出0入0汤圆

 楼主| 发表于 2013-4-21 06:19:51 | 显示全部楼层
shangdawei 发表于 2013-4-21 05:44

但是按照你这个来的话编译出错啊

出0入0汤圆

发表于 2013-4-21 06:29:08 | 显示全部楼层
Huangwenfeng 发表于 2013-4-21 06:19
但是按照你这个来的话编译出错啊

本来就是引用你的代码而已, 同时想测试一下代码着色功能

出0入0汤圆

 楼主| 发表于 2013-4-21 07:07:16 | 显示全部楼层
shangdawei 发表于 2013-4-21 06:29
本来就是引用你的代码而已, 同时想测试一下代码着色功能

哦哦,谢谢啦!能帮忙修改下不!嘻嘻

出0入0汤圆

发表于 2013-4-21 07:07:35 | 显示全部楼层
主要是没有延时,单步仿真应该能看出效果

出0入0汤圆

发表于 2013-4-21 08:43:31 | 显示全部楼层
Huangwenfeng 发表于 2013-4-21 07:07
哦哦,谢谢啦!能帮忙修改下不!嘻嘻

参考这个代码
  1. /* BLINKY.C - LED Flasher for the Keil MCBx51 Evaluation Board with 80C51 device*/

  2. #include <REG8252.H>


  3. // When you have enabled the option Stop Program Execution with Serial
  4. // Interrupt, the Monitor-51 uses the serial interrupt of the UART.
  5. // It is therefore required to reserve the memory locations for the interrupt
  6. // vector.  You can do this by adding one of the following code lines:

  7. // char code reserve [3] _at_ 0x23;   // when using on-chip UART for communication
  8. // char code reserve [3] _at_  0x3;   // when using off-chip UART for communication

  9. void wait (void)  {                   /* wait function */
  10.   ;                                   /* only to delay for LED flashes */
  11. }

  12. void main (void)  {
  13.   unsigned int i;                     /* Delay var */
  14.   unsigned char j;                    /* LED var */

  15.   while (1) {                         /* Loop forever */
  16.     for (j=0x01; j< 0x80; j<<=1)  {   /* Blink LED 0, 1, 2, 3, 4, 5, 6 */
  17.       P1 = j;
  18.                             /* Output to LED Port */
  19.       for (i = 0; i < 10000; i++)  {  /* Delay for 10000 Counts */
  20.        wait ();                       /* call wait function */
  21.       }
  22.     }

  23.     for (j=0x80; j> 0x01; j>>=1)  {   /* Blink LED 6, 5, 4, 3, 2, 1 */
  24.       P1 = j;                         /* Output to LED Port */
  25.       for (i = 0; i < 10000; i++)  {  /* Delay for 10000 Counts */
  26.        wait ();                       /* call wait function */
  27.       }
  28.     }
  29.   }
  30. }
复制代码

出0入0汤圆

 楼主| 发表于 2013-4-21 20:43:11 | 显示全部楼层
呵呵。。谢谢各位的帮助,我已经解决这个问题啦!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 13:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表