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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2415|回復: 7
收起左側

仿寫金沙灘的秒表程序。編譯通過,下載后數碼管一閃而過,萌新求助問題在哪?普中板子

[復制鏈接]
ID:695565 發表于 2020-3-8 21:57 | 顯示全部樓層 |閱讀模式
#include<reg52.h>

typedef unsigned char u8;
typedef unsigned int u16;
sbit KEY1=P3^1;
sbit KEY2=P3^0;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

unsigned char code LedChar[]={                        //數碼管顯示字符轉換表
        0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71       
};
unsigned char Ledbuff[6] = {                        //數碼管顯示緩沖區
        0x00,0x00,0x00,0x00,0x00,0x00
};
unsigned char KeySta[4]={                                //按鍵當前狀態
        1,1,1,1
};

u8 T0RH = 0;
u8 T0RL = 0;
bit StopwatchRefresh=1;                                           //秒表計數刷新標志
bit StopwatchRunning=0;                                    //秒表運行標志
u8 DecimalPart = 0;                                                //小數部分定義
u16 IntegerPart = 0;                                        //整數部分定義

void ConfigTimer0(u16 ms);
void KeyDriver();
void StopwatchDisplay();
void main(void)
{
        EA=1;
        ConfigTimer0(2);                                         //定時器周期函數
        while(1)
        {
                if(StopwatchRefresh)
                {
                        StopwatchRefresh=0;                        //秒表狀態位
                        StopwatchDisplay();                        //秒表顯示函數
                }
                KeyDriver();                                         //按鍵驅動函數
        }
}

void ConfigTimer0(u16 ms)
{
        unsigned long tmp;

        tmp=12000000/12;
        tmp=(tmp*ms)/1000;
        tmp=65536-tmp;
        T0RH=(u8)(tmp>>8);
        T0RL=(u8)tmp;
        TMOD&=0XF0;
        TMOD|=0X01;
        TH0=T0RH;
        TL0=T0RL;
        ET0=1;
        TR0=1;
}

void StopwatchDisplay()
{
        signed char i;
        u8 buf[4];                                                         //數據轉換的緩沖區

        //小數部分轉換到低2位
        Ledbuff[0] = LedChar[DecimalPart%10];
        Ledbuff[1] = LedChar[DecimalPart/10];
        //整數部分轉換到高4位
        buf[0] = IntegerPart%10;
        buf[1] = (IntegerPart/10)%10;
        buf[2] = (IntegerPart/100)%10;
        buf[3] = (IntegerPart/1000)%10;

        for(i=3;i>1;i--)                                           //整數部分高位的0 轉換為空字符
        {
                if(buf[i] == 0)
                {
                        Ledbuff[i+2] = 0xfe;
                }
                else
                        break;
        }
        for(;i>0;i--)                                                 //有效數字位轉換為顯示字符
        {
                Ledbuff[i+2] = LedChar[buf[i]];
        }
        Ledbuff[2] &= 0x7f;                                          //點亮小數點
}

/*秒表啟停函數*/
void StopwatchAction()
{
        if(StopwatchRunning)                                   //已啟動則停止
                StopwatchRunning = 0;
        else                                                                  //未啟動則啟動
                StopwatchRunning = 1;       
}

/* 秒表復位函數 */
void StopwatchReset()
{
        StopwatchRunning = 0;                                //停止秒表
        DecimalPart = 0;                                        //清零計數值
        IntegerPart = 0;
        StopwatchRefresh =1;                                //置刷新標志
}

/* 按鍵驅動函數,檢測按鍵動作,調度相應動作函數,需在主循環中調用 */
void KeyDriver()
{
        u8 i;
        static u8 backup[4] = {1,1,1,1};        //按鍵上一次的狀態

        for(i=0;i<4;i++)                                        //循環檢測4個按鍵
        {       
                if(backup[i]!= KeySta[i])                //按鍵狀態改變
                {
                        if(backup[i] != 0)                        //按鍵按下
                        {
                                if(i == 1)                                   //Key1鍵復位秒表
                                        StopwatchReset();
                                if( i== 2)                                   //Key2鍵啟停秒表
                                        StopwatchAction();       
                        }
                        backup[i] = KeySta[i];                 //刷新前一次的備份值
                }
        }               
}

