4828|6

70

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请高手进来,51单片机计时中断控制数码管的位选段选问题 [复制链接]



  1. /*程序功能,计时器,精确到0.1秒*/
  2. #include
  3. #define UINT unsigned int
  4. #define UCHAR unsigned char
  5. sbit keyS2 = P3 ^ 4;
  6. sbit dula = P2 ^ 6;
  7. sbit wela = P2 ^ 7;
  8. UINT time = 0;
  9. UINT cnt = 0;
  10. UCHAR code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d,
  11.                       0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x37, 0x5e,
  12.                       0x79, 0x71, 0x76, 0x38, 0x73, 0x3e, 0x80,
  13.                       0x00};

  14. void main()
  15. {
  16.     bit key();
  17.     void display(UCHAR, UCHAR, UCHAR);
  18.     UCHAR digits, tens, hundreds;
  19.     TMOD = 0X01;
  20.     EA = 1;
  21.     ET0 = 1;
  22.     TR0 = 1;
  23.    
  24.     while(1)
  25.     {
  26.         if(key())
  27.             TR0 = 0;
  28.         else
  29.             TR0 = 1;
  30.         digits = time % 10;
  31.         tens = time / 10 % 10;
  32.         hundreds = time / 100;
  33.         display(hundreds, tens, digits);      
  34.     }   
  35. }

  36. bit key()
  37. {
  38.     void delay(UINT);
  39.     if(keyS2 == 0)
  40.     {
  41.         delay(5);
  42.         if(keyS2 == 0)
  43.         {
  44.             while(keyS2 == 0)
  45.                 ;  
  46.             return 1;
  47.         }
  48.     }
  49.    
  50.     return 0;   
  51. }

  52. void display(UCHAR tube1, UCHAR tube2, UCHAR tube3)
  53. {

  54.     void delay(UINT);
  55.     wela = 1;
  56.     P0 = 0xfe;         //我的迷惑之处是display()函数和后面的display()函数的不同处。。
  57.     wela = 0;
  58.     dula = 1;
  59.     P0 = table[tube1];
  60.     dula = 0;
  61.     delay(1);
  62.    
  63.     wela = 1;
  64.     P0 = 0xfd;
  65.     wela = 0;
  66.     dula = 1;
  67.     P0 = table[tube2];
  68.     dula = 0;
  69.     delay(1);
  70.    
  71.     wela = 1;
  72.     P0 = 0xfb;
  73.     wela = 0;
  74.     dula = 1;
  75.     P0 = table[tube3];
  76.     dula = 0;
  77.     delay(1);        
  78. }

  79. void timer1() interrupt 1
  80. {
  81.     TH0 = (65536 - 50000) / 256;
  82.     TL0 = (65536 - 50000) % 256;
  83.     if(++cnt == 2)
  84.     {
  85.         if(++time == 999)
  86.             time = 0;
  87.         cnt = 0;
  88.     }
  89. }

  90. void delay(UINT ms)
  91. {
  92.     UINT x, y;

  93.     for(x = ms; x; x--)
  94.         for(y = 197; y; y--)
  95.             ;
  96. }
复制代码


下面是另外一个display()函数

  1. void display(UCHAR tube1, UCHAR tube2, UCHAR tube3)
  2. {
  3.     void delay(UINT);

  4.       /*这个display()函数就是多了下面这三条语句,我不知道它们的用意
  5.        *不是像上面那个display()函数那样就好吗?直接先送位选数,再送段选数据
  6.        *为什么要再加多这三条语句
  7.        *我用上面那个display()函数去编译,把.hex下载到实验板上运行,能正常运行
  8.        *但在proteus上进行仿真时就不行了,显示不稳定,一闪一闪的。我总共要显示3个数码管
  9.        *在proteus上仿真时有一两个还不会亮,但在实验板上就正常
  10.        *用了这里的display()函数去编译,下载到实验板上正常运行,在proteus上也正常仿真
  11.        *请高手指点下,一:这两个display()的区别在哪里
  12.        *               二:为什么第一个display()函数在实验板上正常运行,仿真不行。
  13.        *在这里先谢过了
  14.          */
  15.       
  16.     wela = 1;      
  17.     P0 = 0xff;
  18.     wela = 0;
  19.     dula = 1;
  20.     P0 = table[tube1];
  21.     dula = 0;
  22.     wela = 1;
  23.     P0 = 0xfe;
  24.     wela = 0;
  25.    
  26.     delay(1);
  27.    
  28.     wela = 1;
  29.     P0 = 0xff;
  30.     wela = 0;
  31.     dula = 1;
  32.     P0 = table[tube2];
  33.     dula = 0;
  34.     wela = 1;
  35.     P0 = 0xfd;
  36.     wela = 0;
  37.    
  38.     delay(1);
  39.    
  40.     wela = 1;
  41.     P0 = 0xff;
  42.     wela = 0;
  43.     dula = 1;
  44.     P0 = table[tube3];
  45.     dula = 0;
  46.     wela = 1;
  47.     P0 = 0xfb;
  48.     wela = 0;
  49.    
  50.     delay(1);        
  51. }

复制代码

最新回复

谢谢了。。  详情 回复 发表于 2010-5-17 12:29
点赞 关注

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

  1. /*我的迷或之处*/
  2. wela = 1;      
  3.     P0 = 0xff;
  4.     wela = 0;
  5.     dula = 1;
  6.     P0 = table[tube1];
  7.     dula = 0;
  8.     wela = 1;
  9.     P0 = 0xfe;
  10.     wela = 0;
  11. /*和下面的区别*/
  12. wela = 1;
  13.     P0 = 0xfe;
  14.     wela = 0;
  15.     dula = 1;
  16.     P0 = table[tube1];
  17.     dula = 0;
复制代码
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
好难搞吗,程序好难看啊,太长了,呵呵
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

4
 
程序是新概念那本书上的,两个都没有问题,问题应该是protues软件自身的问题,对数码管的显示经常不正常,我试过很多
 
 
 

回复

96

帖子

0

TA的资源

一粒金砂(初级)

5
 
多的那三条相当于初始化操作,初始的是相应地址的值
proteus里没有这三条语句的话 开始运行时它从软件映射的地址取值就很可能得到一个不确定的数 是由这个软件和运行环境决定的 应该叫数据堆栈吧。。。
而51的板子上没有变量储存功能 加不加那三条语句它都是 0xff

嗯,软件,仿了,不一定真。。
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 4 楼 rncjd 的回复:
多的那三条相当于初始化操作,初始的是相应地址的值
proteus里没有这三条语句的话 开始运行时它从软件映射的地址取值就很可能得到一个不确定的数 是由这个软件和运行环境决定的 应该叫数据堆栈吧。。。
而51的板子上没有变量储存功能 加不加那三条语句它都是 0xff

嗯,软件,仿了,不一定真。。


有理。。仿了不一定真
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 4 楼 rncjd 的回复:
多的那三条相当于初始化操作,初始的是相应地址的值
proteus里没有这三条语句的话 开始运行时它从软件映射的地址取值就很可能得到一个不确定的数 是由这个软件和运行环境决定的 应该叫数据堆栈吧。。。
而51的板子上没有变量储存功能 加不加那三条语句它都是 0xff

嗯,软件,仿了,不一定真。。

谢谢了。。
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表