找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1314|回复: 2
收起左侧

关于郭天祥lesson4-2程序仿真的疑问

[复制链接]
ID:666011 发表于 2020-2-20 10:00 | 显示全部楼层 |阅读模式
根据郭师傅的视频一步步走下来的,最终代码如下,郭师傅在视频中用实验板能实现此功能,但我用proteus仿真仿不出来,在线求助。再就是仿真出现图二是什么原因。
单片机源程序如下:
  1. //实现的功能:第一位亮一,过一秒种后第二位亮二,再过一秒后第三位亮三,然后依次类推
  2. #include<reg52.h>
  3. #include<intrins.h>        //流水灯的循环移动
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. uchar temp,aa,numdu,numwe;
  7. sbit dula=P2^6;//段选
  8. sbit wela=P2^7;//位选
  9. uchar code table[]={
  10. 0x3f,0x06,0x5b,0x4f,
  11. 0x66,0x6d,0x7d,0x07,
  12. 0x7f,0x6f,0x77,0x7c,
  13. 0x39,0x5e,0x79,0x71};
  14. uchar code tablewe[]={                //位的table
  15. 0xfe,0xfd,0xfb,
  16. 0xf7,0xef,0xdf};
  17. //{0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  18. //void delay(uint z);        //使用定时器延时
  19. void main()
  20. {
  21.         numdu=0;
  22.         numwe=0;
  23.         aa=0;
  24.         TMOD=1;//0x01;确定T0T1的工作方式
  25.         TH0=(65536-50000)/256;//50毫秒产生一次中断
  26.         TL0=(65536-50000)%256;
  27.         EA=1;//开总中断
  28.         ET0=1;//开定时器0中断
  29.         TR0=1;//启动定时器
  30. /*定时/计数器初始化程序应完成如下工作:
  31. //对TMOD赋值,以确定T0和T1的工作方式。
  32. //计算初值,并将其写入TH0、TL0或TH1、TL1.
  33. //中断方式时,则对IE赋值,开放中断。
  34. //使TR0或TR1置位,启动定时/计数器定时或计数*/
  35.         while(1)
  36.         {
  37. //                delay(1000);//延时1000毫秒
  38. //                temp=_crol_(temp,1);
  39. //                P1=temp;   
  40.                 if(aa==10)//200毫秒
  41.                         {
  42.                                 aa=0;
  43.                                 numdu++;
  44.                                 if(numdu==7)
  45.                                         numdu=1;
  46.                                 dula=1;
  47.                                 P0=table[numdu];
  48.                                 dula=0;
  49.                                 wela=1;
  50.                                 P0=tablewe[numwe];
  51.                                 wela=0;
  52.                                 numwe++;
  53.                                 if(numwe==6)
  54.                                         numwe=0;
  55.                         }               
  56.         }                                 
  57. }

  58. //void delay(uint z)
  59. //{
  60. //        uint x,y;
  61. //        for(x=z;x>0;x--)
  62. //                for(y=110;y>0;y--);
  63. //}
  64. void timer0() interrupt 1
  65. /*51单片机中using使用在C51编程中,
  66. 用来在中断函数中指定工作寄存器区,
  67. 工作寄存器共有4个区,分别代表R0~R7地址是:
  68. 第0工作区:00H~07H
  69. 第1工作区:08H~0FH
  70. 第2工作区:10H~17H
  71. 第3工作区:18H~1FH
  72. using n,那么n就是第几区,使用方法如下:
  73. void exterint0() interrupt 0 using 1
  74. 这表示外部中断0使用第1工作区地址。*/
  75. {
  76.         TH0=(65536-50000)/256;//5毫秒产生一次中断
  77.         TL0=(65536-50000)%256;
  78.         aa++;
  79. //                if(aa==40)//2秒
  80. //                        {
  81. //                                 aa=0;
  82. //                                 num++;//num不需初始化,默认为0
  83. //                                 if(num==16)
  84. //                                         num=0;
  85. //                                 dula=1;
  86. //                                 P0=table[num];
  87. //                                 dula=0;
  88. //                        }               
  89. }
复制代码





1

1

2

2
回复

使用道具 举报

