找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1952|回復(fù): 0
收起左側(cè)

關(guān)于51單片機(jī)按鈕控制數(shù)碼管計(jì)時(shí)程序 希望大佬幫忙完善一下代碼

[復(fù)制鏈接]
ID:987571 發(fā)表于 2021-12-3 14:01 | 顯示全部樓層 |閱讀模式
1黑幣
本人已經(jīng)將代碼寫(xiě)了一部分了,能夠?qū)⒌谝粋(gè)按鈕控制第一第二個(gè)數(shù)碼管的計(jì)時(shí),希望有大佬能夠把第二個(gè)按鈕控制第三第四個(gè)數(shù)碼管的計(jì)時(shí)完善一下。
謝謝幫忙了!

代碼如下
  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單片機(jī)的雙倍速模式則需要改成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. //時(shí)鐘周期=晶振/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翻轉(zhuǎn)*/

  20. void main(void)
  21. {
  22.   P1=0XFF;
  23.   configTime0(50,&T0RH,&TORL);        //定時(shí)器初始化,
  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)//做下降沿檢測(cè)
  52.         {
  53.                 delay_ms(20);//延時(shí)消抖
  54.                 if(!P30)//做下降沿檢測(cè)       
  55.                 {                       
  56.                         while(!P30);//做松手檢測(cè)
  57.                         call_key();        //任務(wù)
  58.                         return 1;
  59.                 }
  60.                 else
  61.                 return 0;       
  62.         }
  63.         else
  64.         return 0;
  65. }

  66. /*******************************************************************************
  67. 函數(shù)功能:
  68. *   @ 定時(shí)器0初始化
  69. 參數(shù)描述:
  70. *   @ ms 初始化時(shí)間
  71. 返回值描述:
  72. *   @ 無(wú)
  73. 說(shuō)明:
  74. *   @  
  75. *******************************************************************************/
  76. void configTime0(u16 ms,u8 *T0H,u8 *TOL)
  77. {
  78.         unsigned long temp;//0~4,294,967,296(32字節(jié)一般的時(shí)鐘都用這個(gè)變量算)
  79.         /*加載初值*/
  80.         temp=cpu_f/machine_cycle;//該宏定義在timer.c(52RC/RD具備6T雙倍速模式,如果為提高程序運(yùn)行效率可更改宏定義)
  81.         temp=(temp*ms)/1000; //調(diào)用函數(shù)變量ms要轉(zhuǎn)換成秒

  82.         temp=65536-temp;   
  83.         temp=temp+1;//中斷在準(zhǔn)備中斷時(shí)會(huì)使用一些機(jī)器周期去保存變量,造成響應(yīng)延遲,這里嘗試抵消延遲
  84.        
  85.          /*數(shù)據(jù)結(jié)算*/
  86.         *T0H=(u8)(temp>>8);//變量類(lèi)型強(qiáng)制轉(zhuǎn)換        //ff
  87.         *TOL=(u8)temp;                                                        //f5
  88.        
  89.         /*清空T0控制位,將T0配置成模式1*/
  90.         TMOD &=0XF0;
  91.         TMOD |=0X01; //置位         0000 0001
  92.        
  93.         /*賦初值*/
  94.         TH0=*T0H;//初負(fù)載值(高)        8位寄存器
  95.         TL0=*TOL;//(低)

  96.         /*初始化T0*/
  97.         TF0=0;//清空溢出標(biāo)志位
  98.         ET0=1;//使能T0中斷
  99.         TR0=1;//啟動(dòng)T0
  100.         EA=1;//開(kāi)啟總中斷
  101. }

  102. void smg_watch(unsigned char wx,dx)
  103. {
  104.         /*關(guān)閉段選*/
  105.         P26=1;
  106.         P0=0Xff;/*清空位選*/
  107.         P27=1;//打開(kāi)位選   =
  108.         P0=_crol_(0XFE,wx);//進(jìn)行位選
  109.        
  110.         /*關(guān)閉位選*/
  111.         P27=0;
  112.         P0=0X00;/*清空段選*/
  113.         P26=1;//打開(kāi)段選
  114.         P0= dm[dx];//輸入段選信號(hào)
  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        //主要模式為計(jì)數(shù)
  135. {       
  136.         static unsigned char jishu=0;
  137.         TH0=T0RH;//初負(fù)載值(高)
  138.         TL0=TORL;//(低)
  139.         /*計(jì)時(shí)*/
  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. }
復(fù)制代碼

keilproject_3.zip

25.86 KB, 下載次數(shù): 1

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表