久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2261|回復: 6
收起左側

關于8051單片機開發板秒表程序問題,數組沒辦法初始化

[復制鏈接]
ID:419421 發表于 2019-1-1 19:19 | 顯示全部樓層 |閱讀模式
求助QAQ,一直是這樣查了好久看不出來問題。數組沒辦法初始化。。譜中的板子
qq_pic_merged_1546340613743.jpg s.png TIM截圖20190101185954.png TIM截圖20190101190132.png TIM截圖20190101190141.png
  1. #include <reg52.h>
  2. typedef unsigned char u8;
  3. typedef unsigned int u16;
  4. typedef unsigned long u32;

  5. sbit LSA = P2^2;        //38譯碼器引腳編號,選擇數碼管
  6. sbit LSB = P2^3;
  7. sbit LSC = P2^4;
  8. sbit number = P0;    //發送轉換表(段碼)
  9. sbit key1 = P3^1;    //開始/暫停
  10. sbit key2 = P3^0;    //復位
  11. sbit key3 = P3^2;    //
  12. sbit key4 = P3^3;    //

  13. u8 code smgduan[17] = {
  14.     0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
  15.     0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
  16.     };//數碼管轉換表

  17. u8 LedBuff[8] = {
  18.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  19.     } ;//數碼管緩沖區
  20. u8 KeySt[4] = {
  21.     1, 1, 1, 1
  22.     };//按鍵電平狀態儲存區

  23. bit StopwatchRunning = 1;    //秒表是否運行(確定是否暫停)
  24. bit StopwatchRefresh = 1;    //秒表是否要刷新
  25. u8    DecimalPart = 0;        //計數小數部分
  26. u16    IntegerPart = 0;        //計數整數部分
  27. u8    T0RH = 0;                //T0重裝高位
  28. u8    T0RL = 0;                //T0重裝低位
  29. void ConfigTimer0(u16 ms); //配置定時器
  30. void StopwatchDisplay(); //顯示函數(數字分割顯示)
  31. void KeyDriver(); //檢測按鍵,執行指令(主函數中調用)

  32. void main()
  33. {
  34.     EA = 1;    //打開總中斷
  35.     ConfigTimer0(2);    //定時器2ms

  36.     while(1)
  37.     {
  38.         if(StopwatchRefresh)   //是否更新數碼管顯示
  39.         {
  40.             StopwatchRefresh = 0;
  41.             StopwatchDisplay();
  42.         }
  43.         KeyDriver();    //調用按鍵驅動
  44.     }
  45. }
  46. /*函數部分*/
  47. void ConfigTimer0(u16 ms)//配置定時器
  48. {
  49.     u32 tmp;
  50.    
  51.     tmp = 12000000 / 12;
  52.     tmp = (tmp * ms) / 1000;
  53.     tmp = 65536 - tmp;
  54.     tmp += 18;
  55.     T0RH = (u8)(tmp >> 8);
  56.     T0RL = (u8)tmp;
  57.     TMOD &= 0XF0;    //僅改變后四位(置零)
  58.     TMOD |= 0X01;
  59.     TH0 = T0RH;
  60.     TL0 = T0RL;
  61.     ET0 = 1;
  62.     TR0 = 1;        
  63. }
  64. void StopwatchDisplay()//顯示函數(數字分割顯示)
  65. {
  66.     signed char i;
  67.     u8 buf[4];    //

  68.     LedBuff[0] = smgduan[DecimalPart % 10];     //小數轉換
  69.     LedBuff[1] = smgduan[DecimalPart / 10];
  70.     buf[0] = IntegerPart % 10;
  71.     buf[1] = (IntegerPart / 10) % 10;
  72.     buf[2] = (IntegerPart / 100) % 10;
  73.     buf[3] = (IntegerPart / 1000) % 10;
  74.     for(i = 3; i >= 1; i --) //整數高位0轉換為空
  75.     {
  76.         if(buf[i] == 0)
  77.         {
  78.             LedBuff[i + 2] = 0XFF;
  79.         }
  80.         else break;
  81.     }
  82.     for( ; i >= 0; i --)    //整數轉換
  83.     {
  84.         LedBuff[i + 2] = smgduan[buf[i]];
  85.     }
  86.     LedBuff[2] &= 0X80;     //小數點
  87. }
  88. void StopwatchAction()//秒表的啟動與暫停
  89. {
  90.     if (StopwatchRunning)    //已啟動則停止
  91.         StopwatchRunning = 0;
  92.     else                     //未啟動則啟動
  93.         StopwatchRunning = 1;
  94. }
  95. void StopwatchReset()//秒表復位
  96. {
  97.     StopwatchRunning = 0;
  98.     DecimalPart = 0;
  99.     IntegerPart = 0;
  100.     StopwatchRefresh = 1;
  101. }
  102. void KeyDriver()//檢測按鍵,執行指令(主函數中調用)
  103. {
  104.     u8 i;
  105.     static u8 backup[4] = {1, 1, 1 , 1};//鍵值對比樣本   

  106.     for(i = 0; i < 4; i ++)
  107.     {
  108.         if(backup[i] != KeySt[i])
  109.         {
  110.             if(backup[i] != 0)
  111.             {
  112.                 if(i == 1)
  113.                 {
  114.                     StopwatchReset();
  115.                 }
  116.                 else if(i == 2)
  117.                 {
  118.                     StopwatchAction();
  119.                 }
  120.             }
  121.             backup[i] = KeySt[i];    //刷新備份,作為下次判定樣本   
  122.         }
  123.     }
  124. }
  125. void KeyScan()//按鍵掃描,定時中斷調用
  126. {
  127.     u8 i;
  128.     static u8 keybuf[4]    = {
  129.         0xFF, 0xFF, 0xFF, 0xFF
  130.     };
  131.     keybuf[0] = (keybuf[0] << 1) | key1;  //鍵值輸入
  132.     keybuf[1] = (keybuf[1] << 1) | key2;
  133.     keybuf[2] = (keybuf[2] << 1) | key3;
  134.     keybuf[3] = (keybuf[3] << 1) | key4;

  135.     for(i = 0; i < 4; i ++)
  136.     {
  137.         if(keybuf[i] == 0X00)
  138.         {
  139.             KeySt[i] = 0;
  140.         }
  141.         else if(keybuf == 0XFF)
  142.         {
  143.             KeySt[i] = 1;
  144.         }
  145.     }

  146. }
  147. void LedScan()//數碼管掃描,定時中斷調用
  148. {
  149.     static u8 i = 0;

  150.     number = 0X00;
  151.     //LS = (LS & 0XE3) | (i << 2);
  152.     for(i = 0;i < 5;i++)
  153.     {
  154.         switch(i)     //位選,選擇點亮的數碼管,
  155.         {
  156.             case(0):
  157.                 LSA=0;LSB=0;LSC=0; break;//顯示第0位
  158.             case(1):
  159.                 LSA=1;LSB=0;LSC=0; break;//顯示第1位
  160.             case(2):
  161.                 LSA=0;LSB=1;LSC=0; break;//顯示第2位
  162.             case(3):
  163.                 LSA=1;LSB=1;LSC=0; break;//顯示第3位
  164.             case(4):
  165.                 LSA=0;LSB=0;LSC=1; break;//顯示第4位
  166.             case(5):
  167.                 LSA=1;LSB=0;LSC=1; break;//顯示第5位
  168.             case(6):
  169.                 LSA=0;LSB=1;LSC=1; break;//顯示第6位
  170.             case(7):
  171.                 LSA=1;LSB=1;LSC=1; break;//顯示第7位   
  172.         }
  173.     }
  174.     P0 = LedBuff[i];
  175.     //if(i < 5) i ++;
  176.     //else i = 0;

  177. }
  178. void StopwatchCount()//秒數統計
  179. {
  180.     if(StopwatchRunning)
  181.     {
  182.         DecimalPart ++;
  183.         if(DecimalPart >= 100)
  184.         {
  185.             DecimalPart = 0;
  186.             IntegerPart ++;
  187.             if(IntegerPart > 10000)
  188.             {
  189.                 IntegerPart = 0;
  190.             }   
  191.         }
  192.         StopwatchRefresh = 1;  //提醒刷新
  193.     }
  194. }
  195. void InterruptTimer0() interrupt 1 //中斷函數
  196. {
  197.     static u8 tmr10ms = 0;
  198.    
  199.     TH0 = T0RH;
  200.     TL0 = T0RL;
  201.     LedScan();
  202.     KeyScan();
  203.     tmr10ms ++;
  204.     if(tmr10ms >= 5) //10ms記一次數
  205.     {
  206.         tmr10ms = 0;
  207.         StopwatchCount();
  208.     }   
  209. }
