proteus+51单片机+实验(LCD1620、定时器)

目录

1.LCD1602液晶显示屏

1.1基本概念

1.1.1LCD的简介

1.1.2LCD的显示原理

​​​1.1.3LCD的硬件电路

1.1.4LCD的常见指令

1.1.5LCD的时序

​​​​​​​1.2代码

1.2.1写命令和写数据操作

 1.2.2初始化和测试代码

1. 3.3功能函数

1.3proteus代码

1.3.1器件代码

1.3.2总体Proteus

​编辑​ 2.定时器

2.1基本概念

2.1.1定时器的简介

2.1.2定时器的计数模式

 2.1.3寄存器

​编辑 2.1.4中断系统

​编辑  ​编辑

2.2代码

2.2.1定时器初始化代码

2.2.2定时器中断代码

2.2.3计数器函数

2.3proteus仿真

2.3.1定时器总体仿真

2.3.2计数器总体框图


1.LCD1602液晶显示屏

1.1基本概念

1.1.1LCD的简介

  • LCD1602(Liquid Crystal Display)液晶显示屏是一种专门用来显示字母、数字、符号和字符型等的点阵型液晶模块,可以显示ASCII码的标准字符和其它的一些内置特殊字符,还可以有8个自定义字符。

  • 它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。该显示屏的优点是耗电量低、体积小、辐射低。

  • 显示容量:16×2个字符,每个字符为5*7点阵,、

1.1.2LCD的显示原理

我们所用的LCD屏的命名,基本都是按照其分辨率来进行命名的比如lcd1602就是分辨率为16×2,lcd12864就是分辨率为128×64

  • LCD1602主要用来显示数字、字母、图形以及少量自定义字符。可以显示2行16个字符,拥有16个引脚,其中8位数据总线D0-D7,和RS、R/W、EN三个控制端口,工作电压为5V,并且带有字符对比度调节V0和背光源AK。

  • LCD需要背光源才能亮

  • 80个字节的显示缓冲区DDRAM,分两行,地址分别为00H27H,40H67H
  • LCD1602,总共显示为16行2列,对应着32个RAM地址,在使用的时候,需要在哪个位置显示,就写入对应的RAM地址,然后再写入需要的字符,对应就会显示该字符。

  • 转义字符(\)

​​​1.1.3LCD的硬件电路

引脚功能
VSS
VDD电源正极(4.5~5.5V)
VO对比度调节电压,即调节LCD的显示
RS数据/指令选择,1为数据,0为指令
RW读(read)/写(write)信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或显示地址;当RS为低电平,R/W为高电平时,可以读忙信号;当RS为高电平,R/W为低电平时,可以写入数据
E使能,1为数据有效,下降沿执行命令
D0~D78位并行数据口数据输入/输出
A背光灯电源正极
K背光灯电源负极

1.1.4LCD的常见指令

ASCll码表

  • 清屏指令(0x01)

(1)清除液晶显示器,即将DDRAM的内容全部填入“空白”的ASCII码20H;

(2)光标归位,将光标撤回液晶显示屏的左上方;

(3)将地址计数器(AC)的值设置为0;

  • 光标复位,光标返回到地址00H

(1) 光标复位到地址00H位置

(2)LCD显示DDRAM的内容不变

  • 进入模式设置指令

(1) 功能:设定每次定入1位数据后光标的移位方向,并且设定每次写入的一个字符是否移动。参数设定的情况如下所示:

(2)0=写入新数据后光标左移 ; 1=写入新数据后光标右移;

(3)S—0=写入新数据后显示屏不移动 ;1=写入新数据后显示屏整体右移1个字符

  • 显示开关指令

(1)功能 : 控制显示器开/关、光标显示/关闭以及光标是否闪烁。

(2)D(Dispaly):控制整体的显示开与关,高电平表示开显示屏,低电平表示关显示屏

(3)C(Cursor):控制光标的开与关,高电平表示有光标,低电平表示无光标

