基於proteus的51單片機仿真實例六十、8位數碼管顯示實例

1、本例實現在8位數碼管上同時顯示多個不同字符。
2、本例使用了8只集成式7段共陽數碼管(pruteus中元件標識爲7seg-mpx8-ca-blu,共陽爲ca,共陰爲cc),所有8個數碼管的段碼引腳a,b,c,d,e,f,g,dp都是分別並聯在一起,任何時候發送的段碼均會傳送到所有數碼管上,所有的數碼管的共陽極是獨立的,本例中個數碼管的共陽極分別與8只NPN三極管射極相連,程序運行時,任意時刻僅允許一隻數碼管的共陽極連接+5V,當向連接段碼的端口發送段碼值時,相應數字只會顯示在某一隻數碼管上。
3、爲了使不同數碼管顯示不同字符,本例使用的是集成式多位數碼管常用的動態掃描顯示技術,他利用了人的視覺暫留特徵,選通第一隻數碼管時,發送1的段碼;選通第二隻數碼管時,發送2的段碼,...每次僅選通一隻數碼管,發送相應的段碼,每次切換選通下一數碼管併發送相應段碼的時間間隔非常短,視覺惰性使人感覺不到字符是一個接一個顯示在不同的數碼管上的,而會覺得所有的字符很穩定的同時顯示在不同數碼管上。
在控制兩位數碼管選通的時間間隔時,要注意全屏的掃描頻率要高於視覺暫留頻率16-20Hz。對於程序中的點亮一位數碼管的延時時間,我們可以嘗試將延時時間改爲其他數值,觀察會出現什麼樣的效果。
 
4、在keil c51中新建工程ex48,編寫如下程序代碼,編譯並生成ex48hex文件
/*****************************************************************************
*         LED數碼管顯示演示程序                                                *
*         在8個LED數碼管上依次顯示1,2,3,4,5,6,7,8                              *
*******************************************************************************/
#include <reg51.h>         //包含頭文件
#include <intrins.h>        //包含移位函數頭文件
//段碼錶
unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3
    0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off
//毫秒級延時函數
void delay(unsigned int x)
{
  unsigned char i;
 while(x--)
 {
  for(i=0;i<120;i++);
 }
}
//主函數
void main()
{
 unsigned char k,m=0x80;      //變量定義
 P0 = 0xff;       //先關閉數碼管
 P2 = 0x00;        //
 while(1)
 {
   for(k = 0;k < 8;k++)       //循環8次
  {
    P2 = 0x00;      //每顯示一位都要關閉位選端口一次
   m=_crol_(m,1);   //循環左移
   P2=m;            //每次選通一個位選端口
   P0=dis_code[k+1];   //段碼送P0口
   delay(2);
  }
 }
}
 
5、在proteus中新建仿真文件ex48.dsn,電路原理圖如下所示

6、將ex48.hex文件載入at89c51中,啓動仿真,觀察程序運行結果,下圖是程序運行結果。我們也可以試着將程序中的 “P2 = 0x00;      //每顯示一位都要關閉位選端口一次”這句話去掉,然後再觀察程序運行結果,觀察會出現什麼情況,並解釋這種情況。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章