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

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 10258|回復(fù): 3
收起左側(cè)

笨鳥(niǎo)先飛之八位動(dòng)態(tài)數(shù)顯

[復(fù)制鏈接]
ID:23261 發(fā)表于 2010-4-27 19:59 | 顯示全部樓層 |閱讀模式

/*動(dòng)態(tài)數(shù)顯的設(shè)計(jì)思路,首先是我們要先知道怎樣才能使哪個(gè)位亮,顯示的段是什么數(shù)值,接下來(lái)就是中斷時(shí)間
的問(wèn)題了,設(shè)計(jì)步驟如下,如果要讓八個(gè)數(shù)碼管靜態(tài)顯示1到8,我們可以修改中斷時(shí)間,如把50000改成100或更低*/

#include<reg52.h>   
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit duan=P2^6;     
sbit wei=P2^7; 

uchar  a,numw,numd;
uchar code tabled[]={
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f}; /*第二步驟,創(chuàng)建段顯數(shù)值的對(duì)碼表0~9數(shù)值.如果要顯示1~8數(shù)值,最好多加前后兩位數(shù)0跟9,
      因?yàn)楹竺?+移位時(shí)就能按我們常規(guī)順序亮下去,至于如何顯示對(duì)應(yīng)數(shù)值請(qǐng)先看數(shù)碼顯示電路圖*/  
uchar code tablew[]={
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f}; //第二步驟,創(chuàng)建位顯,就是顯示的位置,這個(gè)碼表相對(duì)簡(jiǎn)單,用二進(jìn)制表示11111110~01111111,是0的為八位數(shù)顯管的位置
void main()
{
 a=0;            //定義個(gè)時(shí)間函數(shù)
 numw=0;     //附位顯初值為0位
 numd=0;     //附段顯初值為0位
 
 TMOD=0X01;    //第四步驟,附中斷暫存器初值
 TH0=(65536-50000)/256; //附中斷請(qǐng)求時(shí)間初值,高8位
 TL0=(65536-50000)%256; //附中斷請(qǐng)求時(shí)間初值,低8位
 EA=1;     //開(kāi)啟總中斷
 ET0=1;     //開(kāi)啟定時(shí)中斷
 TR0=1;     //啟動(dòng)定時(shí)中斷
 while(1)
 {
  if(a==10)   //第三步驟,執(zhí)行速度,如果等20差不多是1秒,則往下執(zhí)行,相當(dāng)于單位數(shù)值亮的時(shí)間
  { 
   a=0;   //重新附值初值0
   numd++;   //段顯值++
   if(numd==9)  //如果段值在對(duì)碼表第9位則轉(zhuǎn)下執(zhí)行  
    numd=1;  /*重新附值段顯值對(duì)應(yīng)對(duì)碼表第1位,因?yàn)?+所以0位并不在數(shù)碼管中顯示.
       如果要顯示,也會(huì)因?yàn)?+而在第二輪中顯示出*/
   duan=1;   //開(kāi)啟段顯端
   P0=tabled[numd];//附段顯P0值對(duì)應(yīng)段顯值對(duì)碼表 
   duan=0;   //鎖存 
   wei=1;   //開(kāi)啟位顯端
   P0=tablew[numw];//附位顯P0值對(duì)應(yīng)位顯值對(duì)碼表
   wei=0;   //鎖存 
   numw++;   //相當(dāng)于位顯移位
   if(numw==8)  //如果位顯值到對(duì)應(yīng)位顯對(duì)碼表第八位則轉(zhuǎn)下執(zhí)行 
    numw=0;  //重新附值位顯值對(duì)應(yīng)對(duì)碼表第0位起
/*

下面是簡(jiǎn)單的單個(gè)數(shù)碼管顯示例證 第一驟, 修改后在第三步驟內(nèi)
#include"reg52.h"
#include"intrins.h"

sbit duan=P2^6; //段顯端口
sbit wei=P2^7; //位顯端口

void main()
{
 //P0=0xff; 數(shù)碼管不顯示任何信號(hào),默認(rèn)情況下通電本身就不顯示,可以不寫(xiě)
 duan=1;  //開(kāi)啟段顯端口
 P0=0x06; //附值段顯數(shù)值為1,可以查閱數(shù)碼管電路圖相對(duì)應(yīng)顯示的對(duì)碼表
 duan=0;  //鎖存,保持上一步段顯狀態(tài),硬件說(shuō)明請(qǐng)查閱74HC573功能
 wei=1;  //開(kāi)啟位顯端口
 P0=0xfe; //附值位顯位置,01111111,左邊第一位,為0的顯示
 wei=0;  //鎖存,保持上一步位顯狀態(tài),硬件說(shuō)明請(qǐng)查閱74HC573功能
}
*/
  
  } 
 } 
}