(4)B(Blink):控制光标是否闪烁,高电平闪烁,低电平不闪烁

  • 功能设定指令

(1) 功能 : 设定数据总线位数、显示的行数及字型

(2)DL —— 0=数据总线为4位 ; 1=数据总线为8位;

(3)N —— 0=显示1行 ; 1=显示2行;

(4)F —— 0=5×7点阵/每字符 ; 1=5×10点阵/每字符;

  • 光标和显示移位

(1) SC=0,RL=0 :光标左移

(2)SC=0,RL=1 : 光标右移

(3)SC=1,RL=0时,字符和光标都左移

(4)SC=1,RL=1时字符和光标都右移

1.1.5LCD的时序

  • 写指令/数据

  • ​​​​​​​​​​读指令/数据

​​​​​​​​​​​​​​1.2代码

1.2.1写命令和写数据操作

sbit RS=P3^0;
sbit RW=P3^1;
sbit E=P3^2;void writecommand(unsigned char command)
{RS=0;  //RS为低电平时此时为读数据RW=0;  //RW为低表示数据写入E=0;   //E=0表示在前半部分,此时数据没有传送无需置高P2=command; //command为命令Delay_ms(5);E=1;   //E此时表示传送数据有效E=0;   //E此时表示数据传送完成此时为空闲状态
}void writedata(unsigned char dat)
{RS=1;  //RS为低电平时此时为读数据RW=0;  //RW为低表示数据写入E=0;   //E=0表示在前半部分,此时数据没有传送无需置高P2=dat; //command为命令Delay_ms(5);E=1;   //E此时表示传送数据有效E=0;   //E此时表示数据传送完成此时为空闲状态
}

 1.2.2初始化和测试代码

void lcd_init()
{writecommand(0x38);//设置16×2显示、5×7点阵和8位数据接口writecommand(0x0C);//设置开启显示,不显示光标writecommand(0x06);//显示地址地址加1,即写一个数据后,显示位置右移一位 writecommand(0x01);//显示清零,数据指针清零
}void lcd_test()
{writecommand(0x80); //LCD的第一行起始地址Delay_ms(5);writedata('A');Delay_ms(5);writecommand(0x80+0x40); //LCD的第二行起始地址Delay_ms(5);writedata('X');Delay_ms(5);
}

1. 3.3功能函数

