51单片机系统练习

 头文件内容:

/*--------------------------------------------------------------------------
AT89X52.H

Header file for the low voltage Flash Atmel AT89C52 and AT89LV52.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/

#ifndef __AT89X52_H__
#define __AT89X52_H__

/*------------------------------------------------
Byte Registers
------------------------------------------------*/
sfr P0      = 0x80;
sfr SP      = 0x81;
sfr DPL     = 0x82;
sfr DPH     = 0x83;
sfr PCON    = 0x87;
sfr TCON    = 0x88;
sfr TMOD    = 0x89;
sfr TL0     = 0x8A;
sfr TL1     = 0x8B;
sfr TH0     = 0x8C;
sfr TH1     = 0x8D;
sfr P1      = 0x90;
sfr SCON    = 0x98;
sfr SBUF    = 0x99;
sfr P2      = 0xA0;
sfr IE      = 0xA8;
sfr P3      = 0xB0;
sfr IP      = 0xB8;
sfr T2CON   = 0xC8;
sfr T2MOD   = 0xC9;
sfr RCAP2L  = 0xCA;
sfr RCAP2H  = 0xCB;
sfr TL2     = 0xCC;
sfr TH2     = 0xCD;
sfr PSW     = 0xD0;
sfr ACC     = 0xE0;
sfr B       = 0xF0;

/*------------------------------------------------
P0 Bit Registers
------------------------------------------------*/
sbit P0_0 = 0x80;
sbit P0_1 = 0x81;
sbit P0_2 = 0x82;
sbit P0_3 = 0x83;
sbit P0_4 = 0x84;
sbit P0_5 = 0x85;
sbit P0_6 = 0x86;
sbit P0_7 = 0x87;

/*------------------------------------------------
PCON Bit Values
------------------------------------------------*/
#define IDL_    0x01

#define STOP_   0x02
#define PD_     0x02    /* Alternate definition */

#define GF0_    0x04
#define GF1_    0x08
#define SMOD_   0x80

/*------------------------------------------------
TCON Bit Registers
------------------------------------------------*/
sbit IT0  = 0x88;
sbit IE0  = 0x89;
sbit IT1  = 0x8A;
sbit IE1  = 0x8B;
sbit TR0  = 0x8C;
sbit TF0  = 0x8D;
sbit TR1  = 0x8E;
sbit TF1  = 0x8F;

/*------------------------------------------------
TMOD Bit Values
------------------------------------------------*/
#define T0_M0_   0x01
#define T0_M1_   0x02
#define T0_CT_   0x04
#define T0_GATE_ 0x08
#define T1_M0_   0x10
#define T1_M1_   0x20
#define T1_CT_   0x40
#define T1_GATE_ 0x80

#define T1_MASK_ 0xF0
#define T0_MASK_ 0x0F

/*------------------------------------------------
P1 Bit Registers
------------------------------------------------*/
sbit P1_0 = 0x90;
sbit P1_1 = 0x91;
sbit P1_2 = 0x92;
sbit P1_3 = 0x93;
sbit P1_4 = 0x94;
sbit P1_5 = 0x95;
sbit P1_6 = 0x96;
sbit P1_7 = 0x97;

sbit T2   = 0x90;       /* External input to Timer/Counter 2, clock out */
sbit T2EX = 0x91;       /* Timer/Counter 2 capture/reload trigger & dir ctl */

/*------------------------------------------------
SCON Bit Registers
------------------------------------------------*/
sbit RI   = 0x98;
sbit TI   = 0x99;
sbit RB8  = 0x9A;
sbit TB8  = 0x9B;
sbit REN  = 0x9C;
sbit SM2  = 0x9D;
sbit SM1  = 0x9E;
sbit SM0  = 0x9F;

/*------------------------------------------------
P2 Bit Registers
------------------------------------------------*/
sbit P2_0 = 0xA0;
sbit P2_1 = 0xA1;
sbit P2_2 = 0xA2;
sbit P2_3 = 0xA3;
sbit P2_4 = 0xA4;
sbit P2_5 = 0xA5;
sbit P2_6 = 0xA6;
sbit P2_7 = 0xA7;

