51单片机自学报告--实验部分

news2024/9/21 17:55:42

微机接口技术-自主学习笔记

PPT链接:微机接口自学--51单片机自学汇报PPT_猫猫爱吃小鱼的博客-CSDN博客

效果演示gif:

 

 

 

 

四、Proteus仿真

仿真环境:电路仿真软件:                       Proteus

                  HEX可执行文件编写软件:    keil uVision4

keil uVision4新建项目简略步骤:

  1. new project,选择使用的芯片(例:AT89C51,AT89C52)。
  2. 创建main.c(或.asm),并添加进project。
  3. 选择生成 HEX 文件 ,因为单片机执行的时候,是通过执行 HEX 文件来执行的。
  4. 添加HEX文件,即可运行

图13 步骤1

 

图14 步骤2

图15 步骤3

可用芯片:AT89C51,AT89C52等,它们的区别如下所示:

(1)、RAM 空间增大:AT89C51 有128 字节的内部 RAM,称之为 DATA 存储区。AT89C52 的内部 RAM 扩展为 256 字节,其中高 128 字节,位于从 80H 开始的地址空间中,称之为 IDATA 存储区,但IDATA 区的访问只能是间接寻址方式。
    (2)、内部 FLASH 变大:AT89C51 有 4K 字节的内部 FLASH PERAM,而。AT89C52 的内部 FLASH PERAM 增加1倍,达到8K。
    (3)、中断源增加:在AT89C52 中P1.0和P1.1还可分别作为定时器/计数器2的外部计数输入(P1.0/T2)和(P1.1/T2EX),也就是说,P1.0同时可作为定时器/计数器 T2 的外部计数输入,和输出占空比 50% 的时钟脉冲端口,P1.1同时可作为定时器/计数器 T2 捕获/重新装载触发和方向控制端口。故,AT89C52 除了具备 AT89C51 的定时器/计数器 T0 和定时器/计数器 T1,还额外增加了一个定时器/计数器 T2。而定时器/计数器 T2 的控制和状态位单独位于T2CON、T2MOD,定时器/计数器 T2 在 16 位捕获方式或自动重新装载方式下的捕获/重载寄存器组是(TCAO2H、RCAP2L)。

4.1 简单LED灯的控制

这是一个简单来理解51单片机定时和计数的例子。

(1)先来介绍定时功能,当作为定时使用时,配置步骤:模式设置,配置TMOD寄存器;定时器初值设置 假设10ms中断;开定时器中断;开总中断;打开定时器。流程图如下图所示:

 

图16 定时器中断方式计时流程图

仿真电路图绘制如下图所示,实现每一秒点亮LED一次:

所含电路元器件:单片机AT89C51(频率12M),LED灯,电阻,电容,电源和地等(CRYSTAL和电容组成不可编程模块,可不添加)

 图17 定时点亮LED仿真电路

LED-RED接引脚P1.0,程序中需要这样配置:

sbit led=P1^0;

采用的是定时器0,16位定时器/计数器工作模式(工作与式1),参照图 TMOD格式

 图18 TMOD格式

程序中需要这样配置:

TMOD=0X01;

 因为:1s=50ms*20,对于12M的晶振单片机,12MHz除12为1MHz,也就是说一秒=1000000次机器周期,50ms=50000次机器周期;所以计数值为50000,每中断20次,则点亮LED灯。

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

........

//中断服务子程序

void time0() interrupt 1 {

TH0=(65536-50000)/256;      //重装初值

TL0=(65536-50000)%256;

a++;

}

a每加到20,则点亮LED灯,同时置0,需要注意每次触发中断后,都需要重新装入初值。

 图19 LED点亮

(2)定时计数器作为计数器使用,配置步骤如下:

1.模式设置,配置TMOD寄存器。

2.开计数器中断

3.开总中断

4.打开计数器

注意: 计数器可以不开中断,这样溢出时只是不会进去中断服务程序。

仿真电路图绘制如下图所示,实现每按五次按键(P3.4引脚)点亮LED一次:

 

图20 计数方式点亮LED灯

LED灯接法和定时方式下一样,但是TMOD寄存器配置不一样了,本设计中TMOD的D2位C/T为设为1,选择计数功能:

sbit led=P1^0;

 sbit s=P3^4;

TMOD=0x05; //模式设置,00000101,采用的是计数器0,工作模式1

比较定时方式下的电路,在这边的P3.4/T0口接了一个简单的开关电路,对P3.4口进行下降沿的脉冲计数。因为TR0:T0充许计数控制位,为1时充许T0计数(定时),所以初始化时需要将 TR0置1。

 TR0=1;    