復制代碼


回復

使用道具 舉報

ID:164602 發表于 2019-1-2 08:23 | 顯示全部樓層
一點看法吧——程序我還沒有讀通
第一:你照片上的右四位數碼管的點亮的問題,不是什么數組初始化問題,是消隱問題
            case(7):
                LSA=1;LSB=1;LSC=1; break;//顯示第7位   
        }
    }
    P0 = LedBuff[i];
                j=10;                                                 //掃描間隔時間設定
                while(j--);       
                P0=0x00;//消隱
我在你的顯示函數中加點東西,就不亮了,就只有最左的數碼管是亮的。
第二:看你的程序結構(雖然沒全部讀通),但你的顯示和按鍵函數都放在中斷里,是很不好的——一是讓你的定時很不準確,二是顯示和按鍵在不中斷時不能執行——我有你同樣的板子,按鍵根本沒用,長按都不行,具體原因還沒找到,但這個結構很不好,其實就是編程思路問題。
我這里有別人的一個程序,給你看看,功能是完整的哦——一鍵秒表

//上電待令,按鍵k3計時開始,再按計時停止,再按清0,再按開始,周而復始。
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;//連接譯碼器,選擇點亮的數碼管
sbit k3=P3^2;//外部中斷按鍵
uchar code table[]={
        0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
        0x39,0x5e,0x79,0x71};
