普中51单片机学习

单片机开发

教程来自bilibili 江协科技

1.开发工具软件安装

https://pan.baidu.com/s/1vDTN2o8ffvczzNQGfyjHng?pwd=gdzf
链接里压缩包的解压密码:51 ,如果打不开请复制链接到浏览器再打开

Keil普中51单片机学习_第1张图片

在D盘中建立一个文件夹Keil防止文件散落。
安装完成之后以管理员身份运行Keil

普中51单片机学习_第2张图片

随便填写下一步即可。

普中51单片机学习_第3张图片

点击这个按钮复制CID

普中51单片机学习_第4张图片

粘贴到下图可生成通行证

普中51单片机学习_第5张图片

粘贴到此处即可破解

普中51单片机学习_第6张图片

stc-isp-15xx-v6.86L

拖出来双击即可使用

驱动

双击安装即可

普中51单片机学习_第7张图片

2.点亮LED

点亮一个LED

普中51单片机学习_第8张图片

建立相关的文件夹

普中51单片机学习_第9张图片

选择Atmel下的AT89C52
普中51单片机学习_第10张图片
普中51单片机学习_第11张图片
点击否

普中51单片机学习_第12张图片

创建C文件普中51单片机学习_第13张图片
编译

普中51单片机学习_第14张图片

普中51单片机学习_第15张图片
生成hex文件用于烧录普中51单片机学习_第16张图片
普中51单片机学习_第17张图片

#include 

void main()
{
	P2 = 0x55;//0101 0101
	while(1)
	{
		
	}
}

LED闪烁

原理:LED编码是1111 1111 表示全灭只需要将最后一位变成0即可 即1111 1110
分别对应0xFF和0xFE
Delay函数是STA-ISP自动生成普中51单片机学习_第18张图片

代码如下

#include 
#include 

void Delay500ms()		//@12.000MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 205;
	k = 187;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


void main()
{
	while(1)
	{
	P2 = 0xFE;
	Delay500ms();
	P2 = 0xFF;
	Delay500ms();
	}
}

LED流水灯

#include 
#include 
void Delay500ms()		//@12.000MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 205;
	k = 187;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void main()
{
	while(1)
	{
		P2 = 0xFE;//1111 1110
		Delay500ms();
		P2 = 0xFD;//1111 1101
		Delay500ms();
		P2 = 0xFB;//1111 1011
		Delay500ms();
		P2 = 0xF7;//1111 0111
		Delay500ms();
		P2 = 0xEF;//1110 1111
		Delay500ms();
		P2 = 0xDF;//1101 1111
		Delay500ms();
		P2 = 0xBF;//1011 1111
		Delay500ms();
		P2 = 0x7F;//0111 1111
		Delay500ms();
		P2 = 0xFF;//1111 1111
		Delay500ms();
	}
}

LED流水灯时间可定

原理:调整延时函数变成可输入参数形式,每次延时完成参数减一。

#include 
#include 
void Delay1ms(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;
	while(xms)
	{
	_nop_();
	i = 2;
	j = 239;
	do
	{
	while (--j);
	} while (--i);
	xms--;
	}
}

void main()
{
	while(1)
	{
		P2 = 0xFE;//1111 1110
		Delay1ms(500);
		P2 = 0xFD;//1111 1101
		Delay1ms(500);
		P2 = 0xFB;//1111 1011
		Delay1ms(500);
		P2 = 0xF7;//1111 0111
		Delay1ms(500);
		P2 = 0xEF;//1110 1111
		Delay1ms(500);
		P2 = 0xDF;//1101 1111
		Delay1ms(500);
		P2 = 0xBF;//1011 1111
		Delay1ms(500);
		P2 = 0x7F;//0111 1111
		Delay1ms(500);
		P2 = 0xFF;//1111 1111
		Delay1ms(500);
	}
}

3.独立按键控制LED

独立按键控制LED亮灭

原理是按键按下则表示P3_0==0此处为同时按下K2(P3_0)和K1(P3_1)则LED灯(P2_0)亮,否则灭。

#include 

void main()
{
	P2_0 = 0;
	P2_0 = 1;
	while(1)
	{
		if(P3_1 == 0 && P3_0 == 0)
		{
			P2_0=0;
		}
		else
		{
			P2_0 = 1;
		}
	}
}

独立按键控制LED状态

按下按键灯亮,再次按下按键灯灭

#include 

void Delay(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;
	while(xms)
	{
	i = 2;
	j = 239;
	do
	{
		while (--j);
	} while (--i);
	xms--;
	}
}



void main()
{
	while(1)
	{
	   if(P3_1==0)
	   {
	   		Delay(20);
			while(P3_1 == 0);
			Delay(20);

			P2_0=~P2_0;
	   }
	}
}

独立按键控制LED显示二进制

#include 

void Delay(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;
	while(xms)
	{
	i = 2;
	j = 239;
	do
	{
		while (--j);
	} while (--i);
	xms--;
	}
}

void main()
{
	unsigned char LEDNumber=0;
	while(1)
	{
		if(P3_1==0)
		{
			Delay(20);
			while(P3_1==0);
			Delay(20);
			//1111 1111
			LEDNumber++;//0000 0000
			P2=~LEDNumber;
		}
	}
}

独立按键控制LED移位

控制左移右移

#include 
void Delay(unsigned int xms);

unsigned char LEDNum;

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=~(0x01<

4.数码管显示

静态数码管显示

位选:P2_4,P2_3,P2_2.用3-8译码器方式来实现第几位亮
段选:用以下代码分别表示0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,空
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00

#include 

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,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(3,2);//第几位数码管显示什么数字
    while(1)
   	{
   	
   	}
}

动态数码管显示

数码管显示时延时归零,不然会导致段选位选错位

#include 

unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,
0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};

void Delay(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;
	while(xms)
	{
	i = 2;
	j = 239;
	do
	{
		while (--j);
	} while (--i);
	xms--;
	}
}

void Nixie(unsigned char Location,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);
	P0=0x00;
}

void main()
{	
	while(1)
   	{
	Nixie(1,1);//第几位数码管显示什么数字
    //Delay(500);
	Nixie(2,2);
	//Delay(500);
	Nixie(4,5);
	//Delay(500);
   	}
}

你可能感兴趣的:(研究生项目,51单片机,学习,单片机)