/* 秒表計數函數,每隔10ms 調用一次進行秒表計數累加 */
void StopwatchCount()
{
        if(StopwatchRunning)                                  //當處于運行狀態時遞增計數值
        {
                DecimalPart++;                                           //小數部分+1
                if(DecimalPart >= 100)                          //小數部分計到100 時進位到整數部分
                {
                        DecimalPart = 0;
                        IntegerPart++;                                //整數部分+1
                        if(IntegerPart >= 10000)       
                        {
                                IntegerPart = 0;
                        }
                }
                StopwatchRefresh = 1;
        }
}

/* 數碼管動態掃描刷新函數,需在定時中斷中調用 */
void LedScan()
{
        static u8 i;
        P0=0X00;
        switch(i)
        {
                case 0:LSA=0;LSB=0;LSC=0;i++;P0=Ledbuff[0];break;
                case 1:LSA=1;LSB=0;LSC=0;i++;P0=Ledbuff[1];break;
                case 2:LSA=0;LSB=1;LSC=0;i++;P0=Ledbuff[2];break;
                case 3:LSA=1;LSB=1;LSC=0;i++;P0=Ledbuff[3];break;
                case 4:LSA=0;LSB=0;LSC=1;i++;P0=Ledbuff[4];break;
                case 5:LSA=1;LSB=0;LSC=1;i++;P0=Ledbuff[5];break;
                default:break;
        }
}

/* 按鍵掃描函數,需在定時中斷中調用 */
void KeyScan()
{
        u8 i;
        static u8 keybuf[4] = {                                //按鍵掃描初始化
        0xFF,0xFF,0xFF,0xFF
        };

         //按鍵值移入緩沖區
        keybuf[0] = (keybuf[0] << 1) | KEY1;
        keybuf[1] = (keybuf[1] << 1) | KEY2;
        keybuf[2] = (keybuf[2] << 1) | KEY3;
        keybuf[3] = (keybuf[3] << 1) | KEY4;
        //消抖后更新按鍵狀態
        for(i=0;i<4;i++)
        {
                if(keybuf[i] == 0x00)        //連續8次掃描為0,即16ms內都是彈起狀態,可認為按鍵已按下
                        KeySta[i]=0;
                else if(keybuf[i] == 0xFF) //連續8次掃描為1,即16ms內都是按下狀態,可認為按鍵已按下
                        KeySta[i]=1;       
        }       
}

/*中斷服務函數,完成數碼管,按鍵掃描與秒表計數*/
void Timer0() interrupt 1
{
        static unsigned char tmr10ms;
        TH0 = T0RH;
        TL0 = T0RL;
        LedScan();                                                        //數碼管顯示
        KeyScan();                                                        //按鍵掃描

        tmr10ms++;
        if(tmr10ms >= 5)
        {
                tmr10ms = 0;
                StopwatchCount();                                 //調用秒表計數函數
        }
}


A2開發板原理圖.pdf

281.54 KB, 下載次數: 4

回復

使用道具 舉報

ID:695565 發表于 2020-3-8 21:59 | 顯示全部樓層
附件是普中版本的,除了數碼管是共陰的,就沒其他大的區別了,實在不知道問題出在哪?
回復

使用道具 舉報

ID:524818 發表于 2020-3-10 16:34 | 顯示全部樓層
共陰和共陽數碼管數組值是不一樣的
回復

使用道具 舉報

ID:677076 發表于 2020-3-10 19:10 | 顯示全部樓層
51編程就是寫驅動。你要對照線路圖寫代碼。電路設計不一樣寫出來就不一樣,抄過來的有些地方改一改就可以了。主要是IO口位置及電平的高低。
回復

使用道具 舉報

