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

news2024/12/23 13:08:57

目录

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;              //计数器3
    ET0=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.coloradmin.cn/o/2130763.html

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

相关文章

几种手段mfc140u.dll丢失的解决方法,了解mfc140u.dll

在使用Windows操作系统时&#xff0c;许多用户可能会遇到“找不到mfc140u.dll”或“mfc140u.dll未找到”的错误提示。这个错误通常是由于该文件丢失或损坏所致。本文将详细介绍mfc140u.dll文件的作用、丢失的原因及其解决方法&#xff0c;帮助您快速恢复系统的正常运行。 一、m…

无人机视角的道路损害数据集,2400张图像,包括纵向裂缝(LC)、横向裂缝(TC)、鳄鱼裂缝(AC)、斜裂(OC)、修补(RP)和坑洞(PH),共2.3GB

数据集名称 无人机视角的道路损害数据集 数据集描述 这是一个专注于道路损害检测的数据集&#xff0c;包含了从无人机视角拍摄的2400张高清图像&#xff0c;涵盖了六种典型的道路损害类型&#xff1a;纵向裂缝&#xff08;LC&#xff09;、横向裂缝&#xff08;TC&#xff0…

c++ 点云生成二维俯视图

🙋 结果预览 一、代码实现 #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include

S7_1200配方功能快速入门

配方数据文件按照标准 CSV 格式存储在 S7-1200 CPU 装载存储器或 S7-1200 SIMATIC 存储卡“程序卡”中。分别可通过 PLC Web 服务器或对于存储卡文件操作&#xff0c;将数据文件传送到 PC 进行管理和查看。也可将修改过后的配方数据文件上传至PLC&#xff0c;再通过“RecipeImp…

【数据结构】详细介绍各种排序算法,包含希尔排序,堆排序,快排,归并,计数排序

目录 1. 排序 1.1 概念 1.2 常见排序算法 2. 插入排序 2.1 直接插入排序 2.1.1 基本思想 2.1.2 代码实现 2.1.3 特性 2.2 希尔排序(缩小增量排序) 2.2.1 基本思想 2.2.2 单个gap组的比较 2.2.3 多个gap组比较(一次预排序) 2.2.4 多次预排序 2.2.5 特性 3. 选择排…

【AcWing】869. 试除法求约数

约数&#xff1a;当前数能整除这个数。 和判断质数一样的道理&#xff0c;同样是试除法。 约数也一定是成对出现的。在枚举的时候也可以只枚举较小的那一个约数就可以了&#xff0c;较大的那个约数直接算。 #include<iostream> #include<algorithm> #include<…

无人机之处理器篇

无人机的处理器是无人机系统的核心部件之一&#xff0c;它负责控制无人机的飞行、数据处理、任务执行等多个关键功能。以下是对无人机处理器的详细解析&#xff1a; 一、处理器类型 无人机中使用的处理器主要包括以下几种类型&#xff1a; CPU处理器&#xff1a;CPU是无人机的…

JDBC API详解一

DriverManager 驱动管理类&#xff0c;作用&#xff1a;1&#xff0c;注册驱动&#xff1b;2&#xff0c;获取数据库连接 1&#xff0c;注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); 查看Driver类源码 static{try{DriverManager.registerDriver(newDrive…

中间件常见漏洞

文章目录 中间件漏洞IIS文件解析漏洞1&#xff1a;/xx.asp/xx.jpg 、/xx.asa/xx.jsp2&#xff1a;xx.asp;.jpg3&#xff1a;xx.asa、xx.cer、xx.cdx4&#xff1a;IIS.7/8 CGI配置不当解析漏洞 Apache文件解析漏洞1&#xff1a;apache2.2版本解析漏洞2&#xff1a;其余配置问题…

IMX6 L508EN 模块调试(4G)

一、概述 提起 4G 网络连接&#xff0c;大家可能会觉得是个很难的东西&#xff0c;其实对于嵌入式 Linux 而言&#xff0c;4G 网络连接恰恰相反&#xff0c;不难&#xff01;大家可以看一下其他的嵌入式 Linux 或者 Android 开发板&#xff0c;4G 模块都是 MiniPCIE 接口的&…