/*------------------------------------------------
IE Bit Registers
------------------------------------------------*/
sbit EX0  = 0xA8;       /* 1=Enable External interrupt 0 */
sbit ET0  = 0xA9;       /* 1=Enable Timer 0 interrupt */
sbit EX1  = 0xAA;       /* 1=Enable External interrupt 1 */
sbit ET1  = 0xAB;       /* 1=Enable Timer 1 interrupt */
sbit ES   = 0xAC;       /* 1=Enable Serial port interrupt */
sbit ET2  = 0xAD;       /* 1=Enable Timer 2 interrupt */

sbit EA   = 0xAF;       /* 0=Disable all interrupts */

/*------------------------------------------------
P3 Bit Registers (Mnemonics & Ports)
------------------------------------------------*/
sbit P3_0 = 0xB0;
sbit P3_1 = 0xB1;
sbit P3_2 = 0xB2;
sbit P3_3 = 0xB3;
sbit P3_4 = 0xB4;
sbit P3_5 = 0xB5;
sbit P3_6 = 0xB6;
sbit P3_7 = 0xB7;

sbit RXD  = 0xB0;       /* Serial data input */
sbit TXD  = 0xB1;       /* Serial data output */
sbit INT0 = 0xB2;       /* External interrupt 0 */
sbit INT1 = 0xB3;       /* External interrupt 1 */
sbit T0   = 0xB4;       /* Timer 0 external input */
sbit T1   = 0xB5;       /* Timer 1 external input */
sbit WR   = 0xB6;       /* External data memory write strobe */
sbit RD   = 0xB7;       /* External data memory read strobe */

/*------------------------------------------------
IP Bit Registers
------------------------------------------------*/
sbit PX0  = 0xB8;
sbit PT0  = 0xB9;
sbit PX1  = 0xBA;
sbit PT1  = 0xBB;
sbit PS   = 0xBC;
sbit PT2  = 0xBD;

/*------------------------------------------------
T2CON Bit Registers
------------------------------------------------*/
sbit CP_RL2= 0xC8;      /* 0=Reload, 1=Capture select */
sbit C_T2 = 0xC9;       /* 0=Timer, 1=Counter */
sbit TR2  = 0xCA;       /* 0=Stop timer, 1=Start timer */
sbit EXEN2= 0xCB;       /* Timer 2 external enable */
sbit TCLK = 0xCC;       /* 0=Serial clock uses Timer 1 overflow, 1=Timer 2 */
sbit RCLK = 0xCD;       /* 0=Serial clock uses Timer 1 overflow, 1=Timer 2 */
sbit EXF2 = 0xCE;       /* Timer 2 external flag */
sbit TF2  = 0xCF;       /* Timer 2 overflow flag */

/*------------------------------------------------
T2MOD Bit Values
------------------------------------------------*/
#define DCEN_   0x01    /* 1=Timer 2 can be configured as up/down counter */
#define T2OE_   0x02    /* Timer 2 output enable */

/*------------------------------------------------
PSW Bit Registers
------------------------------------------------*/
sbit P    = 0xD0;
sbit F1   = 0xD1;
sbit OV   = 0xD2;
sbit RS0  = 0xD3;
sbit RS1  = 0xD4;
sbit F0   = 0xD5;
sbit AC   = 0xD6;
sbit CY   = 0xD7;

/*------------------------------------------------
Interrupt Vectors:
Interrupt Address = (Number * 8) + 3
------------------------------------------------*/
#define IE0_VECTOR	0  /* 0x03 External Interrupt 0 */
#define TF0_VECTOR	1  /* 0x0B Timer 0 */
#define IE1_VECTOR	2  /* 0x13 External Interrupt 1 */
#define TF1_VECTOR	3  /* 0x1B Timer 1 */
#define SIO_VECTOR	4  /* 0x23 Serial port */

#define TF2_VECTOR	5  /* 0x2B Timer 2 */
#define EX2_VECTOR	5  /* 0x2B External Interrupt 2 */

#endif



  • 单个LED灯的闪烁
    #include<REGX52.H>
    
    void Delay(unsigned int number)	//@12.000MHz
    {
    	unsigned char data i, j;
    
    	while (number--)
    	{
    			i = 2;
    		j = 239;
    		do
    		{
    			while (--j);
    		} while (--i);
    	}
    }
    
    void main()
    {
    	while (1)
    	{
    		P2_0=0;
    		Delay(500);
    		P2_0=1;
    		Delay(500);
    	}
    	
    	
    }
    
     
  •  流水灯设计,软件定时器的使用
#include<REGX52.H>
#include<intrins.h>

