欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 單片機(jī)秒表程序顯示問(wèn)題 [打印本頁(yè)]

作者: Irvingzong    時(shí)間: 2020-7-13 21:19
標(biāo)題: 單片機(jī)秒表程序顯示問(wèn)題
程序要求按 A 鍵再按 B 鍵后,顯示兩鍵按下之間的時(shí)間 t(t <60s),單位為 ms。時(shí)間 t 用五位十進(jìn)制整數(shù)顯示,由一位數(shù)碼管從最高位開(kāi)始逐位顯示一遍。可是我的程序在按鍵之后顯示的數(shù)字好像和時(shí)間不對(duì)應(yīng),請(qǐng)問(wèn)大佬們這是哪里出錯(cuò)了?另外還要求轉(zhuǎn)成BCD碼后譯碼顯示輸出,這個(gè)應(yīng)該怎么改?
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uint m=0;
sbit A1=P3^4;
sbit A2=P3^5;
uint count,t;
uchar d,e,f;
uchar code table[]={0x14,0xde,0x38,0x1a,0xd2,0x13,0x11,0x9e,0x10,0x12};
uchar code cnt[]={10000,1000,100,10,1};
void delay(void)   //誤差 0us
{
    unsigned char a,b,c;
    for(c=67;c>0;c--)
        for(b=124;b>0;b--)
            for(a=167;a>0;a--);
}

void start()
{
        TMOD=0x01; //T0 使用工作方式 1
        TH0=(65536-1000)/256; //1ms 定時(shí)
        TL0=(65536-1000)%256;
        EA=1;
        ET0=1;
        TR0=0;
}
void time0(void) interrupt 1 //T0 中斷服務(wù)子程序
{
        TH0=(65536-1000)/256;
        TL0=(65536-1000)%256;
        count++;
        if(count>=1)
        {count=0;
         t++;
         if(t>=60000)
         {t=0;}
        }
}


void display(uint t)  //顯示子程序,從第一位開(kāi)始逐位顯示
{
         uint k=0,v;
         for(;k<5;k++)
         {
                 v=t/cnt[k]%10 ;
                 P0=table[v];
                delay();
            {for(f=23;f>0;f--)
                for(e=152;e>0;e--)
                    for(d=70;d>0;d--)
                                P0=0xFF;
                }
         }

}
void main(void)
{        start();
while(1)
{
        P0=0xb7;
        P3=0x30;
        if(P3!=0x30)
        {if(A1==0)                          //按鍵掃描
                {TR0=1;}
         if(A2==0)
                 {
                        TR0=0;
                        while(!A2);
                        while(P3==0x30)
                        {
                                display(t);
                        }
                }
        
        }               
}
}

捕獲.PNG (103.72 KB, 下載次數(shù): 138)

捕獲.PNG

圖片.png (36.73 KB, 下載次數(shù): 139)

圖片.png

作者: wulin    時(shí)間: 2020-7-13 21:19
完全下圖做時(shí)間電路和程序,共陽(yáng)數(shù)碼管,可以實(shí)現(xiàn)樓主想要的功能。 A、B 鍵互鎖,不需要消抖,用閃爍表示換顯示位,否則相鄰數(shù)字相同無(wú)法分辨。小數(shù)點(diǎn)前為妙,小數(shù)點(diǎn)后為毫秒。


  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit A1=P3^4;
  5. sbit A2=P3^5;
  6. uint m=0;
  7. uint count,t;
  8. uchar code table[]={//共陽(yáng)數(shù)碼管"0~f .-"
  9.         0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
  10.         0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0x7f};
  11. uchar cnt[6]={0xc0,0xc0,0xc0,0xc0,0xc0,0xc0};//小數(shù)緩存
  12. bit flag=0;
  13. bit sign=0;
  14. bit init=0;

  15. void start()
  16. {
  17.         TMOD=0x01; //T0 使用工作方式 1
  18.         TH0=(65536-1000)/256; //1ms 定時(shí)
  19.         TL0=(65536-1000)%256;
  20.         EA=1;
  21.         ET0=1;
  22.         TR0=1;
  23. }

  24. void display()  //顯示子程序,從第一位開(kāi)始逐位顯示't 00秒 000毫秒'
  25. {
  26.         static uint j=0;
  27.         if(sign)
  28.                 P0=0xbf;//等待計(jì)數(shù)時(shí)顯示'-'
  29.         else
  30.         {       
  31.                 if(j<=900)
  32.                         P0=cnt[m];
  33.                 else if(init==1)
  34.                         P0=0xff;//閃爍表示換位顯示
  35.                 j++;
  36.                 if(j>=1000)
  37.                 {
  38.                         j=0;
  39.                         m++;
  40.                         m%=6;
  41.                 }
  42.         }
  43. }
  44. void main(void)
  45. {
  46.         start();
  47.         P0=0xc0;//初始顯示0
  48.         while(1)
  49.         {
  50.                 if(A1==0 && flag==0) //按鍵掃描
  51.                 {
  52.                         flag=1;
  53.                         count=0;                               
  54.                         t=0;
  55.                         sign=1;
  56.                         init=1;
  57.                 }
  58.                 if(A2==0 && flag==1)
  59.                 {
  60.                         sign=0;
  61.                         flag=0;
  62.                         cnt[0]=0x87;
  63.                         cnt[1]=table[t/10];
  64.                         cnt[2]=table[t%10]&0x7f;//加秒點(diǎn)
  65.                         cnt[3]=table[count/100];
  66.                         cnt[4]=table[count/10%10];
  67.                         cnt[5]=table[count%10];
  68.                         m=0;
  69.                 }
  70.         }
  71. }

  72. void time0(void) interrupt 1 //T0 中斷服務(wù)子程序
  73. {
  74.         TH0=(65536-1000)/256;
  75.         TL0=(65536-1000)%256;
  76.         if(sign)
  77.         {
  78.                 count++;
  79.                 if(count>=1000)
  80.                 {
  81.                         count=0;
  82.                         t++;
  83.                         if(t>=60)
  84.                         {
  85.                                 t=0;
  86.                         }
  87.                 }
  88.         }
  89.         display();
  90. }
