51单片机实验课代码(简单版)

流水灯

/*****************************************************************
*
*头文件添加区
*
******************************************************************/
#include<STC12C5A60S2.h>

/*****************************************************************
*
*引脚定义区
*
******************************************************************/
sbit LED1 = P2^4;
sbit LED2 = P2^5;
sbit LED3 = P2^6;
sbit LED4 = P2^7;
sbit P1_0 = P1^0;

/*****************************************************************
*
*变量声明区
*
******************************************************************/
unsigned long int i;

/*****************************************************************
*
*函数定义区
*
******************************************************************/


//第一题
void fun1()
{
for(i = 0;i<80000;i++);
LED1 = 0;				 //设置LED1点亮  低电平有效
LED2 = 1;
LED3 = 1;
LED4 = 1;
for(i = 0;i<80000;i++);
LED1 = 1;
LED2 = 0;				 //设置LED2点亮
LED3 = 1;
LED4 = 1;
for(i = 0;i<80000;i++);
LED1 = 1;
LED2 = 1;
LED3 = 0;				  //设置LED3点亮
LED4 = 1;
for(i = 0;i<80000;i++);
LED1 = 1;
LED2 = 1;
LED3 = 1;
LED4 = 0;			  //设置LED4点亮
}


//第二题
void fun2()
{
for(i = 0;i<50000;i++);
LED1 = 0;				//设置LED1点亮
LED2 = 1;
LED3 = 1;
LED4 = 1;
for(i = 0;i<50000;i++);
LED1 = 0;				//设置LED1点亮
LED2 = 0;				//设置LED2点亮
LED3 = 1;
LED4 = 1;
for(i = 0;i<50000;i++);
LED1 = 0;				//设置LED1点亮
LED2 = 0;				//设置LED2点亮
LED3 = 0;				//设置LED3点亮
LED4 = 1;
for(i = 0;i<50000;i++);
LED1 = 0;				//设置LED1点亮
LED2 = 0;				//设置LED2点亮
LED3 = 0;				//设置LED3点亮
LED4 = 0;				//设置LED4点亮
for(i = 0;i<50000;i++);
LED1 = 1;
LED2 = 1;
LED3 = 1;
LED4 = 1;
}



//第三题
void fun3()
{
for(i = 0;i<50000;i++);
P1_0 = 0x01;			//启动蜂鸣器
LED1 = 1;				//设置LED1点亮
LED2 = 0;       
LED3 = 0;
LED4 = 0;
for(i = 0;i<50000;i++); 
P1_0 = 0x00;			//关闭蜂鸣器
LED1 = 0;
LED2 = 1;				//设置LED2点亮
LED3 = 0;
LED4 = 0;
for(i = 0;i<50000;i++); 
P1_0 = 0x01;			//启动蜂鸣器
LED1 = 0;
LED2 = 0;
LED3 = 1;				//设置LED3点亮
LED4 = 0;
for(i = 0;i<50000;i++) ;
P1_0 = 0x00;		   //关闭蜂鸣器
LED1 = 0;
LED2 = 0;
LED3 = 0;
LED4 = 1;				//设置LED4点亮
}


//主函数
void main()
{
P1_0 = 0x00;//设置P1.0为推挽输出
while(1)
{
fun1();
//fun2();
//fun3();
}
}

数码管

#include"STC12C5A60S2.h"
// 定义KEY引脚
sbit KEY1 = P3^2;    //P要大写
sbit KEY2 = P3^4;
//定义 4个计数器
sbit P2_0 = P2^0;   //计数器1   低电平有效
sbit P2_1 = P2^1;   //计数器2
sbit P2_2 = P2^2;   //计数器3
sbit P2_3 = P2^3;   //计数器3
//定义8个LED管脚
sbit P0_7 = P0^7;//管脚A     低电平点亮
sbit P0_6 = P0^6;//管脚B
sbit P0_5 = P0^5;//管脚C
sbit P0_4 = P0^4;//管脚D
sbit P0_3 = P0^3;//管脚E
sbit P0_2 = P0^2;//管脚F
sbit P0_1 = P0^1;//管脚G
sbit P0_0 = P0^0;//管脚H
//定义蜂鸣器
sbit P1_0 = P1^0;




