单片机实验报告-串口实验

一.实验目的

1.  掌握 51 单片机串口工作原理。

2.  掌握 51 单片机串口初始化编程。

3.  掌握 51 单片机串口的软硬件编程。

二.实验设备和器件

1.KEIL软件

2.PROTEUS仿真软件   

3.伟福实验箱

三.实验内容

1编程实现:编程实现:甲、乙双机串行通信,双机的 RXD

和 TXD 相互交叉相连,甲机的 P0 口接 8 个开关,乙机的 P0口接 8 个发光二极管。甲机设置为只发不收的单工方式。要求甲机读入 P0口的 8 个开关的状态后,通过串行口发送到乙机,乙机将接收到的甲机的 8 个开关的状态数据送入 P0 口

  • 电路图:

 

  • 代码:

/*甲机(接开关)代码*/

#include <reg51.h>

#define uchar unsigned char

#define uint unsigned int

void main()

{uchar temp=0;

TMOD=0x20; /*设置定时器T1为方式2*/

TH1=0xfd; /*波特率9600*/

TL1=0xfd;

SCON=0x40; /*方式1只发送,不接收*/

PCON=0x00; /*波特率为9600,SMOD=0*/

TR1=1; /*启动T1*/

P0=0xff; /* P1口为输入*/

while(1)

{temp=P0; /*读入P0口开关的状态数据*/

SBUF=temp; /*数据送串行口发送*/

while(TI==0); /*如果TI=0,未发送完,循环等待*/

TI=0;}}/*已发送完,再把TI清0*/

/*乙机(接灯)代码*/

#include <reg51.h>

#define uchar unsigned char

#define uint unsigned int

void main()

{uchar temp=0;

TMOD=0x20; /*设置定时器T1为方式2*/

TH1=0xfd; /*波特率9600*/

TL1=0xfd;

SCON=0x50; /*方式1接收REN=1*/

PCON=0x00; /*波特率为9600,SMOD=0*/

TR1=1; /*启动T1*/

P0=0xff; /* P0口为输入*/

while(1)

{while(RI==0); /* 若RI为0,未接收到数据*/

RI=0; /* 接收到数据,则把RI清0*/

temp=SBUF; /* 读取数据存入temp中*/

P0=temp; /* 接收的数据送P0口控制8个LED的亮与灭*/

}}

  • 分析:
  1. 串口工作于方式1或方式3已知波特率,计算初值的公式:

 

则波特率为9600bps,方式1接收和发送SMOD=0,则初值=256-11059200/(384*9600)=253=fdH

  1. REN为允许接收控制位,REN=1,则允许接收,REN=0,则禁止接收,允许发送,在该题中,最开始将乙机的SCON也设置为40H,及REN=0,此时不管开关怎么变换,灯都不会亮,原因是乙机现在无法接收串口数据
  2. 当开关闭合是,串口传送的数据为低电平数据,protuse仿真中,灯即为低电平亮,则不需要取反,eg:当第一个开关闭合时,传送的数据为01111111,则乙机收到数据后,第D0位为低电平,则第一盏灯亮

 

(2)参考实验 1,将乙机的显示改为 LED 数码管,将按键输入显示到数码管上,按键输入范围:0~F

  • 电路图:

 

  • 代码:

/*甲机(接开关)代码*/

#include <reg51.h>

#define uchar unsigned char

#define uint unsigned int

void main()

{uchar temp=0;

TMOD=0x20; /*设置定时器T1为方式2*/

TH1=0xfd; /*波特率9600*/

TL1=0xfd;

SCON=0x40; /*方式1只发送,不接收*/

PCON=0x00; /*串行口初始化为方式0*/

TR1=1; /*启动T1*/

P0=0x0f; /* P0口为输入*/

while(1)

{temp=P0; /*读入P0口开关的状态数据*/

SBUF=temp; /*数据送串行口发送*/

while(TI==0); /*如果TI=0,未发送完,循环等待*/

TI=0;/*已发送完,再把TI清0*/

}}

