2907|4

76

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

计时器,通过4个独立按键来控制 [复制链接]


  1. /*数码管前三位显示一个跑表,从000到999之间以1%秒速度运行   
  2. */

  3. #include
  4. #define UINT unsigned int
  5. #define UCHAR unsigned char
  6. sbit s2 = P3 ^ 4;
  7. sbit s3 = P3 ^ 5;
  8. sbit s4 = P3 ^ 6;
  9. sbit s5 = P3 ^ 7;
  10. sbit dula = P2 ^ 6;
  11. sbit wela = P2 ^ 7;
  12. UINT time, cnt;
  13.                      /*0     1      2     3     4    5     6
  14.                       *7    8       9     A     b    C      d
  15.                       *E     F     H      L     P    U      .
  16.                       */
  17. UCHAR code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d,
  18.                       0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x37, 0x5e,
  19.                       0x79, 0x71, 0x76, 0x38, 0x73, 0x3e, 0x80,
  20.                       0x00};

  21. void main()
  22. {
  23.     char pressKey();
  24.     void display(UCHAR, UCHAR, UCHAR);
  25.     UCHAR digits, tens, hundreds;

  26.     time = cnt = 0;
  27.     digits = tens = hundreds = 0;
  28.     TMOD = 0X01;
  29.     EA = 1;
  30.     ET0 = 1;
  31.     while(1)
  32.     {
  33.         if(pressKey() == 1)  //开始
  34.         {
  35.             ET0 = 1;
  36.             TR0 = 1;
  37.         }
  38.         else if(pressKey() == 2)  //pause
  39.             TR0 = 0;
  40.         else if(pressKey() == 3)  //stop,清零, 按下这个键后无法实现清零  
  41.         {
  42.             
  43.             TR0 = 0;
  44.             ET0 = 0;
  45.             time = 0;
  46.             cnt = 0;
  47.         }
  48.         else if(pressKey() == 4)  //清零并重新计时,这里的功能也无法实现  
  49.         {
  50.             ET0 = 0;
  51.             TR0 = 0;
  52.             time = 0;
  53.             cnt = 0;
  54.             ET0 = 1;
  55.             TR0 = 1;
  56.         }
  57.         digits = time % 10;
  58.         tens = time / 10 % 10;
  59.         hundreds = time / 100;
  60.         display(hundreds, tens, digits);                  
  61.     }
  62. }

  63. void display(UCHAR tube1, UCHAR tube2, UCHAR tube3)
  64. {
  65.     void delay(UINT);

  66.     wela = 1;
  67.     P0 = 0xff;
  68.     wela = 0;
  69.     dula = 1;
  70.     P0 = table[tube1];
  71.     dula = 0;
  72.     wela = 1;
  73.     P0 = 0xfe;
  74.     wela = 1;
  75.     delay(1);  
  76.    
  77.     wela = 1;
  78.     P0 = 0xff;
  79.     wela = 0;
  80.     dula = 1;
  81.     P0 = table[tube2];
  82.     dula = 0;
  83.     wela = 1;
  84.     P0 = 0xfd;
  85.     wela = 1;
  86.     delay(1);
  87.    
  88.     wela = 1;
  89.     P0 = 0xff;
  90.     wela = 0;
  91.     dula = 1;
  92.     P0 = table[tube3];
  93.     dula = 0;
  94.     wela = 1;
  95.     P0 = 0xfb;
  96.     wela = 1;
  97.     delay(1);   
  98. }

  99. char pressKey()
  100. {
  101.     void delay(UINT);
  102.     if(!s2)
  103.     {
  104.         delay(5);
  105.         while(!s2)
  106.             ;
  107.         return 1;
  108.     }
  109.     else if(!s3)
  110.     {
  111.         delay(5);
  112.         while(!s3)
  113.             ;
  114.         return 2;
  115.     }
  116.     else if(!s4)
  117.     {
  118.         delay(5);
  119.         while(!s4)
  120.             ;
  121.         return 3;
  122.     }
  123.     else if(!s5)
  124.     {
  125.         delay(5);
  126.         while(!s5)
  127.             ;
  128.         return 4;
  129.     }

  130.     return 0;
  131. }

  132. void timer0() interrupt 1
  133. {
  134.     TH0 = (65536 - 50000) / 256;
  135.     TL0 = (65536 - 50000) % 256;
  136.     if(++cnt == 2)
  137.     {
  138.         cnt = 0;
  139.         if(++time == 1000)
  140.             time = 0;
  141.     }
  142. }

  143. void delay(UINT ms)
  144. {
  145.     UINT x, y;

  146.     for(x = ms; x; x--)
  147.         for(y = 197; y; y--)
  148.             ;
  149. }                        



复制代码


停止和停止并清零这两个功能实现不了,,应该怎么使计时器停止工作和重新工作呢?

  1. /*哪里出错了*/
  2. else if(pressKey() == 3)  //stop,清零, 按下这个键后无法实现清零  
  3.         {
  4.             
  5.             TR0 = 0;
  6.             ET0 = 0;
  7.             time = 0;
  8.             cnt = 0;
  9.         }
  10.         else if(pressKey() == 4)  //清零并重新计时,这里的功能也无法实现  
  11.         {
  12.             ET0 = 0;
  13.             TR0 = 0;
  14.             time = 0;
  15.             cnt = 0;
  16.             ET0 = 1;
  17.             TR0 = 1;
  18.         }

