嵌入式入门教学——C51

news2024/9/23 15:29:57

一、前期准备

1、硬件设备

2、软件设备

  •  

二、预备知识

1、什么是单片机?

  • 在一片集成电路芯片上集成微处理器、存储器、IO接口电路,从而构成了单芯片微型计算机,及单片机。
  • STC89C52单片机:
    • STC:公司
    • 89:所属系列
    • C:工作电压(5.5V~3.8V)
    • 52:程序空间及RAM空间大小(8KB程序空间及512B的RAM空间)

2、电平特性

  • 定义单片机为TTL电平:高+5v、低0v
  • RS232电平(计算机的串口):高-12v、低+12v 
  • 故计算机与单片机之间通讯时需要加电平转换芯片max232

3、二进制数的逻辑关系

  • 与:&
  • 或:+
  • 非:!
  • 异或:⊕(相同为0,不同为1)

4、80C51系列介绍

  • 以8051为基核开发出的CMOS工艺单片机产品统称为80C51系列。
  • STC(公司名)89(系列)C(CMOS)52(2为内部存储空间大小2*4=8k)RC
  • 40(晶振频率)C(商业级-温度)-PDIP(封装格式)
  • 0721(07年21周)CV4336

5、80C51引脚封装

  • 总线型:四组,每组8位。
  • 非总线型

6、C-51数据类型扩充定义

  • sfr:特殊功能寄存器声明。
  • sfr16:sfr16位数据声明。
  • sbit:特殊功能位声明。
  • bit:位变量声明。

7、C-51包含的头文件

  • reg51.h:定义特殊功能寄存器和位寄存器。
  • math.h:定义常用数学运算。

8、C-51的运算符

  • >>:位右移
  • <<:位左移
  • &:按位与
  • |:按位或
  • ^:按位异或
  • ~:按位取反

9、单片机主要掌握一下几点

  • 最小系统能够运行起来的必要条件:电源、晶振、复位电路(程序从头执行)。
  • 对单片机任意IO口的随意操作:输出控制电平高低、输出检测电平高低。
  • 定时器:重点掌握最常用的方式2。
  • 中断:外部中断、定时器中断、串口中断。
  • 串口通信:单片机之间、单片机与计算机间。

10、电路图符号表示

  • 电阻:R
  • 电容:C
  • 电感:L
  • 集成块/芯片:U
  • 地:GND
  • 电源:VCC、AVDD、DVDD

三、LED模块

1、点亮一个LED

1.1、LED的位置
1.2、新建一个工程
  • 新建一个工程。
  • 选择存放位置,新建一个文件夹用于存放该工程。
  • 进入文件夹,输入文件名,即工程名。
  • 选择单片机的型号。选择Atmel下的AT89C52。(本单片机使用的是STC89C52)
  • 新建一个c语言程序文件。
1.3、LED原理图
  • 下图红框区域相连接。
  • LED右端接的是电源,为高电平,故左端为低电平即可导通。(单片机默认输出高电平)
  •  
1.4、单片机如何控制LED
  • P2寄存器的8位决定了LED的高低电平。1为高电平,0为低电平。
  • 当为低电平时,低于外部电压,有电流通过,点亮led。
  • 【注】51单片机所有IO口上电后默认全是高电平。
  • 例如:控制第一个灯亮,p2寄存器应为:1111 1110。
1.5、进制转换
  • c语言中,不能识别二进制,应该转换为十六进制。
  • 例如:
    • p2=1111 1110; // 错误
    • p2=0xFE; // 正确,前面0x表示十六进制。
1.6、编写代码
#include <REGX52.H> // 头文件,定义特殊功能寄存器和位寄存器
void main(){
	P2=0xFE; // 1111 1110
	while(1); // 让程序停止在这,不让main重复执行
}
1.7、设置生成.hex下载文件
  • 设置完后,编译程序,生成.hex文件。