void main()
{
	int i;
	unsigned long int j;
	P1_0 = 0x00;  //让蜂鸣器闭嘴
	P0 = 0xFF;    //管脚全部点亮
	
	P2_0 = 0; //四个计数器全部拉低使能
	P2_1 = 0;
	P2_2 = 0;
	P2_3 = 0;
	i = 0;
	while(1)
	{
		
//NO.1		
		
/*		
if(KEY1 == 0) //按键按下为0,显示  弹起为1,不显示
{		
if(i==0)
{
	//显示0
 P0_7 = 0;  //点亮
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 0;
 P0_3 = 0;
 P0_2 = 0;
 P0_1 = 1;  //熄灭
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}
else if(i == 1)
{
	//显示1
 P0_7 = 1;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 1;
 P0_3 = 1;
 P0_2 = 1;
 P0_1 = 1;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}
else if(i == 2)
{
	//显示2
 P0_7 = 0;  
 P0_6 = 0;
 P0_5 = 1;
 P0_4 = 0;
 P0_3 = 0;
 P0_2 = 1;
 P0_1 = 0;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}
else if(i == 3)
{
		//显示3
 P0_7 = 0;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 0;
 P0_3 = 1;
 P0_2 = 1;
 P0_1 = 0;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}
else if(i == 4)
{
	//显示4
 P0_7 = 1;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 1;
 P0_3 = 1;
 P0_2 = 0;
 P0_1 = 0;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}else if(i==5)
{
	//显示5
 P0_7 = 0;  
 P0_6 = 1;
 P0_5 = 0;
 P0_4 = 0;
 P0_3 = 1;
 P0_2 = 0;
 P0_1 = 0;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}else if(i == 6)
{
	//显示6
 P0_7 = 0;  
 P0_6 = 1;
 P0_5 = 0;
 P0_4 = 0;
 P0_3 = 0;
 P0_2 = 0;
 P0_1 = 0;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}else if(i == 7)
{
 P0_7 = 0;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 1;
 P0_3 = 1;
 P0_2 = 1;
 P0_1 = 1;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
	
}else if(i == 8)
{
 P0_7 = 0;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 0;
 P0_3 = 0;
 P0_2 = 0;
 P0_1 = 0;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}else if(i == 9)
{
 P0_7 = 0;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 1;
 P0_3 = 1;
 P0_2 = 0;
 P0_1 = 0;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i = 0;
}

}*/


/******************************************/

//NO.2

if(KEY1==0 && KEY2 == 0)
{
	P2_0 = 0; //只使能第一个计数器
	P2_1 = 1;
	P2_2 = 1;
	P2_3 = 1;

		if(i==0)
{
	//显示0
 P0_7 = 0;  //点亮
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 0;
 P0_3 = 0;
 P0_2 = 0;
 P0_1 = 1;  //熄灭
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}
else if(i == 1)
{
	//显示1
 P0_7 = 1;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 1;
 P0_3 = 1;
 P0_2 = 1;
 P0_1 = 1;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}
else if(i == 2)
{
	//显示2
 P0_7 = 0;  
 P0_6 = 0;
 P0_5 = 1;
 P0_4 = 0;
 P0_3 = 0;
 P0_2 = 1;
 P0_1 = 0;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}
else if(i == 3)
{
		//显示3
 P0_7 = 0;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 0;
 P0_3 = 1;
 P0_2 = 1;
 P0_1 = 0;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}
else if(i == 4)
{
	//显示4
 P0_7 = 1;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 1;
 P0_3 = 1;
 P0_2 = 0;
 P0_1 = 0;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}else if(i==5)
{
	//显示5
 P0_7 = 0;  
 P0_6 = 1;
 P0_5 = 0;
 P0_4 = 0;
 P0_3 = 1;
 P0_2 = 0;
 P0_1 = 0;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}else if(i == 6)
{
	//显示6
 P0_7 = 0;  
 P0_6 = 1;
 P0_5 = 0;
 P0_4 = 0;
 P0_3 = 0;
 P0_2 = 0;
 P0_1 = 0;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}else if(i == 7)
{
 P0_7 = 0;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 1;
 P0_3 = 1;
 P0_2 = 1;
 P0_1 = 1;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
	
}else if(i == 8)
{
 P0_7 = 0;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 0;
 P0_3 = 0;
 P0_2 = 0;
 P0_1 = 0;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}else if(i == 9)
{
 P0_7 = 0;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 1;
 P0_3 = 1;
 P0_2 = 0;
 P0_1 = 0;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i = 0;
}
	
}
else if(KEY1==0 && KEY2 == 1)
{
	P2_0 = 1; //只使能第二个计数器
	P2_1 = 0;
	P2_2 = 1;
	P2_3 = 1;
	
	if(i==0)
{
	//显示0
 P0_7 = 0;  //点亮
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 0;
 P0_3 = 0;
 P0_2 = 0;
 P0_1 = 1;  //熄灭
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}
else if(i == 1)
{
	//显示1
 P0_7 = 1;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 1;
 P0_3 = 1;
 P0_2 = 1;
 P0_1 = 1;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}
else if(i == 2)
{
	//显示2
 P0_7 = 0;  
 P0_6 = 0;
 P0_5 = 1;
 P0_4 = 0;
 P0_3 = 0;
 P0_2 = 1;
 P0_1 = 0;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}
else if(i == 3)
{
		//显示3
 P0_7 = 0;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 0;
 P0_3 = 1;
 P0_2 = 1;
 P0_1 = 0;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}
else if(i == 4)
{
	//显示4
 P0_7 = 1;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 1;
 P0_3 = 1;
 P0_2 = 0;
 P0_1 = 0;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}else if(i==5)
{
	//显示5
 P0_7 = 0;  
 P0_6 = 1;
 P0_5 = 0;
 P0_4 = 0;
 P0_3 = 1;
 P0_2 = 0;
 P0_1 = 0;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}else if(i == 6)
{
	//显示6
 P0_7 = 0;  
 P0_6 = 1;
 P0_5 = 0;
 P0_4 = 0;
 P0_3 = 0;
 P0_2 = 0;
 P0_1 = 0;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}else if(i == 7)
{
 P0_7 = 0;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 1;
 P0_3 = 1;
 P0_2 = 1;
 P0_1 = 1;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
	
}else if(i == 8)
{
 P0_7 = 0;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 0;
 P0_3 = 0;
 P0_2 = 0;
 P0_1 = 0;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}else if(i == 9)
{
 P0_7 = 0;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 1;
 P0_3 = 1;
 P0_2 = 0;
 P0_1 = 0;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i = 0;
}
}
else if(KEY1==1 && KEY2 == 0)
{
	P2_0 = 1; //只使能第三个计数器
	P2_1 = 1;
	P2_2 = 0;
	P2_3 = 1;

	if(i==0)
{
	//显示0
 P0_7 = 0;  //点亮
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 0;
 P0_3 = 0;
 P0_2 = 0;
 P0_1 = 1;  //熄灭
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}
else if(i == 1)
{
	//显示1
 P0_7 = 1;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 1;
 P0_3 = 1;
 P0_2 = 1;
 P0_1 = 1;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}
else if(i == 2)
{
	//显示2
 P0_7 = 0;  
 P0_6 = 0;
 P0_5 = 1;
 P0_4 = 0;
 P0_3 = 0;
 P0_2 = 1;
 P0_1 = 0;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}
else if(i == 3)
{
		//显示3
 P0_7 = 0;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 0;
 P0_3 = 1;
 P0_2 = 1;
 P0_1 = 0;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}
else if(i == 4)
{
	//显示4
 P0_7 = 1;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 1;
 P0_3 = 1;
 P0_2 = 0;
 P0_1 = 0;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}else if(i==5)
{
	//显示5
 P0_7 = 0;  
 P0_6 = 1;
 P0_5 = 0;
 P0_4 = 0;
 P0_3 = 1;
 P0_2 = 0;
 P0_1 = 0;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}else if(i == 6)
{
	//显示6
 P0_7 = 0;  
 P0_6 = 1;
 P0_5 = 0;
 P0_4 = 0;
 P0_3 = 0;
 P0_2 = 0;
 P0_1 = 0;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}else if(i == 7)
{
 P0_7 = 0;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 1;
 P0_3 = 1;
 P0_2 = 1;
 P0_1 = 1;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
	
}else if(i == 8)
{
 P0_7 = 0;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 0;
 P0_3 = 0;
 P0_2 = 0;
 P0_1 = 0;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}else if(i == 9)
{
 P0_7 = 0;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 1;
 P0_3 = 1;
 P0_2 = 0;
 P0_1 = 0;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i = 0;
}
}
else if(KEY1==1 && KEY2 == 1)
{
	P2_0 = 1; //只使能第四个计数器
	P2_1 = 1;
	P2_2 = 1;
	P2_3 = 0;
if(i==0)
{
	//显示0
 P0_7 = 0;  //点亮
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 0;
 P0_3 = 0;
 P0_2 = 0;
 P0_1 = 1;  //熄灭
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}
else if(i == 1)
{
	//显示1
 P0_7 = 1;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 1;
 P0_3 = 1;
 P0_2 = 1;
 P0_1 = 1;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}
else if(i == 2)
{
	//显示2
 P0_7 = 0;  
 P0_6 = 0;
 P0_5 = 1;
 P0_4 = 0;
 P0_3 = 0;
 P0_2 = 1;
 P0_1 = 0;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}
else if(i == 3)
{
		//显示3
 P0_7 = 0;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 0;
 P0_3 = 1;
 P0_2 = 1;
 P0_1 = 0;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}
else if(i == 4)
{
	//显示4
 P0_7 = 1;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 1;
 P0_3 = 1;
 P0_2 = 0;
 P0_1 = 0;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}else if(i==5)
{
	//显示5
 P0_7 = 0;  
 P0_6 = 1;
 P0_5 = 0;
 P0_4 = 0;
 P0_3 = 1;
 P0_2 = 0;
 P0_1 = 0;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}else if(i == 6)
{
	//显示6
 P0_7 = 0;  
 P0_6 = 1;
 P0_5 = 0;
 P0_4 = 0;
 P0_3 = 0;
 P0_2 = 0;
 P0_1 = 0;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}else if(i == 7)
{
 P0_7 = 0;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 1;
 P0_3 = 1;
 P0_2 = 1;
 P0_1 = 1;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
	
}else if(i == 8)
{
 P0_7 = 0;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 0;
 P0_3 = 0;
 P0_2 = 0;
 P0_1 = 0;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i++;
}else if(i == 9)
{
 P0_7 = 0;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 1;
 P0_3 = 1;
 P0_2 = 0;
 P0_1 = 0;  
 P0_0 = 1;
 for(j=0;j<60000;j++); //延迟
	i = 0;
}
}

}

}

