51单片机学习day02

基于普中的stc89c52,

串口:

        通讯接口,51单片机自带UART(通用异步收发器),可实现窗口通讯。

硬件电路:

        简单双向串口通信有两根通信线(发送端TXD和接收端RXD),TXD和RXD需要交叉连接,单向数据传输时,可以接一根通信线,电平协议不一致,需要加电平转换芯片。

电平标准:

        电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有三种:

        TTL电平:+5v表示1,0v表示0;

        RS232电平:-3~-15V表示1,+3~+15V表示0;

以上电平距离十多米以上传输信号就会错乱;

        RS485电平:两线压差+2~+6V表示1,-2~-6V表示0;(差分信号)

RS485传输距离远;

流控制,调整传输速率和接收速率不匹配的情况;

同步的带时钟线:SCL,SCLK

全双工:两根线,设备a和设备b可以同时发;

半双工:一根线,利用同一根线收发;分时复用一根线

单工:只能单向传输;

51单片机里的UART:

        

串口参数及时序图:

       波特率:串口通信的速率(发送和接收各数据位的间隔时间)

        检验位:用于数据验证(奇偶校验,)

        停止位:用于数据帧间隔

         比特率:bit,传送多少位;

串口模式图:

配置ES,EA;

波特率计算:

-----------------------------------------------------

SCON = 0x40;//模式一,SM0=0,SM1=1;
    PCON |= 0x80;//波特率
    TMOD &= 0x0F;        //设置定时器模式
    TMOD |= 0x20;        //设置定时器模式,八位自动重装
    TL1 = 0xF3;        //设置定时初值,和波特率有关
    TH1 = 0xF3;            //设置定时初值
    ET1 = 0;        //禁止定时器1中断
    TR1 = 1;        //启动定时器1

---------------------------------------------------------

以12MHZ的晶振为例(每过1微秒记一次数,)

定时器为0xF3(十进制为243),八位寄存器,每隔256溢出一次,与初始值相差13个数(每记13个数溢出一次),每隔13微秒溢出一次,TI的溢出率即为1/13= 0.07692307692307692307692307692308 MHZ

SMOD = 1:  

1/13= 0.07692307692307692307692307692308 MHZ  / 16 =4,807.6923076923076923076923076923 HZ

频率没有与晶振对应,所以会产生误差;

误差值为溢出率/波特率

0.07692307692307692307692307692308 / 4,807.6923076923076923076923076923

=1.6000000000000000000000000000001e-5

所以会产生0.16/100的误差;

如果不选择SMOD就先 / 2再 / 16;

串口相关寄存器:
        

PCON(电源寄存器)前两位与串口有关;

串口控制寄存器SCON和PCON:

配置目标:让UART处于模式1工作状态;(模式1:8位UART)

SCON = 0x40  //SM0:0;SM1:1;//模式一给二进制位:0100 0000;十六进制0x40;

PCON=0 /波特率配置;

------------------配置定时器

串口中定时器有自己的工作模式;

-----------------------------------------------------

SCON = 0x40;//模式一,SM0=0,SM1=1;
    PCON |= 0x80;//波特率
    TMOD &= 0x0F;        //设置定时器模式
    TMOD |= 0x20;        //设置定时器模式,八位自动重装
    TL1 = 0xD0;        //设置定时初值,和波特率有关
    TH1 = 0xFF;            //设置定时初值
    ET1 = 0;        //禁止定时器1中断
    TR1 = 1;        //启动定时器1

---------------------------------------------------------

定时器和波特率stc配置样例:

发送速率过快或者波特率过高都会产生误差,可以采用低波特率和Delay延迟函数解决;

配置单片机收数据:

把REN置为1;

SCON = 0x50;//模式一,SM0=0,SM1=1;
    PCON |= 0x80;//波特率
    TMOD &= 0x0F;        //设置定时器模式
    TMOD |= 0x20;        //设置定时器模式,八位自动重装
    TL1 = 0xD0;        //设置定时初值,和波特率有关
    TH1 = 0xFF;            //设置定时初值
    ET1 = 0;        //禁止定时器1中断
    TR1 = 1;        //启动定时器1

     EA = 1;//启动中断

   ES = 1;//启动串口中断;

中断号:

void UART_Routine() interrupt 4       串口中断号4

单片机是用同一个串口同时收发:所以在中断函数里面用if判断是接收中断还是发送中断;

一个函数不能再主函数和中断函数中同时调用;

数据显示模式:

HEX模式/二进制模式:以原始数据形式显示;

文本模式/字符模式:以原始数据编码后的数据显示;

数据在文本模式时需要用ascll码进行编码在进行发送,可以传输的数据为0-255;(对应ascll码表)