void Delay(unsigned int number)	//@12.000MHz
{
	unsigned char data i, j, k;

	_nop_();
	_nop_();
	while(number--)
	{
			
			i = 5;
			j = 144;
			k = 71;
			do
			{
				do
				{
					while (--k);
				} while (--j);
			} while (--i);
	}
}
void main ()
{
	while (1)
	{
		P2=0xFE;
		Delay(500);
		P2=0xFD;
		Delay(500);
		P2=0xFB;
		Delay(500);
		P2=0xF7;
		Delay(500);
		P2=0xEF;
		Delay(500);
		P2=0xDF;
		Delay(500);
		P2=0xBF;
		Delay(500);
		P2=0x7F;
		Delay(500);	
	}

}
  • 延迟函数
  • void Delay(unsigned int number)	//@12.000MHz
    {
    	unsigned char data i, j;
    
    	while (number--)
    	{
    			i = 2;
    		j = 239;
    		do
    		{
    			while (--j);
    		} while (--i);
    	}
    }
  •  按键独立控制LED灯亮灭
  • #include<REGX52.H>
    void main ()
    {
    	if (P3_1==0)
    	{
    		P2_0=0;
    	}
    	else
    	{
    		P2_0=1;
    	}
    	while (1);//需要先初始化一次再按击K1键位
    }
    
    
    

    版本二

  • #include<REGX52.H>
    
    
    //时间延迟器(初始化 1  毫秒)(输入数据 转化为秒)
    void Delay(unsigned int number)	//@12.000MHz
    {
    	unsigned char data i, j;
    
    	while (number--)
    	{
    	    i = 2;
    		j = 239;
    		do
    		{
    			while (--j);
    		} while (--i);
    	}
    }
    
    void main()
    {
    	while (1)
    	{
    		if (P3_1==0)//判断按键K1 是否高电平
    		{
    			Delay(20);//时间延迟效果,(震荡波)
    			while(P3_1==0);//确定按键操作
    			Delay (20);
    			
    			P2_0=~P2_0;//按位取反,修改P2_0处的高低电平
    		}
    	}
    	
    	
    }
    

  • 按键控制左右移动
  • #include <REGX52.H>
    
    
    
    void Delay(unsigned int number)	//@12.000MHz
    {
    	unsigned char data i, j;
    
    	while (number --)
    	{
    		i = 2;
    		j = 239;
    		do
    		{
    			while (--j);
    		} while (--i);
    	}
    }
    
    unsigned char LEDNum=0;
    
    void main()
    {
        P2=~0x01;//初始化操作
    	while (1)
    	{
    		if (P3_1 == 0)
    		{
    			Delay(20);
    			while (P3_1 == 0);
    			Delay(20);
    			
    			LEDNum++;
    			if(LEDNum >= 8)//判断是否大于8 ?0:》越界处理
    			{
    				LEDNum = 0 ;
    			}
    			P2_0=~(0x01<<LEDNum);//实现二进制数据左移,比如(0x01)-( 0000 0001 )-> (0000 0010 );控制高低电平输出
    		}			
    	}
    	
    }

    左右移动

  • #include <REGX52.H>
    
    
    
    void Delay(unsigned int number)	//@12.000MHz
    {
    	unsigned char data i, j;
    
    	while (number --)
    	{
    		i = 2;
    		j = 239;
    		do
    		{
    			while (--j);
    		} while (--i);
    	}
    }
    
    unsigned char LEDNum=0;
    
    void main()
    {
    	P2=~0x01;
    	while (1)
    	{
    		if (P3_1 == 0)
    		{
    			Delay(20);
    			while (P3_1 == 0);
    			Delay(20);
    			
    			LEDNum++;
    			if(LEDNum >= 8)
    			{
    				LEDNum = 0 ;
    			}
    			P2_0=~(0x01<<LEDNum);
    		}	
    			if (P3_0 == 0)
    		{
    			Delay(20);
    			while (P3_0 == 0);
    			Delay(20);
    			
    			if(LEDNum == 0)
    				LEDNum = 7 ;
    			else 
    				LEDNum--;
    
    			P2_0=~(0x01<<LEDNum);
    		}	
    	}
    	
    }

  • 按键控制二进制显示
  • #include<REGX52.H>
    
    void Delay(unsigned int number)	//@12.000MHz
    {
    	unsigned char data i, j;
    	while (number--)
    	{
    		i = 2;
    		j = 239;
    		do
    		{
    			while (--j);
    		} while (--i);
    	}
    }
    void main()
    {
    	
    	unsigned char LEDNum=0;//自定义
    	while (1)
    	{
    		if (P3_1==0)
    		{
    			Delay(20);
    			while (P3_1==0);
    			Delay (20);
    			
    			LEDNum ++;//按位,转换为二进制()比如——( 0 ) -> 先进行加一操作(1)-- >  
    二进制转换( 0000  0001  ); 
    			P2_0=~LEDNum;//二进制取反操作( 0000 0001 )---> ( 1111 1110 )“控制电平高低”
    			
    		}
    		
    		
    	}
    	
    	
    }
    

  • 数码管显示
