初识51..标题短就短呗咋我车轱辘滚一滚滚一滚... ...
单片机相关硬件本人所用为普中51MS开发板,芯片为89C52RC硬件拆分发光二极管:二极管:阳极、阴极 单向导通性共阳极二极管:将所有发光二极管的阳极连接到VCC,发光二级的阴极接到单片机的引脚,此时阳极输出 高电平,给对应单片机引脚低电平,满足发光二极管的单向导通性,电流会从阳极流向阴极,LED被点亮。位运算1000 00011111 1110&= 不可以和 | 一样连续写,得分两行Keil软件
单片机相关硬件
本人所用为普中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()执行完之后才被调用的。也就是说,程序执行流程是这样的:
led_show(1 << i):点亮第i位 LED(例如i=0时点亮 P1.0)delay(0x3FFF):等待一段时间(比如 50ms)在这段时间里,LED 保持点亮状态。led_all_off():此时才把所有 LED 熄灭- 循环到下一个
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);
}
}
更多推荐

所有评论(0)