在实际传输过程中只传输二进制码,只是显示方式不一样;

LED点阵屏:

         

本次使用的开发板只是一个8*8单色点阵;

显示原理:

类似于数码管,点阵屏只能扫描法显示不同内容;

74HC595(可控制多位输出):

QA--QH输出端;

OE上加横线说明低电平有效;OE使能接口(只有OE低电平芯片才工作);

RCLK:寄存器时钟;

SRCLR:串行清零端  (直接接VCC代表不清空)

SRCLK:串行时钟

SER:串行数据

--------------------------------------------

SER:串行数据:
        

数据分串行(一个一个在时钟的激励下出去)和并行(同时输出)

串行数据接移位寄存器:把数据写入高电平,控制时钟上升沿移位(SERCLK),把SER清零,再给一个上升沿移位,,数据会一个一个向下移动;

RCLK会把移位寄存器的数据移位到输出端(给RCLK一个上升沿)

以上是一片74HC595的工作方式;

QH` 多片级联:

当移位寄存器满的时候,SER继续给1,输出端会输出到QH`给下一个移位寄存器;

每一片移位寄存器的时钟是连接到一起的;当所有的移位寄存器满的时候,数据移位完成是,上升沿锁存(RCLK)会控制所有的移位寄存器输出到输出缓冲区;

单片机低电平强,高电平弱,如直接接芯片IO口会影响亮度;如果用三极管放大电路进行放大输出电平,IO口作为控制电路,这样缓冲后可以增加导通效果;

同一列输出和同一行输出灯亮度不一样;(恒压输出和恒流输出);

c51中的sfr、sbit:(在头文件中可以找到)

sfr:特殊功能寄存器声明;

例如:sfr P0 =0x80;  声明P0口寄存器,物理地址为0x80;

sbit:特殊位声明

例如:sbit P0_1 = 0x81;  或 sbit P0_1 = P0^1; /声明P0寄存器的第一位;

可位寻址/不可位寻址:

单片机系统中,操作任意寄存器或者某一位数据时,必须给出其物理地址,又因为一个寄存器里有八位,所以位的数量是寄存器数量的8倍。单片机无法对所有位进行编码,故每8位寄存器中,只有一个是可以寻址的,对不可寻址的寄存器,若只操作其中一位而不影响其他位,可以用“&=”,“|=”,“^=”的方法进行位操作;

-----------------------------

sbit RCK = P3^5;      //把P3的第五位命名为RCLK,,等同于操作P35

采用不同的命名方法:来保证避免命名冲突;

高位优先推入QH:

SER第一个给最高位值;把byte的最高位取出赋值给SER;

单片机初始化后所有的IO口都是高电平:所以要操作sck要把先赋值为0;

上升沿移位由0置1后SER给的高位1被移入下一层,移动结束后,再次置0,为下一次移动准备;

重复移位:

用for循环解决:

上升沿移位完成后,进行上升沿锁存,把八位数据送到IO口上;

点阵屏代码:

当Column = 0 ,P07 = 0.其他输出1;

代码改进:

段选  位选   段选  位选 段选  位选        //点阵屏重复执行,会把位选的数据影响到段选数据;所以要消影;

消除残影,所以加上延时 位清零

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

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

相关文章

HelixToolKit的模型旋转操作

前面加载了模型以后,鼠标拖动和缩放比较好操作;但是旋转似乎没有, 操作了一阵,也不是没有,应该是还不熟悉; 旋转的指示器在右下角,现在U面看到正面, 想看一下模型的背面&#xff0…

【Java项目介绍和界面搭建】拼图小游戏——添加图片

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏 …

扼杀网络中的环路:STP、RSTP、MSTP

