找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機每隔1秒計數(shù)加1,數(shù)碼管顯示 程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:589336 發(fā)表于 2022-4-5 22:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式


單片機源程序如下:
  1. #include"reg52.h"
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. /*****數(shù)碼管位選****/
  5. sbit SMG_A = P2^2;
  6. sbit SMG_B = P2^3;
  7. sbit SMG_C = P2^4;

  8. /****數(shù)碼管碼表****/
  9. uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9

  10. /****函數(shù)聲明*****/
  11. void Delay(uchar x);
  12. void Display_SMG();
  13. void Init();

  14. uchar count = 0;//計數(shù)20,T = 20*50ms = 1s
  15. int number = 0;

  16. /*****主函數(shù)*****/
  17. void main()
  18. {
  19.   Init();
  20.   while(1)
  21.   {
  22.           Display_SMG();  
  23.   }
  24. }

  25. /******初始化函數(shù)********/
  26. void Init()
  27. {
  28.         TMOD = 0x01;//定時器0,方式1
  29.         TH0 = (65536 - 46080)/256;//裝初值,延時50ms
  30.         TL0 = (65536 - 46080)%256;
  31.         EA = 1;//開總中斷
  32.         ET0 = 1;//開定時器中斷
  33.         TR0 = 1;//啟動定時器0         
  34. }

  35. /********數(shù)碼管顯示函數(shù)***********/
  36. void Display_SMG()
  37. {
  38.         uchar ge,shi,bai,qian;
  39.         qian = number / 1000;
  40.         bai = (number / 100)%10;
  41.         shi = (number / 10)%10;
  42.         ge = number % 10;
  43.         
  44.         //*****數(shù)碼管顯示個位******
  45.         SMG_A = 0;
  46.         SMG_B = 0;
  47.         SMG_C = 0;
  48.         P0 = table[ge];        
  49.         Delay(10);        

  50.         //*****數(shù)碼管顯示十位******
  51.         SMG_A = 1;
  52.         SMG_B = 0;
  53.         SMG_C = 0;
  54.         P0 = table[shi];        
  55.         Delay(10);

  56.          //*****數(shù)碼管顯示百位******
  57.         SMG_A = 0;
  58.         SMG_B = 1;
  59.         SMG_C = 0;
  60.         P0 = table[bai];        
  61.         Delay(10);

  62.         //*****數(shù)碼管顯示千位******
  63.         SMG_A = 1;
  64.         SMG_B = 1;
  65.         SMG_C = 0;
  66.         P0 = table[qian];        
  67.         Delay(10);
  68. }

  69. /********定時器中斷函數(shù)**********/
  70. void time0() interrupt 1
  71. {
  72.         TH0 = (65536 - 46080)/256;//裝初值,延時50ms
  73.         TL0 = (65536 - 46080)%256;
  74.         count++;
  75.         if(count == 20)        //延時1s后
  76.           {
  77.                   count = 0;
  78.                 number++;
  79.                 if(number == 9999)
  80.                   {
  81.                           number = 0;
  82.                   }
  83.           }
  84. }

  85. /*********延時函數(shù)*********/
  86. void Delay(uchar x)
  87. {
  88.         uchar y,z;
  89.         for(y = 30;y > 0;y--)
  90.            for(z = x;z > 0;z--);
  91. }
復(fù)制代碼


評分

參與人數(shù) 1黑幣 +30 收起 理由
admin + 30 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:863362 發(fā)表于 2022-4-20 08:35 | 只看該作者
請問一下,初始值46080是怎么計算出來的?50毫秒不是應(yīng)該就是50000嗎?
回復(fù)

使用道具 舉報

板凳
ID:514317 發(fā)表于 2022-4-20 09:16 | 只看該作者
sonique0371 發(fā)表于 2022-4-20 08:35
請問一下,初始值46080是怎么計算出來的?50毫秒不是應(yīng)該就是50000嗎?

樓主使用的定時器中斷來計時的    定時器是向上累加溢出的   所以 定時=65536--基礎(chǔ)值
回復(fù)

使用道具 舉報

地板
ID:928284 發(fā)表于 2022-4-21 15:58 | 只看該作者
利用定時中斷掃描數(shù)碼管位顯示,可以使程序更簡單明了。
回復(fù)

使用道具 舉報

5#
ID:863362 發(fā)表于 2022-4-22 08:11 | 只看該作者
lzzasd 發(fā)表于 2022-4-20 09:16
樓主使用的定時器中斷來計時的    定時器是向上累加溢出的   所以 定時=65536--基礎(chǔ)值

我問的就是基礎(chǔ)值為什么不是50000,而是46080?
回復(fù)

使用道具 舉報

6#
ID:65369 發(fā)表于 2022-4-22 09:04 | 只看該作者
用Delay,好占用資源的,同時在定時器里面選擇不是更好,一般都是在定時器里面刷新的
回復(fù)

使用道具 舉報

7#
ID:71955 發(fā)表于 2022-4-23 12:06 | 只看該作者
本人很菜,請教下各大俠,數(shù)碼管位選為啥只有三個位?
回復(fù)

使用道具 舉報

8#
ID:1010435 發(fā)表于 2022-4-24 10:42 | 只看該作者
數(shù)碼管位選用Switch函數(shù)
回復(fù)

使用道具 舉報

9#
ID:220661 發(fā)表于 2022-4-24 15:38 | 只看該作者
sonique0371 發(fā)表于 2022-4-22 08:11
我問的就是基礎(chǔ)值為什么不是50000,而是46080?

void Timer0Init(void)                //50毫秒@11.0592MHz
{
        AUXR &= 0x7F;                //定時器時鐘12T模式
        TMOD &= 0xF0;                //設(shè)置定時器模式
        TL0 = 0x00;                //設(shè)置定時初始值
        TH0 = 0x4C;                //設(shè)置定時初始值
        TF0 = 0;                //清除TF0標(biāo)志
        TR0 = 1;                //定時器0開始計時
}
回復(fù)

使用道具 舉報

10#
ID:863362 發(fā)表于 2022-4-25 08:11 | 只看該作者
gongnn 發(fā)表于 2022-4-24 15:38
void Timer0Init(void)                //50毫秒@11.0592MHz
{
        AUXR &= 0x7F;                //定時器時鐘12T模式

我也是剛搞清楚,如果是11.0592m晶振,初值就是46080,如果是12m晶振,初值就是50000
回復(fù)

使用道具 舉報

11#
ID:603753 發(fā)表于 2022-4-25 10:06 | 只看該作者
如果是11.0592m晶振,初值就是46080

晶振11.0592M:
11.0592MHz除12為921600Hz,就是一秒921600次機器周期,50ms=46080次機器周期。
65536-46080=19456(4c00)
TH0=0x4c,TL0=0x00

回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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