#include<REGX52.H>

unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//数码管段码表(还有--- > > 0x77  0x7C  0x39  0x5E  0x79  0x71  0x00(空) )

void Nixie(unsigned char Location ,unsigned char Number )
{
	
	switch (Location)
	{
		case 1:P2_4=1;P2_3=1;P2_2=1;break;
		case 2:P2_4=1;P2_3=1;P2_2=0;break;
		case 3:P2_4=1;P2_3=0;P2_2=1;break;
		case 4:P2_4=1;P2_3=0;P2_2=0;break;
		case 5:P2_4=0;P2_3=1;P2_2=1;break;
		case 6:P2_4=0;P2_3=1;P2_2=0;break;
		case 7:P2_4=0;P2_3=0;P2_2=1;break;
		case 8:P2_4=0;P2_3=0;P2_2=0;break;
	}
	P0=NixieTable[Number];
}

void main()
{
	Nixie(2,3);
	while(1);
	
}

 第二版本

#include<REGX52.H>

unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

void Delay(unsigned int number)	//@12.000MHz
{
	unsigned char data i, j;

	while(number--)
	{
			i = 2;
			j = 239;
			do
			{
				while (--j);
			} while (--i);
	}
}


void Nixie(unsigned char Location ,unsigned char Number )
{
	
	switch (Location)
	{
		case 1:P2_4=1;P2_3=1;P2_2=1;break;
		case 2:P2_4=1;P2_3=1;P2_2=0;break;
		case 3:P2_4=1;P2_3=0;P2_2=1;break;
		case 4:P2_4=1;P2_3=0;P2_2=0;break;
		case 5:P2_4=0;P2_3=1;P2_2=1;break;
		case 6:P2_4=0;P2_3=1;P2_2=0;break;
		case 7:P2_4=0;P2_3=0;P2_2=1;break;
		case 8:P2_4=0;P2_3=0;P2_2=0;break;
	}
	P0=NixieTable[Number];
}

void main()
{
	while(1)
	{
		Nixie(1,1);
		Delay(20);
		Nixie(2,2);
		Delay(20);
		Nixie(3,3);
		Delay(20);
		Nixie(4,4);
		Delay(20);
		Nixie(5,5);
		Delay(20);
	}
	
}

版本三

#include<REGX52.H>

unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

void Delay(unsigned int number)	//@12.000MHz
{
	unsigned char data i, j;

	while(number--)
	{
			i = 2;
			j = 239;
			do
			{
				while (--j);
			} while (--i);
	}
}


void Nixie(unsigned char Location ,unsigned char Number )
{
	
	switch (Location)
	{
		case 1:P2_4=1;P2_3=1;P2_2=1;break;
		case 2:P2_4=1;P2_3=1;P2_2=0;break;
		case 3:P2_4=1;P2_3=0;P2_2=1;break;
		case 4:P2_4=1;P2_3=0;P2_2=0;break;
		case 5:P2_4=0;P2_3=1;P2_2=1;break;
		case 6:P2_4=0;P2_3=1;P2_2=0;break;
		case 7:P2_4=0;P2_3=0;P2_2=1;break;
		case 8:P2_4=0;P2_3=0;P2_2=0;break;
	}
	P0=NixieTable[Number];
	Delay (1);
	P2=0x00;
}

void main()
{
	while(1)
	{
		Nixie(1,1);
		Delay(20);
		Nixie(2,2);
		Delay(20);
		Nixie(3,3);
		Delay(20);
		Nixie(4,4);
		Delay(20);
		Nixie(5,5);
		Delay(20);
	}
	
}

  • 16
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值