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

QQ登錄

只需一步,快速開始

搜索
查看: 200|回復(fù): 17
打印 上一主題 下一主題
收起左側(cè)

靜態(tài)數(shù)碼管0~10間隔一秒測(cè)試

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1150380 發(fā)表于 2025-5-13 18:36 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#include "reg52.h"


typedef unsigned char u8;
typedef unsigned int u16;

#define SMG_A_DP_PORT        P0//數(shù)碼管P0端口

u8 gsmg_code[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x6f,0x77,0x7c,
                                0x39,0x5e,0x79,0x71};//共陰0-F
u8 a=0;//給a賦值0
void ZD0_init(void)
{
          TMOD|=0X01;//選擇為定時(shí)器0模式,工作方式1
          TH0=0XFC;//給定時(shí)器賦初值,定時(shí)10ms
          TL0=0X18;
          ET0=1; //打開定時(shí)器0中斷
          EA=1;        //打開總中斷
          TR0=1;//打開定時(shí)器
}


void main()
{         

        ZD0_init();//定時(shí)器中斷0
       
        while(1)
        {
           switch(a)
                  {
                          case 0:        SMG_A_DP_PORT=~gsmg_code[0];break;
                        case 1:        SMG_A_DP_PORT=~gsmg_code[1];break;
                        case 2:        SMG_A_DP_PORT=~gsmg_code[2];break;
                        case 3:        SMG_A_DP_PORT=~gsmg_code[3];break;
                        case 4:        SMG_A_DP_PORT=~gsmg_code[4];break;
                        case 5:        SMG_A_DP_PORT=~gsmg_code[5];break;
                        case 6:        SMG_A_DP_PORT=~gsmg_code[6];break;
                        case 7:        SMG_A_DP_PORT=~gsmg_code[7];break;
                        case 8:        SMG_A_DP_PORT=~gsmg_code[8];break;
                        case 9:        SMG_A_DP_PORT=~gsmg_code[9];break;
                        case 10:SMG_A_DP_PORT=~gsmg_code[10];break;

                  }

        }
}
       