void timer0() interrupt 1 /*第四步驟,中斷時(shí)間函數(shù)這個(gè)相當(dāng)于移位數(shù)顯的速度,速度夠快,人眼就會(huì)有余輝效應(yīng),
       感覺(jué)8位數(shù)顯一直在亮著,相當(dāng)于正在播放的電影膠卷*/

{
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 a++;
}

/*

以上有什么地方還需要改進(jìn)的還請(qǐng)老師明示

*/

 

 

 

 

[此貼子已經(jīng)被作者于2010-4-28 8:52:39編輯過(guò)]
回復(fù)

使用道具 舉報(bào)

ID:1 發(fā)表于 2010-4-28 00:00 | 顯示全部樓層

這是個(gè)很好的程序,注釋非常詳細(xì),我在板子上測(cè)試了可以運(yùn)行

回復(fù)

使用道具 舉報(bào)

ID:23261 發(fā)表于 2010-4-28 09:25 | 顯示全部樓層

有些函數(shù)解釋的很模糊,像下面這個(gè)就是了 

TH0=(65536-50000)/256; //附中斷請(qǐng)求時(shí)間初值,高8位
TL0=(65536-50000)%256; //附中斷請(qǐng)求時(shí)間初值,低8位

其實(shí)像我這樣沒(méi)念過(guò)初中以上的人理解這個(gè)確實(shí)很難,下面是引用其他論壇上的資料,寫(xiě)得非常明白.

 

TL0=0xb0;
TH0=0x3c;
這兩個(gè)是怎么算出來(lái)得
如果晶振不是12Mhz
是11.0592 MHz
怎么算

12M的晶振每秒可產(chǎn)生1M個(gè)機(jī)器周期,50ms就需要50000個(gè)機(jī)器周期,定時(shí)器在方式1工作,是16位計(jì)數(shù)器,最大值為65536,所以需設(shè)置初值15536,即3CB0H(10進(jìn)制15536轉(zhuǎn)換成16進(jìn)制數(shù)3CB0),所以TH0=0x3c,TL0=0xb0。
(65536-50000周期=初值15536)
高位就是TH0的值,低位為T(mén)L0的值
11.0592M的晶振每秒可產(chǎn)生0.9216M個(gè)機(jī)器周期,50ms就需要46080個(gè)機(jī)器周期,定時(shí)器在方式1工作,是16位計(jì)數(shù)器,最大值為65536,所以需設(shè)置初值19456,即4C00H,所以TH0=0x4c,TL0=0x00。
其實(shí)很簡(jiǎn)單,不管你使用多大的晶振,使用51單片機(jī),一般都是12分頻出來(lái),也就可以得出一個(gè)機(jī)器周期


機(jī)器周期=12/n(n指晶振頻率),假設(shè)你要定時(shí)的時(shí)間為M
那么定時(shí)的初值為:
M/機(jī)器周期=初值;
TH0=(65536-初值)%256;         
TL0=(65536-初值)/256;
將(65536-初值)所得的值化成16進(jìn)制,其高位就是TH0的值,低位為T(mén)L0的值
例如用12M晶振做1ms定時(shí)計(jì)算如下:
機(jī)器周期=12/12*10^6=1us(微秒)
定時(shí)初值=(1*10^-3)/(1*10^-6)=1000;
所以:TH0=(65536-1000)%256;
      TL0=(65536-1000)/256;
將65536-1000=64536化為16進(jìn)制為:0xFC18
TH0=0xFC;
TL0=0X18;

回復(fù)

使用道具 舉報(bào)

ID:370231 發(fā)表于 2018-8-3 17:07 | 顯示全部樓層
admin 發(fā)表于 2010-4-28 00:00
這是個(gè)很好的程序,注釋非常詳細(xì),我在板子上測(cè)試了可以運(yùn)行

你們的板子是什么型號(hào)的,
還有這sbit duan=P2^6;     
sbit wei=P2^7; 端口接哪里。
我一臉迷茫
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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