按键散转

;***************************************************************
;  引脚定义
;***************************************************************
LED1 BIT P2.4
LED2 BIT P2.5
LED3 BIT P2.6
LED4 BIT P2.7

KEY1 BIT P3^2;    //P要大写

KEY1_STATE EQU 69H
DelayTimes_100MS EQU 6FH 
;***************************************************************
;  全灭
;***************************************************************
CLR LED1
CLR LED2
CLR LED3
CLR LED4


;*******************************************************************
;--主程序-----
;*******************************************************************
ORG 0000H                                   ; 定义起始地址,程序将从此处开始运行 
LJMP START                                   ; 长跳转,跳转到标号"START";P1M0 = 0x01
ORG 0100H                                    ; 定义START程序的地址 
START:
     MOV SP,#70H                          ;设置堆栈,堆栈空间从70H到7FH,共16个字节 
     MOV A,#00H
     MOV KEY1_STATE,A 
START1:
        LCALL LEDRUN                       ; 调用跑马灯程序 
 
        LJMP START1                         ; 跳转回START1,重新执行以上程序 
                                            ; 相当于C语言中的while(1)的功能 



;*******************************************************************
;--子程序-----
;*******************************************************************
 LEDRUN:
    JNB KEY1,KEY_PROCESS_1               
 RET   ;