uchar Cntus=0,Cnt100ms,Cnt1s=0;//中斷計時變量
bit zantin=0;                                        //暫停標志


/***********定時器初始化程序****************/
void Timer0Init(void)                //2500微秒@12.000MHz
{
        TMOD= 0x01;                //設置定時器模式
        TL0 = 0x3C;                //設置定時初值
        TH0 = 0xF6;                //設置定時初值
        TF0 = 0;                //清除TF0標志
        TR0 = 1;                //定時器0開始計時
        EA=1;                        //開總中斷
        ET0=1;                //開定時器0中斷
}
/***********按鍵掃描程序****************/
void keyscan()        
{
        static uint count2=0,count1=0;        //計數變量                        
        static bit key_sign=0;                                //按鍵狀態標志
        if(k3==0)                                //檢測輸入如果為0
        {
                count1++;                                        //計數延時消抖
                if((count1>=500)&&(key_sign==0))//檢測按鍵如果為0
                {                        
                        key_sign=1;                //按鍵狀態標志置1,防止重復響應
                        count2++;
                        if(count2>=3)
                                count2=0;
                        switch(count2)
                        {
                                case 0:        Cntus=0;
                                                Cnt100ms=0;
                                                Cnt1s=0;        break;//清0
                                case 1:        zantin=1;   break;//計時
                                case 2:        zantin=0;        break;//暫停
                        }               
                }
        }
        else
        {
                count1=0;                                //計數變量清0
                key_sign=0;                                //按鍵狀態標志清0
        }
}
void display()//顯示程序
{
        static uchar  i=0;
        P0=0x00;//消隱
        switch(i)
        {
                case(0):
                LSA=0;LSB=1;LSC=1;P0=table[Cnt1s/10];i++; break;//顯示第5位
                case(1):
                LSA=1;LSB=0;LSC=1;P0=table[Cnt1s%10]|0x80;i++; break;//顯示第6位
                case(2):
                LSA=0;LSB=0;LSC=1;P0=table[Cnt100ms];i=0; break;//顯示第7位
        }
}
/***************主程序****************/
void main()
{
        Timer0Init();                                //定時器初始化
        while(1)
        {
                keyscan();                                //按鍵掃描
        }
}
/**************中斷服務程序*****************/
void timer0() interrupt        1//2500微秒@11.0592MHz
{
        TL0 = 0x00;                //設置定時初值
        TH0 = 0xF7;                //設置定時初值
        Cntus++;                                        //中斷變量Cntus自+1
        if(Cntus>=40)                                //10ms
        {
                Cntus=0;                                //清0
                if(zantin==1)                        //暫停/啟動
                        Cnt100ms++;                        //毫秒計數
                if(Cnt100ms>=10)
                {
                        Cnt100ms=0;
                        Cnt1s++;                                //秒計數
                        if(Cnt1s>=60)
                                Cnt1s=0;
                }
        }
        display();                                        //顯示程序
}
回復