1.8、将.hex文件下载到单片机中
  • 将单片机连接电脑串口。 
  • 打开STC-ISP程序,选择hex文件,点击下载。
  • 重启单片机,成功点亮第一个led。

2、LED闪烁

  • 新建工程和c语言程序文件,与前相同。
  • 尝试点亮一个led再熄灭它。
  • #include<REGX52.H>
    void main(){
        while(1){
            P2=0xFE; // 亮
            P2=0xFF; // 灭
        }
    }
  • 结果led常亮,并未闪烁。原因是led闪烁的频率过快,人的肉眼无法捕捉。 
  • 使用STC-ISP生成延时函数。设置要与使用的单片机一致。
  • 添加延时函数。
  • #include<REGX52.H>
    #inlcude<INTRINS.H> // 引入nop函数
    void Delay500ms() // 500ms延时函数
    {
    	unsigned char i, j, k;
    	_nop_();
    	i = 4;
    	j = 205;
    	k = 187;
    	do
    	{
    		do
    		{
    			while (--k);
    		} while (--j);
    	} while (--i);
    }
    void main(){
        while(1){
            P2=0xFE; // 亮
            Delay500ms(); // 延时500ms
            P2=0xFF; // 灭
            Delay500ms();
        }
    }
  • 编译后下载程序到单片机,LED灯以500ms的时间间隔闪烁。

3、LED流水灯

  • 新建工程和c语言程序文件,设置生成hex文件。
  • 编辑代码:
  • #include<regx52.h>
    #inlcude<intrins.h> // 引入nop函数
    void Delay500ms() //500ms延时函数
    {
    	unsigned char i, j, k;
    	_nop_();
    	i = 4;
    	j = 205;
    	k = 187;
    	do
    	{
    		do
    		{
    			while (--k);
    		} while (--j);
    	} while (--i);
    }
    void main(){
        while(1){
            P2=0xFE; // 1111 1110
            Delay500ms(); // 延时500ms
            P2=0xFD; // 1111 1101
            Delay500ms();
            P2=0xFB; // 1111 1011
            Delay500ms();
            P2=0xF7; // 1111 0111
            Delay500ms();
            P2=0xEF; // 1110 1111
            Delay500ms();
            P2=0xDF; // 1101 1111
            Delay500ms();
            P2=0xBF; // 1011 1111
            Delay500ms();
            P2=0x7F; // 0111 1111
            Delay500ms();
        }
    }
  • 编译后下载程序到单片机,LED灯以500ms的时间间隔流动。
  • 原延时函数不方便,不能随时更改延时时间,重新编辑延时函数。先使用STC-ISP生成一个延时1ms的函数。
  • C51数据类型
  • 为延时函数添加一个参数,控制延时时间。
  • #include<regx52.h>
    void Delay(unsigned int xms) //带参延时函数
    {
    	unsigned char i, j;
        while(xms--){
    	    i = 2;
    	    j = 239;
    	    do
    	    {
    		    while (--j);
    	    } while (--i);
        }
    }
    void main(){
        while(1){
            P2=0xFE; // 1111 1110
            Delay(500); // 延时500ms
            P2=0xFD; // 1111 1101
            Delay(500);
            P2=0xFB; // 1111 1011
            Delay(500);
            P2=0xF7; // 1111 0111
            Delay(500);
            P2=0xEF; // 1110 1111
            Delay(500);
            P2=0xDF; // 1101 1111
            Delay(500);
            P2=0xBF; // 1011 1111
            Delay(500);
            P2=0x7F; // 0111 1111
            Delay(500);
        }
    }
  •  带参数的延时函数更加灵活。

四、独立按键

1、独立按键控制LED亮灭

1.1、独立按键
  • 相当于是一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开。