;--------------------------------------------------------------------
;
;
;--------------------------------------------------------------------
    KEY_PROCESS_1 :

                JB KEY1,KEY_PROCESS_2
      
    KEY_PROCESS_2 :
                
                
                ;--散转 
                MOV A,KEY1_STATE
                RL A
                ADD A,KEY1_STATE
                MOV DPTR,#KEY1_Flash
                JMP @A + DPTR
                KEY1_Flash :
                LJMP  KEY1_Flash0
                LJMP  KEY1_Flash1
                LJMP  KEY1_Flash2
                LJMP  KEY1_Flash3
                LJMP  KEY1_Flash4

KEY1_Flash0:
    SETB LED1
    CLR LED2
    CLR LED3
    CLR LED4  
MOV A,#01H
ADD A,KEY1_STATE
MOV KEY1_STATE,A
MOV DelayTimes_100MS,#10         ;设置需要延时多少个100MS 
LCALL Delay100MS                        ; 调用延时100MS子程序 
LJMP LEDRUN
KEY1_Flash1:
CLR LED1
SETB LED2
CLR LED3
CLR LED4
MOV A,#01H
ADD A,KEY1_STATE
MOV KEY1_STATE,A
MOV DelayTimes_100MS,#10         ;设置需要延时多少个100MS 
LCALL Delay100MS                        ; 调用延时100MS子程序  
LJMP LEDRUN
KEY1_Flash2:
CLR LED1
CLR LED2
SETB LED3
CLR LED4
MOV A,#01H
ADD A,KEY1_STATE
MOV KEY1_STATE,A
MOV DelayTimes_100MS,#10         ;设置需要延时多少个100MS 
LCALL Delay100MS                        ; 调用延时100MS子程序  
LJMP LEDRUN
KEY1_Flash3:
CLR LED1
CLR LED2
CLR LED3
SETB LED4
MOV A,#01H
ADD A,KEY1_STATE
MOV KEY1_STATE,A  
MOV DelayTimes_100MS,#10         ;设置需要延时多少个100MS 
LCALL Delay100MS                        ; 调用延时100MS子程序
LJMP LEDRUN
KEY1_Flash4:
SETB LED1
SETB LED2
CLR LED3
CLR LED4 
MOV A,#01H
ADD A,KEY1_STATE
MOV KEY1_STATE,A
MOV KEY1_STATE,00H
MOV DelayTimes_100MS,#10         ;设置需要延时多少个100MS 
LCALL Delay100MS                        ; 调用延时100MS子程序 
LJMP LEDRUN