复制代码

最新回复

用了e3399的就可以了。  详情 回复 发表于 2010-5-17 14:04
点赞 关注

回复
举报

61

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

  1. /*数码管前三位显示一个跑表,从000到999之间以1%秒速度运行   
  2. *独立按键1:开始/暂停计时,
  3. *独立按键2:按住键暂停,松开继续继时  
  4. *独立按键3:清零
  5. *独立按键4:清零并重新开始计时
  6. */

  7. #include
  8. #define UINT unsigned int
  9. #define UCHAR unsigned char
  10. sbit s2 = P3 ^ 4;
  11. sbit s3 = P3 ^ 5;
  12. sbit s4 = P3 ^ 6;
  13. sbit s5 = P3 ^ 7;
  14. sbit dula = P2 ^ 6;
  15. sbit wela = P2 ^ 7;
  16. UINT time, cnt;
  17.                      /*0     1      2     3     4    5     6
  18.                       *7    8       9     A     b    C      d
  19.                       *E     F     H      L     P    U      .
  20.                       */
  21. UCHAR code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d,
  22.                       0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x37, 0x5e,
  23.                       0x79, 0x71, 0x76, 0x38, 0x73, 0x3e, 0x80,
  24.                       0x00};

  25. void main()
  26. {
  27.    
  28.     void display(UCHAR, UCHAR, UCHAR);
  29.     void init();
  30.     void keyScan();
  31.     UCHAR digits, tens, hundreds;

  32.     digits = tens = hundreds = 0;
  33.     init();  
  34.     while(1)
  35.     {
  36.         keyScan();
  37.         digits = time % 10;
  38.         tens = time / 10 % 10;
  39.         hundreds = time / 100;
  40.         display(hundreds, tens, digits);                  
  41.     }
  42. }

  43. void init()
  44. {     
  45.     time = cnt = 0;   
  46.     TMOD = 0X01;
  47.     EA = 1;
  48.     ET0 = 1;   
  49. }

  50. void display(UCHAR tube1, UCHAR tube2, UCHAR tube3)
  51. {
  52.     void delay(UINT);

  53.     wela = 1;
  54.     P0 = 0xff;
  55.     wela = 0;
  56.     dula = 1;
  57.     P0 = table[tube1];
  58.     dula = 0;
  59.     wela = 1;
  60.     P0 = 0xfe;
  61.     wela = 1;
  62.     delay(1);  
  63.    
  64.     wela = 1;
  65.     P0 = 0xff;
  66.     wela = 0;
  67.     dula = 1;
  68.     P0 = table[tube2];
  69.     dula = 0;
  70.     wela = 1;
  71.     P0 = 0xfd;
  72.     wela = 1;
  73.     delay(1);
  74.    
  75.     wela = 1;
  76.     P0 = 0xff;
  77.     wela = 0;
  78.     dula = 1;
  79.     P0 = table[tube3];
  80.     dula = 0;
  81.     wela = 1;
  82.     P0 = 0xfb;
  83.     wela = 1;
  84.     delay(1);   
  85. }

  86. void keyScan()
  87. {
  88.     if(!s2)    //开始/暂停计时,  
  89.     {
  90.         delay(5);
  91.         if(!s2)
  92.         {
  93.             TR0 = ~TR0;
  94.             while(!s2)
  95.                 ;
  96.         }
  97.     }
  98.     else if(!s3)    //按下键暂停,松开继续继时  
  99.     {
  100.         delay(5);
  101.         if(!s3)
  102.         {
  103.             TR0 = 0;
  104.             while(!s3)
  105.                 ;
  106.             TR0 = ~TR0;

  107.         }
  108.     }
  109.     else if(!s4)   //清零
  110.     {
  111.         delay(5);
  112.         if(!s4)
  113.         {
  114.             TR0 = 0;
  115.             time = 0;
  116.             cnt = 0;
  117.             while(!s4)
  118.                 ;
  119.         }
  120.     }
  121.     else if(!s5)  //清零并重新开始计时
  122.     {
  123.         delay(5);
  124.         if(!s5)
  125.         {
  126.             TR0 = 0;
  127.             time = 0;
  128.             cnt = 0;
  129.             while(!s5)
  130.                 ;
  131.             TR0 = 1;
  132.         }
  133.     }
  134.    
  135. }

  136. void timer0() interrupt 1
  137. {
  138.     TH0 = (65536 - 50000) / 256;
  139.     TL0 = (65536 - 50000) % 256;
  140.     if(++cnt == 2)
  141.     {
  142.         cnt = 0;
  143.         if(++time == 1000)
  144.             time = 0;
  145.     }
  146. }

  147. void delay(UINT ms)
  148. {
  149.     UINT x, y;

  150.     for(x = ms; x; x--)
  151.         for(y = 197; y; y--)
  152.             ;
  153. }                        



复制代码

 
 

回复

56

帖子

3

TA的资源

一粒金砂(初级)

板凳
 
太长了,先去上课咯
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

4
 
现象是按了3.4按键之后,还继续计算吗?
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

5
 
用了e3399的就可以了。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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