1.2、独立按键原理图
  • 下图红框区域相连接。
 1.3、编写代码
  • 由原理图知,K1由P3.1控制。
  • #include<regx52.h>
    void main(){
        //P2=0xFE;
        while(1){
            if(P3_1==0){ // K1按下
                P2_0=0; // 按位操作,在regx52.h头文件中有声明
            }else{ // K1松开
                P2_0=1;
            }
        }
    }
  • K1按下,LED亮;K1松开,LED灭。

2、独立按键控制LED状态

2.1、按键的抖动
  • 对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动。
  • 抖动会使对按键的判断产生一些误操作,可以通过代码解决。
2.2、解决抖动并控制LED状态
  • #include<regx52.h>
    void Delay(unsigned int xms) //带参延时函数
    {
    	unsigned char i, j;
        while(xms--){
    	    i = 2;
    	    j = 239;
    	    do
    	    {
    		    while (--j);
    	    } while (--i);
        }
    }
    void main(){
        while(1){
            if(P3_1==0){ // K1按下
                // 防抖
                Delay(20);
                while(P3_1==0);
                Delay(20);
    
                P2_0=~p2_0; // 取反
            }
        }
    }
  • 按下K1,没反应,松开K1,灯亮;按下K1,无反应,松开K1,灯灭。

3、独立按键控制LED显示二进制

  • #include<regx52.h>
    void Delay(unsigned int xms)
    {
    	unsigned char i, j;
        while(xms--){
    	    i = 2;
    	    j = 239;
    	    do
    	    {
    		    while (--j);
    	    } while (--i);
        }
    }
    void main(){
        unsigned char Led_Num=0; // 8位,相当于寄存器的8位
        while(1){
            if(P3_1==0){ // K1按下
                // 防抖
                Delay(20);
                while(P3_1==0);
                Delay(20);
                
                Led_Num++;
                P2=~Led_Num; // 取反
            }
        }
    }
  • 每按一次按键,8个LED显示对应的二进制。 
  • 如:,表示0000 0111。

4、独立按键控制LED移位

  • #include<regx52.h>
    void Delay(unsigned int xms) // 延时函数
    {
    	unsigned char i, j;
        while(xms--){
    	    i = 2;
    	    j = 239;
    	    do
    	    {
    		    while (--j);
    	    } while (--i);
        }
    }
    void main(){
        unsigned char Led_Num=0;
        P2=~0x01; // 初始化
        while(1){
            // K1按键,左移
            if(P3_1==0){
                Delay(20);
                while(P3_1==0);
                Delay(20);
                
                Led_Num++;
                if(Led_Num>=8) // 越界判断
                    Led_Num=0;
                P2=~(0x01<<Led_Num);
            }
            // K2按键,右移
            if(P3_0==0){
                Delay(20);
                while(P3_0==0);
                Delay(20);
                
                if(Led_Num==0)
                    Led_Num=7;
                else Led_Num--;
                P2=~(0x01<<Led_Num);
            }
        }
    }
  • 按下K1,LED左移一个;按下K2,LED右移一个。

五、数码管

1、静态数码管显示

1.1、数码管介绍
  • 数码管是一种简单、廉价的显示器,是由多个发光极管封装在一起组成“8”字型的器件。
1.1.1、一位数码管
  • 段的名称、引脚序号
  • 共阴极连接、共阳极连接
  • 例如,让共阴极数码管显示6。
    • ,应该让A、C、D、E、F、G点亮。
    • 首先需要将3,8引脚接地,即位选(让某个数码管亮)。
    • ,控制7、4、2、1、9、10输出高电平,即段选(让数码管输出6)。
1.1.2、四位一体数码管
  • 引脚序号
  • 连接方式
  • 例如,让共阴极数码管第3位显示1。
    • ,需要如下图所示。
  • 【注】同一时刻,只能有一个位被选中显示数字,或者4个位都显示相同的数字。(静态)
1.2、数码管原理图

待续。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/834147.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于图片、无人机、摄像头拍摄进行智能检测功能