使用道具 舉報

ID:419421 發表于 2019-1-3 21:19 | 顯示全部樓層
HC6800-ES-V2.0 發表于 2019-1-2 08:23
一點看法吧——程序我還沒有讀通
第一:你照片上的右四位數碼管的點亮的問題,不是什么數組初始化問題,是 ...

我把程序改了下,可是按鍵時只有第一次按下有作用,有時復位鍵有作用,我懷疑是按鍵消抖作用需要時間太長,和掃描形成了時間差,您覺得是不是有這樣的可能。普中的板子是會在長按按鍵一段時間后自動取消置高電平的嗎?
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. typedef unsigned char u8;
  4. typedef unsigned int u16;
  5. typedef unsigned long u32;

  6. sbit LS = P2;        //38譯碼器引腳編號,選擇數碼管
  7. sbit number = P0;    //發送轉換表(段碼)
  8. sbit key1 = P3^1;    //復位
  9. sbit key2 = P3^0;    //開始/暫停
  10. sbit key3 = P3^2;    //
  11. sbit key4 = P3^3;    //

  12. u8 code smgduan[17] = {
  13.     0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
  14.     0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
  15.     };//數碼管轉換表

  16. u8 LedBuff[8] = {
  17.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  18.     } ;//數碼管緩沖區
  19. u8 KeySt[4] = {
  20.     1, 1, 1, 1
  21.     };//按鍵電平狀態儲存區

  22. bit StopwatchRunning = 0;    //秒表是否運行(確定是否暫停)
  23. bit StopwatchRefresh = 1;    //秒表是否要刷新
  24. u8    mseconds = 0;        //計數毫秒部分
  25. u8    seconds = 0;         //計數秒部分
  26. u8          minutes = 0;                   //計數分鐘部分
  27. u8    T0RH = 0;                //T0重裝高位
  28. u8    T0RL = 0;                //T0重裝低位
  29. void ConfigTimer0(u16 ms); //配置定時器
  30. void StopwatchDisplay(); //顯示函數(數字分割顯示)
  31. void KeyDriver(); //檢測按鍵,執行指令(主函數中調用)
  32. void LedScan();
  33. void KeyScan();
  34. void main()
  35. {
  36.     EA = 1;    //打開總中斷
  37.     ConfigTimer0(2);    //定時器2ms

  38.     while(1)
  39.     {
  40.         if(StopwatchRefresh)   //是否更新數碼管顯示
  41.         {
  42.             StopwatchRefresh = 0;
  43.             StopwatchDisplay();
  44.         }
  45.                 LedScan();
  46.                 KeyScan();
  47.         KeyDriver();    //調用按鍵驅動
  48.     }
  49. }
  50. /*函數部分*/
  51. void ConfigTimer0(u16 ms)//配置定時器
  52. {
  53.     u32 tmp;
  54.    
  55.     tmp = 11059260 / 12;
  56.     tmp = (tmp * ms) / 1000;
  57.     tmp = 65536 - tmp;
  58.     tmp += 18;                 //時間補償
  59.     T0RH = (u8)(tmp >> 8);
  60.     T0RL = (u8)tmp;
  61.     TMOD &= 0XF0;    //僅改變后四位(置零)
  62.     TMOD |= 0X01;
  63.     TH0 = T0RH;
  64.     TL0 = T0RL;
  65.     ET0 = 1;
  66.     TR0 = 1;        
  67. }
  68. void StopwatchDisplay()//顯示函數(數字分割顯示)
  69. {
  70.     signed char i;
  71.     u8 buf[2]; u8 minbuf[2];   

  72.     LedBuff[0] = smgduan[mseconds % 10];     //毫秒轉換
  73.     LedBuff[1] = smgduan[mseconds / 10];
  74.     buf[1] = seconds % 10;
  75.     buf[2] = (seconds / 10) % 10;
  76.     minbuf[1] = (minutes) % 10;
  77.     minbuf[2] = (minutes / 10) % 10;
  78.     for(i = 1; i < 3; i ++) //秒位數字轉換0
  79.     {
  80.         if(buf[i] == 0)
  81.         {
  82.             LedBuff[i + 2] = 0X00;
  83.         }
  84.         else break;
  85.     }
  86.         for(i = 1; i < 3; i ++) //分位數字轉換0
  87.         {
  88.                 if(minbuf[i] == 0)
  89.         {
  90.             LedBuff[i + 5] = 0X00;
  91.         }
  92.         else break;       
  93.         }
  94.     for(i = 1 ; i < 3; i ++)    //秒和分位數字轉換
  95.     {
  96.         LedBuff[i + 2] = smgduan[buf[i]];
  97.                 LedBuff[i + 5] = smgduan[minbuf[i]];       
  98.     }
  99.     LedBuff[2] = 0X40;     //"-"符號顯示
  100.         LedBuff[5] = 0x40;
  101. }
  102. void StopwatchAction()//秒表的啟動與暫停
  103. {
  104.     if (StopwatchRunning)    //已啟動則停止
  105.         StopwatchRunning = 0;
  106.     else                     //未啟動則啟動
  107.         StopwatchRunning = 1;
  108. }
  109. void StopwatchReset()//秒表復位
  110. {
  111.     StopwatchRunning = 0;
  112.     mseconds = 0;
  113.     seconds = 0;
  114.         minutes = 0;
  115.     StopwatchRefresh = 1;
  116. }
  117. void KeyDriver()//檢測按鍵,執行指令(主函數中調用)
  118. {
  119.     static u8 i;
  120.     static u8 backup[4] = {1, 1, 1 , 1};//鍵值對比樣本   

  121.     for(i = 0; i < 4; i ++)
  122.     {
  123.         if(backup[i] != KeySt[i])
  124.         {
  125.             if(backup[i] != 0)
  126.             {
  127.                 if(i == 0)
  128.                 {
  129.                     StopwatchReset();        //重置
  130.                 }
  131.                 else if(i == 1)
  132.                 {
  133.                     StopwatchAction();        //開始/暫停
  134.                 }
  135.             }
  136.             else if(i == 1)
  137.             {
  138.                 StopwatchAction();        //開始/暫停
  139.             }
  140.                         backup[i] = KeySt[i];    //刷新備份,作為下次判定樣本   
  141.         }
  142.     }
  143. }
  144. void KeyScan()//按鍵掃描
  145. {
  146.         u8  i = 0;
  147.     static u8 keybuf[4]    = {
  148.         0xFF, 0xFF, 0xFF, 0xFF
  149.     };
  150.         keybuf[0] = (keybuf[0] << 1) | key1;  //鍵值輸入,8次分位輸入,消抖
  151.     keybuf[1] = (keybuf[1] << 1) | key2;
  152.     keybuf[2] = (keybuf[2] << 1) | key3;
  153.     keybuf[3] = (keybuf[3] << 1) | key4;

  154.     for(i = 0; i < 4; i ++)
  155.     {
  156.         if(keybuf[i] == 0X00)
  157.         {
  158.             KeySt[i] = 0;
  159.         }
  160.         else if(keybuf == 0XFF)
  161.         {
  162.             KeySt[i] = 1;
  163.         }
  164.     }
  165. }
  166. void LedScan()//數碼管掃描
  167. {
  168.     u8 i = 0;
  169.         for( ; i < 8; i ++)
  170.     {
  171.                 P2 = (P2 & 0XE3) | (i << 2);
  172.                 P0 = LedBuff[i];
  173.                 _nop_();                                        //延時兩個機器周期
  174.                 _nop_();
  175.                 P0 = 0x00;
  176.         }
  177. }
  178. void StopwatchCount()//秒數統計
  179. {
  180.     if(StopwatchRunning)
  181.     {
  182.         mseconds ++;
  183.         if(mseconds >= 100)
  184.         {
  185.             mseconds = 0;
  186.             seconds ++;
  187.             if(seconds >= 60)
  188.             {
  189.                 seconds = 0;
  190.                                 minutes ++;
  191.             }
  192.                         if(minutes >= 60)
  193.                         {
  194.                                         minutes = 0;
  195.                         }   
  196.         }
  197.         StopwatchRefresh = 1;  //提醒刷新
  198.     }
  199. }
  200. void InterruptTimer0() interrupt 1 //中斷函數
  201. {
  202.     static u8 tmr10ms = 0;
  203.    
  204.     TH0 = T0RH;
  205.     TL0 = T0RL;
  206.     tmr10ms ++;
  207.     if(tmr10ms >= 5) //10ms記一次數
  208.     {
  209.         tmr10ms = 0;
  210.         StopwatchCount();
  211.     }   
  212. }