本次的设计是用count存储计数值,到了5次,则人为让计数器进入中断,使得TH0和TL0溢出,进行中断处理。

   count=(TH0<<8)|TL0;

        if((count*10000)==50000)//按5下按键led状态取反  

            {

                led=0;

                TH0=0XFF;

                TL0=0XFF; //人为的让计数器进入中断

            }

中断服务程序中,使LED灯亮。

 图21  LED灯点亮

4.2 流水灯控制(定时器中断控制的独立式键盘扫描)

使用定时器中断控制获得按键值,实现按下S1,D8-D1循环点亮;按下S2,D1-D8循环点亮;按下S3,全部熄灭;按下S4,D1-D8同频率闪烁。仿真电路图设计如下:

 图22 按键控制流水灯方式

D1-D8接AT89C51的P3口,按键电路接P1口。

设计要点如下:

1.考虑到实际电路中按键的不稳定性,需要对按键进行消抖设计。

2.计数初值的选择,检测按键需要迅速。

3.LED需要一定的延时,不然看不到灯亮。

4.LED点亮方式P3由口的值进行控制。

基于以上的设计要点,消抖设计的时间为20ms,每次检测到有按键按下时,都先进行消抖延时:

void delay20ms(void)

{ unsigned char i,j;

for(i=0;i<100;i++)

for(j=0;j<60;j++);

}

计数初值选择1000,检测的比较迅速。P3口直接改变值,再适当延长时间来控制LED灯的流水状况。

P3=0xfe;         //第一个灯亮

led_delay();

P3=0xfd;          //第二个灯亮

led_delay();

P3=0xfb;          //第三个灯亮

led_delay();

P3=0xf7;          //第四个灯亮

led_delay();

P3=0xef;          //第五个灯亮

led_delay();

P3=0xdf;          //第六个灯亮

led_delay();

P3=0xbf;          //第七个灯亮

led_delay();

P3=0x7f;          //第八个灯亮

led_delay();  

运行结果如下图所示(左上为S1方式,右上为S2方式,左下为S3方式,右下为S4方式):

 

图23 流水灯结果

4.3 液晶时钟设计

基于51单片机实现计时(24小时制),并显示在LCD1602屏幕上。先来简单介绍下LCD1602液晶显示屏。

LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。它的引脚说明如下表所示:

表4 LCD引脚说明

编号

符号

引脚说明

标号

符号

引脚说明

1

VSS

电源地

9

D2|

数据

2

VDD

电源正极

10

D3

数据

3

VL

液晶显示偏压

11

D4

数据

4

RS

数据/命令选择

12

D5

数据

5

R/W

读/写选择

13

D6

数据

6

E

使能信号

14

D7

数据

7

D0

数据

15

BLA

背光源正极

8

D1

数据

16

BLK

背光源负极

引脚的具体功能不再进行展开,简单地介绍下我们本次设计中用到的几个指令(具体指令设计不再阐述):

表5 LCD指令

序号

指令

RS

R/W

D7

D6

D5

D4

D3

D2

D1

D0

1

清屏

0

0

0

0

0

0

0

0

0

1

2

初始化

0

0

0

0

1

1

1

0

0

0

3

开显示,无光标,不闪烁

0

0

0

0

0

0

1

1

0

0

4

光标右移,字符不移

0

0

0

0

0

0

0

1

1

0

仿真电路图设计如下图:

图24 液晶时钟仿真设计图

 

LCD1602的D0-D7连接AT89C52的P0端口,将RS位,定义为P2.0引脚,将RW位定义为P2.1引脚,将E位定义为P2.2引脚,将BF(忙碌标志位)位定义为P0.7引脚。

BF是忙碌标志位,每次写数据前都需检查显示屏是否忙碌,端口为1,则是忙碌,等待。为0则空闲,直接写数据。读时需注意:RS为低电平,RW为高电平时,可以读状态,即RS=0,RW=1,E=1

才允许读写。读完BF,将E恢复低电平,使E=0;    

LCD的初始化如下:

WriteInstruction(0x38); //确保初始化成功

delay(5);

WriteInstruction(0x0c);  //显示模式设置:显示开,无光标,光标不闪烁

delay(5);

WriteInstruction(0x06);  //显示模式设置:光标右移,字符不移

delay(5);

WriteInstruction(0x01);  //清屏幕指令,将以前的显示内容清除

delay(5);

将字符写进LCD中时,需要指定字符的位置,我们需要写两个函数,先指定位置,再写数据。

指定字符的实际地址函数为:

 void WriteAddress(unsigned char x)

 {

     WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"

 }