Delay100MS:                
       		MOV R7,DelayTimes_100MS  
                
Delay100MS_1:        MOV R6,#10
Delay100MS_2:        MOV R5,#150
Delay100MS_3:        MOV R4,#200
Delay100MS_4:        DJNZ R4, Delay100MS_4
                                DJNZ R5, Delay100MS_3
                                DJNZ R6, Delay100MS_2
                                DJNZ R7, Delay100MS_1
RET                        ;子程序返回

END   

外部中断(C语言)


#include <STC12C5A60S2.h>

sbit P1_0 = P1^0; 


void configExtInt0();	//外部中断0对应引脚P3^2
void configExtInt1();	//外部中断1对应引脚P3^3
 

void main() {
	P1_0 = 0;
	configExtInt0();
	configExtInt1();
	
    while (1);
}
 
void configExtInt0() {
	IT0 = 1;	//选择为下降沿触发方式(为1代表下降沿触发,为0代表低电平触发)
	EA = 1;  	//使能总中断
	EX0 = 1;	//使能外部中断0	
}
 
void configExtInt1() {
	IT1 = 1;  	//选择为下降沿触发方式    //将1改为0即低电平触发
	EA = 1;  	//使能总中断
	EX1 = 1;	//使能外部中断1	
}
//外部中断0中断服务函数
void extInt0ISR() interrupt 0 {
	unsigned long int i;
  P1_0 = 1;
for(i = 0;i<50000;i++);	
	P1_0 = 0;
for(i = 0;i<50000;i++);	
	P1_0 = 1;
for(i = 0;i<50000;i++);	
	P1_0 = 0;
for(i = 0;i<50000;i++);	
	P1_0 = 1;
for(i = 0;i<50000;i++);	
  P1_0 = 0;
	
}                      
//外部中断1中断服务函数
void extInt1ISR() interrupt 2 {
}

外部中断(汇编版)

;***************************************************************
;  引脚定义
;***************************************************************
LED1 BIT P2.4
LED2 BIT P2.5
LED3 BIT P2.6
LED4 BIT P2.7
BEEP BIT P1.0
KEY1 BIT P3^2;    //P要大写

KEY1_STATE EQU 69H
DelayTimes_100MS EQU 6FH 


;*******************************************************************
;--主程序-----
;*******************************************************************
ORG 0000H                                   ; 定义起始地址,程序将从此处开始运行 
LJMP START                                   ; 长跳转,跳转到标号"START"处 
ORG 0003H
LJMP INT0_ISR


ORG 0100H                                    ; 定义START程序的地址 
START:
     MOV SP,#70H                          ;设置堆栈,堆栈空间从70H到7FH,共16个字节 
     MOV A,#00H
     MOV KEY1_STATE,A 