復制代碼
回復

使用道具 舉報

ID:419421 發表于 2019-1-3 21:27 | 顯示全部樓層
HC6800-ES-V2.0 發表于 2019-1-2 08:23
一點看法吧——程序我還沒有讀通
第一:你照片上的右四位數碼管的點亮的問題,不是什么數組初始化問題,是 ...

而且復位之后無法重新啟動,求幫助
回復

使用道具 舉報

ID:213173 發表于 2019-1-4 11:21 | 顯示全部樓層
凜夏寒煙 發表于 2019-1-3 21:27
而且復位之后無法重新啟動,求幫助

給你改寫成單鍵操作8位24小時百分秒表,有詳細注釋,應該能看得懂,經仿真無誤。

#include <AT89X52.H>

#define number P0
#define wela P2
typedef unsigned int u16 ;
typedef unsigned char u8 ;

sbit key1=P3^0;
//sbit key2=P3^1;
//sbit wela_A=P2^2;       
//sbit wela_B=P2^3;       
//sbit wela_C=P2^4;       

u8 code smgduan[16] = {
    0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
    0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
    };//數碼管轉換表

u8 LedBuff[8];//數碼管緩沖區

u8 Cntus=0,Cnt10ms=0,Cnt1s=0,Cnt1min=0,Cnthour=0;                //中斷計時變量