C++从入门到起飞之——继承上篇 全方位剖析!

&#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a;C从入门到起飞 &#x1f516;克心守己&#xff0c;律己则安 目录 1、继承的概念 2、继承定义 2.1 定义格式 2.2 继承基类成员访问⽅式的变化 3、继承类模板 4、 基…

linux网络编程——UDP编程

写在前边 本文是B站up主韦东山的4_8-3.UDP编程示例_哔哩哔哩_bilibili视频的笔记&#xff0c;其中有些部分博主也没有理解&#xff0c;希望各位辩证的看。 UDP协议简介 UDP 是一个简单的面向数据报的运输层协议&#xff0c;在网络中用于处理数据包&#xff0c;是一种无连接的…

操作系统 ---- 处理机调度

一、处理机调度学习路线 二、调度要研究的问题&#xff1f; 当有一堆任务要处理&#xff0c;但由于资源有限&#xff0c;这些事情没法同时处理。这就需要确定某种规则来决定处理这些任务的顺序&#xff0c;这就是“调度”研究的问题。 三、调度的三个层次 3.1 高级调度&…

深入解读Docker核心原理:Namespace资源隔离机制详解

在容器技术中&#xff0c;资源隔离 是容器化能够实现轻量级虚拟化的关键技术之一。通过资源隔离&#xff0c;容器可以拥有自己的独立环境&#xff0c;确保容器之间互不干扰&#xff0c;从而实现应用的安全和稳定。Docker作为主流的容器平台&#xff0c;其核心的资源隔离机制依赖…

LabVIEW软件授权与分发要求

在LabVIEW开发中&#xff0c;将软件打包成安装程序并销售给其他公司&#xff08;例如对知识产权有严格要求的国外公司&#xff09;时&#xff0c;涉及授权和许可的多个关键环节。NI对LabVIEW的开发、分发、安装和使用都有明确的授权要求&#xff0c;以确保知识产权的合法性和软…

CentOS 7 最小化安装后如何安装图形化桌面

CentOS 7 最小化安装后如何安装图形化桌面 一、准备工作1. 登录系统2. 配置网络 二、安装图形化桌面1. 安装 X Window System2. 安装 GNOME 桌面 三、配置默认启动模式1. 查看当前启动模式2. 修改默认启动模式 四、重启系统并验证 &#x1f496;The Begin&#x1f496;点点关注…

基于微信小程序的高校实验室管理系统的设计与实现

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于微信小程序JavaSpringBootVueMySQL的高…

FreeRTOS学习笔记(十一)内存管理

文章目录 前言一、内存管理1.1 内存管理的引入1.2 内存碎片 二、内存分配的方法2.1 heap_12.1.1 实现原理2.1.2 源码解析 2.2 heap_2 内存分配方法2.2.1 实现原理2.2.2 源码解析 2.3 heap_3 内存分配方法2.4 heap_4 内存分配方法2.4.1 实现原理2.4.2 源码解析 2.5 heap_5 内存分…

【论文解读系列】DPD-BiReconstructor的神经网络架构

原标题&#xff1a;Semisupervised Neural Proto-Language Reconstruction 论文地址&#xff1a;https://arxiv.org/pdf/2406.05930 现有实现祖先语言&#xff08;原语言&#xff09;比较重建的工作通常需要完全监督。然而&#xff0c;如果历史重建模型只能用少量标记数据进行训…

二、栈和队列-算法总结

文章目录 二、栈和队列2.1 基本应用2.1.1 逆波兰表达式求值2.1.2 有效的括号 2.2 单调栈2.2.1 柱状图中最大的矩形 二、栈和队列 2.1 基本应用 2.1.1 逆波兰表达式求值 150. 逆波兰表达式求值 class Solution {/**思路分析&#xff1a;遇到数则压栈&#xff0c;遇到运算符…