/*乙机(接数码管)代码*/

#include <reg51.h>

#include <absacc.h>

#define uchar unsigned char

#define uint unsigned int

void delay(unsigned int time)

{int j = 150;

for(;time>0;time--)

for(;j>0;j--);}

void main( )

{Code uchar codevalue[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

uchar temp=0;

TMOD=0x20;

TH1=0xfd;

TL1=0xfd;

SCON = 0x50;

PCON = 0x00;

TR1=1;

while(1)

{while(RI==0);

RI=0;

temp=SBUF;

P0=codevalue[temp];

}}

  • 分析:
  1. 数码管共阴极发光二极管的正级接地,要接一个排阻才可以正常使用;共阳极单片机可以直接驱动发光二极管的正级接电源
  2. 在该题中数码管只能显示到F,乙机P0显示的值是codevalue[16]数组中的数,所以只需要4个开关控制,则甲机P0的初始值为0x0f,,初始值不能大于0f,如果大于,则超过了数组的范围,则数码管无法显示。
  3.  
  4. (3)编写程序控制 LCD1602 输出显示数字和英文字符,显示内容为 2 行:第一行:学号;第二行:英文姓名(拼音)
  • 电路图:

 

  • 代码:

#include <reg51.h>

#define uchar unsigned char

sbit RS=P1^7;/*数据命令选择端*/

sbit RW=P1^6;/*读/写选择端*/

sbit E=P1^5;/*使能端*/

void init(void);

void wc51r(uchar i);

void wc51ddr(uchar i);

void fbusy(void);

void main()

{SP=0x50;init();

wc51r(0x80);wc51ddr('1');wc51ddr('5');wc51ddr('0');wc51ddr('4');wc51ddr('0');

wc51ddr('1');wc51ddr('0');wc51ddr('1');wc51ddr('0');wc51ddr('7');

wc51r(0xc0);wc51ddr('j');wc51ddr('i');wc51ddr('a');wc51ddr('n');

wc51ddr('g');wc51ddr(' ');wc51ddr('z');wc51ddr('h');wc51ddr('e');wc51ddr('n');

while(1);}

/*初始化函数*/

void init()

{wc51r(0x01);//清屏命令

wc51r(0x38);//设置16*2,5*7点阵,8位数据接口

wc51r(0x0c);//显示控制开关命令:D=1,显示;c=0,光标不显示;B=0,字符不闪烁

wc51r(0x06);}//输入方式设置命令:字符不动,光标自动向右移动

/*检查忙函数*/

void fbusy()

{P2=0xff;RS=0;RW=1;//忙标志和地址计数器读出

E=0;E=1;

while (P2&0x80)

{E=0;E=1;}//忙,等待

}

/*写命令函数*/

void wc51r(uchar j)

{fbusy();

E=0;RS=0;RW=0;//指令寄存器写入

E=1;P2=j;E=0;}

/*写数据函数*/

void wc51ddr(uchar j)

{

fbusy();

E=0;RS=1;RW=0;//数据寄存器写入

E=1;P2=j;E=0;}

  •  分析:
  1. sp其实是一个寄存器,其中只能保存一个指针,而这个指针就指向了栈空间中的最高层,即栈顶
  2. LCD第一行第一个字符地址为80H,第二行第一个字符地址为C0H
  3. E,使能端,为高电平时,读取液晶模块信息,当E端由高电平跳变成低电平时,液晶模块执行写操作

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

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

相关文章

学习率周期性变化

学习率周期性变化&#xff0c;能后解决陷入鞍点的问题&#xff0c;更多的方式请参考https://github.com/bckenstler/CLR base_lr:最低的学习率 max_lr:最高的学习率 step_size&#xff1a;&#xff08;2-8&#xff09;倍的每个epoch的训练次数。 scale_fn(x)&#xff1a;自…

清华发布《人工智能AI芯片研究报告》,一文读懂人才技术趋势

来源&#xff1a;Future智能摘要&#xff1a;大数据产业的爆炸性增长下&#xff0c;AI 芯片作为人工智能时代的技术核心之一&#xff0c;决定了平台的基础架构和发展生态。 近日&#xff0c;清华大学推出了《 人工智能芯片研究报告 》&#xff0c;全面讲解人工智能芯片&#xf…

开发者账号申请 真机调试 应用发布

技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilong 开发者账号申请 真机调试 应用发布 技术博客http://www.cnblogs.com/ChenYilong/新浪微博http://weibo.com/luohanchenyilong 要解决的问题 • 开发者账号申请 • 真机调试 • 真机调…

单片机实验-DA实验

一、实验目的 1、了解 D/A 转换的基本原理。 2、了解 D/A 转换芯片 0832 的性能及编程方法。 3、了解单片机系统中扩展 D/A 转换的基本方法。 二.实验设备和器件 1.KEIL软件 2.实验箱 三&#xff0e;实验内容 利用 DAC0832&#xff0c;编制程序产生锯齿波、三角波、正弦…

进化三部曲,从互联网大脑发育看产业互联网的未来

摘要&#xff1a;从互联网的左右大脑发育看&#xff0c;产业互联网可以看做互联网的下半场&#xff0c;但从互联网大脑的长远发育看&#xff0c;互联网依然处于大脑尚未发育成熟的婴儿时期&#xff0c;未来还需要漫长的时间发育。参考互联网右大脑的发育历程&#xff0c;我们判…

pycharm远程连接服务器(docker)调试+ssh连接多次报错

一&#xff0c;登入服务器建docker nvidia-docker run -it -v ~/workspace/:/workspace -w /workspace/ --namefzh_tf --shm-size 8G -p 1111:22 -p 1112:6006 -p 1113:8888 tensorflow/tensorflow:1.4.0-devel-gpu bash 二&#xff0c;开ssh服务 apt-get update apt-get i…

Verilog HDL语言设计4个独立的非门

代码&#xff1a; module yanxu11(in,out); input wire[3:0] in; output reg[3:0] out; always (in) begin out[0]~in[0]; out[1]~in[1]; out[2]~in[2]; out[3]~in[3]; end endmodule timescale 1ns/1ns module test(); reg[3:0] in; wire[3:0] out; yanxu11 U(…

深度长文:表面繁荣之下,人工智能的发展已陷入困境

来源&#xff1a;36氪编辑&#xff1a;郝鹏程摘要&#xff1a;《连线》杂志在其最近发布的12月刊上&#xff0c;以封面故事的形式报道了人工智能的发展状况。现在&#xff0c;深度学习面临着无法进行推理的困境&#xff0c;这也就意味着&#xff0c;它无法让机器具备像人一样的…

Verilog HDL语言设计一个比较电路

设计一个比较电路&#xff0c;当输入的一位8421BCD码大于4时&#xff0c;输出为1&#xff0c;否则为0&#xff0c;进行功能仿真&#xff0c;查看仿真结果&#xff0c;将Verilog代码和仿真波形图整理入实验报告。 代码&#xff1a; module yanxu12(in,out); input wire[3:0] i…

交叉熵

1.公式 用sigmoid推导 上式做一下转换&#xff1a; y 视为类后验概率 p(y 1 | x)&#xff0c;则上式可以写为&#xff1a; 则有&#xff1a; 将上式进行简单综合&#xff0c;可写成如下形式&#xff1a; 写成对数形式就是我们熟知的交叉熵损失函数了&#xff0c;这也是交叉熵…

第5章 散列

我们在第4章讨论了查找树ADT&#xff0c;它允许对一组元素进行各种操作。本章讨论散列表(hash table)ADT&#xff0c;不过它只支持二叉查找树所允许的一部分操作。 散列表的实现常常叫作散列(hashing)。散列是一种以常数平均时间执行插入、删除和查找的技术。但是&#xff0c;那…

谷歌自动驾驶是个大坑,还好中国在构建自己的智能驾驶大系统

来源&#xff1a;张国斌中国有堪称全球最复杂的路况&#xff0c;例如上图是去年投入使用的重庆黄桷湾立交桥上下共5层&#xff0c;共20条匝道&#xff0c;堪称中国最复杂立交桥之最&#xff0c;据称走错一个路口要在这里一日游&#xff0c;这样的立交桥如果让谷歌无人驾驶车上去…

Verilog HDL语言设计计数器+加法器

完成课本例题4.12&#xff0c;进行综合和仿真&#xff08;包括功能仿真和时序仿真&#xff09;&#xff0c;查看仿真结果&#xff0c;将Verilog代码和仿真波形图整理入实验报告。 功能文件&#xff1a; module shiyan1(out,reset,clk); input reset,clk; output reg[3:0] ou…

自动驾驶寒冬与否,关键看“芯”

来源&#xff1a;智车科技摘要&#xff1a;2018年&#xff0c;全世界瞩目的半导体行业大事件无疑是高通收购恩智浦了。虽然&#xff0c;最终这笔收购案以失败结尾&#xff0c;但高通的收购恩智浦的意图就是出自于拓展汽车芯片市场。智能汽车芯片的重要性也得以突显。前不久&…

如何知道自己的CPU支持SLAT

因为WP8 SDK发布&#xff0c;很多WP8的开发者们也开始陆续安装WP8的SDK的&#xff0c;然而安装WP8的SDK有很多软件和硬件的要求&#xff0c;其中有一个就是——要求CPU支持二级地址转换&#xff08;SLAT&#xff09;&#xff0c;如果CPU不支持二级地址转换的话&#xff0c;在电…

opencv基础知识及其一些例子

opencv官网 一.插值法 1.最近邻插值 上图可看出f(p)f(Q11),缺点可能出现明显的块状。 2.线性插值 3.双线性插值 通过线性插值确定R1和R2,最终在确定P 二.cv2.putText 图片添加文字 import cv2 img cv2.imread(caijian.jpg) font cv2.FONT_HERSHEY_SIMPLEXimgzi cv2.putT…

Verilog HDL语言设计实现过程赋值+译码器

完成课本例题6.11、6.12&#xff0c;进行综合和仿真&#xff08;功能仿真&#xff09;&#xff0c;查看综合和仿真结果&#xff0c;整理入实验报告。 6.11 module shiyan21(in,clk,out1,out2); input clk,in; output out1,out2; reg out1,out2; always (posedge clk) beg…

【工业4.0】深度报告:独家解密工业4.0真正图谋?跟踪软件帝国的十年

来源&#xff1a;知识自动化要理解工业4.0&#xff0c;就避不开对西门子的研究&#xff1b;而要看懂西门子&#xff0c;不要去要看它的硬件&#xff0c;而要去看它的软件。数字化工厂只是水中花&#xff0c;真正的花朵不在你眼前&#xff0c;而在你身头。德国安贝格和成都的数字…

检测系列--RCNN系列

一.RCNN 框架&#xff1a; 1.selective search 2,区域预处理&#xff0c;尺寸缩放到227227 3.利用Alexnet(去掉最后分类层&#xff0c;4096维向量)&#xff0c;做特征提取&#xff0c;一个物体一个SVM分类&#xff0c;(当时认为SVM比softmax分类好)bounding box回归 4.正负样本…

Verilog HDL语言设计实现D触发器+计数器

分别采用结构描述和行为描述方式设计一个基本的D触发器&#xff0c;在此基础上&#xff0c;采用结构描述的方式&#xff0c;用8个D触发器构成一个8位移位寄存器。进行功能仿真&#xff0c;查看结果&#xff0c;把上述内容整理到实验报告。&#xff08;1&#xff09;行为描述:单…