写数据时,RS为高电平,RW为低电平时,可以写入数据, 即RS=1,RW=0,E从0到1发生正跳变,将数据送入P0口,即将数据写入液晶模块,当E由高电平跳变成低电平时,液晶模块开始执行命令。

时间采用24小时制,控制程序就是中断服务程序,如下所示:

     count++;  //每产生1次中断,中断累计次数加1

if(count==20)  //如果中断次数计满20次

{count=0;  //中断累计次数清0

   s++;  }    //秒加1

if(s==60)   //如果计满60秒

{s=0;     //秒清0

   m++;    }    //分钟加1

if(m==60)    //如果计满60分

 { m=0;   //分钟清0

h++;    //小时加1

    }

if(h==24)  //如果计满24小时

  { h=0;   //小时清0

   }

计数器的初值:

TH0=(65536-46083)/256;   //定时器T0高8位重新赋初值

TL0=(65536-46083)%256;   //定时器T0低8位重新赋初值

因为晶振为11.059Mhz,11.0592MHz除12为921600Hz,就是一秒921600次机器周期,10ms=9216次机器周期。所以1s=20*50ms,而50ms=46083,所以计数初值为46083,可以实现比较精确的秒计时。

写时分秒分别写一个函数,时的函数如下:

void DisplayHour()

{

   unsigned char i,j;

i=h/10;                //取整运算,求得十位数字

j=h%10;                //取余运算,求得各位数字

   WriteAddress(0x44);   //写显示地址,将十位数字显示在第2行第5列

WriteData(digit[i]);  //将十位数字的字符常量写入LCD

WriteData(digit[j]);  //将个位数字的字符常量写入LCD

     

 }

分和秒的类似,只是写的地址不同(在屏幕上显示的位置不同),不在具体阐述。

结果如下图所示:

 图25 液晶时钟

和精确时钟进行对比,还是很精准的。短时间内没有任何问题。如果想改开始时间,则可以直接在源程序中改,加日期也是一样的道理。

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

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

相关文章

设计模式——模板方法

GOF-23 模式分类 从目的来看&#xff1a; • 创建型&#xff08;Creational&#xff09;模式&#xff1a;将对象的部分创建工作延迟到子类或者其他对象&#xff0c;从而应对需求变化为对象创建时具体类型实 现引来的冲击。 • 结构型&#xff08;Structural&#xff09;模式&a…

OpenCV 透视变换

OpenCV 透视变换1. 简介2. 仿射变换2.1. 平移2.2. 旋转2.3. 放缩2.4. 错切2.5. 仿射变换3. 透视变换1. 简介 汽车的360度全景影像&#xff0c;从拍照视角变成鸟瞰图 这种变换常常用到透视变换 在了解透视变换前&#xff0c;需要了解一下其他的变换&#xff0c;包括 平移&#…

小白必知必会的几个IP协议知识

小白必知必会的几个IP协议知识1.IP地址属于网络层协议2.路由控制3.数据链路的抽象化4.IP属于面向无连接型1.IP地址属于网络层协议 在计算机通信中&#xff0c;为了识别通信对端&#xff0c;必须要有一个类似于地址的识别码进行标识。 MAC地址是用来标识同一个链路中不同计算机…

【C++泛型学习笔记】函数模板

提到C的程序设计方法&#xff0c;最先想到的便是两种&#xff1a;面向过程和面向对象编程。但是当我们去阅读一些优秀的C库源码时&#xff08;比如CGAL&#xff09;&#xff0c;就会直接被其的泛型编程劝退。泛型编程也是C程序设计方法中的一种&#xff0c;不同于上述两种设计方…

一文教你从Linux内核角度探秘JDK NIO文件读写本质(下)

接上文一文教你从Linux内核角度探秘JDK NIO文件读写本质&#xff08;上&#xff09; 10. JDK NIO 对普通文件的写入 FileChannel fileChannel new RandomAccessFile(new File("file-read-write.txt"), "rw").getChannel();ByteBuffer heapByteBuffer B…

LRU和FIFO页面置换算法模拟实战

Introduction 本文将介绍如何使用LRU和FIFO实现页面置换的模拟&#xff08;Python实现&#xff09;&#xff0c;并使用缺页率进行算法的评价。 Requirement 先附上具体的要求: 【实验目的】 &#xff08;1&#xff09;了解内存分页管理策略 &#xff08;2&#xff09;掌握…

[附源码]JAVA毕业设计昆明市人民医院血库管理系统(系统+LW)

[附源码]JAVA毕业设计昆明市人民医院血库管理系统&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。…

SSM框架-SpringMVC(一)

