C51的课程设计 :数据大流动,出租车的计价器,交通灯;

 
 

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();

}


猜你喜欢

转载自blog.csdn.net/qq_38053395/article/details/80600188