復(fù)制代碼




作者: 不要黑    時(shí)間: 2020-7-13 23:12
要不要把源文件發(fā)上來(lái)測(cè)試一下
作者: robinsonlin    時(shí)間: 2020-7-14 16:33
1,為什么要在沒(méi)有時(shí)間定標(biāo)的主循環(huán)中去控制定時(shí)器?  時(shí)鐘就一直讓它走,只去采集和記錄就好了嗎。 你亂控制主定時(shí)的TR0,  時(shí)間不亂才怪。
2,   count++;
        if(count>=1)
        {count=0;
         t++;
這段是干啥?     實(shí)在無(wú)法理解。
3,   8段數(shù)碼管輸出的不是BCD碼。是你那個(gè)table[]數(shù)組對(duì)應(yīng)的控制值,而且這個(gè)值分陰碼和陽(yáng)碼,根據(jù)你P0口的線序不同,這個(gè)控制值也會(huì)不同。(為什么要線序不同? 等你自己布線經(jīng)驗(yàn)多一點(diǎn)就明白了)  你這個(gè)顯示子程序,有點(diǎn)花。  不太容易懂的,也不利于你弄明白LED的顯示原理。想弄明白,還是找教程看吧,論壇上就有的。
作者: Irvingzong    時(shí)間: 2020-7-14 16:41
wulin 發(fā)表于 2020-7-14 12:31
完全下圖做時(shí)間電路和程序,共陽(yáng)數(shù)碼管,可以實(shí)現(xiàn)樓主想要的功能。 A、B 鍵互鎖,不需要消抖,用閃爍表示換 ...

感謝大佬!!另外框圖要求轉(zhuǎn)成BCD碼后譯碼顯示輸出,你這個(gè)顯示子程序是不是也算是符合呢?
作者: Irvingzong    時(shí)間: 2020-7-14 16:45
本帖最后由 Irvingzong 于 2020-7-14 16:48 編輯
robinsonlin 發(fā)表于 2020-7-14 16:33
1,為什么要在沒(méi)有時(shí)間定標(biāo)的主循環(huán)中去控制定時(shí)器?  時(shí)鐘就一直讓它走,只去采集和記錄就好了嗎。 你亂控 ...

噢噢好的,師傅要求轉(zhuǎn)成BCD碼后譯碼用十進(jìn)制顯示輸出,這個(gè)是怎么理解呢?我感覺(jué)沒(méi)有用到BCD碼呀
作者: wulin    時(shí)間: 2020-7-14 20:42
Irvingzong 發(fā)表于 2020-7-14 16:41
感謝大佬!!另外框圖要求轉(zhuǎn)成BCD碼后譯碼顯示輸出,你這個(gè)顯示子程序是不是也算是符合呢?

不同的顯示設(shè)備需要不同的驅(qū)動(dòng)碼,LED數(shù)碼管用的是16進(jìn)制筆段碼。如果非得轉(zhuǎn)成BCD碼后再轉(zhuǎn)成筆段碼就是自找麻煩了。不過(guò)樓主用一個(gè)數(shù)碼管顯示5位數(shù)也屬特殊用法,未見(jiàn)有在實(shí)際運(yùn)用中出現(xiàn)過(guò)。
作者: wulin    時(shí)間: 2020-7-14 21:17
Irvingzong 發(fā)表于 2020-7-14 16:41
感謝大佬!!另外框圖要求轉(zhuǎn)成BCD碼后譯碼顯示輸出,你這個(gè)顯示子程序是不是也算是符合呢?

改成5或6位數(shù)碼管顯示較為合理


  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit A1=P3^4;
  5. sbit A2=P3^5;
  6. uint m=0;
  7. uint count,t;
  8. uchar code table[]={//共陽(yáng)數(shù)碼管"0~f .-"
  9.         0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
  10.         0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0x7f};
  11. uchar cnt[6]={0x87,0xc0,0xc0,0xc0,0xc0,0xc0};//顯示緩存
  12. bit flag=0;//鍵態(tài)標(biāo)志
  13. bit sign=0;//計(jì)時(shí)啟動(dòng)標(biāo)志

  14. void start()
  15. {
  16.         TMOD=0x01; //T0 使用工作方式 1
  17.         TH0=(65536-1000)/256; //1ms 定時(shí)
  18.         TL0=(65536-1000)%256;
  19.         EA=1;
  20.         ET0=1;
  21.         TR0=1;
  22. }

  23. void display()  //顯示子程序,從第一位開(kāi)始逐位顯示't 00秒 000毫秒'
  24. {
  25.         P2&=0xc0;//位碼清0消隱
  26.         P0=cnt[m];//送段碼
  27.         P2|=0x01<<m;//送位碼
  28.         m++;
  29.         m%=6;
  30. }
  31. void main(void)
  32. {
  33.         start();
  34.         while(1)
  35.         {
  36.                 if(A1==0 && flag==0) //按鍵掃描
  37.                 {
  38.                         flag=1;
  39.                         count=0;                               
  40.                         t=0;
  41.                         sign=1;
  42.                 }
  43.                 if(A2==0 && flag==1)
  44.                 {
  45.                         flag=0;
  46.                         sign=0;
  47.                 }
  48.         }
  49. }

  50. void time0(void) interrupt 1 //T0 中斷服務(wù)子程序
  51. {
  52.         TH0=(65536-1000)/256;
  53.         TL0=(65536-1000)%256;
  54.         if(sign)
  55.         {
  56.                 count++;
  57.                 if(count>=1000)
  58.                 {
  59.                         count=0;
  60.                         t++;
  61.                         if(t>=60)
  62.                         {
  63.                                 t=0;
  64.                         }
  65.                 }
  66.         }
  67.         cnt[1]=table[t/10];
  68.         cnt[2]=table[t%10]&0x7f;//加秒點(diǎn)
  69.         cnt[3]=table[count/100];
  70.         cnt[4]=table[count/10%10];
  71.         cnt[5]=table[count%10];
  72.         display();
  73. }
復(fù)制代碼




作者: 梁廷明    時(shí)間: 2020-7-14 22:40
閃爍點(diǎn)可以用GP來(lái)制作,也可以用LED來(lái)閃爍,這就是基本的定時(shí)器應(yīng)用
作者: robinsonlin    時(shí)間: 2020-7-15 16:16
Irvingzong 發(fā)表于 2020-7-14 16:45
噢噢好的,師傅要求轉(zhuǎn)成BCD碼后譯碼用十進(jìn)制顯示輸出,這個(gè)是怎么理解呢?我感覺(jué)沒(méi)有用到BCD碼呀

轉(zhuǎn)BCD碼是軟件層面的要求,可能是用來(lái)直接匹配到哪個(gè)模塊,就可以直接驅(qū)動(dòng)LED8段數(shù)碼管了。  我跟你講的是硬件層面的做法,直接用單片機(jī)的端口加三極管來(lái)驅(qū)動(dòng)LED8段數(shù)碼管的方法。
作者: robinsonlin    時(shí)間: 2020-7-15 16:21
Irvingzong 發(fā)表于 2020-7-14 16:41
感謝大佬!!另外框圖要求轉(zhuǎn)成BCD碼后譯碼顯示輸出,你這個(gè)顯示子程序是不是也算是符合呢?

手把手教你學(xué)51單片機(jī)-C語(yǔ)言版 PDF電子書(shū)下載
http://m.raoushi.com/bbs/dpj-48477-1.html
(出處: 單片機(jī)論壇)
有C語(yǔ)言基礎(chǔ), 花3天時(shí)間看看就能弄明白了

作者: Irvingzong    時(shí)間: 2020-7-15 18:01
wulin 發(fā)表于 2020-7-14 21:17
改成5或6位數(shù)碼管顯示較為合理

謝謝,不過(guò)設(shè)計(jì)要求用一位數(shù)碼管,可是你第一個(gè)程序的display()函數(shù)我不是很能理解,能再解釋一下嗎
作者: Irvingzong    時(shí)間: 2020-7-16 10:23
robinsonlin 發(fā)表于 2020-7-15 16:21
手把手教你學(xué)51單片機(jī)-C語(yǔ)言版 PDF電子書(shū)下載
http://m.raoushi.com/bbs/dpj-48477-1.html
(出處: 單片 ...

大佬們幫我看下,設(shè)計(jì)框圖規(guī)定了顯示子程序,所以我把上面大佬的程序display()函數(shù)改了一下,可是運(yùn)行時(shí)數(shù)據(jù)又亂了,請(qǐng)問(wèn)是按照樓頂?shù)目驁D應(yīng)該怎么改?
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit A1=P3^4;
sbit A2=P3^5;
uint m=0;
uint count,t,d,e,f;
uchar code table[]={0x14,0xde,0x38,0x1a,0xd2,0x13,0x11,0x9e,0x10,0x12};
uchar cnt[6]={0};//小數(shù)緩存
bit flag=0;
bit init=0;

void delay(void)   //誤差 0us
{
    unsigned char a,b,c;
    for(c=67;c>0;c--)
        for(b=124;b>0;b--)
            for(a=167;a>0;a--);
}

void start()
{
        TMOD=0x01; //T0 使用工作方式 1
        TH0=(65536-1000)/256; //1ms 定時(shí)
        TL0=(65536-1000)%256;
        EA=1;
        ET0=1;
            TR0=1;
}

void display()  //顯示子程序,從第一位開(kāi)始逐位顯示't 00秒 000毫秒'
{
        uint j;
        if(flag)
                P0=0xbf;//等待計(jì)數(shù)時(shí)顯示'-'
        else
        {        
                                if(init==1)
                                for(j=5;j>=0;j--)
                                {P0=cnt[j];
                                delay();
                                }
        }
}
void main(void)
{
        start();
        P0=0xb7;//上電提示符
        while(1)
        {
                if(A1==0 && flag==0) //按鍵掃描
                {
                        flag=1;
                        count=0;                                
                        t=0;
                        init=1;                                               
                }
                if(A2==0 && flag==1)
                {
                                                while(!A2);
                        flag=0;
                        cnt[5]=0xbf;
                        cnt[4]=table[t/10];
                        cnt[3]=table[t%10];//加秒點(diǎn)
                        cnt[2]=table[count/100];
                        cnt[1]=table[count/10%10];
                        cnt[0]=table[count%10];
                        m=0;
                }
        }
}

void time0(void) interrupt 1 //T0 中斷服務(wù)子程序
{
        TH0=(65536-1000)/256;
        TL0=(65536-1000)%256;
        if(flag)
        {
                count++;
                if(count>=1000)
                {
                        count=0;
                        t++;
                        if(t>=60)
                        {
                                t=0;
                        }
                }
        }
        display();
}
作者: robinsonlin    時(shí)間: 2020-7-20 15:49
Irvingzong 發(fā)表于 2020-7-16 10:23
大佬們幫我看下,設(shè)計(jì)框圖規(guī)定了顯示子程序,所以我把上面大佬的程序display()函數(shù)改了一下,可是運(yùn)行時(shí) ...

樓上給你的display()函數(shù)是驅(qū)動(dòng)8段數(shù)碼管的程序, 而你的要求好像只是驅(qū)動(dòng)某個(gè)BCD值模塊的。 都不是一樣的目標(biāo)對(duì)象,你如何能改好。 我們做產(chǎn)品的,很少再用模塊去輔助驅(qū)動(dòng)8段數(shù)碼管的,關(guān)于BCD值的模塊,沒(méi)有研究過(guò),也沒(méi)有現(xiàn)成的環(huán)境做試驗(yàn),這里不好給你提供幫助。 但是,最終是驅(qū)動(dòng)8段數(shù)碼管,所以,以下程序備注很經(jīng)典,你仔細(xì)讀懂就會(huì)了。
void display()  //顯示子程序,從第一位開(kāi)始逐位顯示't 00秒 000毫秒'
{
        P2&=0xc0;//位碼清0消隱
        P0=cnt[m];//送段碼
        P2|=0x01<<m;//送位碼
        m++;
        m%=6;
}
步驟大概就是1,消隱; 2,送段碼; 3,送位碼; 4,改變循環(huán)值; 5,檢查限定最大循環(huán)值。
作者: robinsonlin    時(shí)間: 2020-7-20 16:03
剛剛又看了一下你自己改的程序。 看來(lái)你還是沒(méi)有深刻理解單片機(jī)工作方法,特別定時(shí)器這塊。 你的display()函數(shù)里面有 delay(),這個(gè)delay()是多長(zhǎng)時(shí)間?  定時(shí)器周期又是多久? 請(qǐng)仔細(xì)思考這個(gè)問(wèn)題!!!




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1