根据要求进行无人机拍摄的视频或图片进行智能识别&#xff0c;开发过程需要事项 1、根据图片案例进行标记&#xff0c;进行模型训练 2、视频模型训练 开发语言为python 根据需求功能进行测试结果如下 根据车辆识别标记进行的测试结果截图 测经过查看视频 8月1日

深度学习论文: RepViT: Revisiting Mobile CNN From ViT Perspective及其PyTorch实现

深度学习论文: RepViT: Revisiting Mobile CNN From ViT Perspective及其PyTorch实现 RepViT: Revisiting Mobile CNN From ViT Perspective PDF: https://arxiv.org/pdf/2307.09283.pdf PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTorch代码: https://gith…

DSP学习笔记

间接寻址&#xff08;通过放在辅助寄存器里面&#xff0c;可以对地址包括很多操作&#xff0c;1&#xff0c;-1&#xff0c;/-平移量&#xff0c;辅助寄存器内容的修改是在ARAU0和ARAU1中完成的。分为单操作数和双操作数&#xff0c;有很多模式在ARAU。单操作数间接寻址&#x…

[PyTorch][chapter 46][LSTM -1]

前言&#xff1a; 长短期记忆网络&#xff08;LSTM&#xff0c;Long Short-Term Memory&#xff09;是一种时间循环神经网络&#xff0c;是为了解决一般的RNN&#xff08;循环神经网络&#xff09;存在的长期依赖问题而专门设计出来的。 目录&#xff1a; 背景简介 LSTM C…

dubbo的高可用

1、zookeeper宕机与dubbo直连 现象&#xff1a;zookeeper注册中心宕机&#xff0c;还可以消费dubbo暴露的服务。 原因&#xff1a; 健壮性 &#xff08;1&#xff09;监控中心宕掉不影响使用&#xff0c;只是丢失部分采样数据. &#xff08;2&#xff09;数据库宕掉后&#x…

三、线性工作流

再生产的各个环节&#xff0c;正确使用gamma编码及gamma解码&#xff0c;使得最终得到的颜色数据与最初输入的物理数据一致。如果使用gamma空间的贴图&#xff0c;在传给着色器前需要从gamma空间转到线性空间。 如果不在线性空间下进行渲染&#xff0c;会产生的问题&#xff1a…

SQL Server安装配置

又得装数据库...头秃 报错 其他信息: 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证... 1是可能主机名不一致导致的&#xff0c;这种换主机名&#xff0c;二是没开sql 服务。 第二种先打开SQL Server 资源配置管理器 打…

【腾讯云Cloud Studio实战训练营】React 快速构建点餐页面

前言&#xff1a; Cloud Studio是一个在线的云集成开发环境&#xff08;IDE&#xff09;&#xff0c;可以让开发人员在浏览器中轻松地开发、测试、调试和部署应用程序。它提供了基于云的计算资源和工具&#xff0c;例如代码编辑器、编译器、调试器、版本控制系统和项目管理工具…

8.4算法

#include <stdio.h> #include <stdlib.h> #include <string.h>// 1.求1/阶乘累加 int main() {int n;int i;double temp 1;double result 0;printf("Input:");scanf("%d", &n);for (i 1; i < n; i) {temp * i;//1,2,6,24resul…

Kafka的配置和使用

目录 1.服务器用docker安装kafka 2.springboot集成kafka实现生产者和消费者 1.服务器用docker安装kafka ①、安装docker&#xff08;docker类似于linux的软件商店&#xff0c;下载所有应用都能从docker去下载&#xff09; a、自动安装 curl -fsSL https://get.docker.com | b…

Jenkins工具系列 —— 插件 钉钉发送消息

文章目录 安装插件 Ding TalkJenkins 配置钉钉机器人钉钉APP配置项目中启动钉钉通知功能 安装插件 Ding Talk 点击 左侧的 Manage Jenkins —> Plugins ——> 左侧的 Available plugins Jenkins 配置钉钉机器人 点击 左侧的 Manage Jenkins &#xff0c;拉到最后 钉…