START1:
        LCALL LEDRUN                       ; 调用跑马灯程序 
        CLR BEEP
        SETB IT0
        SETB PX0
        SETB EX0
        SETB EA
        LJMP START1                         ; 跳转回START1,重新执行以上程序 
LEDRUN:
    
    

    SETB LED1
    CLR LED2
    CLR LED3
    CLR LED4  

    MOV DelayTimes_100MS,#10         ;设置需要延时多少个100MS 
    LCALL Delay100MS                        ; 调用延时100MS子程序 
    
    CLR LED1
    SETB LED2
    CLR LED3
    CLR LED4

    MOV DelayTimes_100MS,#10         ;设置需要延时多少个100MS 
    LCALL Delay100MS                        ; 调用延时100MS子程序  
    
    CLR LED1
    CLR LED2
    SETB LED3
    CLR LED4

    MOV DelayTimes_100MS,#10         ;设置需要延时多少个100MS 
    LCALL Delay100MS                        ; 调用延时100MS子程序  
    
    CLR LED1
    CLR LED2
    CLR LED3
    SETB LED4
 
    MOV DelayTimes_100MS,#10         ;设置需要延时多少个100MS 
    LCALL Delay100MS                        ; 调用延时100MS子程序
    
                  
 RET   ;                                            ; 相当于C语言中的while(1)的功能 


INT0_ISR:
    
    PUSH PSW  //执行中断保护现场
    PUSH ACC
    SETB RS0
    CLR  RS1

    SETB BEEP
    MOV DelayTimes_100MS,#10         ;设置需要延时多少个100MS 
    LCALL Delay100MS
    CLR BEEP                        ; 调用延时100MS子程序 
    MOV DelayTimes_100MS,#10         ;设置需要延时多少个100MS 
    LCALL Delay100MS
   
    SETB BEEP
    MOV DelayTimes_100MS,#10         ;设置需要延时多少个100MS 
    LCALL Delay100MS
    CLR BEEP                        ; 调用延时100MS子程序 
    MOV DelayTimes_100MS,#10         ;设置需要延时多少个100MS 
    LCALL Delay100MS

    SETB BEEP
    MOV DelayTimes_100MS,#10         ;设置需要延时多少个100MS 
    LCALL Delay100MS
    CLR BEEP                        ; 调用延时100MS子程序 
    MOV DelayTimes_100MS,#10         ;设置需要延时多少个100MS 
    LCALL Delay100MS

    POP ACC
    POP PSW

RETI


Delay100MS:                
       		MOV R7,DelayTimes_100MS  
                
Delay100MS_1:        MOV R6,#10
Delay100MS_2:        MOV R5,#150
Delay100MS_3:        MOV R4,#200
Delay100MS_4:        DJNZ R4, Delay100MS_4
                                DJNZ R5, Delay100MS_3
                                DJNZ R6, Delay100MS_2
                                DJNZ R7, Delay100MS_1
RET                        ;子程序返回

END   

定时器

/*****************************************************************
*
*头文件添加区
*
******************************************************************/


#include<STC12C5A60S2.h>


/*****************************************************************
*
*引脚定义区
*
******************************************************************/

//定义LED管
sbit LED1 = P2^4;
sbit LED2 = P2^5;
sbit LED3 = P2^6;
sbit LED4 = P2^7;
//蜂鸣器
sbit P1_0 = P1^0;
//定义 4个计数器
sbit P2_0 = P2^0;   //计数器1   低电平有效
sbit P2_1 = P2^1;   //计数器2
sbit P2_2 = P2^2;   //计数器3
sbit P2_3 = P2^3;   //计数器3
//定义8个LED管脚
sbit P0_7 = P0^7;//管脚A     低电平点亮
sbit P0_6 = P0^6;//管脚B
sbit P0_5 = P0^5;//管脚C
sbit P0_4 = P0^4;//管脚D
sbit P0_3 = P0^3;//管脚E
sbit P0_2 = P0^2;//管脚F
sbit P0_1 = P0^1;//管脚G
sbit P0_0 = P0^0;//管脚H

/*****************************************************************
*
*变量声明区
*
******************************************************************/

//全局变量
int k = 0;
int one_second_count = 1;

/*****************************************************************
*
*函数定义区
*
******************************************************************/
//延时10ms函数
void delay_10ms(unsigned long int n) 
{ 
unsigned long int i;
unsigned long int j;
n = 10*n;
for(i = 0;i<n;k++)
{	
 for(j=0;j<144;j++); 
}
}