ID:213173 发表于 2020-2-20 14:42 | 显示全部楼层
学习板上集成了很多功能,而且常有端口和接口复用,利用跳线帽切换电路。楼主想完整仿真一个复杂的学习板上所有功能几乎是不可能成功。只能把某些功能的相关电路分离出来仿真才能成功。程序修改如下: 无标题.jpg


  1. //实现的功能:第一位亮一,过一秒种后第二位亮二,再过一秒后第三位亮三,然后依次类推
  2. #include<reg52.h>
  3. #include<intrins.h>        //流水灯的循环移动
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. uchar temp,aa,numdu,numwe;
  7. sbit dula=P2^6;//段选
  8. sbit wela=P2^7;//位选
  9. uchar code table[]={
  10. 0x3f,0x06,0x5b,0x4f,
  11. 0x66,0x6d,0x7d,0x07,
  12. 0x7f,0x6f,0x77,0x7c,
  13. 0x39,0x5e,0x79,0x71};
  14. uchar code tablewe[]={                //位的table
  15. 0xfe,0xfd,0xfb,
  16. 0xf7,0xef,0xdf};
  17. //{0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  18. void Timer0Init();
  19. void delay(uint z);        //使用定时器延时
  20. void main()
  21. {
  22.         numdu=0;
  23. //        numwe=0;
  24.         aa=0;
  25. //        TMOD=1;//0x01;确定T0T1的工作方式
  26. //        TH0=(65536-50000)/256;//50毫秒产生一次中断
  27. //        TL0=(65536-50000)%256;
  28.         Timer0Init();
  29.         EA=1;//开总中断
  30.         ET0=1;//开定时器0中断
  31. //        TR0=1;//启动定时器
  32.         /*定时/计数器初始化程序应完成如下工作:
  33.         //对TMOD赋值,以确定T0和T1的工作方式。
  34.         //计算初值,并将其写入TH0、TL0或TH1、TL1.
  35.         //中断方式时,则对IE赋值,开放中断。
  36.         //使TR0或TR1置位,启动定时/计数器定时或计数*/
  37.         while(1)
  38.         {
  39.                 if(aa>=20)//1秒
  40.                 {
  41.                         aa=0;
  42.                         numdu++;
  43.                         if(numdu>=6)
  44.                                 numdu=0;
  45.                 }
  46.                 P0=table[numdu+1];
  47.                 dula=1;
  48.                 dula=0;

  49.                 P0=tablewe[numdu];
  50.                 wela=1;
  51.                 wela=0;
  52. //                numwe++;
  53. //                if(numwe==6)
  54. //                        numwe=0;               
  55.                 delay(2);
  56.         }                                 
  57. }

  58. void Timer0Init()        //50毫秒@11.0592MHz
  59. {
  60.         TMOD= 0x01;                //设置定时器模式
  61.         TL0 = 0x00;                //设置定时初值
  62.         TH0 = 0x4C;                //设置定时初值
  63.         TF0 = 0;                //清除TF0标志
  64.         TR0 = 1;                //定时器0开始计时
  65. }

  66. void delay(uint z)
  67. {
  68.         uint x,y;
  69.         for(x=z;x>0;x--)
  70.                 for(y=110;y>0;y--);
  71. }

  72. void timer0() interrupt 1
  73. /*51单片机中using使用在C51编程中,
  74. 用来在中断函数中指定工作寄存器区,
  75. 工作寄存器共有4个区,分别代表R0~R7地址是:
  76. 第0工作区:00H~07H
  77. 第1工作区:08H~0FH
  78. 第2工作区:10H~17H
  79. 第3工作区:18H~1FH
  80. using n,那么n就是第几区,使用方法如下:
  81. void exterint0() interrupt 0 using 1
  82. 这表示外部中断0使用第1工作区地址。*/
  83. {
  84.         TH0=(65536-50000)/256;//50毫秒产生一次中断
  85.         TL0=(65536-50000)%256;
  86.         aa++;
  87. //  if(aa==40)//2秒
  88. //  {
  89. //     aa=0;
  90. //     num++;//num不需初始化,默认为0
  91. //     if(num==16)
  92. //       num=0;
  93. //     dula=1;
  94. //     P0=table[num];
  95. //     dula=0;
  96. //  }               
  97. }
复制代码



回复

使用道具 举报

ID:666011 发表于 2020-3-17 23:13 | 显示全部楼层
wulin 发表于 2020-2-20 14:42
学习板上集成了很多功能,而且常有端口和接口复用,利用跳线帽切换电路。楼主想完整仿真一个复杂的学习板上 ...

谢谢啦!长知识了!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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