找回密码
 立即注册

QQ登录

只需一步,快速开始

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

按键按一次计数器开始计数,按两次停止计数

[复制链接]
跳转到指定楼层
楼主
有没有人有源程序,看起来很简单,,自己写就各种实现不了
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:94072 发表于 2017-1-7 23:44 | 只看该作者
用标志位啊,按一次时为1,按两次时为2,停止计数,标志位清零
回复

使用道具 举报

板凳
ID:155507 发表于 2017-1-8 00:19 | 只看该作者
  1. /*-----------------------------------------------
  2. 名称:数码管显示,按键控制秒表
  3. 内容:中断按键控制,数码管显示,P3.2 中断0控制计时和停止,P3.3 中断1清零
  4. ------------------------------------------------*/
  5. #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

  6. unsigned int msecond,second;//定义全局变量
  7. bit GoFlag;//定义停止,计时标志

  8. #define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
  9. sbit LATCH1=P2^2;//定义锁存使能端口 段锁存         74hc573 就是锁存器
  10. sbit LATCH2=P2^3;//             位锁存

  11. unsigned char code DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
  12. unsigned char code WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
  13. unsigned char TempData[8]; //存储显示值的全局变量

  14. void DelayUs2x(unsigned char t);//函数声明
  15. void DelayMs(unsigned char t);
  16. void Display(unsigned char FirstBit,unsigned char Num);
  17. void Init_Timer0(void);
  18. void CLR(void);
  19. /*------------------------------------------------
  20.                                         主函数
  21. ------------------------------------------------*/
  22. void main (void)
  23. {
  24.         unsigned char num=0;                  


  25.         EX0=1;         //外部中断0开
  26.         IT0=1;         //IT1=0表示边沿触发
  27.         EX1=1;         //外部中断1开
  28.         IT1=1;         //IT1=1表示边沿触发
  29.         Init_Timer0();
  30.         while (1)         //主循环
  31.         {

  32.                 TempData[0]=DuanMa[second/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  
  33.                 TempData[1]=DuanMa[second%10];
  34.                 TempData[2]=0x40;// "-"
  35.                 TempData[3]=DuanMa[msecond/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  
  36.                 TempData[4]=DuanMa[msecond%10];
  37.                
  38.                 //主循环中添加其他需要一直工作的程序
  39.                
  40.         }
  41. }

  42. /*------------------------------------------------
  43. 显示函数,用于动态扫描数码管
  44. 输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示
  45. 如输入0表示从第一个显示。
  46. Num表示需要显示的位数,如需要显示99两位数值则该值输入2
  47. ------------------------------------------------*/
  48. void Display(unsigned char FirstBit,unsigned char Num)
  49. {
  50.         static unsigned char i=0;
  51.        

  52.         DataPort=0;   //清空数据,防止有交替重影
  53.         LATCH1=1;     //段锁存
  54.         LATCH1=0;

  55.         DataPort=WeiMa[i+FirstBit]; //取位码
  56.         LATCH2=1;     //位锁存
  57.         LATCH2=0;

  58.         DataPort=TempData[i]; //取显示数据,段码
  59.         LATCH1=1;     //段锁存
  60.         LATCH1=0;
  61.        
  62.         i++;
  63.         if(i==Num)
  64.         i=0;


  65. }
  66. /*------------------------------------------------
  67.                                         定时器初始化子程序
  68. ------------------------------------------------*/
  69. void Init_Timer0(void)
  70. {
  71.         TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
  72.         //TH0=0x00;              //给定初值
  73.         //TL0=0x00;
  74.         EA=1;            //总中断打开
  75.         ET0=1;           //定时器中断打开
  76.         TR0=1;           //定时器开关打开
  77. }
  78. /*------------------------------------------------
  79.                                 定时器中断子程序
  80. ------------------------------------------------*/
  81. void Timer0_isr(void) interrupt 1
  82. {
  83.         static unsigned char num;
  84.         TH0=(65536-2000)/256;                  //重新赋值 2ms
  85.         TL0=(65536-2000)%256;

  86.         Display(0,8);
  87.         if(GoFlag)
  88.         {
  89.                 num++;
  90.                 if(num==5)
  91.                 {
  92.                         num=0;
  93.                         msecond++;
  94.                         if (msecond==100)//100进1
  95.                         {
  96.                                 msecond=0;
  97.                                 second++;//秒加1
  98.                                 if(second==100)
  99.                                 second=0;
  100.                         }
  101.                 }
  102.         }
  103. }
  104. /*------------------------------------------------
  105.                         外部中断0程序
  106. ------------------------------------------------*/
  107. void ISR_INT0(void) interrupt 0
  108. {
  109.         GoFlag=!GoFlag; //利用外部中断打开和关闭定时标志 用于开始和停止计时
  110. }
  111. /*------------------------------------------------
  112.                         外部中断1程序
  113. ------------------------------------------------*/
  114. void ISR_INT1(void) interrupt 2
  115. {
  116.         if(GoFlag==0)//停止时才可以清零
  117.         CLR();
  118. }
  119. /*------------------------------------------------
  120.                         数值清零
  121. ------------------------------------------------*/
  122. void CLR(void)
  123. {
  124.         second=0;      //利用外部中断清零
  125.         msecond=0;
  126. }

复制代码
回复

使用道具 举报

地板
ID:111634 发表于 2017-1-8 13:31 | 只看该作者
本帖最后由 zl2168 于 2017-1-8 13:32 编辑

一键三用:按第一次,秒表运行计时,最大计时99.9s,超过复0。按第二次,秒表停运行,但保持最后显示秒数。按第三次,秒表清0。


实例93 99.9秒秒表
Proteus仿真一下,确认有效。
实例95 99.9秒秒表.rar (38.86 KB, 下载次数: 19)

以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1内有常用的单片机应用100案例,用于仿真实验操作,书中电路和程序设计有详细说明,电路与程序真实可靠可信可行,程序语句条条有注解。若需99.99秒,硬件电路增加一位595软件程序增加0.01s10ms)计数器,并修改相应计数显示程序。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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