bit suspend=0;                                        //暫停標志
void LedScan();                                        //顯示程序聲明
void keyscan();                                        //按鍵掃描程序聲明

/***********按鍵掃描程序****************/
void keyscan()       
{
        static u8 count2=0,count1=0;        //計數變量                       
        static bit key_sign=0;                                        //按鍵狀態標志
        if(key1==0)                                //檢測輸入如果為0
        {
                count1++;                                        //計數延時消抖
                if((count1>=100)&&(key_sign==0))//檢測按鍵如果為0
                {                       
                        key_sign=1;                //按鍵狀態標志置1,防止重復響應
                        count2++;
                        if(count2>=3)
                                count2=0;
                        switch(count2)
                        {
                                case 0:        Cntus=0;
                                                        Cnt10ms=0;
                                                        Cnt1s=0;
                                                        Cnt1min=0;
                                                        Cnthour=0;        break;//清0
                                case 1:        suspend=1;  break;//計時
                                case 2:        suspend=0;        break;//暫停
                        }               
                }
        }
        else
        {
                count1=0;                                //計數變量清0
                key_sign=0;                                //按鍵狀態標志清0
        }
}

/***********定時器初始化程序****************/
void Timer0Init()        //2500微秒@11.0592MHz
{
        TMOD = 0x01;        //設置定時器模式
        TL0 = 0x00;                //設置定時初值
        TH0 = 0xF7;                //設置定時初值
        TF0 = 0;                        //清除TF0標志
        TR0 = 1;                        //定時器0開始計時
        EA=1;                                //開總中斷
        ET0=1;                        //開定時器0中斷
}
void StopwatchDisplay()//數字分解
{
        LedBuff[0]=Cnthour/10;
        LedBuff[1]=Cnthour%10;
        LedBuff[2]=Cnt1min/10;
        LedBuff[3]=Cnt1min%10;
        LedBuff[4]=Cnt1s/10;
        LedBuff[5]=Cnt1s%10;
        LedBuff[6]=Cnt10ms/10;
        LedBuff[7]=Cnt10ms%10;
}

