51數碼管動態顯示程序-------調試經驗


  今兒學習了動態數碼管顯示的知識,其實很簡單,只要是首先讓數碼管逐個顯示1,2,3,4...間隔1秒鍾,用定時器0控制時間,未選也用一個table數組表示出來,然后減小間隔時間,我這用的是5ms顯示效果不錯,利用人眼的視覺暫留(<20ms),將東西完全顯示在數碼管上。

  注意:如果在設計硬件電路時候,有雨動態顯示數碼管時候,亮度較靜態顯示時候低,所以,限流電阻應取小一些。(具體電路網上應該找得到)

  調試經驗如下:

  1.若keil調試出現亂碼,還有出現invalid ...path原因:(1)工程文件名是否存在中文,最好修改為英文;(2)程序文件中是否出現中文狀態下的字符,建議自己編寫,或者直接在自己存放的子函數中(.c文件)直接復制粘貼過來

  2.中斷服務程序中莫忘aa++;否則定時器不起作用

/*
####################################################
數碼管(共陰)
  段選位 P2口
  片選位 P1.2  P1.1  P1.0
  格式         dp g f e d c b a

P1口(片選位):
0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07
 位1  位2  位3  位4  位5  位6  位7  位8
P2口(數據位):
0x3f 0x06 0x5b 0x4f 0x66 0x6d 0x7d 0x07 0x7f 0x6f
  0    1    2    3    4    5    6    7    8    9
0x77 0x7c 0x39 0x5e 0x79 0x71
  A    B    C    D    E    F
####################################################
*/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

uchar code duan[]={0x3f,0x06,0x5b,0x4f,
       0x66,0x6d,0x7d,0x07,
       0x7f,0x6f,0x77,0x7c,
       0x39,0x5e,0x79,0x71};
uchar code wei[]={0x00,0x01,0x02,0x03,
      0x04,0x05,0x06,0x07};

uchar numwe,numdu,aa;

void main ()
{
 /*# 定時器0初始化 #*/
 TMOD=0x01;            //1.選擇定時器0,工作方式1(16位定時器,最大值65536)
 TH0=(65536-10000)/256; //2.對寄存器賦初值
 TL0=(65536-10000)%256;
 EA=1;
 ET0=1;
 TR0=1; 

 numwe=0;              //段位賦初值
 numdu=1;

 while(1)
 {  
  P1=wei[numwe];   //第1位數碼管顯示1
  P2=duan[numdu];
  if(aa==1)
  {
   aa=0;
   if(numwe==8)
    numwe=0;
   numwe++;
   P1=wei[numwe];
   if(numdu==8)
    numdu=0;
   numdu++;   
   P2=duan[numdu];
  } 
 } 
}

void timer0() interrupt 1
{
 TH0=(65536-5000)/256; //中斷服務程序中記得要對寄存器重裝初值哦!
 TL0=(65536-5000)%256;
 aa++; 
}

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM