利用keil和proteus实现仿真51呼吸灯和51时钟

一、51呼吸灯

通过控制pwm的周期同时利用了for循环在keil上设计了控制呼吸灯亮灯灭灯效果的实现的代码

从而在Proteus上利用AT89C52芯片初步且粗陋地实现了51呼吸灯的基本实现。

其代码如下:

#include <REGX52.H>

void Delay(unsigned int time)
{
	while(time--);
}
void main()
{
	unsigned char Time,i;         
	while(1)
	{
		for(Time=0;Time<100;Time++)    
		{
	for(i=0;i<20;i++)
			{
				P2_7=0;
				Delay(Time);
				P2_7=1;
				Delay(100-Time);
			}
		}
		for(Time=100;Time>0;Time--)
			{
				for(i=0;i<20;i++)
				{
					P2_7=0;
					Delay(Time);
					P2_7=1;
							Delay(100-Time);
				}
			}
		}
}

其中利用了Delay函数来实现呼吸灯亮灭灯的延时效果,以使亮灯灭灯的现象能够达到人眼能够捕捉的效果。

在实现仿真的过程中,两组for循环中限制条件的改变对于仿真结果影响也是肉眼可见。

仿真效果如图:

以上代码和呼吸灯的硬件原理图都有所参考借鉴,以我目前的能力能够在短时间内学习并实现确实存在一定局限性。

二、51时钟

代码如下:

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1 = P3^0 ;
sbit key0 = P3^1 ;		 
sbit key2 = P3^2 ;
sbit key3 = P3^3 ;

uchar s[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};	   //共阴数码管0~9
uchar hour = 10 , min = 10 , sec = 0 ,day = 25 , month = 1 , year = 20 ;					   
uchar a = 0 ,b = 0 , c = 0 , d = 0 , e = 0 ,f = 0 ;
uchar b_1 = 0 ,c_1 = 0 ;		   

void time0_server_() interrupt 1      
{
	TH0 = 0x4c ;
	TL0 = 0x00 ;
	a++;
	e = 2000 + year ;
	if(a == 20)					
	{
		a = 0 ;
		sec = sec + 1 ;
	}
	if(sec == 60)				   
	{
		min = min + 1 ;
		sec = 0 ;
	} 
	if(min == 60)				 
	{
		hour = hour + 1 ;
		min = 0 ;
	}
	if(hour == 24)				 
	{
		day = day + 1 ;
		hour = 0 ;	
	}
	switch(month)			
	{
		case 1: 
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:if(day == 32)
				{
					month = month + 1 ;
					day = 1 ;
				}
				break ;
		case 4:
		case 6:
		case 9:
		case 11:if(day == 31)
				{
					month =month + 1;
					day = 1 ;
				}
				break ;
		case 2:if(e%400==0||e%4==0&&e%100!=0)
			    {
				 	if(day == 30)
					{
						month = month + 1 ;
						day = 1 ;	
					}
				}
				else if(day == 29)
					 {
					 	month = month + 1 ;
						day = 1 ;	
					 }
				break ;
	}
	if(month == 13)
	{
		year = year + 1 ;
		month = 1 ;
	} 

}

void init_t0()
{
	TMOD = 0x01 ;	   
	TH0 = 0x4C ;	   
	TL0 = 0x00 ;	     
	EA = 1 ;		   
	ET0 = 1 ;          		  
	TR0 = 1 ;		   		  
}

void delay(uint n)	 
{
	uint i,j;
	for(i = 0 ; i < n ; i ++)
	{
		for(j = 0 ; j < 120 ; j ++);
	}	
}

void display1()						 
{
	uchar t0 = 0 ,t1 = 0 , t2 = 0 , t3 = 0 , t4 = 0 , t5 = 0 ;
	t0 = hour / 10 ;		  
	t1 = hour % 10 ;		  
	t2 = min / 10 ;		
	t3 = min % 10 ;			  
	t4 = sec / 10 ;			 
	t5 = sec % 10 ;
	P2 = 0x7f ;				  
	P0 = s[t0] ;		
	delay(1) ;			
	P2 = 0xbf ;				  
	P0 = s[t1] ;		
	delay(1) ;
	P2 = 0xdf ;			
	P0 = 0x40 ;			
	delay(1) ;
	P2 = 0xef ;			
	P0 = s[t2] ;			  
	delay(1) ;
	P2 = 0xf7 ;				 
	P0 = s[t3] ;			
	delay(1) ;
	P2 = 0xfb ;				 
	P0 = 0x40 ;				
	delay(1) ;
	P2 = 0xfd ;				
	P0 = s[t4] ;			 
	delay(1) ;
	P2 = 0xfe ;			
	P0 = s[t5] ;		
	delay(1) ;	
}

