《51單片機PV趣味制作詳解》光盤資料包:
0.png (46.02 KB, 下載次數: 47)
下載附件
2018-2-9 14:33 上傳
所有資料51hei提供下載:
51單片機PV趣味制作詳解.rar
(40.81 KB, 下載次數: 24)
2018-2-9 12:07 上傳
點擊文件名下載附件
源碼 下載積分: 黑幣 -5
下面是部分內容預覽:
第3章的單片機源程序如下:
- //-------------------------------------------------------------------------------------------
- // 程序名:CPU風扇上的POV
- // 編 程:周正華
- // 說 明:單片機89S2051,晶振12M
- //-------------------------------------------------------------------------------------------
- //-------------------------------------------------------------------------------------------
- //** 嵌入文件 **
- //-------------------------------------------------------------------------------------------
- #include <reg52.h> //51單片機硬件資源參數說明
- //-------------------------------------------------------------------------------------------
- //** 變量說明 **
- //-------------------------------------------------------------------------------------------
- unsigned char V[25]; //顯示緩沖區用數組
- unsigned char i,j; //顯示定位,i:字符,j:字符其中的一列
- unsigned int S; //每隔5毫秒的時間計數
- unsigned char BG,BZ; //顯示狀態用標志
- unsigned int N; //轉速計數值
- unsigned int Rt; //LED顯示一列的時間
- unsigned char cc; //取數值的位用變量
- unsigned int aa,bb,num;
- /*字符字模*/
- unsigned char code ASCIIDOC[] = // -ASCII-編號
- {
- 0x3E,0x45,0x49,0x51,0x3E,0x00, // -0-0
- 0x00,0x21,0x7F,0x01,0x00,0x00, // -1-1
- 0x23,0x45,0x49,0x49,0x31,0x00, // -2-2
- 0x42,0x41,0x49,0x59,0x66,0x00, // -3-3
- 0x0C,0x14,0x24,0x7F,0x04,0x00, // -4-4
- 0x72,0x51,0x51,0x51,0x4E,0x00, // -5-5
- 0x1E,0x29,0x49,0x49,0x46,0x00, // -6-6
- 0x40,0x47,0x48,0x50,0x60,0x00, // -7-7
- 0x36,0x49,0x49,0x49,0x36,0x00, // -8-8
- 0x31,0x49,0x49,0x4A,0x3C,0x00, // -9-9
- 0x00,0x00,0x00,0x00,0x00,0x00, // - -10
- 0x00,0x00,0x7D,0x00,0x00,0x00, // -!-11
- 0x02,0x04,0x08,0x10,0x20,0x00, // -/-12
- 0x00,0x36,0x36,0x00,0x00,0x00, // -:-13
- 0x1F,0x24,0x44,0x24,0x1F,0x00, // -A-14
- 0x7F,0x49,0x49,0x49,0x36,0x00, // -B-15
- 0x3E,0x41,0x41,0x41,0x22,0x00, // -C-16
- 0x7F,0x41,0x41,0x41,0x3E,0x00, // -D-17
- 0x7F,0x49,0x49,0x49,0x41,0x00, // -E-18
- 0x7F,0x48,0x48,0x48,0x40,0x00, // -F-19
- 0x3E,0x41,0x45,0x45,0x27,0x00, // -G-20
- 0x7F,0x08,0x08,0x08,0x7F,0x00, // -H-21
- 0x00,0x41,0x7F,0x41,0x00,0x00, // -I-22
- 0x02,0x01,0x41,0x7E,0x40,0x00, // -J-23
- 0x7F,0x08,0x14,0x22,0x41,0x00, // -K-24
- 0x7F,0x01,0x01,0x01,0x01,0x00, // -L-25
- 0x7F,0x20,0x18,0x20,0x7F,0x00, // -M-26
- 0x7F,0x10,0x08,0x04,0x7F,0x00, // -N-27
- 0x3E,0x41,0x41,0x41,0x3E,0x00, // -O-28
- 0x7F,0x48,0x48,0x48,0x30,0x00, // -P-29
- 0x3E,0x41,0x45,0x42,0x3D,0x00, // -Q-30
- 0x7F,0x48,0x4C,0x4A,0x31,0x00, // -R-31
- 0x32,0x49,0x49,0x49,0x26,0x00, // -S-32
- 0x40,0x40,0x7F,0x40,0x40,0x00, // -T-33
- 0x7E,0x01,0x01,0x01,0x7E,0x00, // -U-34
- 0x7C,0x02,0x01,0x02,0x7C,0x00, // -V-35
- 0x7F,0x02,0x0C,0x02,0x7F,0x00, // -W-36
- 0x63,0x14,0x08,0x14,0x63,0x00, // -X-37
- 0x60,0x10,0x0F,0x10,0x60,0x00, // -Y-38
- 0x43,0x45,0x49,0x51,0x61,0x00, // -Z-39
- 0x12,0x15,0x15,0x0E,0x01,0x00, // -a-40
- 0x7F,0x0A,0x11,0x11,0x0E,0x00, // -b-41
- 0x0E,0x11,0x11,0x11,0x08,0x00, // -c-42
- 0x0E,0x11,0x11,0x0A,0x7F,0x00, // -d-43
- 0x0E,0x15,0x15,0x15,0x08,0x00, // -e-44
- 0x08,0x3F,0x48,0x48,0x20,0x00, // -f-45
- 0x0C,0x12,0x12,0x12,0x0F,0x00, // -g-46
- 0x7F,0x08,0x10,0x10,0x0F,0x00, // -h-47
- 0x00,0x00,0x4F,0x00,0x00,0x00, // -i-48
- 0x00,0x00,0x08,0x4F,0x00,0x00, // -j-49
- 0x7F,0x04,0x0A,0x11,0x01,0x00, // -k-50
- 0x00,0x41,0x7F,0x01,0x00,0x00, // -l-51
- 0x0F,0x10,0x0F,0x10,0x0F,0x00, // -m-52
- 0x10,0x0F,0x10,0x10,0x0F,0x00, // -n-53
- 0x0E,0x11,0x11,0x11,0x0E,0x00, // -o-54
- 0x1F,0x12,0x12,0x12,0x0C,0x00, // -p-55
- 0x0C,0x12,0x12,0x12,0x1F,0x00, // -q-56
- 0x10,0x0F,0x10,0x10,0x08,0x00, // -r-57
- 0x09,0x15,0x15,0x15,0x12,0x00, // -s-58
- 0x10,0x7E,0x11,0x11,0x12,0x00, // -t-59
- 0x1E,0x01,0x01,0x1E,0x01,0x00, // -u-60
- 0x1C,0x02,0x01,0x02,0x1C,0x00, // -v-61
- 0x1E,0x01,0x1E,0x01,0x1E,0x00, // -w-62
- 0x11,0x0A,0x04,0x0A,0x11,0x00, // -x-63
- 0x1C,0x02,0x02,0x04,0x1F,0x00, // -y-64
- 0x11,0x13,0x15,0x19,0x11,0x00, // -z-65
- };
- //-------------------------------------------------------------------------------------------
- //** 外部中斷0處理程序
- //-------------------------------------------------------------------------------------------
- void intersvr0(void) interrupt 0 using 1
- {
- TH0=-137/256; TL0=-137%256; //給定時器一定的偏移量,
- //讓外部中斷與定時中斷在時間上錯開,避免沖突
- i=24; P1=0xff; ET0=1; //顯示初始化
- N++; //進行轉速計數
- }
- //-------------------------------------------------------------------------------------------
- //** 定時中斷0處理函數 **
- //-------------------------------------------------------------------------------------------
- void timer0(void) interrupt 1 using 1
- {
- TH0=-(Rt/256); TL0=-(Rt%256); //顯示"一排"LED的時間
- if(j>0) j--; //在字符表中取字
- else {
- j=5;
- {
- if(i>0) i--;
- else {
- i=0;
- ET0=0;
- }
- }
- }
- P1=~ASCIIDOC[V[i]*6+j]; //取出的數據到輸出口
- }
- //-------------------------------------------------------------------------------------------
- //** 定時中斷1處理函數 **
- //-------------------------------------------------------------------------------------------
- void timer1(void) interrupt 3 using 1
- {
- TH1=-5000/256;
- TL1=-5000%256; //將5毫秒作為一個時間段
- S++; //增加一個5毫秒
- if(S==2400) { //如到12秒
- num=N; //取出計數值
- BG=1; //將更新顯示數組
- S=0; //5毫秒計數器歸零
- N=0; //轉速計數器歸零
- }
- }
- //-------------------------------------------------------------------------------------------
- //** 顯示畫面之一 **
- //-------------------------------------------------------------------------------------------
- void Display1(void)
- {
- V[0]=36; //W
- V[1]=44; //e
- V[2]=51; //l
- V[3]=42; //c
- V[4]=54; //o
- V[5]=52; //m
- V[6]=44; //e
- V[7]=10; //(空)
- V[8]=33; //T
- V[9]=54; //o
- V[10]=10; //(空)
- V[11]=21; //H
- V[12]=44; //e
- V[13]=57; //r
- V[14]=44; //e
- }
- //-------------------------------------------------------------------------------------------
- //** 顯示畫面之二 **
- //-------------------------------------------------------------------------------------------
- void Display2(void)
- {
- V[0]=29; //P
- V[1]=51; //l
- V[2]=44; //e
- V[3]=40; //a
- V[4]=58; //s
- V[5]=44; //e
- V[6]=10; //(空)
- V[7]=62; //w
- V[8]=40; //a
- V[9]=48; //i
- V[10]=59; //t
- V[11]=10; //(空)
- V[12]=10; //(空)
- V[13]=10; //(空)
- V[14]=10; //(空)
- }
- //-------------------------------------------------------------------------------------------
- //** 顯示畫面之三 **
- //-------------------------------------------------------------------------------------------
- void Display3(void)
- {
- V[0]=31; //R
- V[1]=29; //P
- V[2]=26; //M
- V[3]=13; //:
- V[4]=10; //(空)
- num=num*5; //因是按12秒為計數單位得到的數值, 按分鐘的計數時還需乘5
- do { //從低位到高位分別取得數字,放入緩沖區
- bb=num/10;
- aa=num-bb*10;
- V[8-cc]=aa;
- num=bb;cc++;
- }while(num>0);
- V[9]=10; //(空)
- V[10]=10; //(空)
- V[11]=10; //(空)
- V[12]=10; //(空)
- V[13]=10; //(空)
- V[14]=10; //(空)
- }
- //-------------------------------------------------------------------------------------------
- //** 主程序 **
- //-------------------------------------------------------------------------------------------
- void main(void)
- {
- unsigned char k; //循環變量
-
- TMOD=0x10; //使用定時器的方式
- TH0=0; TL0=0; //初始化定時中斷0
- TR0=1; ET0=1;
- TH1=0; TL1=0; //初始化定時中斷1
- TR1=1; ET1=1;
- IT0=1; EX0=1; //初始化外部中斷0
- EA=1; //打開中斷功能
- Rt=1100; //設置LED顯示1列的時間
- BZ=0; //顯示狀態標志置0
-
- for(k=0;k<25;k++) V[k]=10; //初始化顯示數組
- while(1) //進入主程序循環
- {
- if(BZ==0){
- Display1(); //顯示開機畫面"Welcome To Here"
- if(S>1200) BZ=1; //顯示6秒后進入下一步顯示
- }
- if(BZ==1){
- Display2(); //顯示字符"Please wait"
- if(S>2200) BZ=2; //開機11秒后,進入轉速顯示
- }
-
- if((BG==1)&&(BZ==2)){
- Display3(); //顯示轉速
- BG=0;cc=0; //初始化變量
- }
- }
- }
復制代碼
|