//一秒钟执行函数
void One_Second_Project ()
{
	if(k==0)
{
	//显示0
 P0_7 = 0;  //点亮
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 0;
 P0_3 = 0;
 P0_2 = 0;
 P0_1 = 1;  //熄灭
 P0_0 = 1;

	k++;
}
else if(k == 1)
{
	//显示1
 P0_7 = 1;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 1;
 P0_3 = 1;
 P0_2 = 1;
 P0_1 = 1;  
 P0_0 = 1;

	k++;
}
else if(k == 2)
{
	//显示2
 P0_7 = 0;  
 P0_6 = 0;
 P0_5 = 1;
 P0_4 = 0;
 P0_3 = 0;
 P0_2 = 1;
 P0_1 = 0;  
 P0_0 = 1;

	k++;
}
else if(k == 3)
{
		//显示3
 P0_7 = 0;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 0;
 P0_3 = 1;
 P0_2 = 1;
 P0_1 = 0;  
 P0_0 = 1;

	k++;
}
else if(k == 4)
{
	//显示4
 P0_7 = 1;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 1;
 P0_3 = 1;
 P0_2 = 0;
 P0_1 = 0;  
 P0_0 = 1;

	k++;
}else if(k==5)
{
	//显示5
 P0_7 = 0;  
 P0_6 = 1;
 P0_5 = 0;
 P0_4 = 0;
 P0_3 = 1;
 P0_2 = 0;
 P0_1 = 0;  
 P0_0 = 1;

	k++;
}else if(k == 6)
{
	//显示6
 P0_7 = 0;  
 P0_6 = 1;
 P0_5 = 0;
 P0_4 = 0;
 P0_3 = 0;
 P0_2 = 0;
 P0_1 = 0;  
 P0_0 = 1;

	k++;
}else if(k == 7)
{
 P0_7 = 0;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 1;
 P0_3 = 1;
 P0_2 = 1;
 P0_1 = 1;  
 P0_0 = 1;

	k++;
	
}else if(k == 8)
{
 P0_7 = 0;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 0;
 P0_3 = 0;
 P0_2 = 0;
 P0_1 = 0;  
 P0_0 = 1;

	k++;
}else if(k == 9)
{
 P0_7 = 0;  
 P0_6 = 0;
 P0_5 = 0;
 P0_4 = 1;
 P0_3 = 1;
 P0_2 = 0;
 P0_1 = 0;  
 P0_0 = 1;

	k = 0;
}
}


// 定时器中断函数
void Timer0() interrupt 1
{
  if( 1000 == one_second_count)
	{
		one_second_count = 1;
		One_Second_Project ();
	}
	else
	{
		one_second_count++;
	}

}



//定时器0初始化设置
void Timer0Init(void)		//1毫秒@11.0592MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0xCD;		//设置定时初值
	TH0 = 0xD4;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	EA = 1; //全局中断打开
  ET0 = 1; //定时器0中断打开
}



// 主函数

void main()
{
P1_0 = 0;
	
//定时器完成跑马灯	
/*while(1)
{	
delay_10ms(100);
LED1 = 0;				 //设置LED1点亮  低电平有效
LED2 = 1;
LED3 = 1;
LED4 = 1;
delay_10ms(100);
LED1 = 1;
LED2 = 0;				 //设置LED2点亮
LED3 = 1;
LED4 = 1;
delay_10ms(100);
LED1 = 1;
LED2 = 1;
LED3 = 0;				  //设置LED3点亮
LED4 = 1;
delay_10ms(100);
LED1 = 1;
LED2 = 1;
LED3 = 1;
LED4 = 0;
}*/


//定时器中断初始化
Timer0Init();


P2_0 = 0;
while(1)
{

}


}

中断嵌套

/*****************************************************************
*
*头文件添加区
*
******************************************************************/
#include<STC12C5A60S2.h>

/*****************************************************************
*
*引脚定义区
*
******************************************************************/

//定义LED管
sbit LED1 = P2^4;
sbit LED2 = P2^5;
sbit LED3 = P2^6;
sbit LED4 = P2^7;

//定义8个LED管脚
sbit P0_7 = P0^7;//管脚A     低电平点亮
sbit P0_6 = P0^6;//管脚B
sbit P0_5 = P0^5;//管脚C
sbit P0_4 = P0^4;//管脚D
sbit P0_3 = P0^3;//管脚E
sbit P0_2 = P0^2;//管脚F
sbit P0_1 = P0^1;//管脚G
sbit P0_0 = P0^0;//管脚H