ID:642838 發表于 2020-3-10 21:54 | 顯示全部樓層
改寫3處:
Ledbuff[i+2] = 0xfe;改成 Ledbuff[i+2] = 0x00;
Ledbuff[2] &= 0x7f; 改成Ledbuff[2] |= 0x80;
最重要的是switch(i)中的case 5后面的i++i++要改成i=0或者刪除switch語句
改成 P0 = 0x00;            
   P2 = (P2 & 0xE3) |( i*100);  
    P0 = LedBuff[i];            
     i++;
     i %= 6;簡潔多了
回復

使用道具 舉報

ID:213173 發表于 2020-3-10 22:01 | 顯示全部樓層
wangzhe212 發表于 2020-3-8 21:59
附件是普中版本的,除了數碼管是共陰的,就沒其他大的區別了,實在不知道問題出在哪?

秒表不用寫那么復雜,改簡單一些,發生問題也好查。
  1. #include <reg51.H>

  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. sbit key=P3^3;
  5. sbit LSA=P2^2;
  6. sbit LSB=P2^3;
  7. sbit LSC=P2^4;

  8. unsigned char code LedChar[]={                  //數碼管顯示字符轉換表
  9.         0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  10.         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71        
  11. };
  12. unsigned char Ledbuff[] = {                        //數碼管顯示緩沖區
  13.         0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00
  14. };
  15. uchar Cntus=0,Cnt10ms=0,Cnt1s=0,Cnt1min=0;//中斷計時變量

  16. bit  stop=0;                                                //停止標志
  17. void display();                                                //顯示程序聲明
  18. void keyscan();                                                //按鍵掃描程序聲明

  19. /***********定時器初始化程序****************/
  20. void Timer0Init(void)                                //2毫秒@12.000MHz
  21. {
  22.         TMOD |= 0x01;                                        //設置定時器模式
  23.         TL0 = 0x30;                                                //設置定時初值
  24.         TH0 = 0xF8;                                                //設置定時初值
  25.         TF0 = 0;                                                //清除TF0標志
  26.         TR0 = 1;                                                //定時器0開始計時
  27.         EA=1;                                                        //開總中斷
  28.         ET0=1;                                                        //開定時器0中斷
  29. }

  30. /***********按鍵掃描程序****************/
  31. void keyscan()       
  32. {
  33.         static uint num=0,count=0;                //計數變量                       
  34.         static bit key_sign=0;                        //按鍵自鎖標志
  35.         if(!key)                                                //檢測按鍵為0
  36.         {
  37.                 count++;                                        //計數延時消抖
  38.                 if((count>=100)&&(key_sign==0))//檢測按鍵如果為0
  39.                 {                       
  40.                         key_sign=1;                                //按鍵自鎖標志置1,防止重復響應
  41.                         num++;
  42.                         if(num>=3)
  43.                                 num=0;
  44.                         switch(num)
  45.                         {
  46.                                 case 0:        Cntus=0;Cnt10ms=0;Cnt1s=0;Cnt1min=0;break;//清0
  47.                                 case 1:        stop=1; break;//計時
  48.                                 case 2:        stop=0;        break;//停止
  49.                         }               
  50.                 }
  51.         }
  52.         else
  53.         {
  54.                 count=0;                                        //計數變量清0
  55.                 key_sign=0;                                        //按鍵自鎖標志清0
  56.         }
  57. }

  58. void StopwatchDisplay()
  59. {
  60.         Ledbuff[0]=LedChar[Cnt10ms%10];
  61.         Ledbuff[1]=LedChar[Cnt10ms/10];
  62.         Ledbuff[3]=LedChar[Cnt1s%10];
  63.         Ledbuff[4]=LedChar[Cnt1s/10];
  64.         Ledbuff[6]=LedChar[Cnt1min%10];
  65.         Ledbuff[7]=LedChar[Cnt1min/10];
  66. }

  67. void display()//顯示程序
  68. {
  69.         static uchar i=0;                        //計數變量
  70.         P0=0x00;                                                //消隱
  71.         switch(i)
  72.         {
  73.                 case 0:LSA=0;LSB=0;LSC=0;break;
  74.                 case 1:LSA=1;LSB=0;LSC=0;break;
  75.                 case 2:LSA=0;LSB=1;LSC=0;break;
  76.                 case 3:LSA=1;LSB=1;LSC=0;break;
  77.                 case 4:LSA=0;LSB=0;LSC=1;break;
  78.                 case 5:LSA=1;LSB=0;LSC=1;break;
  79.                 case 6:LSA=0;LSB=1;LSC=1;break;
  80.                 case 7:LSA=1;LSB=1;LSC=1;break;
  81.         }
  82.         P0=Ledbuff[i];
  83.         i++; i%=8;
  84. }

  85. /***************主程序****************/
  86. void main()
  87. {
  88.         Timer0Init();                                        //定時器初始化
  89.         while(1)
  90.         {
  91.                 keyscan();                                        //按鍵掃描
  92.                 StopwatchDisplay();
  93.                 display();                                        //顯示程序

  94.         }
  95. }
  96. /**************中斷服務程序*****************/
  97. void timer0() interrupt        1                //2毫秒
  98. {
  99.         TL0 = 0x30;                                                //設置定時初值
  100.         TH0 = 0xF8;                                                //設置定時初值
  101.         Cntus++;                                                        //中斷變量Cntus自+1
  102.         if(Cntus>=5)                                        //10ms
  103.         {
  104.                 Cntus=0;                                                //清0
  105.                 if(stop==1)                                        //啟動
  106.                         Cnt10ms++;                                //10毫秒計數
  107.                 if(Cnt10ms>=100)
  108.                 {
  109.                         Cnt10ms=0;
  110.                         Cnt1s++;                                        //秒計數
  111.                         if(Cnt1s>=60)
  112.                         {
  113.                                 Cnt1s=0;
  114.                                 Cnt1min++;                        //分計數
  115.                                 if(Cnt1min>=100)
  116.                                         Cnt1min=0;
  117.                         }
  118.                 }
  119.         }
  120. }
