《51单片机PV趣味制作详解》光盘资料包:
所有资料51hei提供下载:
51单片机PV趣味制作详解.rar
(40.81 KB, 下载次数: 24)
下面是部分内容预览:
第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; //初始化变量
- }
- }
- }
复制代码
|