找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于51单片机按钮控制数码管计时程序 希望大佬帮忙完善一下代码

[复制链接]
跳转到指定楼层
楼主
ID:987571 发表于 2021-12-3 14:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1黑币
本人已经将代码写了一部分了,能够将第一个按钮控制第一第二个数码管的计时,希望有大佬能够把第二个按钮控制第三第四个数码管的计时完善一下。
谢谢帮忙了!

代码如下
  1. #include <STC89C5xRC.H>
  2. #include <intrins.H>
  3.                                                                  /*分频*/
  4. #define u8                                         unsigned char
  5. #define u16                                 unsigned int
  6. #define cpu_f                                         12000000
  7. #define machine_cycle                    6                                //如使用RC/RD单片机的双倍速模式则需要改成6
  8. static unsigned char time_count=0;
  9. unsigned char code   dm[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
  10. unsigned char        T0RH=0,TORL=0;//初始化高低位值存放变量
  11. bit time_le=1;
  12. //时钟周期=晶振/12(6)
  13. void configTime0(u16 ms,u8 *T0H,u8 *TOL);
  14. void smg_watch(unsigned char wx,dx);
  15. void delay_ms(unsigned int count_ms);
  16. unsigned char  key(void (*call_key)());
  17. void stop_begin(void);
  18. void stop_begin2(void);
  19. /*1s翻转*/

  20. void main(void)
  21. {
  22.   P1=0XFF;
  23.   configTime0(50,&T0RH,&TORL);        //定时器初始化,
  24.   while(1)
  25.   {
  26.           smg_watch(0,time_count/10);
  27.         smg_watch(1,time_count%10);
  28.         key(stop_begin2);
  29.   }
  30. }

  31. void stop_begin(void)
  32. {
  33. static unsigned char mode=1;
  34. mode=!mode;
  35. if(mode)
  36.         TR0=1;
  37. else
  38.         TR0=0;       
  39. }

  40. void stop_begin2(void)
  41. {
  42. static unsigned char mode2=1;
  43. mode2=!mode2;
  44. if(mode2)
  45.         time_le=1;
  46. else
  47.         time_le=0;       
  48. }

  49. unsigned char  key(void (*call_key)())
  50. {
  51.         if(!P30)//做下降沿检测
  52.         {
  53.                 delay_ms(20);//延时消抖
  54.                 if(!P30)//做下降沿检测       
  55.                 {                       
  56.                         while(!P30);//做松手检测
  57.                         call_key();        //任务
  58.                         return 1;
  59.                 }
  60.                 else
  61.                 return 0;       
  62.         }
  63.         else
  64.         return 0;
  65. }

  66. /*******************************************************************************
  67. 函数功能:
  68. *   @ 定时器0初始化
  69. 参数描述:
  70. *   @ ms 初始化时间
  71. 返回值描述:
  72. *   @ 无
  73. 说明:
  74. *   @  
  75. *******************************************************************************/
  76. void configTime0(u16 ms,u8 *T0H,u8 *TOL)
  77. {
  78.         unsigned long temp;//0~4,294,967,296(32字节一般的时钟都用这个变量算)
  79.         /*加载初值*/
  80.         temp=cpu_f/machine_cycle;//该宏定义在timer.c(52RC/RD具备6T双倍速模式,如果为提高程序运行效率可更改宏定义)
  81.         temp=(temp*ms)/1000; //调用函数变量ms要转换成秒

  82.         temp=65536-temp;   
  83.         temp=temp+1;//中断在准备中断时会使用一些机器周期去保存变量,造成响应延迟,这里尝试抵消延迟
  84.        
  85.          /*数据结算*/
  86.         *T0H=(u8)(temp>>8);//变量类型强制转换        //ff
  87.         *TOL=(u8)temp;                                                        //f5
  88.        
  89.         /*清空T0控制位,将T0配置成模式1*/
  90.         TMOD &=0XF0;
  91.         TMOD |=0X01; //置位         0000 0001
  92.        
  93.         /*赋初值*/
  94.         TH0=*T0H;//初负载值(高)        8位寄存器
  95.         TL0=*TOL;//(低)

  96.         /*初始化T0*/
  97.         TF0=0;//清空溢出标志位
  98.         ET0=1;//使能T0中断
  99.         TR0=1;//启动T0
  100.         EA=1;//开启总中断
  101. }

  102. void smg_watch(unsigned char wx,dx)
  103. {
  104.         /*关闭段选*/
  105.         P26=1;
  106.         P0=0Xff;/*清空位选*/
  107.         P27=1;//打开位选   =
  108.         P0=_crol_(0XFE,wx);//进行位选
  109.        
  110.         /*关闭位选*/
  111.         P27=0;
  112.         P0=0X00;/*清空段选*/
  113.         P26=1;//打开段选
  114.         P0= dm[dx];//输入段选信号
  115.         delay_ms(1);//留显
  116.          
  117. }

  118. void delay_ms(unsigned int count_ms)
  119. {
  120. unsigned int count=0;
  121. unsigned char i, j;
  122. for(count=0;count<count_ms;count++)
  123. {
  124.         _nop_();
  125.         _nop_();
  126.         i = 2;
  127.         j = 15;
  128.         do
  129.         {
  130.                 while (--j);
  131.         } while (--i);
  132. }

  133. }

  134. void Interrupt_timer0(void) interrupt 1        //主要模式为计数
  135. {       
  136.         static unsigned char jishu=0;
  137.         TH0=T0RH;//初负载值(高)
  138.         TL0=TORL;//(低)
  139.         /*计时*/
  140.         if(time_le)
  141.         jishu++;
  142.         if((jishu==20))//1s后
  143.         {
  144.                 time_count++;
  145.                 if(time_count==61)
  146.                         time_count=0;
  147.                 jishu=0;
  148.         }               
  149. }
复制代码

keilproject_3.zip

25.86 KB, 下载次数: 1

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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