微前端中的 CSS

本文为翻译 本文译者为 360 奇舞团前端开发工程师原文标题&#xff1a;CSS in Micro Frontends 原文作者&#xff1a;Florian Rappl 原文地址&#xff1a;https://dev.to/florianrappl/css-in-micro-frontends-4jai 我被问得最多的问题之一是如何在微前端中处理 CSS。毕竟&…

QT图形视图系统 - 使用一个项目来学习QT的图形视图框架 -第一篇

文章目录 QT图形视图系统介绍开始搭建MainWindow框架设置scene的属性缩放功能的添加加上标尺 QT图形视图系统 介绍 详细的介绍可以看QT的官方助手&#xff0c;那里面介绍的详细且明白&#xff0c;需要一定的英语基础&#xff0c;我这里直接使用一个开源项目来介绍QGraphicsVi…

AI大模型之花,绽放在鸿蒙沃土

随着生成式AI日益火爆&#xff0c;大语言模型能力引发了越来越多对于智慧语音助手的期待。 我们相信&#xff0c;AI大模型能力加持下的智慧语音助手一定会很快落地&#xff0c;这个预判不仅来自对AI大模型的观察&#xff0c;更来自对鸿蒙的了解。鸿蒙一定会很快升级大模型能力&…

macOS 虚拟桌面黑屏(转)

转自&#xff1a;macOS重置虚拟桌面、macOS 虚拟桌面黑屏 有几次出现如图的情况&#xff0c;以为是iTerm的问题&#xff0c;但是在关闭软件&#xff0c;重启之后&#xff0c;依旧无效。 后面经过网友告知&#xff0c;才知道是虚拟桌面的问题。 为了清理这个问题&#xff0c;有以…

看redisson是如何解决锁超时问题

看redisson是如何解决锁超时问题 什么是锁超时问题&#xff1f; 比如利用redis实现的分布式锁会设置一定的过期时间&#xff0c;超过该时间&#xff0c;缓存自动删除&#xff0c;锁被释放。这是防止因程序宕机等原因导致锁一直被占用。 但存在一定的问题&#xff0c;如果是该…

ADC模拟看门狗

如果被ADC转换的模拟电压低于低阀值或高于高阀值&#xff0c;AWD模拟看门狗状态位被设置。阀值位 于ADC_HTR和ADC_LTR寄存器的最低12个有效位中。通过设置ADC_CR1寄存器的AWDIE位 以允许产生相应中断。通过以下函数可以进行配置 void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx…

wolfSSL5.6.3 虚拟机ubuntu下编译运行记录(踩坑填坑)

网上相关教程很多(包括wolfSSL提供的手册上也是如此大而化之的描述)&#xff0c;大多类似如下步骤&#xff1a; ./configure //如果有特殊的要求的话可以在后面接上对应的语句&#xff0c;比如安装目录、打开或关闭哪些功能等等 make make install 然后结束&#xff0c;大体…

秒杀业务场景的处理方案

秒杀的处理方案 秒杀技术实现核心思想是运用缓存减少数据库瞬间的访问压力。在秒杀时&#xff0c;首先会将数据库的秒杀商品同步到缓存中&#xff0c;用户从缓存中查询秒杀商品&#xff0c;抢购商品时减少缓存中的库存数量。产生的秒杀订单先写到缓存&#xff0c;付款成功后再…

【TypeScript】安装的坑!

TypeScript安装 安装TypeScript安装时候可能报错这样开头的数据&#xff08;无法枚举容器中的对象&#xff09;——原因&#xff1a;没权限先解决没权限的问题如果发现无法修改-高级-修改继续安装想使用tsc-发现&#xff0c;tsc不能用解决方法&#xff1a;配置环境变量最后的最…