51单片机学习之流水灯的设计

我是我在学习郭天祥的《51单片机C语言教程》中的笔记。

【例2.2.1】编写程序,点亮第一个发光二极管。

#include  	//52系列单片机头文件 
abit led1 = p1^0;	//声明单片机P1口的第一位 
void main()			//主函数 
{
	led1 = 0;		/*点亮第一个发光二极管*/
}
在代码中假如头文件有两种输入方法:

#include -->从软件安装文件中搜

#include "reg52.h"-->先从当前工程文件中搜,搜不到在从软件安装文件中搜

发光二极管:具有单向导电性,通过5mA左右电流即可发光。

锁存器:74HC573

51单片机一上电时,如果我们没有人为的控制其I/O口的状态,它所有的为控制的I/O口都将默认为高电平。

【例2.2.2】

#include 	//52系列单片机头文件 
void main()			//主函数 
{
	P1 = 0xaa;	
}

这里的"P1 = 0xaa;"就是对单片机P1口的8个I/O口同时进行操作,“0x”表示后面的数据是十六进制形式表示的,十六进制的aa,转换成二进制是10101010,那么对应的发光二极管便是1,3,5,7亮,2,4,6,8灭。我们将0xaa转换成十进制后为170,也可直接对P0口进行十进制数的赋值。如"P1 = 170;",其效果是一样的,只是麻烦了一些。

【例2.3.1】编写一个完整的点亮发光二极管的程序。

#include 	//52系列单片机头文件 
void main()			//主函数 
{
	P1 = 0xfe;
	while(1);	
}
使用for语句的延时语句:

unsigned char i , j;
for(i=100;i>0;i--)
	for(j=200;j>0;j--); 
【例2.6.1】写出一个完整的调用子函数的例子,让实验板上第一个发光二极管以间隔500毫秒亮暗闪动。

#include 			//52系列单片机头文件 
#define uint unsigned int	//宏定义 
sbit led1 = p1^0;			//声明单片机P1口的第一位 
void delay1s();				//声明子函数 
void main()					//主函数 
{
	while(1)				//大循环 
	{		
		led1 = 0;			/*点亮第一个发光二极管*/ 
		delay1s();			//调用延时子函数 
		led1 = 1;			/*关闭第一个发光二极管*/
		delay1s();			//调用延时子函数 
	}	
}
void delay1s()				//子函数体 
{	
	uint i , j;			
	for(i=500;i>0;i--)		//i=500即延时约500毫秒 
		for(j=110;j>0;j--);	
}
延时x毫秒的函数的写法:

void delayms(unsigned int xms)
{
	uint i , j;
	for(i=xms;i>0;i--)
		for(j=110;j>0;j--);	
}
【例2.7.1】写一个完整的程序,还是让一个小灯闪动,不过这次我们让他以亮200ms、灭800毫秒的方式闪动,完整代码如下:

#include 				//52系列单片机头文件 
#define uint unsigned int		//宏定义 
sbit led1 = p1^0;				//声明单片机P1口的第一位 
void delayms(unit);				//声明子函数 
void main()						//主函数 
{
	while(1)					//大循环 
	{					
		led1 = 0;				/*电亮第一个发光二极管*/
		delayms(200);			//延时200毫秒 
		led1 = 1;				/*关闭第一个发光二极管*/
		delayms(800);			//延时800毫秒 
	}	
}
void delayms(uint xms)
{
	unit i , j;
	for(i=xms;i>0;i--)			//i=xms即延时约xms毫秒 
		for(j=110;j>0;j--);	
}
移位操作:

(1)左移,“<<”操作符

(2)右移,“>>”操作符

 (3)循环左移:_crol_函数

(4)循环右移:_cror_函数

【例2.8.1】左移程序。

#include 				//52系列单片机头文件 
#define uchar unsigned char		//宏定义 
uchar a;			
void main()						//主函数 
{
	a = 0xaa;
	while(1)					//大循环 
	{
		a = a << 1;	
	}	
}
【例2.8.2】右移程序。

#include 				//52系列单片机头文件 
#define uchar unsigned char		//宏定义 
uchar a;			
void main()						//主函数 
{
	a = 0xaa;
	while(1)					//大循环 
	{
		a = a >> 1;	
	}	
}
【例2.8.3】利用C51自带的库函数_crol_(),以间隔500ms,在实验板上实现流水灯程序。

#include 				//51系列单片机头文件 
#include 			//包含_crol_函数所在的头文件 
#define unit unsigned int		//宏定义 
#define uchar unsigned char
void delayms(uint);				//声明子函数 
uchar aa;						//定义一个变量,用来给P1口赋值 
void main()						//主函数 
{								
	aa = 0xfe;					//赋初值11111110 
	while(1) 					//大循环 
	{
		P1 = aa;				//先点亮第一个发光管 
		delayms(500);			//延时500毫秒 
		aa = _crol_(aa , 1);	//将aa循环左移一位后再赋值给aa 
	}	
}
void delayms(unit xms)
{
	uint i , j;
	for(i=xms;i>0;i--)			//i=xms即延时约xms毫秒 
		for(j=110;j>0;j--);	
}



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