当前位置:网站首页>初学单片机点亮第一个外设--LED灯
初学单片机点亮第一个外设--LED灯
2022-04-22 21:53:00 【不停歇向前^-^蜗牛】
1 单片机编程的一般步骤
(一).目标分析。我们的目标是点亮开发板上的LED灯。
(二).原理图分析:
目标器件(LED)工作原理
相关模块电路连接
控制线路分析:相关IO端口是哪些?
(三).软件安装完毕(isp下载器)
(四).代码编写、编译。
(五).下载与调试。
2 原理图与控制方法分析
2.1 原理图概况浏览
(1)目的1:把原理图的相关部分摘录出来重点看。
(2)目的2:把相关部分的原理图的关键部分(74573芯片)重点看。
74HC138功能
CD74HC138,CD74HC238和CD74HCT138,CD74HCT238是高速硅栅CMOS解码器,适合内存地址解码或数据路由应用。74HC138作用原理于高性能的存贮译码或要求传输延迟时间短的数据传输系统,在高性能存贮器系统中,用这种译码器可以提高译码系统的效率。将快速赋能电路用于高速存贮器时,译码器的延迟时间和存贮器的赋能时间通常小于存贮器的典型存取时间,这就是说由肖特基钳位的系统译码器所引起的有效系统延迟可以忽略不计。HC138按照三位二进制输入码和赋能输入条件,从8个输出端中译出一个低电平输出。两个低电平有效的赋能输入端和一个高电平有效的赋能输入端减少了扩展所需要的外接门或倒相器,扩展成24线译码器不需外接门;扩展成32线译码器,只需要接一个外接倒相器。在解调器应用中,赋能输入端可用作数据输入端。


注:手中拿到的开发板上芯片位74HC138。
原理图LED接法

原理图74HC138接法

