单片机相关硬件

本人所用为普中51MS开发板,芯片为89C52RC

 

硬件拆分

发光二极管:

二极管:

阳极、阴极 单向导通性

共阳极二极管:

将所有发光二极管的阳极连接到VCC,发光二级的阴极接到单片机的引脚,此时阳极输出 高电平,给对应单片机引脚低电平,满足发光二极管的单向导通性,电流会从阳极流向阴极,LED被点亮。

位运算

位运算符号 名称 特性 应用场景 备注
| 按位或 将对应位的bit进行比较,如果有一个为1,结果为1,如果都 为0,结果是0 置1 |=()

t |=(1<<0)|(1<<7)

1000 0001

& 按位与 将对应位的bit进行比较,如果都为1,结果为1,如果有一个 bit为0,结果为0 清零 &= ~()

P2&=~(1<<0)

1111 1110

^ 按位异或 将对应位的bit进行比较,如果两个bit相同,则结果为0,如 果两个bit不相同,则结果为1(相同为0,相异为1) 电平翻转
~ 按位取反 每一位的bit进行翻转

&= 不可以和 | 一样连续写,得分两行

Keil软件的使用

1.编辑main.c

2.勾选 Output 的 Create Hex File选项,OK

3.点击左上角 Build,编译单片机程序

下载单片机程序:

1. 连接串口线

2. 在设备管理器中查看串口设备是COMx

3. 打开ISP软件

4. 选择51单片机芯片型号

5. 选择串口端口 COM5

6. 打开hex文件

7. 点击下载编程

8. 将开发板复位

9. 观察硬件现象

试玩开发板:

多文件编程 用main.c功能.c + 功能.h 包起来

main.c中:

        #include"1.h"

        #include"1.h"

        #include"1.h"

led.c  led.h

delay.c  delay.h

玩转开发板之前我们需要写一些辅助代码

led.h:

#ifndef __LED_H_
#define __LED_H_

extern void led_init(void);
extern void led_all_on(void);
extern void led_all_off(void);
extern void led_nor(void);
extern void led_show(unsigned int n);

#endif

此处位led.c

#include <reg51.h>
#include "led.h"

// led初始化
void led_init(void)
{
	P2 = 0xFF;
}

// led全亮
void led_all_on(void)
{
	P2 = 0;
}

// led全灭
void led_all_off(void)
{
	P2 = 0xFF;
}

// led翻转
void led_nor(void)
{
	P2 = P2 ^ 0xFF;		  
}

// 指定某个led点亮
void led_show(unsigned int n)
{
	P2 = ~n;
}

led亮灭操作(添加了delay.c,delay.h文件)

#include <reg51.h>
#include "led.h"
#include "delay.h"


int main(void)
{
	led_init();

	while(1)
	{
		led_nor();
		delay(0x5FFF);
	}
	
	
	return 0;
}



	
流水灯

led_show(x)可以单独让灯x亮

int main(void)
{
	int i = 0;

	led_init();
	led_show(1);

	while(1) // 死循环,保证两个for执行完之后从头开始
	{
		for(i = 0;i < 8;i++)
		{
			led_show(1 << i); // 1左移i个单位
			delay(0x3FFF);

			led_all_off(); // 全灭
		}

		for(i = 7;i >= 0;i--)
		{
			led_show(1 << i); // 1左移i个单位
			delay(0x3FFF);

			led_all_off();
		}

	}
	
	
	return 0;
}



	

1 << i 可以保证只有一个灯亮

led_all_off() 是在延时函数 delay() 执行完之后才被调用的。

也就是说,程序执行流程是这样的:

  1. led_show(1 << i):点亮第 i 位 LED(例如 i=0 时点亮 P1.0)
  2. delay(0x3FFF)等待一段时间(比如 50ms)在这段时间里,LED 保持点亮状态。
  3. led_all_off()此时才把所有 LED 熄灭
  4. 循环到下一个 i

数码管

一如生活中的红绿灯

同一时刻只能有一个数码管显示数字

数码管基本电路:

先位选再段选,

将数码管对应的NPN三极管的基级(P10-P13)给定高电平,就可以去选中某 一位数码管 给定对应段的引脚高电平,即可选中某一段

3. 数码管动态显示: 数码管在同一时刻只能显示一位,但利用人的肉眼视觉暂留效应(余晖效应),在某 一位数码管显示一个数值后,可以通过快速刷新延时,再去在其他位数码管显示数值

某三极管:

数码管位选、段选

#include <reg51.h>
#include "delay.h"

unsigned char seg[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};

// 数码管位选
void Select_Bit(unsigned int n)
{
	 P1 &= ~(0x0F << 0);       // 将P1寄存器低4位清0
	 P1 |= (1 << n);	  	   // 将P1低四位中某个引脚置1,选中一位数码管	   
}

// 数码管段选
void Select_Seg(unsigned int n)		
{
	P0 = seg[n];
}

// 数码管动态显示
void Digiter_show(unsigned int n)	 
{
	int m = 0;
	int i = 0;

   	while (n != 0)
	{
		P0 = 0;
		m = n % 10;		   
		Select_Bit(i++);
		Select_Seg(m);
		n = n / 10;
		delay(100);
	}
}

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