一、前言
最近在整理资料的时候,偶然发现了以前大学学习51单片机买的开发板附带的学习资料,开发板早已不知去向,只剩下一些代码,刚好最近也在用Proteus仿真,所幸在用仿真重温一下51单片机。
二、51最小系统
单片机最小系统是指用最少的元件组成的单片机可以工作的系统。对51系列单片机来说,最小系统一般包括单片机芯片、晶振电路、复位电路。
复位电路:单片机复位电路就好比电脑的重启,当电脑在使用中出现死机,按下重启电脑程序从头开始执行。基本工作原理是通过一个延时元件(通常是电容)和触发电路,将单片机的复位引脚(RESET)保持在高电平状态,从而使单片机进入复位状态。一旦复位条件满足解除,复位电路会将复位引脚的电平变为低电平,使得单片机退出复位状态,开始正常工作。
晶振电路:晶振是给单片机提供工作信号脉冲的,这个脉冲就是单片机的工作速度。例如,12M晶振单片机工作速度就是每秒12M。晶振与单片机的XTAL0脚和脚XTAL1构成的振荡电路中会产生谐波,这个波对电路的影响不大,但会降低电路时钟振荡器的稳定性。为了电路的稳定性起见, ATMEL公司(89C51系列厂商)建议在晶振的两引脚处接入两个10pf-50pf的瓷片电容,并接地来削减谐波对电路稳定性的影响,所以晶振电路的电容在10pf-50pf之间都可以。
三、点亮第一个LED
仿真图
仿真程序
这段程序是用来控制单片机上的一个LED灯,在单片机上将LED灯接在P2.0端口上,并通过程序控制LED灯的亮灭。
其中,sbit led=P2^0;:这行代码使用 sbit 关键字来定义了一个名为 led 的位变量,它对应于单片机的 P2.0 端口。P2^0 表示将 P2 端口的第0位(即 P2.0)与 led 关联起来,这样我们就可以通过对 led 变量的操作来控制 P2.0 端口的状态。
/**************************************************************************************
* 点亮第一个LED实验 *
实现现象:下载程序后D1指示灯点亮
注意事项:无
***************************************************************************************/
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
sbit led=P2^0; //将单片机的P2.0端口定义为led
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
while(1)
{
led=0; //P2.0端口设置为低电平
}
}
四、LED闪烁
仿真图
flicker
仿真程序
这段程序是用来实现LED灯周期性的闪烁效果,每个周期约为900毫秒(450毫秒熄灭 + 450毫秒点亮)。
/**************************************************************************************
* LED闪烁实验 *
实现现象:下载程序后D1指示灯闪烁
注意事项:无
***************************************************************************************/
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit led=P2^0; //将单片机的P2.0端口定义为led
/*******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
while(1)
{
led=0;
delay(50000); //大约延时450ms
led=1;
delay(50000); //大约延时450ms
}
}
五、LED流水灯
仿真图
Flow light
仿真程序
这段程序是用来控制LED灯左右移动,实现一个流水灯的效果。
其中,crol(led,1); 和 cror(led,1);:这两个函数分别用于将 led 变量左移和右移一位。这些函数是 intrins.h 头文件中定义的,用于实现循环左移和循环右移的操作。
/**************************************************************************************
* LED流水灯实验 *
实现现象:下载程序后LED呈现流水灯效果进行左移右移滚动
注意事项:无
***************************************************************************************/
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
#include<intrins.h> //因为要用到左右移函数,所以加入这个头文件
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
#define led P2 //将P2口定义为led 后面就可以使用led代替P2口
/*******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
u8 i;
led=0xfe;
delay(50000); //大约延时450ms
while(1)
{
/* for(i=0;i<8;i++)
{
P2=~(0x01<<i); //将1右移i位,然后将结果取反赋值到P2口
delay(50000); //大约延时450ms
}
*/
for(i=0;i<7;i++) //将led左移一位
{
led=_crol_(led,1);
delay(50000); //大约延时450ms
}
for(i=0;i<7;i++) //将led右移一位
{
led=_cror_(led,1);
delay(50000); //大约延时450ms
}
}
}
六、总结
今天主要讲了51最小系统和基于51单片机的流水灯的proteus仿真。
感谢你的观看!