3 第一个实验:点亮LED
3.1 创建工程与文件
(1)创建空工程。
(2)创建led.c并关联到工程。
(3)模式化书写:头文件包含与main函数外壳。
3.2 如何用C语言进行IO端口控制
(1)P0 这个符号在C语言代码中的特殊含义。
(2)十六进制数。
(3)位、字节、IO端口、IO口。
(4)硬件接线方式对编程的影响。
3.3 点亮LED
(1)点亮8颗LED。
(2)点亮4颗LED。
(3)隔一颗点亮一颗LED。
(4)全部熄灭8颗LED。
// led.c
#include <reg51.h> // 头文件包含
void main(void) // main函数
{
// 点亮8led
// P0 = 0xff; // P0端口的8个引脚都输出高电平
// 点亮4led
// P0 = 0x0f;
// P0 = 0xf0;
// 隔一颗点亮一颗 二进制应该是10101010
// P0 = 0xAA;
// 全灭
P0 = 0x0;
}
4 如何让LED闪烁
4.1 闪烁的本质含义:亮-延时-灭-延时
(1)由于人眼睛有视觉暂留,所以亮和灭之间的延时时间选择非常重要。
(2)如果延时时间太短(譬如20ms),这时候上一次灭眼睛还没反应过来就到了下一次亮,此时你会觉得灯是一直亮着的。和一直亮着的区别是亮度低一些。但是是看不到闪烁的。
(3)延时时间逐渐增大慢慢就能看到闪烁的,大到一定程度就能看到明显的一亮一灭了。
4.2 单片机如何实现延时
(1)单片机执行每条指令需要一定时间。
(2)单片机开机后不能休息。
(3)单片机可以“空转”来“浪费时间”。
4.3 C语言实现延时
(1)笨办法:放多条指令实现延时。
(2)正确方法:使用C语言循环语句实现延时。
#include <reg51.h>
void delay(void)
{
unsigned char i = 200;
unsigned char j = 100; // 定义变量
for (i=200; i>0; i--)
{
for (j=200; j>0; j--)
{
;
}
}
}
void main(void)
{
P0 = 0xff; // 全亮
// 延时
delay();
P0 = 0x0; // 全灭
// 延时
delay();
}
5 C语言循环语句学习
(1)while循环
格式:
条件初始化
while (条件)
{
// 循环体, 若干条代码
// 循环体中包含条件增量
}
(2)for循环
格式:
for (循环初始化; 循环条件; 循环增量)
{
// 循环体
}
(3)do while循环
格式:
do
{
// 循环体
}while(条件);
6 流水灯效果实现1
6.1 什么是流水灯
灯依次点亮。
6.2 流水灯本质分析
(1)流水灯的本质其实就是不同的亮的状态相互间隔一定时间。
(2)流水灯:
第1个状态等于0x80(10000000),
第2个状态等于0x40(01000000),
第3个状态等于0x20(00100000),
第4个状态等于0x10(00010000),
第5个状态等于0x08(00001000),
第6个状态等于0x04(00000100),
第7个状态等于0x02(00000010),
第8个状态等于0x01(00000001)。
(3)延时时间越长流水灯就流的越慢,越短就流水越快。
(4)8个状态依次执行,完成后从头开始,其实就是一个循环。
6.3 编程实现流水灯
(1)分析就会发现:流水灯和闪烁并没有本质差别。
#include <reg51.h>
void delay(void)
{
unsigned char i, j;
for (i=0; i<200; i++)
{
for (j=0; j<200; j++);
}
}
void main(void)
{
// 因为1永远为真,所以这就是1个死循环
while (1)
{
// 第1个状态
P0 = 0x80;
delay();
// 第2个状态
P0 = 0x40;
delay();
// 第3个状态
P0 = 0x20;
delay();
// 第4个状态
P0 = 0x10;
delay();
// 第5个状态
P0 = 0x08;
delay();
// 第6个状态
P0 = 0x04;
delay();
// 第7个状态
P0 = 0x02;
delay();
// 第8个状态
P0 = 0x01;
delay();
}
}
7 流水灯效果实现2
7.1 上节程序的缺陷分析
(1)功能实现了,但是写的太笨了,如果状态变多程序就会更长。
7.2 改进思路:通过变量运算来得到合适的端口输出值
(1)首先定义变量unsigned char a,初值等于0x80(10000000)。
(2)8个状态,其实就是a依次右移0-7位。
(3)我们这样就相当于是用C语言让单片机自己去运算得到每个状态的端口值,而不用自己事先去计算好。这样程序就简化了。
7.3 C语言移位运算介绍
(1)C语言中有移位运算符,>>可以右移,<<可以左移。(无符号数移位:移出去的位丢掉了,空出来的位用0补)
#include <reg51.h>
void delay(void)
{
unsigned char i, j;
for (i=0; i<200; i++)
{
for (j=0; j<201; j++);
}
}
void main(void)
{
unsigned char i = 0;
while (1)
{
unsigned char d = 0x01;
for (i=0; i<8; i++)
{
d = d << 1; // 在每次循环时d会变化
P0 = d;
delay();
}
}
}
/* void main(void) { unsigned char i = 0; while (1) { unsigned char d = 0x80; for (i=0; i<8; i++) { d = d >> 1; // 在每次循环时d会变化 P0 = d; delay(); } } } */
/* void main(void) { unsigned char i = 0; unsigned char d = 0x80; while (1) { for (i=0; i<8; i++) { P0 = (d >> i); // d在正在操作中一直是0x80并没有被改变 delay(); } } } */
8 跑马灯效果实现
8.1 什么是跑马灯
(1)跑马灯和流水灯非常像,不同的是:流水灯是8颗LED其中7灭1亮,亮的在移动;跑马灯是8颗LED7亮1灭,灭的在移动。
8.2 实现思路分析
01111111 0x7f 10000000
10111111 0xbf 01000000
11011111 0xdf 00100000
8.3 实践编程
(1)编程实现跑马灯,必须用到C语言的2种技巧:左移(右移)、按位取反。
(2)C语言中~这个符号表示对一个数字按位取反,譬如一个数01111111按位取反后变成了10000000。而11011111按位取反后变成了00100000。
#include <reg51.h>
void delay(void)
{
unsigned char i, j;
for (i=0; i<200; i++)
for (j=0; j<200; j++);
}
void main(void)
{
unsigned char i = 0; // i控制循环次数
while (1)
{
unsigned char d = 0x01; // 端口值
for (i=0; i<8; i++)
{
P0 = ~d; // d按位取反后给P0端口
d <<= 1; // d = d >> 1;
delay();
}
}
}
参考:https://blog.csdn.net/qq_20233867/article/details/78941183
版权声明
本文为[不停歇向前^-^蜗牛]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_48321071/article/details/124332714
边栏推荐
- In the era of Internet of all things, how should smart home ecosystems such as Xiaomi, apple and Huawei be selected?
- 强化学习(实践):REINFORCE,AC
- Is it necessary to read the history of mathematics? We have neglected too much about mathematics education
- Rpcx source code learning - client side
- Leetcode-238 - product of arrays other than itself
- 【微信小程序开发(云壁纸小程序教程)】
- A simple and easy-to-use file upload scheme
- SSM框架
- CDN功能特性问题
- Tcp/ip protocol and network layered model
猜你喜欢

hawe哈威液压泵站的液压冲击分析

Node error reporting record: cannot find module are we there yet \ index js

muduo源码分析之Buffer

What is the working nature of Italian ATOS solenoid valve?

Series interpretation of smc-r (II): smc-r communication technology integrating TCP and RDMA

0基础UnityURP渲染管线之阴影ShadowCaster-ShadowMask-Map傻傻分不清楚(代码向)

Pushing hand of industrial Internet innovation iteration

Crashsight general function & feature function introduction

2.57-编写程序show_short, show_long和show_double,它们分别打印类型为short, long和double的C语言对象的字节表示。请试着在几种机器上运行。

为什么BI对企业这么重要?
随机推荐
Why is bi so important to enterprises?
Yapi本地部署
Flutter混合开发
百思买Best Buy 网站EDI 测试流程
Borui data and F5 jointly build the full data chain DNA of financial technology from code to user
东吴证券X袋鼠云:数据轻松可取、毫秒级反应能力,东吴证券做对了什么?
Resource packaging dependency tree
Wechat applet - day 4
Rpcx source code learning - client side
kubeflow创建新用户用户密码
怎么判断企业该做几级等保呢?做等保的意义又有哪些?
Tcp/ip protocol and network layered model
Pushing hand of industrial Internet innovation iteration
In the era of Internet of all things, how should smart home ecosystems such as Xiaomi, apple and Huawei be selected?
io_uring技术在分布式云原生数据库中的应用
Typical application scenarios of alicloud log service SLS
Zhiting, who is called little homekit, how to connect the tmall elf speaker?
These two kinds of people can't do well in we media and can't make a lot of money all their life
优化点
【4.1】flink窗口算子的trigger触发器和Evictor清理器