单片机最小系统实现LED灯闪烁
这学期开始学习专业课,很多东西学了都还没有实际操作起来,想着把大一自学的东西整合起来,算是笔记吧,和大家分享一下。
网上的单片机最小单元是这样的
图片来自网络
我的是这样的
其实这两幅图都是正确的,只是我们的芯片型号不同,但是实现的原理都是一样的。
1.单片机最小系统的概念:
能使单片机正常工作的最小硬件单元电路,就叫单片机最小系统。
2.单片机最小系统的组成:
(1) 复位电路:启动后让单片机从初始状态开始执行程序
(2) 振荡电路:单片机是一种时许电路,必须要有脉冲信号才能工作,他的内部有一个时钟产生电路,只要接上两个电容和一个晶振即可正常工作。
单片机运行需要时钟支持——就像计算机的CPU一样,如果没有时钟电路来产生时钟驱动单片机,那单片机就不能执行程序。
单片机可以看成是在时钟驱动下的时序逻辑电路。
以5l单片机为例随明:51单片机为l2个时钟周期执行一条指令。也就是说单片机运行一条指令,必须要用r2个时钟周期。没有这个时钟,单片机就跑不起来了,也没有办法定时和进行和时间有关的操作。
时钟电路是微型计算机的心脏,它控制着计算机的二个节奏。CPU就是通过复杂的时序电路完成不同的指令功能的。MCS一51的时钟信号可以由两种方式产生:一种是内部方式,利用芯片内部的振荡电路,产生时钟信号:另一种为外部方式,时钟信号由外部引入。如果没有时钟电路来产生时钟驱动单片机,单片机是无法工作的。
单片机时钟电路是用来配合外部晶体实现振荡的电路,这样可以为单片机提供运行时钟,如果运行时钟为0 的话,单片机就不工作,当然超出单片机的工作频率的时钟也会导致单片机不工作。
(3) 存储器访问路经控制:EA=+5V时,EA引脚接电源正极,表示使用内部程序存储器。
3.代码实现小灯闪烁
#include<reg52.h>
#include<intrins.h> //左移函数头文件
/***********************/
typedef unsigned int u16; //对数据类型声明定义,就是将 unsigned int转换成 u16;
typedef unsigned char u8;
/***********************/
#define led P1
/****************************************************************
***************
* 函 数 名 : delay
* 函数功能 : 延时函数,i=1 时,大约延时 10us
*****************************************************************
**************/
void delay(u16 i)
{
while(i--);
}
/*******************
延时更短的延时函数
***************************/
void delay1(void){
unsigned int i;
for(i=0;i<1000;i++){;}
}
/***********************/
void main()
{
u8 i;
led=~0x01;//0x01取反即为 0xFE
delay(50000); //大约延时 450ms
while(1)
{
for(i=0;i<8;i++)
{
P1=~(0x01<<i);
delay1();
}
}
}
4.代码实现逻辑
进入 main 函数后首先 led=~0x01,因为 LED 是低电平点亮,所以 0X01 取反
后的结果是 0XFE,对应二进制数为 1111 1110,即最低位为 0,因此最开始的 D1
指示灯会点亮,然后延时一段时间进入while循环,由于要实现8个LED从D1->D8
循环点亮,因此可以使用 for 循环语句循环 8 次,每循环一次,点亮的小灯向右
移动一个即 P2 口输出的低电平要左移一位,因此可以使用 P2=~(0x01<<i);语句
实现。0X01<<i 表示每次 i 增加 1 次,0x01 中的 1 就移动多少位,因为 (高电平)不会让 LED 点亮,需要取反后变为低电平 0 才能点亮,所以最后的结果需要取反后给 P0 口,并且每次循环都要延时一段时间,这样我们肉眼才能分辨出来。
实现效果
我倒是买了单片机但是仿真软件比较好用我这里就直接在仿真软件上操作。最终实现的效果就是led灯会频繁闪烁。