普中51单片机学习

单片机开发

教程来自bilibili 江协科技

1.开发工具软件安装

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

Keil请添加图片描述

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

请添加图片描述

随便填写下一步即可。

请添加图片描述

点击这个按钮复制CID

请添加图片描述

粘贴到下图可生成通行证

请添加图片描述

粘贴到此处即可破解

请添加图片描述

stc-isp-15xx-v6.86L

拖出来双击即可使用

驱动

双击安装即可

请添加图片描述

2.点亮LED

点亮一个LED

请添加图片描述

建立相关的文件夹

请添加图片描述

选择Atmel下的AT89C52
请添加图片描述
请添加图片描述
点击否

请添加图片描述

创建C文件请添加图片描述
编译

请添加图片描述

在这里插入图片描述
生成hex文件用于烧录请添加图片描述
请添加图片描述

#include <REGX52.H>

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

LED闪烁

原理:LED编码是1111 1111 表示全灭只需要将最后一位变成0即可 即1111 1110
分别对应0xFF和0xFE
Delay函数是STA-ISP自动生成请添加图片描述

代码如下

#include <REGX52.H>
#include <INTRINS.H>

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 <REGX52.H>
#include <INTRINS.H>
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 <REGX52.H>
#include <INTRINS.H>
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 <REGX52.H>

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 <REGX52.H>

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 <REGX52.H>

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 <REGX52.H>
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<<LEDNum);
		}
		if(P3_0==0)
		{
			Delay(20);
			while(P3_0==0);
			Delay(20);

			
			if(LEDNum==0)
				LEDNum=7;
			else
				LEDNum--;
			P2=~(0x01<<LEDNum);
		}
	}
}

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

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 <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,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 <REGX52.H>

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);
   	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值