void display2()	
{
	uchar t0 = 0 ,t1 = 0 , t2 = 0 , t3 = 0 , t4 = 0 , t5 = 0 ;
	t0 = year / 10 ;		  
	t1 = year % 10 ;		  
	t2 = month / 10 ;		
	t3 = month % 10 ;			  
	t4 = day / 10 ;			 
	t5 = day % 10 ;	
	P2 = 0x7f ;				  
	P0 = s[t0] ;		
	delay(1) ;			
	P2 = 0xbf ;				  
	P0 = s[t1] ;		
	delay(1) ;
	P2 = 0xdf ;			
	P0 = 0x40 ;			
	delay(1) ;
	P2 = 0xef ;			
	P0 = s[t2] ;			  
	delay(1) ;
	P2 = 0xf7 ;				 
	P0 = s[t3] ;			
	delay(1) ;
	P2 = 0xfb ;				 
	P0 = 0x40 ;				
	delay(1) ;
	P2 = 0xfd ;				
	P0 = s[t4] ;			 
	delay(1) ;
	P2 = 0xfe ;			
	P0 = s[t5] ;		
	delay(1) ;				
}

void KEY0()		
{
	if(key0 == 0 && c == 0)
	{
		c = 1 ;
	}
	if(key0 == 1 && c == 1)
	{
		c = 0 ;
		c_1 = c_1 + 1 ;
	}
	if(c_1 == 4)
	{
		c_1 = 0 ;
	}
}

void KEY1()		  
	switch(c_1)
	{
		case 1: if(b_1 == 0)
				{
				 	if(key1 == 0 && d == 0)
					{
						d = 1 ;
					}
					if(key1 == 1 && d == 1)
					{
						d = 0 ;
						sec = sec + 1 ;
					}
				}
				else if(b_1 == 1)
				{
					if(key1 == 0 && d == 0)
					{
						d = 1 ;
					}
					if(key1 == 1 && d == 1)
					{
						d = 0 ;
						day = day + 1 ;
					}	
				}
				break ;
		case 2: if(b_1 == 0)
				{
					if(key1 == 0 && d == 0)
					{
						d = 1 ;
					}
					if(key1 == 1 && d == 1)
					{
						d = 0 ;
						min = min + 1 ;
					}
				}
				else if(b_1 == 1)
				{
					if(key1 == 0 && d == 0)
					{
						d = 1 ;
					}
					if(key1 == 1 && d == 1)
					{
						d = 0 ;
						month = month + 1 ;
					}
				}
				break ;
		case 3: if(b_1 == 0)
				{
					if(key1 == 0 && d == 0)
					{
						d = 1 ;
					}
					if(key1 == 1 && d == 1)
					{
						d = 0 ;
						hour = hour + 1 ;
					}
				}
				else if(b_1 == 1)
				{
					if(key1 == 0 && d == 0)
					{
						d = 1 ;
					}
					if(key1 == 1 && d == 1)
					{
						d = 0 ;
						year = year + 1 ;
					}
				}
				break ;
	}
}

void KEY2()		 
{
	switch(c_1)
	{
		case 1: if(b_1 == 0)
				{
				 	if(key2 == 0 && f == 0)
					{
						f = 1 ;
					}
					if(key2 == 1 && f == 1)
					{
						f = 0 ;
						sec = sec - 1 ;	
						if(sec == 255)
						{
							sec = 59 ;
						}
					}
				}
				else if(b_1 == 1)
				{
					if(key2 == 0 && f == 0)
					{
						f = 1 ;
					}
					if(key2 == 1 && f == 1)
					{
						f = 0 ;
						day = day - 1 ;
						if(day <= 1)
						{
							day = 1 ;
						}
					}
				}
				break ;
		case 2: if(b_1 == 0)
				{
					if(key2 == 0 && f == 0)
					{
						f = 1 ;
					}
					if(key2 == 1 && f == 1)
					{
						f = 0 ;
						min = min - 1 ;
						if(min == 255)
						{
							min = 0 ;
						}
					}
				}
				else if(b_1 == 1)
				{
					if(key2 == 0 && f == 0)
					{
						f = 1 ;
					}
					if(key2 == 1 && f == 1)
					{
						f = 0 ;
						month = month - 1 ;
						if(month <= 1)
						{
							month = 1 ;
						}
					}
				}
				break ;
		case 3: if(b_1 == 0)
				{
					if(key2 == 0 && f == 0)
					{
						f = 1 ;
					}
					if(key2 == 1 && f == 1)
					{
						f = 0 ;
						hour = hour - 1 ; 
						if(hour == 255)
						{
							hour = 0 ;
						}
					}
				}
				else if(b_1 == 1)
				{
					if(key2 == 0 && f == 0)
					{
						f = 1 ;
					}
					if(key2 == 1 && f == 1)
					{
						f = 0 ;
						year = year - 1 ;
						if(year == 255)
						{
							year = 0 ;
						}
					}
				}
				break ;
	}
}
void KEY3()		
{
	if(key3 == 0 && b == 0)
	{
		b = 1 ;
	}
	if(key3 == 1 && b == 1)
	{
		b = 0 ;
		b_1 = b_1 + 1;
	}
	if(b_1 == 2)
	{ 
		b_1 = 0 ;
	}
	switch(b_1)
	{
		case 0: display1() ;
				break ;
		case 1: display2() ;
				break ;
	}
}

void main()
{
	init_t0();
	while(1)
	{
		KEY0();
		KEY1();
		KEY2();
		KEY3();
	}	
}

仿真原理图如下:

此次51呼吸灯和51时钟的仿真实现让我学习也收获到不少,但由于自身能力尚且不足,很多地方都是借鉴其他前辈的思路和代码,其中还有很多粗糙和不太正确之处,我会继续学习的!

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值