//蜂鸣器
sbit P1_0 = P1^0;
/*****************************************************************
*
*变量声明区
*
******************************************************************/

//全局变量
int k = 0;
int one_second_count = 1;


/*****************************************************************
*
*函数定义区
*
******************************************************************/


//一秒钟执行函数
void One_Second_Project ()
{
	switch (k)
	{
		case 0: 
		{
			LED1 = 0;				 //设置LED1点亮  低电平有效
			LED2 = 1;
			LED3 = 1;
			LED4 = 1;
			k++;
		}
		break;
		case 1: 
		{
			LED1 = 1;				 //设置LED1点亮  低电平有效
			LED2 = 0;
			LED3 = 1;
			LED4 = 1;			
			k++;
		}
		break;
		case 2: 
		{
			LED1 = 1;				 //设置LED1点亮  低电平有效
			LED2 = 1;
			LED3 = 0;
			LED4 = 1;			
			k++;
		}
		break;
		case 3: 
		{
			LED1 = 1;				 //设置LED1点亮  低电平有效
			LED2 = 1;
			LED3 = 1;
			LED4 = 0;			
			k = 0;
		}
		break;
		default: k = 0;
		break;
		
	}
}

// 定时器中断函数
void Timer0() interrupt 1
{
	TL0 = 0xCD;		//设置定时初值
	TH0 = 0xD4;		//设置定时初值
  if( 1000 == one_second_count)
	{
		one_second_count = 1;
		One_Second_Project ();
	}
	else
	{
		one_second_count++;
	}

}

//外部中断0中断服务函数
void extInt0ISR() interrupt 0
{
	unsigned long int i;
  P1_0 = 1;
for(i = 0;i<50000;i++);	
	P1_0 = 0;
for(i = 0;i<50000;i++);	
	P1_0 = 1;
for(i = 0;i<50000;i++);	
	P1_0 = 0;

} 


//定时器0初始化设置
void Timer0Init(void)		//1毫秒@11.0592MHz
{
	AUXR |= 0x80;	//定时器时钟1T模式
	TMOD &= 0xF0;	//设置定时器模式
	TL0 = 0xCD;		//设置定时初值
	TH0 = 0xD4;		//设置定时初值
	TF0 = 0;		  //清除TF0标志
	TR0 = 1;		  //定时器0开始计时
	EA = 1;       //全局中断打开
    ET0 = 1;      //定时器0中断打开
}

//外部中断初始化设置
void ExtInt0Init() 
{
	IT0 = 0;	//(1代表下降沿触发,为0代表低电平触发)
	EA = 1;  	//使能总中断
	EX0 = 1;	//使能外部中断0	
}

//中断优先级配置
void Interrupt_priority()
{
	PX0 = 0;//外部中断0 INT0'优先级控制设置为高优先级
	PT0 = 0;//定时器0优先级设置设置为低优先级
}



//主函数
void main()
{
	P1_0 = 0;//让蜂鸣器闭嘴
	Timer0Init();
	ExtInt0Init();
	Interrupt_priority();
	while(1)
	{
		
	}
}

串口单字节发送接收

 /*****************************************************************
*
*头文件添加区
*
******************************************************************/
#include<STC12C5A60S2.h>

/*****************************************************************
*
*变量定义区
*
******************************************************************/

  long int i;
 /*****************************************************************
*
*函数定义区
*
******************************************************************/

void Init()
{
  REN = 1;         //允许接受控制位
  SM0 = 0; SM1 = 1;   //UART方式1
  TR1 = 1;
  TMOD = 0X20;   //定时器1方式2
  TH1 = 0XFD;
  TL1 = 0XFD;
  EA = 1;
  ES = 1;
}

void UART1_Send_ISR()
{
  SBUF = i;
}

void UART1_Recv_ISR()
{
   i = SBUF;
}




void main()
{  
  Init();
  while(1);
}


 void UART1_ISR()interrupt 4    
{
    if(TI == 1)
    {    
      TI = 0;
    }  
    else if (RI == 1)
    {
      UART1_Recv_ISR();
      UART1_Send_ISR(); 
      RI = 0;
    }     
}
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鄢广杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值