习题答案之郭天祥单片机视频教程(1)

插入c语言的是选插入c++那一栏吗?

1.闪烁_for循环实现


#include

sbit d1=P1^0;

void delay();

void main()
{	while(1)
	{
		d1=0;
		delay();
		d1=1;
		delay();
	}
}

void delay()
{
	unsigned int i,j;
	for(i=100;i>0;i--)
		for(j=680;j>0;j--);
}


2.单个发光管来回流动,第个管亮100ms,流动时让蜂鸣器发出“滴滴”声。


//单个发光管来回流动,第个管亮100ms,流动时让蜂鸣器发出“滴滴”声。

//为什么我的单片机用P0,D3和D4会单独往复一次?!!

#include
#include

#define uint unsigned int
#define uchar unsigned char
						   
sbit beep=P1^5;

void delay();

void main()
{
	uint temp=0xfe;
	uint num;

	while(1)
	{
		//beep=0;
		for(num=7;num>0;num--)
		{
			P0=temp;
			temp=_crol_(temp,1);
			//当P0为0x7f时,没有执行P0=temp,直接跳过
			delay();
		}
		for(num=7;num>0;num--)
		{
			P0=temp;
			temp=_cror_(temp,1);
                        //若将P0=temp写在这里的话,P0=0x7f无法显示,则右一一直无法点亮
			delay();
		}		
	}
}

void delay()
{
	uint x,y;
	for(x=100;x>0;x--)
		for(y=2000;y>0;y--);
}


3.8个发光管由上至下间隔1s流动,其中每个管亮500ms,灭500ms,亮时蜂鸣器响,灭时关闭蜂鸣器,一直重复下去。


//8个发光管由上至下间隔1s流动,其中每个管亮500ms,灭500ms,亮时蜂鸣器响,灭时关闭蜂鸣器,一直重复下去。
//用intrins.h头文件中的_crol_(unsigned char,unsigned int)函数控制led灯向左移

#include
#include

#define uint unsigned int
#define uchar unsinged char

sbit beep=P1^5;

void delay();

void main()
{
	uint turnOff=0xff;
	uint temp=0xfe;

	while(1)
	{
		P0=temp;
		temp=_crol_(temp,1);
		beep=0;
		delay();
		P0=turnOff;
		beep=1;
		delay();				
	}
}

void delay()
{
	 uint delay_X,delay_Y;
	 for(delay_X=100;delay_X>0;delay_X--)
	 	for(delay_Y=580;delay_Y>0;delay_Y--);
}


4.用8个发光管演示出8位二进制数累加过程。


//用8个发光管演示出8位二进制数累加过程。

#include
#include

#define uint unsigned int
#define uchar unsiged char

void delay();

void main()
{	 
	 uint sum=0xff;
	 while(1)
	 {
		 
		 P2=sum;
		 sum=sum-1;
		 delay();
	 }
}

void delay()
{
	uint x,y;
	for(x=100;x>0;x--)
		for(y=999;y>0;y--);
}



5.间隔300ms先奇数亮再偶数亮,循环三次;一个灯上下循环三次; 两个分别从两边往中间流动三次;再从中间往两边流动三次; 8个全部闪烁3次;关闭发光管,程序停止。


/* ---------------------------------------------------
** 间隔300ms先奇数亮再偶数亮,循环三次;一个灯上下循环三次;
** 两个分别从两边往中间流动三次;再从中间往两边流动三次;
** 8个全部闪烁3次;关闭发光管,程序停止。
----------------------------------------------------*/



#include
#include

#define uint unsigned int
#define uchar unsigned char

uint temp1=0xfe;
uint temp2=0xfd;
uint temp3=0xfe;
//uint temp4=0x7f;
//注意 sbit和uint 的区别

void delay();

void main()
{
	uint xh1,xh2,xh3,xh4,xh5,xh6,xh7,xh8,xh9;
	while(1)
	{  
     	//先奇数亮,然后偶数亮,循环三次		
		for(xh1=3;xh1>0;xh1--)
		{
			for(xh2=4;xh2>0;xh2--)
			{
				P0=temp1;
				temp1=_crol_(temp1,2);
				delay();
			}
			for(xh3=4;xh3>0;xh3--)
			{
				P0=temp2;
				temp2=_crol_(temp2,2);
				delay();
			}
		}
		
		//一个灯上下循环三次
		//之前循环写错了
		for(xh4=3;xh4>0;xh4--)
		{
			for(xh5=7;xh5>0;xh5--)
		    {
		   		P0=temp3;
				temp3=_crol_(temp3,1);
				delay();
		    }
			for(xh6=7;xh6>0;xh6--)
			{
				P0=temp3;
				temp3=_cror_(temp3,1);
				delay();
			}  
		}  
		
		//两个分别从两边往中间流动三次
		for(xh7=3;xh7>0;xh7--)
		{
			P0=0x7e;
			delay();
			P0=0xbd;
			delay();
			P0=0xdb;
			delay();
			P0=0xe7;
			delay();
		}
		//再从中间往两边流动三次
		for(xh8=3;xh8>0;xh8--)
		{
			P0=0xe7;
			delay();
			P0=0xdb;
			delay();
			P0=0xbd;
			delay();
			P0=0x7e;
			delay();
		}
		//暂时还没想到更好的方法
		
		
		//8个全部闪烁3次
		for(xh9=3;xh9>0;xh9--)
		{
			P0=0x00;
			delay();
			P0=0xff;
			delay();
		} 
		
	}
}

void delay()
{
	uint x,y;
	for(x=100;x>0;x--)
		for(y=3500;y>0;y--);
}


一共是有七题,有些功能是重复的,就不贴了。然后因为我还没学到中断,所以时间控制的不够准确,而且为了便于观察现象时间延时故意加长了。

代码应该能够简化,不过不知道该怎么简化?

代码格式什么的,各位大神有没有好的建议?

多谢。。。

你可能感兴趣的:(单片机)