/***************主程序****************/
void main()
{
        Timer0Init();                                //定時器初始化
        while(1)
        {
                keyscan();                                //按鍵掃描
                StopwatchDisplay();
        }
}
/**************中斷服務程序*****************/
void timer0() interrupt        1//2500微秒@11.0592MHz
{
        TL0 = 0x00;                                        //設置定時初值
        TH0 = 0xF7;                                        //設置定時初值
        Cntus++;                                                //中斷變量Cntus自+1
        if(Cntus>=4)                                //10ms
        {
                Cntus=0;                                        //清0
                if(suspend==1)                        //暫停/啟動
                        Cnt10ms++;                        //毫秒計數
                if(Cnt10ms>=100)
                {
                        Cnt10ms=0;
                        Cnt1s++;                                //秒計數
                        if(Cnt1s>=60)
                        {
                                Cnt1s=0;
                                Cnt1min++;                //分計數
                                if(Cnt1min>=60)
                                {
                                        Cnt1min=0;
                                        Cnthour++;        //時計數
                                        if(Cnthour>=24)
                                                Cnthour=0;
                                }
                        }
                }
        }
        LedScan();                                        //顯示程序
}
void LedScan()//顯示程序
{
        static u8 i=0;        //計數變量
        number=0x00;        //消隱
        wela=i<<2;                 //送位碼
        if((i%2==1)&&(i!=7))//送段碼
                number=smgduan[LedBuff]|0x80;//加點
        else         number=smgduan[LedBuff];
        if(++i>=8)
                i=0;
/*
        switch(i)
        {
                case 0: wela=i<<2; number=smgduan[LedBuff[0]];i++;break;
                case 1: wela=i<<2; number=smgduan[LedBuff[0]]|0x80;i++;break;
                case 2: wela=i<<2; number=smgduan[Cnt1min/10];it++;break;
                case 3: wela=i<<2; number=smgduan[Cnt1min%10]|0x80;i++;break;
                case 4: wela=i<<2; number=smgduan[Cnt1s/10];i++;break;                               
                case 5: wela=i<<2; number=smgduan[Cnt1s%10]|0x80;i++;break;                               
                case 6: wela=i<<2; number=smgduan[Cnt10ms/10];i++;break;       
                case 7: wela=i<<2; number=smgduan[Cnt10ms%10];i=0;break;       
        }*/
}
回復

使用道具 舉報

ID:419421 發表于 2019-1-4 12:01 | 顯示全部樓層
wulin 發表于 2019-1-4 11:21
給你改寫成單鍵操作8位24小時百分秒表,有詳細注釋,應該能看得懂,經仿真無誤。

#include

多謝多謝
回復

使用道具 舉報

ID:213173 發表于 2019-1-4 13:16 | 顯示全部樓層

根據電路圖J21跳線帽要接在VCC與LE,否則74HC573打不開,段碼送不了。 無標題.jpg

無標題1.jpg

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品视频导航 | 亚洲精品久久久久中文字幕二区 | 亚洲乱码国产乱码精品精98午夜 | 欧美一区在线看 | 国产精品久久久久久久久久久久久 | 欧美日韩在线免费观看 | 一区二区不卡 | 亚洲精品美女视频 | 亚洲欧洲色视频 | wwwxx在线观看 | 午夜影视 | 黄在线免费观看 | 久草免费在线 | www.日韩av.com | 亚洲人在线观看视频 | 亚洲黄色av | 欧美日韩精品专区 | 国产精品一区一区三区 | 久久男人 | 噜啊噜在线 | 99久久久国产精品免费消防器 | 五月激情久久 | 在线中文字幕亚洲 | 日韩免费福利视频 | 一区二区三区四区五区在线视频 | 黄视频网站在线 | 免费一级黄色录像 | 一区二区三区高清在线观看 | 久久精品国产久精国产 | 日韩成人高清在线 | 日本三级网站在线观看 | 色综合99| 爱爱爱av| 国产欧美一区二区三区日本久久久 | 天堂网av在线 | 国产成人综合在线 | 久久av一区二区三区 | 久久这里只有精品首页 | 福利一区在线观看 | 免费观看色 | 你懂的免费在线 |