目录 1 SpringMVC简介 1.1 什么是mvc 1.2 什么是SpringMVC 1.3 SpringMVC的特点 2 入门案例 2.1 开发环境 2.2 创建maven工程 2.3 配置web.xml 2.4 创建请求控制器 2.5 创建SpringMVC配置文件 2.6 测试HelloWorld 2.7 优化配置 3 RequestMapping注解 3.1 RequestM…

3. 递归

3.1 递归 假设你在祖母的阁楼中翻箱倒柜&#xff0c;发现了一个上锁的神秘手提箱。 祖母告诉你&#xff0c;钥匙很可能在下面这个盒子里。 这个盒子里有盒子&#xff0c;而盒子里的盒子又有盒子。钥匙就在某个盒子中。 为找到钥匙&#xff0c;你将使用什么算法? 第一种&…

c++ word 不依赖软件操作

1、Duck 可以提取word的内容与表格&#xff0c;新建工程直接复制源码就可以得到库 使用实例如下所示&#xff1a; using namespace duckx; duckx::Document doc("file.docx"); doc.open(); //获取当前word中所有的表格 for (auto p doc.tabl…

计算机毕业论文java毕业设计选题源代码基于SSM的会议室预约系统

&#x1f496;&#x1f496;更多项目资源&#xff0c;最下方联系我们✨✨✨✨✨✨ 目录 Java项目介绍 资料获取 Java项目介绍 《SSM会议室预约系统》该项目主要解决了会议室预约日常工作中的一些问题&#xff0c;采用技术的技术是jsp springmvcspringmybatis cssjs等。 项目…

ARM 汇编写启动代码之设置栈和调用C语言

一、C语言运行时需要和栈的意义 “C语言运行时&#xff08;runtime&#xff09;”需要一定的条件&#xff0c;这些条件由汇编来提供。C语言运行时主要是需要栈。 C语言与栈的关系&#xff1a;C语言中的局部变量都是用栈来实现的。如果我们汇编部分没有给 C 部分预先设置合理合…

PAT甲级考试知识点总结和一些看法

0 引言 本人今年PAT甲级考了95分&#xff0c;平时力扣也有再刷&#xff08;大概有360题&#xff09;&#xff0c;感觉PAT主要还是面向考研党的&#xff0c;里面的题目其实难度是小于力扣的&#xff0c;但这种难度的题目浙大去年考研机试居然有20%的0分我其实不是很理解。 PAT…

【计算机网络】计算机网络复习总结 ------ 物理层

计算机网络 内容管理物理层 physical layer相关概念术语信息数据 data信号 signal码元 code cell 【波特率B --- 信号v】比特率R ---- 数据v基带信号 baseband带通&#xff08;频带&#xff09;信号单工 simplex 半双工 全双工失真理想信道奈奎斯特定理 &#xff08;理想&#…

[附源码]Python计算机毕业设计Django求职招聘网站

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

室内温度控制仿真(Simulink+PLC)

本篇博客将会和大家一起一步步解读Simulink自带的仿真模型(Thermal Model of a House),之后再讨论PLC控制系统控制室内环境温度的一些经验方法。温度控制的大部分控制方法都是采用PID控制,有关PLC的PID控制相关内容可以参看专栏的其它文章,链接如下: 博途PLC 1200/1500P…

CN_计算机网络性能指标@信道利用率@信道吞吐率

文章目录性能指标带宽(Bandwidth)&#x1f388;时延(Dely)发送时延&#x1f388;传播时延处理时延排队时延时延带宽积往返时延(Round-Trip Time,RTT)吞吐量(Throughput)速率(Speed)带宽(Bandwidth)信道利用率补充利用率信道利用率发送周期发送时间(传输时间)信道利用率计算&…

(附源码)springboot《升学日》日本大学信息及院校推荐网站 毕业设计 251949

基于springboot《升学日》日本大学信息及院校推荐网站 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于《升学日》日本大学信息及院校推荐网站当然也不能排除在外&#xff0c;随着网络…

面向对象中的继承

面向对象中的继承 封装 低耦合&#xff0c;高内聚 多态 重载&重写 重载 其实这是后台的知识&#xff0c;这么做的原因是&#xff1a;涉及到服务器的承压能力。减轻并发数 重写 子类重写父类中的方法 怎么理解面向对象&#xff1f; 一切皆对象……学院派的答法&#xff0c;尽…

Some App Tech Support 一些应用技术支持

Some App Tech Support 一些应用技术支持 Getting Support: mail: qiudi7323gmail.com or leave comment below. 获得支持&#xff1a; 邮件&#xff1a;qiudi7323gmail.com 或者在下面留下评论。