/*** @brief 在LCD中显示一个字符* @param Line:表示在第几行显示* @param Column:表示在第几列显示* @param Char:显示字符* @retval*/
void LCD_Showchar(unsigned char Line,unsigned char Column,unsigned char Char)
{   if(Line==1){ writecommand(0x80|(Column-1));      //此时在第一行显示}else{writecommand (0x80|(Column-1)+0x40);//此时在第二行显示,writedata(Char);}
}/*** @brief 在LCD中显示一个字符串* @param Line:表示在第几行显示* @param Column:表示在第几列显示* @param Char:显示字符串* @retval*/
void LCD_Showstring(unsigned char Line,unsigned char Column,unsigned char *String)
{unsigned char i;if(Line==1){ writecommand(0x80|(Column-1));      //此时在第一行显示}else{writecommand (0x80|(Column-1)+0x40);//此时在第二行显示,} for(i=0;String[i]!='\0';i++){writedata(String[i]);}  
}/*** @brief 立方函数* @param x为分子* @param y为立方根*/
int LCD_POW(int x,int y)
{unsigned char i;int result=1;for(i=0;i<y;i++){result*=x;}return result;
}/*** @brief 设置字符位置* @param x为行* @param y为列*/
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{unsigned char i;if(Line==1){ writecommand(0x80|(Column-1));      //此时在第一行显示}else{writecommand (0x80|(Column-1)+0x40);//此时在第二行显示,} 
}/*** @brief 设置数字*/
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned char Num,unsigned char Length)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){writedata(Num/LCD_POW(10,i-1)%10+0x30);//得到数字的高位);     }
}

1.3proteus代码

1.3.1器件代码

1.3.2总体Proteus

​ 2.定时器

2.1基本概念

2.1.1定时器的简介

  (1)STC89C52系列单片机内部设置的两个16位定时器/计数器T0和T1都具有计数方式和定时方式两种工作方式。对每个定时器/计数器(T0和T1),在特殊功能寄存器TM0D中都有一控制位一C/T来选择T0或T1为定时器还是计数器。

(2)定时器/计数器的核心部件是一个加法(也有减法)的计数器,其本质是对脉冲进行计数。只是计数脉冲来源不同:如果计数脉冲来自系统时钟,则为定时方式,此时定时器/计数器每12个时钟或者每6个时钟得到一个计数脉冲,计数值加1;如果计数脉冲来自单片机外部引脚(T0为P3.4,T1为P3.5),则为计数方式,每来一个脉冲加1。

(3)SYSclk:系统时钟,即晶振周期,晶振为12MHz 

(4)当定时器/计数器工作在定时模式时,可在烧录用户程序时在STC-ISP编程器中设置(如下
图所示)是系统时钟÷12还是系统时钟÷6后让T0和T1进行计数。当定时器/计数器工作在计数模式时,对外部脉冲计数不分频。

(5)GATE:门控位,用于控制定时/计数器的启动是否受外部中断请求信号的影响。

2.1.2定时器的计数模式

  • 模式1(16位定时器/计数器)及其测试程序

  • 模式2(8位计数器模式)

  • 16位定时器工作方式 

(1)​​​​​​​计数值为N和初值X关系:X=65536-N(12/fosc),N的单位为us即定义的时间

(2)上次计数完,计数器值为0,要重复计数需重置初值。

fosc为晶振频率,51单片机一般为12MHz或者11.0592MHz

  • 16位计数器工作方式

​​​​​​​(1)16位定时/计数器方式计数值为N和初值X关系:X=65536-N
(2)上次计数完,计数器值为0,要重复计数需重置初值。

 2.1.3寄存器

  • 定时器/计数器控制寄存器TCON 

  •  定时器/计数器工作模式寄存器TMOD

 2.1.4中断系统

  

2.2代码

2.2.1定时器初始化代码

void timerinit()
{TMOD=0x01;              //定时器0工作在16位定时器模式下,TH0、TL0全用TF0=0;                  //防止开始定时器溢出产生中断,因此将TF0定时器清零TH0=(65536-50000)/256;  //计时50000us,并且除以2^8相当于右移8位,取出了高八位TH0=(65536-50000)%256;  //取出低八位,ET0=1;                  //开启定时器0的中断EA=1;                   //开启总中断TR0=1;                  //启动定时器0 PT0=0;                  //配置低优先级    
}

2.2.2定时器中断代码

void timer_isr()  interrupt 1   //0表示外部中断0:1表示定时器中断0:2表示外部中断1;3表示定时器中断1;4表示串口中断
{TH0=(65536-50000)/256;  TH0=(65536-50000)%256;  count++;if(count==10)count=0;P2=s[count];// Delay_ms(200);
}

2.2.3计数器函数

void timerinit()
{TMOD=0x06;              //定时器0工作在8位自动重载计数器模式下,TH0、TL0全用TF0=0;                  //防止开始计数器溢出产生中断,因此将TF0计数器清零TH0=256-3;              //计数值为3,由于是8位所以不需要将数据取出TH0=256-3;              //计数器3ET0=1;                  //开启定时器0的中断EA=1;                   //开启总中断TR0=1;                  //启动定时器0 PT0=0;                  //配置低优先级    
}void count_isr()  interrupt 1   //0表示外部中断0:1表示定时器中断0:2表示外部中断1;3表示定时器中断1;4表示串口中断
{num++;     //每隔3次,进入计数器的中断函数使得Num的值加1
}

2.3proteus仿真

2.3.1定时器总体仿真

2.3.2计数器总体框图

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

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

相关文章

探索Python世界的隐藏宝石:Pika库的神秘力量

文章目录 探索Python世界的隐藏宝石&#xff1a;Pika库的神秘力量背景&#xff1a;为何选择Pika&#xff1f;Pik库简介如何安装Pika&#xff1f;简单库函数使用方法场景应用常见Bug及解决方案总结 探索Python世界的隐藏宝石&#xff1a;Pika库的神秘力量 背景&#xff1a;为何…

ELK预警方案:API+XXLJob

目录 步骤一&#xff1a;出一个接口&#xff0c;接口内查询出10分钟内是否有异常信息 步骤二&#xff1a;XXLJob中设置预警的频率 步骤三&#xff1a;在重要的业务处输出指定格式日志即可 步骤一&#xff1a;出一个接口&#xff0c;接口内查询出10分钟内是否有异常信息 {&qu…

Java | Leetcode Java题解之第402题移掉K位数字

题目&#xff1a; 题解&#xff1a; class Solution {public String removeKdigits(String num, int k) {Deque<Character> deque new LinkedList<Character>();int length num.length();for (int i 0; i < length; i) {char digit num.charAt(i);while (!…

C语言字符函数和字符串函数(20)

文章目录 前言一、字符分类函数小练习 二、字符转换函数三、strlen的使用和模拟实现四、strcpy的使用和模拟实现五、strcat的使用和模拟实现六、strcmp的使用和模拟实现七、strncpy函数的使用八、strncat函数的使用九、strncmp函数的使用十、strstr函数的使用和模拟实现十一、s…

OpenGL3.3_C++_Windows(37)

调试&#xff1a; 视觉错误与CPU调试不同&#xff0c;在GLSL代码中也不能设置断点&#xff0c;出现错误的时候寻找错误的源头可能会非常困难。 glGetError&#xff08;&#xff09; GLenum glGetError();返回整形数字&#xff0c;查询错误标记&#xff0c;但是当一个错误标记…

C#开发基础之使用四种流行的数据库访问技术ADO.NET、Dapper、EF Core 和 SqlSugar 连接 SQL Server

前言 在这篇文章中&#xff0c;我们将介绍四种流行的数据库访问技术&#xff1a;ADO.NET、Dapper、Entity Framework Core (EF Core) 和 SqlSugar。每种技术都提供了与 SQL Server 进行交互的不同方法&#xff0c;我们将以 TestDB 数据库中的 User 表为例&#xff0c;展示如何…

关于malloc/free的一些知识点

序 关于malloc/free&#xff0c;我们都不陌生&#xff0c;在最开始学习c语言时就相当了解&#xff0c;包括c中的new也是封装的malloc。下边我以glibc实现的malloc来讲述一些关于malloc/free的知识点。 malloc/free malloc和free并不是系统调用&#xff0c;而是运行时库&…

C语言的结构体类型

在我们使用C语言进行编写代码时&#xff0c;常常会使用已经给定的类型来创建变量&#xff0c;比如int型&#xff0c;char型&#xff0c;double型等&#xff0c;而当我们想创建一些较为复杂的东西时&#xff0c;单单用一个类型变量是没办法做到的&#xff0c;比如我们想创建一个…

shader 案例学习笔记之fract函数

fract函数 可以理解为模1取余&#xff0c;获取一个数的小数部分&#xff0c;如果参数是向量&#xff0c;那就是获取每个向量分量上的小数 案例一 #ifdef GL_ES precision mediump float; #endif// 渲染分辨率 uniform vec2 u_resolution; // 程序运行时间 uniform float u_ti…

如何利用 Smarter Balanced 塑造教育领域的 AI 治理

目录 定义挑战 以人为本的设计引领 融入多样性 探索以学生为中心的价值观 探索效果的层次和不同的影响 部位于加利福尼亚州的Smarter Balanced Assessment Consortium 是一个由会员主导的公共组织&#xff0c;为 K-12 和高等教育领域的教育工作者提供评估系统。该组织成立…

初学者指南:MyBatis 入门教程

主要介绍了Mybatis的基本使用、JDBC、数据库连接池、lombok注解&#xff01; 文章目录 前言 什么是Mybatis? 快速入门 使用Mybatis查询所有的用户信息 配置SQL提示 JDBC介绍 Mybatis 数据库连接池 lombok 总结 前言 主要介绍了Mybatis的基本使用、JDBC、数据库连接…

基于stm32单片机使用 RT-Thread 系统的 ADC 外设

一、ADC 介绍 来源&#xff1a;RT-Thread 文档中心   ADC(Analog-to-Digital Converter) 指模数转换器。是指将连续变化的模拟信号转换为离散的数字信号的器件。真实世界的模拟信号&#xff0c;例如温度、压力、声音或者图像等&#xff0c;需要转换成更容易储存、处理和发射…

【Linux】:信号与信号产生

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家带来信号和信号的产生相关代码和知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到…

YOLOv10优改系列一:YOLOv10融合C2f_Ghost网络,让YoloV10实现性能的均衡

&#x1f4a5; &#x1f4a5;&#x1f4a5; &#x1f4a5;&#x1f4a5; &#x1f4a5;&#x1f4a5; &#x1f4a5;&#x1f4a5;神经网络专栏改进完整目录&#xff1a;点击 &#x1f497; 只需订阅一个专栏即可享用所有网络改进内容&#xff0c;每周定时更新 文章内容&#x…

微信自动通过好友和自动拉人进群,微加机器人这个功能太好用了

又发现一个好用的功能&#xff0c;之前就想找一个这种工具&#xff0c;现在发现可以利用微加机器人的两个功能来实现&#xff0c;分别是加好友和关键词拉群 首先 微加机器人的专业版 > 功能 > 加好友设置 可以设置一个关键词通过,这样别人加好友的时候只需要输入制定内…

实战案例(5)防火墙通过跨三层MAC识别功能控制三层核心下面的终端

如果网关是在核心设备上面&#xff0c;还能用MAC地址进行控制吗&#xff1f; 办公区域的网段都在三层上面&#xff0c;防火墙还能基于MAC来控制吗&#xff1f; 采用正常配置模式的步骤与思路 &#xff08;1&#xff09;配置思路与上面一样 &#xff08;2&#xff09;与上面区…

通信工程学习:什么是PDF策略决策功能

PDF策略决策功能 PDF策略决策功能&#xff08;Policy Decision Function, PDF&#xff09;在通信网络中&#xff0c;特别是在IP多媒体子系统&#xff08;IMS&#xff09;中&#xff0c;扮演着至关重要的角色。以下是对PDF策略决策功能的详细解释&#xff1a; 一、定义与功能概…

CentOS Stream 8中安装和使用 Docker

docker安装包-CSDN博客 〇、常用的docker命令 docker的作用&#xff1a; 快速进行软件的安装&#xff0c;便于软件环境的维护 docker的镜像: 压缩了指定软件的安装包的文件。使用镜像文件创建容器 docker的容器: 容器可以理解为就是一台小电脑。安装的linux系统&am…

【F的领地】项目拆解:小学教辅资料

项目介绍 虚拟资料项目的赛道其实一直可以做&#xff0c;实际上就是一个信息差项目。 知识付费是常青树&#xff0c;人天生有为知识付费的倾向。 而且虚拟资料通常一份 19~99 的资料有这方面需求很容易就能付款。 主要是产附属的流量再提问题。 我有个同乡&#xff0c;18年…

CircleProgressView 鸿蒙ArkTS自定义View实现圆形进度条

上篇的截图中除了一个上下的箭头&#xff0c;还有一个圆形进度条&#xff0c;今天我们来讲讲这个如何进行实现 我们看这个图形的构造&#xff0c;其实很简单&#xff1a;一个圆形图形&#xff0c;以及一个文本来显示进度 所以我们用一个层叠布局 绘制一个带颜色的圆形&#xff…