36、数字(2、4、5)大流动显示
(1)P1口接4*4键盘,P0、P2口(低3位)控制8位数码管的段和位。
(2)按第1行的某个键显示某个数字,按第2行的某个键显示另外1 个数字;
按第3行的某个键加快循环,按第4行的某个键变慢循环。
#include<reg52.h> #define dula P0 #define wela P2 sbit a = P3^0; sbit b = P3^1; sbit c = P3^2; sbit d = P3^3; unsigned char disbuff[] = {0,1,10,10,10,10,10,10}; unsigned char disbuff1[] = {10,10,10,10,10,10,3,2}; unsigned char disbuff2[] = {4,5,10,10,10,10,10,10}; unsigned char disbuff3[] = {10,10,10,10,10,10,6,7}; unsigned char dulacode[] = {0x43,0x40,0x40,0x4c,0x23,0x42,0x54,0x0c,0x7f,0x6f,0} ; unsigned char p = 1; void delayms(unsigned char x) { unsigned char i,j; for(i=x;i>0;i--) { for(j=123;j>0;j--); } } void init() { unsigned char i,j; disbuff[0] = 0; disbuff[1] = 1; for(i=2;i<8;i++) disbuff[i] = 10; disbuff1[6] = 3; disbuff1[7] = 2; for(j=0;j<6;j++) disbuff1[j] = 10; p=1; } void init1() { unsigned char i,j; disbuff2[0] = 6; disbuff2[1] = 7; for(i=2;i<8;i++) disbuff2[i] = 10; disbuff3[6] = 4; disbuff3[7] = 5; for(j=0;j<6;j++) disbuff3[j] = 10; p=1; } void display() { unsigned char i; for(i=0;i<8;i++) { dula=0x00; dula = dulacode[disbuff[i]]; wela = i; delayms(3); } } void display1() { unsigned char i; for(i=0;i<8;i++) { dula=0x00; dula = dulacode[disbuff1[i]]; wela = i; delayms(3); } } void display2() { unsigned char i; for(i=0;i<8;i++) { dula=0x00; dula = dulacode[disbuff2[i]]; wela = i; delayms(3); } } void display3() { unsigned char i; for(i=0;i<8;i++) { dula=0x00; dula = dulacode[disbuff3[i]]; wela = i; delayms(3); } } void remove1() { unsigned char a,j; a = disbuff1[0]; for(j=0;j<7;j++) { disbuff1[j] = disbuff1[j+1]; } disbuff1[7] = a; p++; } void remove() { unsigned char a,j; a = disbuff[7]; for(j=7;j>0;j--) { disbuff[j] = disbuff[j-1]; } disbuff[0] = a; p++; } void remove2() { unsigned char a,j; a = disbuff2[7]; for(j=7;j>0;j--) { disbuff2[j] = disbuff2[j-1]; } disbuff2[0] = a; p++; } void remove3() { unsigned char a,j; a = disbuff3[0]; for(j=0;j<7;j++) { disbuff3[j] = disbuff3[j+1]; } disbuff3[7] = a; p++; } void main() { unsigned char i,j; unsigned int k; P3 = 0x0f; a = 1; while(1) { if(a == 0) { a =0; if(p<7) { i = 50; while(i--) display2(); remove2(); k = 50; if(b == 0) { b=0; while(k--) display2(); // remove2(); if(c == 0) k = 1; } if( d == 0) { break; } } else if (p==7) { k=50000; wela = 7; while(k--) dula = 0x5b; delayms(224); p++; } else if (p>7&&p<14) { j = 50; while(j--) display3(); remove3(); k=50; if(b == 0) { b=0; while(k--) display3(); //remove3(); if(c == 0) k= 1; } if( d == 0) { break; } } else if(p==14) { k=50000; wela = 0; while(k--) dula = 0x5b; init1(); delayms(224); } } else{ if(p<7) { i = 50; while(i--) display(); remove(); } else if (p==7) { k=50000; wela = 7; while(k--){ dula = 0x66;} delayms(224); p++; } else if (p>7&&p<14) { j = 50; while(j--) display1(); remove1(); } else if(p==14) { k=50000; wela = 0; while(k--){ dula = 0x56;} init(); delayms(224); } } } }
19、计价器——数码管显示
使用2个定时器,1个计数、1个定时;计数器记录车辆行驶车轮转的圈数,从而计算出行驶的里程和钱数;定时器记录行驶的时间。
(1)用2个8位数码管显示行驶时间和里程、钱数,用P0口、P2口控制1个数码管,用P3、P2口控制另外1个数码管。
(2)显示时间的时、分、秒为“**﹣**﹣**”;里程显示为“***.*”(公里),钱数显示为“***.*”(元)。
(3)用P1口设计1个按钮,启动(同时清0)/停止。
#include<reg52.h> #define dula P0 #define wela P2 #define dula1 P1 sbit key1=P3^1; unsigned char disbuff[] = {0,0,10,0,0,10,0,0}; unsigned char disbuff1[] = {0,0,0,0,0,0,0,0}; unsigned char hour,min,sec,num,dulacode[] = {0x3f,6,0x5b,0x4f,0x66,0x6d,0x7d,7,0x7f,0x6f,0x40}; unsigned char welacode[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char welacode1[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; dulacode1[] = {0x3f,6,0x5b,0x4f,0x66,0x6d,0x7d,7,0x7f,0x6f,0x40}; unsigned char num1,num2; unsigned int p; unsigned long int s; void delayms(int x) { int i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } void display() { unsigned int j; unsigned char i; for(i=0;i<8;i++) { wela = 0xff; dula = dulacode[disbuff[i]]; dula1 = dulacode[disbuff1[i]]; if(i==6||i==2) dula1=dula1+0x80; wela = welacode[i] ; for(j=0;j<400;j++); } } void time0() interrupt 1 { TL0 = 55536%256; TH0 = 55536/256; num++; if(num > 99) { num = 0; sec++; if(sec>59) { sec=0; min++; if(min>59) { min=0; hour++; if(hour>23) { hour=0; } } } } disbuff[0]=hour/10; disbuff[1]=hour%10; disbuff[3]=min/10; disbuff[4]=min%10; disbuff[6]=sec/10; disbuff[7]=sec%10; } void ssp() { unsigned char i; s=(TL1+TH1*256)/100; if(s<20) { p=50; } else { p= 50 + (s-20)*2; } disbuff1[0]=p%10000/1000; disbuff1[1]=p%1000/100; disbuff1[2]=p%100/10; disbuff1[3]=p%10; i =7; while(s) { disbuff1[i--]=s%10; s=s/10; } } void KeyScan() { if(key1==0) { delayms(10); if(key1==0) { TH1=0; TL1=0; TR1=!TR1; num=0; num1=1; num2=1; sec=0; } while(!key1); } } void main() { TMOD=0x51; TH0=55536/256; TL0=55536%256; TH1=0; TL1=0; EA=1; ET0=1; // ET1=1; TR0=1; TR1=1; while(1) { KeyScan(); display(); ssp(); } }
仿真图如下:
注意这个信号源的电压一定要设置到5V以上;
定时器T1要设置成计数原理,他对应TMOD的高四位,其中把第二位设置成1为计数器,所以他的高四位是5;
15、交通灯——数码管显示
使用定时器产生秒,双方向倒计时,分别显示各自时间(时间不同);红灯亮33秒,绿灯亮24秒,黄灯闪3秒,双向红灯重叠亮3秒。用6位数码管显示双向时间(中间2位不用)。
#include<reg52.h> #define dula P0 #define wela P2 sbit a; = P1^0 sbit a1 = P1^1; sbit a2 = P1^2; sbit b = P1^5; sbit b1 = P1^6; sbit b2 = P1^7; unsigned char disbuff[] = {0,0,10,10,0,0}; unsigned char num,dulacode[] = {0x3f,6,0x5b,0x4f,0x66,0x6d,0x7d,7,0x7f,0x6f,0x00}; unsigned char welacode[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; unsigned char temp1=0,temp=0; unsigned char flag1,flag; unsigned char k=1,k1=1; void display() { unsigned int j; unsigned char i; for(i=0;i<6;i++) { wela = 0xff; dula = dulacode[disbuff[i]]; wela = welacode[i]; for(j=0;j<500;j++); } } void time0() interrupt 1 { TL0 = 55536%256; TH0 = 55536/256; num++; if(num > 99) { num = 0; if(temp==0&&flag==0) { temp = 24; flag++; k++; a=0;a1=0;a2=1; } if(flag==2&&k==2) { a1 = ~a1; } else if(temp==0&&flag==1) { temp = 3; flag++; a=0;a1=1;a2=0; } if(temp==0&&flag==2) { k=1; temp = 30; flag=0; a=1;a1=0;a2=0; } if(temp1==0&&flag1==0) { temp1 = 30; flag1++; k1=1; b=1;b1=0;b2=0; } else if(temp1==0&&flag1==1) { temp1 = 24; flag1++; k1++; b=0;b1=0;b2=1; } if(flag1==0&&k1==2) { b1=~b1; } if(temp1==0&&flag1==2) { temp1 = 3; flag1=0; b=0;b1=1;b2=0; } temp--; temp1--; } disbuff[0]=temp/10; disbuff[1]=temp%10; disbuff[4]=temp1/10; disbuff[5]=temp1%10; } void main() { TMOD = 0x01; TH0=65536/256; TL0=65536%256; ET0 = 1; EA =1; TR0=1; while(1) display(); }