目录 前言: 一、STP(Spanning Tree Protocol) 1.1 STP功能 1.2 STP应用 二、RSTP(Rapid Spanning Tree Protocol) 2.1 RSTP功能 2.2 RSTP应用 三、MSTP(Multiple Spanning Tree Protocol&#xff0…

Angular 由一个bug说起之四:jsonEditor使用不当造成的bug

一:问题 项目中使用了一个JSON第三方库: GitHub - josdejong/jsoneditor: A web-based tool to view, edit, format, and validate JSON 当用户编辑JSON格式的数据,查找替换时: 用户的期望结果是:$$ 被替换为$$_text&a…

[物联网] OneNet 多协议TCP透传

[物联网] OneNet 多协议TCP透传 STM32物联网–ONENET云平台的多协议接入产品创建 : https://blog.csdn.net/qq_44942724/article/details/134492924 Onenet tcp 透传 : https://blog.csdn.net/flyme2010/article/details/107086001 tcp服务端测试工具 : http://tcp.xnkiot.com/…

zephyr学习

zephyr内核对象学习 定时器 类似linux的定时器, 可以分别设置第一次到期时间和后续的周期触发时间, 可以注册到期回调和停止回调 还有一个计数状态,用于标记timer到期了多少次 duration:设定timer第一次到期的时间。 period: …

【蛀牙】日常生活如何正确护理牙齿?刷牙、洗牙、补牙

程序员生活指南之 【蛀牙】日常生活如何正确护理牙齿?刷牙、洗牙、补牙 文章目录 一、日常如何清洗牙齿?——刷牙与洗牙1、牙齿污垢1.1 牙菌斑1.2 软垢1.3 牙结石1.4 牙龈出血 2、如何刷牙2.1 关于时间2.2 各种工具2.3 巴氏刷牙法 二、定期进行洗牙3、如…

题目 1076: 内部收益率

题目描述: 在金融中,我们有时会用内部收益率IRR来评价项目的投资财务效益,它等于使得投资净现值NPV等于0的贴现率。换句话说,给定项目的期数T、初始现金流CF0和项目各期的现金流CF1, CF2, ...,CFT,IRR是下面方程的解&…

RISC-V特权架构 - 特权模式与指令

RV32/64 特权架构 - 特权模式与指令 1 特权模式2 特权指令2.1 mret(从机器模式返回到先前的模式)2.2 sret(从监管模式返回到先前的模式)2.3 wfi(等待中断)2.4 sfence.vma(内存屏障) …

SpringBoot+Vue+MySQL:装修管理新架构探索

✍✍计算机毕业编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java、…

FPGA开源项目分享——2D N-Body重力模拟器

​导语 今天继续康奈尔大学FPGA 课程ECE 5760的典型案例分享——2D N-Body重力模拟器。 (更多其他案例请参考网站: Final Projects ECE 5760) 1. 项目概述 项目网址 Grav Sim 项目说明 该项目的目标是创建一个用DE1-SOC进行硬件加速的2…

简易内存池2 - 华为OD统一考试(C卷)

OD统一考试(C卷) 分值: 200分 题解: Java / Python / C 题目描述 请实现一个简易内存池,根据请求命令完成内存分配和释放。 内存池支持两种操作命令,REQUEST和RELEASE,其格式为: REQUEST请求的内存大小 …

Redis 【1】—— 安装 与 配置

Redis 【1】—— 安装 与 配置 一、安装 与 配置(一)使用 yum 安装(二)创建符号链接1. 软链接2. 相关指令 (三)修改配置文件(四)Redis 的启停 一、安装 与 配置 (一&…

外贸业务员没客户的7大原因+解决办法!

业务员没有客户,就是无源之水,无本之木,这自然也就没有业绩。那些吃空饷的业务员,迟早会拖垮公司。所以不管是什么原因导致的业务员没客户,都要一一查验清楚。七个业务员没有客户的原因,七种对策&#xff0…

华为数通方向HCIP-DataCom H12-821题库(多选题:21-40)

第21题 管理员在配置 VRRP 时,下面哪些不是必须配置的? A.抢占模式 B.抢占延时 C.虚拟IP 地址 D.虚拟路由器的优先级 【参考答案】ABD 【答案解析】 VRRP的作用之一是提供一个虚拟的IP地址,用作默认网关,用来实现冗余和故障转移。因此,配置虚拟IP地址是必须的。华为设备vr…

hcip交换

交换机功能 无限的传输距离——识别,重写电信号(帧)保证信息完整彻底解决了冲突二层单播——MAC地址表提高端口密度 单播地址:MAC地址第一个字节第8位为0 组播地址:MAC地址第一个字节第8位为1 广播地址:全1…

渗透测试靶场环境搭建

1.DVWA靶场 DVWA(Damn Vulnerable Web Application)是一个用来进行安全脆弱性鉴定的PHP/MySQL Web应用,包含了OWASP TOP10的所有攻击漏洞的练习环境,旨在为安全专业人员测试自己的专业技能和工具提供合法的环境,同时…

Mybatis批量更新对象数据的两种方法

说明:遇到一次需要批量修改对象的场景。传递一个对象集合,需要根据对象ID批量修改数据库数据,使用的是MyBatis框架。查了一些资料,总结出两种实现方式。 创建Demo 首先,创建一个简单的Demo; &#xff08…

SpringBoot+Jwt+Redis

大致流程: 参照: 史上最全面的基于JWT token登陆验证_完整的基于jwt的登陆认证-CSDN博客 springboot整合JWTRedis_springboot jwt redis-CSDN博客

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:浮层)

设置组件的遮罩文本。 说明: 从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 overlay overlay(value: string | CustomBuilder, options?: { align?: Alignment; offset?: { x?: number; y?: number } })…