找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5186|回复: 15
打印 上一主题 下一主题
收起左侧

初学者 求助 定时器中断和流水灯的问题

[复制链接]
跳转到指定楼层
楼主
  1. #include<reg52.h>//T1的方式2,时间间隔一秒 流水灯 每次三个
  2. #define uint unsigned int
  3. sbit D0=P1^0;
  4. sbit D1=P1^1;
  5. sbit D2=P1^2;
  6. sbit D3=P1^3;
  7. sbit D4=P1^4;
  8. sbit D5=P1^5;
  9. sbit D6=P1^6;
  10. sbit D7=P1^7;
  11. void display(uint);
  12. uint num,n;
  13. void main()
  14. {
  15.         TMOD=0x20;
  16.         TH1=256-200;
  17.         TL1=256-200;
  18.         EA=1;
  19.         ET1=1;
  20.         TR1=1;
  21.         while(1)
  22. {
  23.         display(n);       
  24. }

  25. }

  26. void T0_time() interrupt 3
  27. {
  28.         num++;
  29.         if(num==5000)
  30.         {
  31.                 num=0;
  32.                 n++;
  33.                 if(n==4)
  34.                 {
  35.                         n=1;
  36.                 }
  37.         }


  38. }
  39. void display(uint n)
  40. {
  41. if(n==1)
  42.         {
  43.         D0=~D0;
  44.         D1=~D1;
  45.         D2=~D2;
  46.         }
  47.         if(n==2)
  48.         {
  49.         D3=~D3;
  50.         D4=~D4;
  51.         D5=~D5;
  52.         }
  53.         if(n==3)
  54.         {
  55.        
  56.         D6=~D6;
  57.         D7=~D7;
  58.         D0=~D0;
  59.         }

  60. }
复制代码
这段代码,我运行出来 第一次循环是正确的,每次三个闪烁,但是从第二次循环就开始乱闪了 每次也不是三个。。各位看看我错在哪里啊
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:140371 发表于 2016-11-11 08:02 | 只看该作者
你的程式架構:有bug ....說明如下..當(n==1) 會執行多次的  D0=~D0;D1=~D1;D2=~D2; 這些敘述
當 n== 2 , n==3 時亦同  ...
回复

使用道具 举报

板凳
ID:145415 发表于 2016-11-11 08:15 | 只看该作者
a0931727149 发表于 2016-11-11 08:02
你的程式架構:有bug ....說明如下..當(n==1) 會執行多次的  D0=~D0;D1=~D1;D2=~D2; 這些敘述
當 n== 2 , n ...

也就是说在n=1和 n=2之间的时候时间会有重叠是吗?那要怎么修改呀?
回复

使用道具 举报

地板
ID:140371 发表于 2016-11-11 08:49 | 只看该作者
  if(n==1){
        D6=0;
        D7=0;
        D0=1;
        D1=1;
        D2=1;
        }
        if(n==2)
        {
        D0=0;
        D1=0;
        D2=0;
        D3=1;
        D4=1;
        D5=1;
        }
        if(n==3)
        {
         D3=0;
        D4=0;
        D5=0;
        D6=1;
        D7=1;
       // D0=1;
        }
回复

使用道具 举报

5#
ID:145415 发表于 2016-11-11 09:00 | 只看该作者
a0931727149 发表于 2016-11-11 08:49
if(n==1){
        D6=0;
        D7=0;

谢谢 我思考了下 也用的这种方法 结果是正确的 但是感觉蠢蠢的 哈哈哈
回复

使用道具 举报

6#
ID:111634 发表于 2016-11-12 13:51 | 只看该作者
本帖最后由 zl2168 于 2016-11-12 15:05 编辑
小胖头 发表于 2016-11-11 09:00
谢谢 我思考了下 也用的这种方法 结果是正确的 但是感觉蠢蠢的 哈哈哈

“感觉蠢蠢的”。
若欲D6=0; D7=0;D0=1;D1=1;D2=1;
可P1=(P1&0x3f)|0x07;//P1&0x3f,表示D6=0; D7=0,其余各位不变。再或0x07,表示D0=1;D1=1;D2=1,其余各位不变。
以此类推。建议你还要加强理论学习,否则,盲目实践,事倍功半。介绍你2本书,
张志良编著《80C51单片机实用教程》ISBN978-7-04-044532-9,高教社出版。用于学习51单片机原理,便于阅读理解,便于自学。
80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行书中电路和程序设计有详细说明,程序语句条条有注解。
回复

使用道具 举报

7#
ID:147540 发表于 2016-11-12 17:18 | 只看该作者
定时器好好学,可以自己尝试定时时间,加强练习
回复

使用道具 举报

8#
ID:111634 发表于 2016-11-12 19:30 | 只看该作者
本帖最后由 zl2168 于 2016-11-12 19:49 编辑

看了你的程序,实在不敢恭维。我编了一个,并带keil调试,你看看。


不学理论,盲目实践,不是事倍功半,就是知其然,不知其所以然。


回复

使用道具 举报

9#
ID:111634 发表于 2016-11-12 19:35 | 只看该作者
本帖最后由 zl2168 于 2016-11-12 19:51 编辑

不学理论,盲目实践,不是事倍功半,就是知其然,不知其所以然。
再给你编一个不用中断的按你要求的程序,你试试:


要走捷径,看我给你介绍的2本书,真的不骗你。
张志良编著《80C51单片机实用教程》ISBN978-7-04-044532-9,高教社出版。用于学习51单片机原理,便于阅读理解,便于自学。
80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行书中电路和程序设计有详细说明,程序语句条条有注解。


回复

使用道具 举报

10#
ID:111634 发表于 2016-11-12 19:44 | 只看该作者
再次指出,你那个高电平亮灯控制是不妥的。
回复

使用道具 举报

11#
ID:145415 发表于 2016-11-17 17:26 | 只看该作者
zl2168 发表于 2016-11-12 19:44
再次指出,你那个高电平亮灯控制是不妥的。

非常感谢,学生受教啦
回复

使用道具 举报

12#
ID:145415 发表于 2016-11-17 17:26 | 只看该作者
zengwei 发表于 2016-11-12 19:55
90060059初学者交流群

谢谢啦
回复

使用道具 举报

13#
ID:140371 发表于 2016-11-18 17:57 来自手机 | 只看该作者
中斷編號有誤。延時時間太長會跳著顯示。
回复

使用道具 举报

14#
ID:148704 发表于 2016-11-18 19:33 | 只看该作者
感谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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