復制代碼
回復

使用道具 舉報

ID:642838 發表于 2020-3-10 23:19 | 顯示全部樓層
   文中還有2點錯誤:
for(i=3;i>1;i--)改成for(i=3;i>=1;i--)  
for(;i>0;i--) 改成for(;i>=0;i--)
加上上貼,一共改動5處
Ledbuff[i+2] = 0xfe;改成 Ledbuff[i+2] = 0x00;
Ledbuff[2] &= 0x7f; 改成Ledbuff[2] |= 0x80;
case 5:LSA=1;LSB=0;LSC=1;i++;P0=Ledbuff[5];break;改成case 5:LSA=1;LSB=0;LSC=1;i=0;P0=Ledbuff[5];break;
回復

使用道具 舉報

ID:695565 發表于 2020-3-24 00:40 來自觸屏版 | 顯示全部樓層
感謝各位的的指點,雖然我第二天找到了問題所在,但是還是給了我更好的思路
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久九九免费 | 国产精品国产三级国产aⅴ浪潮 | 免费在线观看黄色av | 范冰冰一级做a爰片久久毛片 | 日韩一级不卡 | 成人在线免费网站 | 美女福利视频一区 | 成人免费视频在线观看 | 超碰97干| www.国产精 | 金莲网| 日韩成人国产 | 精品伊人| 国产福利在线 | 91视频正在播放 | 中文字幕在线观看第一页 | 成人免费视屏 | 日本一道本视频 | 91国在线视频 | 91精品国产综合久久精品 | www.日本国产 | 一区二区三区观看视频 | 精品一区二区视频 | 免费午夜视频在线观看 | 亚洲国产欧美日韩 | 午夜精品久久久久久久久久久久久 | 欧美不卡在线 | 免费av手机在线观看 | 中文字幕亚洲精品 | 四虎最新地址 | 欧美日韩国产一区二区三区不卡 | 岛国精品 | 日韩精品视频在线观看一区二区三区 | 色播久久 | 在线免费观看毛片 | 高清国产一区二区 | 女人精96xxx免费网站p | 精品二区 | 久久成人免费 | 日本亚洲精品成人欧美一区 | 综合精品|