void ZD0() interrupt 1 //定時(shí)器0中斷函數(shù)
{
        static u16 i;//定義靜態(tài)變量
        TH0=0XFC;//給定時(shí)器賦初值,定時(shí)1ms
        TL0=0X18;
        i++;
        if(i==1000)
        {
                i=0;
           a++;
          
        }
        if(a==10)//a累加到10

        {
          a=0;//當(dāng)a累加到10時(shí),a就等于0
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:69038 發(fā)表于 2025-5-13 22:20 | 只看該作者
為什么要switch?直接 SMG_A_DP_PORT=~gsmg_code[a]不就行了?
為什么要 if(a==10)?直接a=a%11,不一樣能達(dá)到要求?
回復(fù)

使用道具 舉報(bào)

板凳
ID:1109793 發(fā)表于 2025-5-14 07:27 | 只看該作者
switch的確沒有必要。if還是可以有的。
回復(fù)

使用道具 舉報(bào)

地板
ID:744809 發(fā)表于 2025-5-14 10:18 | 只看該作者
zhuls 發(fā)表于 2025-5-13 22:20
為什么要switch?直接 SMG_A_DP_PORT=~gsmg_code[a]不就行了?
為什么要 if(a==10)?直接a=a%11,不一樣能達(dá) ...

取余的計(jì)算速度好像比等于慢很多
回復(fù)

使用道具 舉報(bào)

5#
ID:1150380 發(fā)表于 2025-5-14 10:24 | 只看該作者
xiaobendan001 發(fā)表于 2025-5-14 07:27
switch的確沒有必要。if還是可以有的。

多謝  我一個(gè)初學(xué)者 自己研究的
回復(fù)

使用道具 舉報(bào)

6#
ID:1150380 發(fā)表于 2025-5-14 10:25 | 只看該作者
zhuls 發(fā)表于 2025-5-13 22:20
為什么要switch?直接 SMG_A_DP_PORT=~gsmg_code[a]不就行了?
為什么要 if(a==10)?直接a=a%11,不一樣能達(dá) ...

多謝提醒  剛開始學(xué)
回復(fù)

使用道具 舉報(bào)

7#
ID:619259 發(fā)表于 2025-5-14 10:54 | 只看該作者
zhuls 發(fā)表于 2025-5-13 22:20
為什么要switch?直接 SMG_A_DP_PORT=~gsmg_code[a]不就行了?
為什么要 if(a==10)?直接a=a%11,不一樣能達(dá) ...

確定 "a=a%11" 可以滿足要求?
回復(fù)

使用道具 舉報(bào)

8#
ID:712493 發(fā)表于 2025-5-14 10:57 | 只看該作者
zhuls 發(fā)表于 2025-5-13 22:20
為什么要switch?直接 SMG_A_DP_PORT=~gsmg_code[a]不就行了?
為什么要 if(a==10)?直接a=a%11,不一樣能達(dá) ...

if(a==10)?直接a=a%11 這個(gè)怎么理解?
回復(fù)

使用道具 舉報(bào)

9#
ID:712493 發(fā)表于 2025-5-14 11:00 | 只看該作者
    case 10:SMG_A_DP_PORT=~gsmg_code[10];break;  你這程序這語句實(shí)際能被執(zhí)行?
回復(fù)

使用道具 舉報(bào)

10#
ID:326998 發(fā)表于 2025-5-14 11:40 | 只看該作者
zhuls 發(fā)表于 2025-5-13 22:20
為什么要switch?直接 SMG_A_DP_PORT=~gsmg_code[a]不就行了?
為什么要 if(a==10)?直接a=a%11,不一樣能達(dá) ...

if占4-5個(gè)周期,%占4+div周期,一個(gè)周期短,一個(gè)代碼簡(jiǎn)潔
回復(fù)

使用道具 舉報(bào)

11#
ID:712493 發(fā)表于 2025-5-14 13:53 | 只看該作者
gzhdssj 發(fā)表于 2025-5-14 11:40
if占4-5個(gè)周期,%占4+div周期,一個(gè)周期短,一個(gè)代碼簡(jiǎn)潔

代碼是簡(jiǎn)潔,但不相關(guān)理解困難
回復(fù)

使用道具 舉報(bào)

12#
ID:1109793 發(fā)表于 2025-5-14 16:40 | 只看該作者
fj51hei 發(fā)表于 2025-5-14 10:57
if(a==10)?直接a=a%11 這個(gè)怎么理解?

不是if(a==10)和a=a%10對(duì)等,而是if(a==10)a=0;和a=a%10基本上算對(duì)等。
實(shí)際上if里面是可以增加一些別的代碼的。取余操作顯然是不行的。
回復(fù)

使用道具 舉報(bào)

13#
ID:69038 發(fā)表于 2025-5-14 17:40 | 只看該作者
cy009 發(fā)表于 2025-5-14 10:54
確定 "a=a%11" 可以滿足要求?

嗯吶,,是錯(cuò)了
回復(fù)

使用道具 舉報(bào)

14#
ID:69038 發(fā)表于 2025-5-14 17:42 | 只看該作者
fj51hei 發(fā)表于 2025-5-14 10:57
if(a==10)?直接a=a%11 這個(gè)怎么理解?

數(shù)值錯(cuò)了,應(yīng)該是a=a%10
回復(fù)

使用道具 舉報(bào)

15#
ID:69038 發(fā)表于 2025-5-14 17:44 | 只看該作者
gzhdssj 發(fā)表于 2025-5-14 11:40
if占4-5個(gè)周期,%占4+div周期,一個(gè)周期短,一個(gè)代碼簡(jiǎn)潔

沒驗(yàn)證過,找時(shí)間驗(yàn)證一下
回復(fù)

使用道具 舉報(bào)

16#
ID:69038 發(fā)表于 2025-5-14 23:29 | 只看該作者
xiaobendan001 發(fā)表于 2025-5-14 16:40
不是if(a==10)和a=a%10對(duì)等,而是if(a==10)a=0;和a=a%10基本上算對(duì)等。
實(shí)際上if里面是可以增加一些別的 ...

沒有什么行不行的,各有優(yōu)缺點(diǎn)。
if(a==10)a=0適合于循序漸進(jìn)的計(jì)數(shù)方式,僅適用于a==10,或突發(fā)a>10,則此判斷無效,對(duì)于a=0來說,約束性不強(qiáng); 比如異步操作,受到干擾之類的操作。。
a=a%10 ,則是強(qiáng)制性的讓a都在0~9之間。
在C51中,兩者均編譯后,a=a%10 比if(a==10)a=0;多了一個(gè)字節(jié),運(yùn)行時(shí)間也長(zhǎng)了些。
個(gè)人覺得:若MCU沒有硬件除法,則運(yùn)行效率低于前者;如果是有硬件除法的MCU比如STM32xxx,2者相差無幾,這時(shí)a=a%10 代碼強(qiáng)度的明顯強(qiáng)于if(a==10)。。還有個(gè)前提,2者的a均為unsigned型的數(shù)據(jù)。

歡迎探討。
回復(fù)

使用道具 舉報(bào)

17#
ID:1109793 發(fā)表于 2025-5-15 07:26 | 只看該作者
zhuls 發(fā)表于 2025-5-14 23:29
沒有什么行不行的,各有優(yōu)缺點(diǎn)。
if(a==10)a=0適合于循序漸進(jìn)的計(jì)數(shù)方式,僅適用于a==10,或突發(fā)a>10,則 ...

您說的對(duì)。
只是大部分書籍上面都沒有講解取余的這種用法吧。
例如我要在a=0的同時(shí),做其他操作,比如b++;out = !out;P1 = table;呢
回復(fù)

使用道具 舉報(bào)

18#
ID:619259 發(fā)表于 2025-5-15 11:35 | 只看該作者
1.數(shù)碼管代碼表有錯(cuò)
2.定時(shí)器初值注釋有錯(cuò)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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