搜索
您的当前位置:首页正文

单片机实验指导书

2020-04-12 来源:吉趣旅游网
实验1 最简单的八路跑马灯

一 实验目的与要求

(1) 熟悉单片机实验开发装置实验台上的资源,学会选用其功能电路,连接组成实验需要的系统;

(2) 学习并了解MCS-51单片机P1口的应用及使用方法; (3) 学习编写接口应用程序及延时子程序;

(4) 编写实验程序,实现从P0口输出信号驱动发光二极管L1~L8动态点亮的功能(可自行设计点亮方式)。 二 实验内容

在本实验中,P0作为输出口,接8只发光二极管,编写程序,使发光二极管以不同形式循环点亮。下面给出一个实验样例程序,本例实验主要用到了延时子程序:clr、lcall、ajmp指令,通过轮流点亮P0.0…..P0.7实现效果。用户可以通过此程序的学习,初步掌握单片机的 I/0 端口操作。 相关原理图:

org 0000h ;开始 ajmp loop

org 0030h ;到 0030h 处避开 00-30 的敏感地址 loop:

mov p0,#00h ;关闭所有灯 lcall delay

mov p0,#0ffh ;打开所有灯 lcall delay

mov p0,#00h ;关闭所有灯 lcall delay

setb p0.0 ;打开 p0.0 lcall delay ;延时一段时间 setb p0.1 ; 打开p0.1 lcall delay

setb p0.2 ; 打开p0.2 lcall delay

setb p0.3 ; 打开p0.3 lcall delay

setb p0.4 ; 打开p0.4 lcall delay

setb p0.5 ; 打开p0.5 lcall delay

setb p0.6 ; 打开p0.6 lcall delay

setb p0.7 ; 打开p0.7 lcall delay

实验样例程序如下:

AJMP LOOP ;到最开始 loop 处重新运行 delay: mov r5,#20 ;延时。 d1: mov r6,#50 d2: mov r7,#249 djnz r7,$ djnz r6,d2 djnz r5,d1 ret end

仿照样例程序,设计并编写程序,分别实现以下功能: (1) 使数码管从左至右循环点亮;

(2) 使数码管从中间至两端循环点亮; (3) 使数码管从两端至中间循环点亮; 三 实验报告要求

(1)画出硬件电路连线图;

(2)写出自行设计的实验程序清单;

(3)总结实验过程中调试程序所遇到的问题和解决办法,写出本次实验中编写及调试程序的经验和体会。

思考题

1. 改变延时常数,使发光二极管闪亮时间改变。 2. 修改程序,使发光二极管闪亮移位方向改变。

实验2 数码管静态扫描

一 实验目的与要求

(1) 学习并了解MCS-51单片机IC的应用及使用方法; (2) 学习编写数码管静态扫描应用程序;

(3) 编写实验程序,实现数码管轮流显示0,1,2,3等, 二 实验内容

CD4543 是一个7段码数码管的驱动芯片,通过它解码,可以直接把数字转换为数码管的显示数字,从而简化了程序,节约了单片机的 IO 开销。因此是一个非常好的芯片!但是由于目前从节约成本的角度考虑,此类芯片已较少用,大部份情况下都是用动态扫描数码管的形式来实现数码管显示。作为学习而言,我们还是很有必要了解此类 IC 的应用。 以下是 CD4543 的接线图:

接线方法:

用一条 4PIN 的排线,把数码管译码部份的 J61 接到 CPU 部份 P1 口的 J25 的P1.0,P1.1,P1.2,P1.3 四个端口。(即插入 P1 口的上半部分)

(接线照片以及程序运行瞬间数码管显示数字 6)

实验样例程序如下:

此程序轮流往 P1 口送数字 1,2,3,4,5,6,7,8 数码管也轮流显示 1,2,3,4,5,6,7,8

org 0000h ;开始 ajmp loop

org 0030h ;到 0030h 处避开 00-30 之间的敏感地址 LOOP:

MOV P1,#1 ;p1 口送数字 1 CALL DELAY ;延时

MOV P1,#2 ;p1 口送数字 2 CALL DELAY ;延时 MOV P1,#3 CALL DELAY MOV P1,#4 CALL DELAY MOV P1,#5 CALL DELAY MOV P1,#6 CALL DELAY MOV P1,#7 CALL DELAY MOV P1,#8 CALL DELAY

JMP LOOP ;重新开始

DELAY: MOV R5,#50 ;延时1s子程序 D1: MOV R6,#40 D2:MOV R7,#248 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET END

三 实验报告要求

(1)画出硬件电路连线图;

(2)写出自行设计的实验程序清单并给程序加注释;

(3)总结实验过程中调试程序所遇到的问题和解决办法,写出本次实验中编写及调试程序的经验和体会。

实验3 数码管动态扫描显示 12345678

一 实验目的与要求

(1) 掌握LED数码管八段显示器的工作原理; (2) 学习编写数码管动态扫描应用程序;

(3) 编写实验程序,实现数码管轮流显示1,2,3,4,5,6,7,8。 二 实验内容

数码管是怎样来显示 1,2,3,4… 呢?数码管实际上是由 7 个发光管组成 8 字形构成的,加上小数点就是8个。我们分别把他命名为 A,B,C,D,E,F,G,H(H为小数点)。

搞懂了这个原理,我们如果要显示一个数字 2,那么 A,B,G,E,D 这 5 个段的发光管亮就可以了。也就是把 C,F,H(小数点)不亮,其余全亮。根据硬件的接法我们编出以下程序。当然在此之前,还必须指定哪一个数码管亮,这里我们就指定最后一个 P2.3。(连接:J31与J5_2;J34与J4_1)

LOOP:

CLR P2.3 ;选中最后的数码管 SETB P0.7 ;B 段不亮 SETB P0.5 ;小数点不亮 SETB P0.2 ;C 段不亮 CLR P0.1 ;其他都亮 CLR P0.3 CLR P0.4 CLR P0.6 CLR P0.0

JMP LOOP ;跳转到开始重新进行 END

把这个程序编译后写入单片机,可以看到数码管的最后一位显示了一个数字 2。显示数字 2 则是 C,F,H(小数点)不亮,同时由于接法为共阳接法,那么为 0(低电平)是亮,为 1(高电平)是灭。从高往低排列,(p0.7_p0.0)写成二进制为 01111110, 把他转化为 16 进制则为 A2H。我们可以根据硬件的接线把数码管显示数字编制成一个表格,以后直接调用就行了。

显示 0 1 2 3 4 5 6 7 8 9

P0.7 H 1 1 1 1 1 1 1 1 1 1 P0.6 G 1 1 0 0 0 0 0 1 0 0 P0.5 F 0 1 1 1 0 0 0 1 0 0 P0.4 E 0 1 0 1 1 1 0 1 0 1 P0.3 D 0 1 0 0 1 0 0 1 0 0 P0.2 C 0 0 1 0 0 0 0 0 0 0 P0.1 B 0 0 0 0 0 1 1 0 0 0 P0.0 A 0 1 0 0 1 0 0 0 0 0 HEX代码 C0H F9H A4H B0H 99H 92H 82H F8H 80H 90H 有了这个表格上面显示一个 2 的程序则可简化为:

LOOP:

CLR P2.1 ;选中左边的数码管

MOV P0,#0A4H ;送数字 2 的代码到 P0 口 JMP LOOP ;跳转到开始重新进行 END

相关原理图:

8 个数码管的数据线并联接到 P0(右),位控制由 8 个 PNP 型三级管驱动后由 P2 引出。

原理图中把所有数码管的 8 个笔划段 a-h 同名端连在一起,而每一个显示器的公共极 COM 是各自独立地受 I/O 线控制。CPU 向字段输出口送出字形码时,所有显示器接收到相同的字形码,由 8 个 PNP 的三极管,来控制这 8 位哪一位工作,例如上面的例子中我们选中的是 P2.3,就是最后的一位亮了。同样的,如果要第一位亮,只需要把程序 CLR P2.3 改为 CLR P2.1 即可。

在这里就有了一个矛盾,所有数码管的 8 个笔划段 a-h 同名端连在一起,那么在一个屏幕上如何显示0,1,2,3,4,5 这样不同的数字呢?的确,在这样的接法中,同一个瞬间所有的数码管显示都是相同的,不能显示不同的数字。在单片机里,首先显示一个数,然后关掉.然后显示第二个数,又关掉,那么将看到连续的数字显示。轮流点亮扫描过程中,每位显示器的点亮时间是极为短暂的(约 1ms),由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位显示器并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。

例如数码管显示 01234567 这么 8 个数,在单片机中实际的工作流程如下:先打开 P2.0,送 0,然后关掉P2.0,打开 P2.1 送 1,再关掉 P2.1,打开 P2.2送 2 ,依次向下,由于速度足够快,那么我们将连续的看到01234567 这 8 个数。

接线方法:(以及运行的显示照片)

1接 8 位数码管的数据线。将数码管部份的数据口 J5_2 接到 CPU 部份的 P0 口 J26.

2接 8 位数码管的显示位线。将数码管部份的显示位口 J4_1 接到 CPU 部份的 P1 口 J4_1.

ORG 0000H AJMP MAIN ORG 0030H MAIN:

mov p1,#0bfh

实验样例程序如下:

;选中第一个数码管

MOV P0,#9fH ;显示1

LCALL DELAY ;调用延时 MOV P1,#0FFH ;关显示

mov p1,#0dfh ;选中第二个数码管 MOV P0,#25H ;显示2 LCALL DELAY

mov p1,#0feh ;选中第三个数码管 MOV P0,#0dH ;显示3 LCALL DELAY MOV P0,#0FFH

mov p1,#0fdh ;选中第四个数码管 MOV P0,#99H ;显示4 LCALL DELAY MOV P1,#0FFH

mov p1,#07fh ;选中第五个数码管 MOV P0,#49H ;显示 5 LCALL DELAY

MOV P1,#0fbH ;选中第六个数码管 MOV P0,#41H ;显示 6 LCALL DELAY MOV P1,#0FFH

mov p1,#0f7h ;选中第七个数码管 MOV P0,#1fH ;显示 7 LCALL DELAY MOV P1,#0FFH

mov p1,#0efh ;选中第八个数码管 MOV P0,#01H ;显示 8 LCALL DELAY MOV P1,#0FFH

AJMP MAIN ;重新开始 DELAY: ;延时子程序 MOV R7,#2

D1: MOV R6,#25 D2: DJNZ R6,D2 DJNZ R7,D1 RET END

三 实验报告要求

(1)画出硬件电路图及程序流程图;

(2)写出自行设计的实验程序清单并给程序加详细注释; (3)解决实验中出现的问题并进行总结; (4)给出实验结果及对实验的改进意见。

思考题

1. LED发光二极管组成的段数码管显示器,就其结构来讲有哪两种接法?不同的接法对字显示有什么影响?

2. 无论动态显示还是静态显示,都有硬件译码和软件之分,这两种译码方法其段、位译码各有什么优缺点?

实验4 端口按键判断技术(按键显示数字)

1一 实验目的与要求 (1) 掌握端口按键判断工作方式的程序设计及单片机通信程序的编制方法; (2) 学习编写端口按键判断工作方式的应用程序; 二 实验内容 此部分由 24 个轻触按键组成。一端接地,一端由 JP48 引出,当按下按键时,相应端口为高电平。 相关原理图: 234J7123456CON6J55CON4S1SW-PBS2SW-PBS3SW-PBS4SW-PBS5SW-PBS6SW-PB1234S7SW-PBS10SW-PBS13SW-PBS16SW-PBS19SW-PBS22SW-PBS8SW-PBS11SW-PBS14SW-PBS17SW-PBS20SW-PBS23SW-PBS9SW-PBS12SW-PBS15SW-PBS18SW-PBS21SW-PBS24SW-PB 参考实验照片: TitlSizBDatFile12345

接线方法:

1。用一条 6PIN 数据排线,把按键部份的 CON6,接到 CPU 部份的 P0 口。

用一条 1PIN 数据排线把con4与cpu的p2端口相连

2 用一条 4PIN 数据排线,把8位静态数码管的J61的A,B,C,D显示位线与P1口相连。

实验样例程序如下:

键盘显示数字,通过按键盘上的 K02,K03,K04,K05 四个按键,实现数码管显示 1,2,3,4

org 0000h ;(1) ljmp start ;(2) org 0030h ;(3) start:

mov p2,#00h ;(4)

mov p0,#0ffh ;初始化,P0 口置高; (5) l1:

jnb p0.0, l2 ;(6) jnb p0.1, l3 ;(7) jnb p0.2, l4 ;(8)

jnb p0.3, l5 ;检测按键;(9) ljmp l1 ;循环检测;(10) l2:

mov p1,#1H ;显示'1';(11) ljmp l1 ;(12) l3:

mov p1,#2H ;显示'2';(13) ljmp l1 ;(14) l4:

mov p1,#03H ;显示'3';(15) ljmp l1 ;(16) l5:

mov p1,#4H ;显示'4';(17) ljmp l1 ;(18) end ;(19)

为了便于程序的理解,把每一句分别编号,第 1,2,3 行是单片机的初始化,一般的程序都是这样开头的,作用是跳开 00-30h 的地址单元,这些单元是分配给特殊寄存器使用的。第 5 行把 p0 送 0ffh,作用是把这些端口p0.0-p0.7 置高电平。

因为本实验样例中单片机实验箱的键盘接在 p0 口,只有当端口为高电平时,按下键盘,端口被强行变为 0。根据这个大家自行分析第 4 句的意思。

程序运行到这里, 如果往数码管送数,那么数码管就应当亮了,这里插入了一段简单的键盘检测程序:来看第 6 行,jnb p0.0,l2,意思是如果 p0.0 为 0,那么执行 l2。本实验的 p0.0 接了一个小开关到地,此时就有两种情况,如果键盘没有按下:程序继续向下运行到第 7 行,继续检测 p0.1 有没有按下,直到第10 行: ljmp l1又跳转到第 6 行,继续检测。所以如果一直没有键盘按下,那么这个程序将一直在第 6,7,8,9,10 行反复循环。

如果某键盘已经按下,(假设为 p0.0)此时被强行拉低为 0,此时第 7 行

的 jnb p0.0,l2 就会使程序跳转到 l2(第 11 行): mov p1,#1H,这里就把 #1H 这个数送到 p0 口,数码管就显示“1”了。然后继续第 12 行 ljmp l1,程序又跳转到第 6 行,继续检测键盘.如果这个键不松开那么程序将反复执行 6,11,12,数码管就始终显示一个“1”,剩下的几个键的程序流程与这个类似,大家可自行析

三 实验报告要求

(1)画出硬件电路图及程序流程图;

(2)写出自行设计的实验程序清单并给程序加详细注释; (3)解决实验中出现的问题并进行总结; (4)给出实验结果及对实验的改进意见。

实验5 74LS164串入并出实验

一 实验目的与要求

(1) 掌握串入并出工作方式的程序设计及单片机通信程序的编制方法; (2) 了解实现74LS164串入并出的硬件环境。 二 实验内容

在单片机系统中, 如果并行口的 IO 资源不够,而串行口又没有其他的作用,那么我们可以用 74LS164 来扩展并行 IO 口,节约单片机资源。74LS164 是一个串行输入并行输出的移位寄存器。并带有清除端。

其中: Q0—Q7为并行输出端;A,B为串行输入端;MR为清除端,当为 0 时,输出清零;CP为时钟输入端。

74LS164引脚定义 74LS164 逻辑表

74LS164电路原理:

74LS164 参考实验照片:

接线方法:

1用一个 2PIN 数据排线一端插入 CPU 部分 P1 口的 P1.0,P1.1,另外一端插入 74LS164 部分的输入端 con2。

2 用一根 8PIN 的数据排线,一端插入 74LS164 部分的输出端 J60,另一端插入 8 路指示灯的 J3。 实验样例程序如下:

我们通过以下实验利用 74LS164 串行口实现 8 路跑马灯程序。

org 0000h ;(1) ljmp start ;(2) org 0030h ;(3) start:

mov dptr,#table ;数据指针指到 TABLE loop:

clr a ;清除 ACC

MOV R1,#08H ;数据位数

movc a,@a+dptr ;到 TABLE 取数据

cjne a,#03h,a2 ;到结束码03了吗?不到就跳到a2 jmp start ;是则重新开始 a2:

CLR P1.1 ;P1.1充当时钟 RLC a ;a循环左移

MOV P1.0,C ;把进位位的值付给P1.0 SETB P1.1 ;循环8次 DJNZ R1, a2 loop2:

call delay ;延时

inc dptr ;数据指针加 1 jmp loop

DELAY: ;延时程序 MOV R6,#8 D2:

MOV R5,#250 D3:

MOV R2,#250 D4:

DJNZ R2,D4 DJNZ R5,D3 DJNZ R6,D2 RET

table : db 01h,02h,04h,08h ;左移 db 10h, 20h,40h,80h db 01h,02h,04h,08h db 10h, 20h,40h,80h db 80h,40h,20h,10h ;右移 db 08h, 04h,02h,01h db 80h,40h,20h,10h db 08h, 04h,02h,01h

db 00h,0ffh,00h,0ffh ;闪烁 db 03h end

三 实验报告要求

(1)画出硬件电路图及程序流程图;

(2)写出自行设计的实验程序清单并给程序加详细注释; (3)解决实验中出现的问题并进行总结; (4)给出实验结果及对实验的改进意见。

实验6 D/A 转换 dac0832 的原理与应用

一 实验目的与要求

(1) 了解D/A转换与单片机的接口方法;

(2) 了解单片机系统中扩展D/A转换芯片的基本方法; (3) 掌握D/A转换芯片DAC0832的性能及编程方法。 二 实验内容

DAC0832是 8 位分辨率 D/A 转换集成芯片,与处理器完全兼容,其价格低廉,接口简单,转换控制容易等优点,在单片机应用系统中得到了广泛的应用。

(1)DAC0832 的引脚及功能

DI0-DI7:数据输入线,TLL 电平。

ILE:数据锁存允许控制信号输入线,高电平有效。 CS:片选信号输入线,低电平有效。

WR1:为输入寄存器的写选通信号。

XFER:数据传送控制信号输入线,低电平有效。 WR2:为 DAC 寄存器写选通输入线。

Iout1: 电流输出线。当输入全为 1 时 Iout1 最大。 Iout2: 电流输出线。其值与 Iout1 之和为一常数。 Rfb: 反馈信号输入线,芯片内部有反馈电阻。 345Vcc: 电源输入线 (+5v――+15v) Vref: 基准电压输入线 (-10v――+10v) AGND: 模拟地,摸拟信号和基准电源的参考地。 DGND: 数字地,两种地线在基准电源处共地比较好。 DAC0832 的实验原理图: VCCR14.7KR24.7KVCCDAC08321112J174321R34.7KVCC98Iout1Iout2RfbVref20U3J7lsbDI0DI1DI2DI3DI4DI5DI6msbDI7CSXfer76541615141311712345678CON8VCC19182ILEWR2WR1Vcc 连接图: 实验样例程序如下: 用 DAC0832 产生梯形波。

ORG 0000h ;(1) LJMP MAIN ;(2) ORG 0030h ;(3) MAIN:

MOV A , #0 MOV DPTR,#07FFFH LP:

MOV R1,#0ah

MOVX @DPTR,A ACALL DELAY ;延时 DJNZ R1,NEXT SJMP MAIN NEXT :

ADD A,#10 ; 台阶增幅 SJMP LP

;产生下一台阶

; 产生下一个周期

; D/A转换器地址送DPTR

DELAY: ;延时程序 MOV R5,#3 D3:

MOV R2,#251 D4:

DJNZ R2,D4 DJNZ R5,D3 RET END

接线方法:

1 用一个 1PIN 数据线一端插入 CPU 部分 J33(P3 口)的 P3.6,另外一端插入 DAC0832 部分的输入端 J6的 WR 端。

2 用一个 1PIN 数据线一端插入 CPU 部分 J34(P2 口)的 P2.7,另外一端插入 DAC0832 部分的输入端 J6 的CS 端。

3 用一根 8PIN 的数据排线,一端插入 DAC0832 部分的数据输入端 J7,另一端插入 CPU 部分 J26(P0 口)。

4 用一台示波器,在 J6的Vref端用示波器观察 DA 转换后的输出信号。 示波器输出波形照片:

三 实验报告要求

(1)画出硬件电路图及程序流程图;

(2)写出自行设计的实验程序清单并给程序加详细注释; (3)修改程序,使D/A转换器输出方波; (4)给出实验结果及对实验的改进意见。

思考题

1. D/A转换器与单片机接口常见的三种连接形式是什么?分别适用于哪类D/A转换器?

2. D/A转换器的分辨率和单片机系统数据总线宽度相同与高于系统数据总线宽度时的连接方法有何不同?

3. 简述T型电阻网络D/A转换器的工作原理。 4. D/A转换器的双缓冲方式一般用在什么情况下?

实验7 模拟/数字转换器 ADC0804

一 实验目的与要求

(1) 了解A/D转换器与单片机接口的连接方法; (2) 掌握A/D芯片ADC0804的转换性能及编程方法; (3) 通过实验了解单片机如何进行数据采。 二 实验内容

所谓 A/D 转换器就是模拟/数字转换器(Analog to Digital Converter简称 ADC)是将输入的模拟信号转换成为数字信号。 ADC0804 的规格及引脚图:

/CS:芯片选择信号。 DB0――DB7:8 位数字输出。 VREF:辅助参考电压。

/RD:外部读取转换结果的控制脚输出信号。

AGND,DGND:模拟信号以及数字信号接地。

/INTR:中断请求信号输出,低电平动 CLK IN,CLK R:时钟输入或接振荡元件(R,C),频率约限制100KHz――1460KHz /WR:用来启动转换的控制当/WR 自 HI 变为 LO 时,转换器被清除;当/WR 回到 HI 时,转换正式启动; VIN(+),VIN(-):差动模拟电压输入。输入单端正电压时,VIN(-)接地; VCC:电源供应以及作为电路的参考电压。

ADC0804 电压输入与数字输出关系如表所示 十六进制 二进制码 与满刻度的比率 高四位字节 低四位字节 相对电压值 VREF=2.560 伏 高四位字节电压 低四位字节电压 2F E D C B A 9 8 7 6 5 4 3 2 1 0 1111 1110 1101 1100 1011 1010 1001 1000 0111 0110 0101 0100 0011 0010 0001 0000 R720k15/16 14/16 13/16 12/16 11/16 10/16 9/16 8/16 7/16 6/16 5/16 4/16 3/16 2/16 1/16 315/256 14/256 13/256 12/256 11/256 10/256 9/256 8/256 7/256 6/256 5/256 4/256 3/256 2/256 1/256 4.800 4.480 4.160 3.840 3.520 3.200 2.880 2.560 2.240 1.920 1.600 1.280 0.960 0.640 0.320 0 0.300 0.280 0.260 0.240 0.220 0.200 0.180 0.160 0.140 0.120 0.100 0.080 0.060 0.040 0.020 0 4试验原理图: VCCJ20CON2Vin12r510kVCCADC0804VCCVin(-)20U7J16lsbDB0DB1DB2DB3DB4DB5DB6msbDB7INTR1817161514131211512312345678CON86R81K8Vin(+)A-GND9r6R91K10kC1150PFVref/2194CLK-RCLK-INVccREF7CSRDWRRDWRADC0804实验样例程序如下: //定义 ADC 的连接端口 ad_wr equ P3.6 ad_rd equ P3.7 ad_input_port equ p1 org 0000h ajmp main org 0030h main: lcall adc_demo ajmp main ;// 启动 AD 转换 Adc_Start: clr ad_wr 234 nop nop nop

setb ad_wr nop ret

Adc_Read: ; // 读 AD 转换 mov ad_input_port,#0ffh clr ad_wr nop

clr ad_rd nop nop

mov a,AD_INPUT_PORT nop

setb ad_rd nop

setb ad_wr ret

;// AD 转换读取延时程序,显示读到的数值 Adc_Demo:

lcall Adc_Start lcall delay1ms lcall adc_read mov p0,a ret

delay1ms: mov r7,#10 tt1:

mov r6,#50

djnz r6,$ ;2us djnz r7,tt1 ret end

接线方法:

1 用一根 8PIN 的数据排线,一端插入ADC0804 部分的数据输入端 J2,另一端插入 CPU 部分 J25(P1口)。

2 用一根 8PIN 的数据排线,一端插入八路指示灯部分的 J1,另一端插入 CPU部分 P0 口(J26)。

注:读写信号线已连接到单片机的读写。

运行照片,用一个小螺丝刀调整 AD 转换部分的 R37,可以看到 P0口引出的 8 个 LED 逐次变化。 连接图:

三 实验报告要求

(1)画出硬件电路图及程序流程图;

(2)写出自行设计的实验程序清单并给程序加详细注释; (3)解决实验中出现的问题并进行总结; (4)给出实验结果及对实验的改进意见。

思考题

1. 描述ADC0804的内部结构及转换过程。 2. ADC的作用是什么?用于何种场合?

实验8 汉字显示屏

一 实验目的与要求

(1) 掌握单片机扩展LED显示器接口的设计与编程; (2) 利用汉字式LED显示器显示汉字。 二 实验内容

汉字显示屏广泛应用于汽车报站器,广告屏等。单片机实验箱有一个标准的 16*16 点阵的汉字显示屏。他的行扫描部分分别由单片机的 P0,P2 口担任,列扫描部分则是由两个 74LS164 的 移位寄存器组成。

其电路原理如下:

JP?J1_287654321J2_2CON887654321CON81234567812345678U3PCBCOMPONENT_13231302928272625242322212019181732313029282726252423222120191817123456781718192021222324ROW1ROW2ROW3ROW4ROW5ROW6ROW7ROW8ROW9ROW10ROW11ROW12ROW13ROW14ROW15ROW168550三极管驱动×1616*16 点 阵 910111213141516910111213141516COL1COL2COL3COL4COL5COL6COL7COL8CCOOLL910R1R71R81R92R02R12R22R324330330330330330330330330VccVcc1434561011121314345610111213Q0Q1Q22BQ3SN74LS164NQ41AQ5GNDQ6Q77U2VCCQ0Q1Q22BQ3SN74LS164QN41AQ5GNDQ6Q77MRKCL98J3_121CON298MRKCLVCC1901112131415162526272829303132R2R52R62R72R82R93R03R132330330330330330330330330U1COL11COL12COL13COL14COL15COL16 接线方法: 1 用一根 8PIN 的数据排线,一端接到汉字屏部分的 J1-2 一端接到 CPU 部份的 P0 口 J31。 2 用一根 8PIN 的数据排线,一端接到汉字屏部分的 J2-2 一端接到 CPU 部份的 P1 口 J25。 3 用一根 2PIN 数据线一端插入 CPU 部分 J33(P3 口)的 P3.0,P3.1, 另外一端插入汉字屏部分的J3_1。

连线图:

345TitleSizeBNumbeDate:File:21-AugD:\\单片机

实验样例程序如下:

汉字屏轮流显示个汉字。

/*头文件*/

#include #include /*宏定义*/

#define uchar unsigned char #define uint unsigned int /*函数声明*/ void delay(); /*全局变量*/

uint lie; //列选标志

/** 字模:反显,纵向取模,开头和结尾均加入32个0xFF,用于改善屏滚动显示时循环的连贯性 **/ /** 显示内容 -- ** 宋体, 12 **/

/** 当前所选字体下一个汉字对应的点阵为: 宽度x高度=320x16 **/ uchar code text[640]={ //这里的数据为你要显示的内容的数据量320(包括32*2个0xff) 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, //改显示内容以上两行别改

0xFF,0xFF,0xEF,0xFB,0xEF,0xFB,0xE0,0x03,0xEF,0xFB,0xEF,0xFB,0xFF,0xFF,0xFF,0xFF,//*\"I\

0xFF,0xFF,0xFE,0x3F,0xFD,0xDF,0xFB,0xEF,0xFB,0x37,0xFB,0x5B,0xFD,0x6D,0xFE,0xB6,

0xFD,0x6D,0xFB,0x5B,0xFB,0x37,0xFB,0xEF,0xFD,0xDF,0xFE,0x3F,0xFF,0xFF,0xFF,0xFF,//*\"心型\

0xEF,0xFF,0xE3,0xFF,0xEC,0xFB,0xFF,0x03,0xEC,0xFB,0xE3,0xFF,0xEF,0xFF,0xFF,0xFF,//*\"Y\

0xF8,0x0F,0xF7,0xF7,0xEF,0xFB,0xEF,0xFB,0xEF,0xFB,0xF7,0xF7,0xF8,0x0F,0xFF,0xFF,//*\"O\

0xEF,0xFF,0xE0,0x07,0xEF,0xFB,0xFF,0xFB,0xFF,0xFB,0xEF,0xFB,0xE0,0x07,0xEF,0xFF,//*\"U\

//* 感(0) 受(1) 生(2) 活(3) 就(4) 要(5) 感(6) 受(7) 它(8) 的(9) 乐(10) 观(11) 与(12) 温(13) 馨(14) ,(15)

//感(16) 受(17) 它(18) 的(19) 美(20) 好(21) 与(22) 丰(23) 富(24) ,(25) 感(26) 受(27) 它(28) 的(29) 哲(30) 理(31)

//与(32) 启(33) 迪(34) .(35)*/

0xFF,0xDF,0xFF,0x3D,0xC0,0xF1,0xD7,0xFF,0xD4,0x63,0xD5,0x7D,0xD5,0x7D,0xD4,0x6D,

0xDF,0xF5,0x03,0xBD,0xDC,0x7D,0x5D,0x79,0x93,0xAF,0xDF,0xD3,0xFF,0x1B,0xFF,0xFF,//*\"感\

0xFE,0xFF,0xB9,0xFE,0x9B,0xFE,0xAB,0x7D,0xB3,0x3D,0xBB,0x5B,0x9B,0x6B,0xA3,0x77,

0x2B,0x77,0x7B,0x4B,0x73,0x3B,0x0B,0xFD,0x5A,0xFC,0xF9,0xFD,0xFB,0xFF,0xFF,0xFF,//*\"受\

0xFF,0x7F,0xFE,0xFD,0xF9,0xFD,0x87,0x7D,0xF7,0x7D,0xF7,0x7D,0xF7,0x7D,0xF7,0x7D,

0x00,0x01,0xB7,0x7D,0xF7,0x7D,0xF7,0x7D,0xE6,0x7D,0xF7,0x79,0xFF,0xFD,0xFF,0xFF,//*\"生\

0xF7,0xDF,0xF9,0xDF,0x7F,0x00,0x9C,0xFF,0xF3,0xFF,0xFB,0xFF,0xDB,0x80,0xDB,0xBD,

0xDB,0xBD,0xC0,0x3D,0xBB,0xBD,0xBB,0xBD,0xBB,0x80,0xBB,0xFF,0xFB,0xFF,0xFF,0xFF,//*\"活\

0xDF,0xFB,0xD8,0x77,0xDB,0x4D,0x5B,0x7E,0x9B,0x01,0xDB,0x5F,0xD8,0x65,0xDB,0xFB,

0xFB,0xE7,0xF8,0x1F,0x03,0xFF,0xF8,0x03,0xBB,0xFD,0xCB,0xFD,0xFB,0xF1,0xFF,0xFF,//*\"就\

0xBF,0xBF,0xBF,0xBE,0xA0,0xBE,0xAD,0xBD,0xAD,0x8D,0x80,0x2B,0xAD,0xAB,0xAD,0xB7,

0xAD,0xB7,0x81,0xB7,0xAD,0xAB,0xAD,0x9B,0xA0,0xBC,0xBF,0xBD,0xBF,0xBF,0xFF,0xFF,//*\"要\

0xFF,0xDF,0xFF,0x3D,0xC0,0xF1,0xD7,0xFF,0xD4,0x63,0xD5,0x7D,0xD5,0x7D,0xD4,0x6D,

0xDF,0xF5,0x03,0xBD,0xDC,0x7D,0x5D,0x79,0x93,0xAF,0xDF,0xD3,0xFF,0x1B,0xFF,0xFF,//*\"感\

0xFE,0xFF,0xB9,0xFE,0x9B,0xFE,0xAB,0x7D,0xB3,0x3D,0xBB,0x5B,0x9B,0x6B,0xA3,0x77,

0x2B,0x77,0x7B,0x4B,0x73,0x3B,0x0B,0xFD,0x5A,0xFC,0xF9,0xFD,0xFB,0xFF,0xFF,0xFF,//*\"受\

0xFF,0xFF,0xF7,0xFF,0xCF,0xFF,0xDF,0xFF,0xD8,0x03,0xDF,0xBD,0x5F,0xBD,0x9F,0x7D,

0xDF,0x7D,0xDE,0xFD,0xDC,0xFD,0xDE,0xFD,0xD7,0xE1,0xCF,0xFB,0xDF,0xFF,0xFF,0xFF,//*\"它\

0xFF,0xFF,0xE0,0x01,0xCE,0xF7,0x2E,0xF7,0xEE,0xF7,0xE0,0x03,0xFD,0xFF,0xF3,0xFF,

0x0E,0xFF,0xEF,0x3F,0xEF,0x9B,0xEF,0xFD,0xEF,0xFB,0xE0,0x07,0xFF,0xFF,0xFF,0xFF,//*\"的\

0xFF,0xFF,0xFF,0xFB,0xFD,0xE7,0xC0,0xCF,0xDD,0x1F,0xDD,0xB7,0xDD,0xFB,0x9D,0xFD,

0xA0,0x03,0xBD,0xFF,0x3D,0xFF,0x3D,0xBF,0xBD,0xCF,0xFD,0xE3,0xFF,0xF7,0xFF,0xFF,//*\"乐\

0xFF,0xF7,0xD3,0xCF,0xDD,0x3F,0xDE,0xFF,0xDD,0x7F,0xC3,0x8E,0xFF,0xDD,0x80,0x3B,

0xBF,0xE7,0xBF,0x9F,0xA0,0x7F,0xBF,0x83,0xBF,0xFD,0x80,0x3D,0xFF,0xF1,0xFF,0xFF,//*\"观\

0xFF,0xFF,0xFF,0xDF,0xFF,0xDF,0xFF,0xDF,0x81,0xDF,0xED,0xDF,0xED,0xDF,0xED,0xDF,

0xED,0xDF,0xED,0xDB,0xED,0x9D,0xED,0xDD,0xED,0xFB,0xCC,0x07,0xEF,0xFF,0xFF,0xFF,//*\"与\

0xF7,0xBF,0x7B,0x80,0x9E,0x7F,0xF1,0xFD,0xFF,0x01,0x81,0x7D,0xAD,0x7D,0xAD,0x01,

0xAD,0x7D,0xAD,0x7D,0xAD,0x01,0x81,0x7D,0xFF,0x7D,0xFF,0x01,0xFF,0xFD,0xFF,0xFF,//*\"温\

0xFF,0x7F,0xB0,0xF7,0xAB,0xB7,0xAA,0xAF,0x02,0xA0,0xAA,0x96,0xAA,0xB6,0xB2,0x02,

0xEE,0xB4,0x16,0x96,0x72,0xA6,0x75,0xA0,0x12,0xB7,0xD6,0xF7,0xDE,0xFF,0xFF,0xFF,//*\"馨\

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, };

/*主函数*/ void main() {uchar i,j;

uint m=0;//m是从字模数组里向后取数据时的计数器,用以改变显示文字的内容,及滚动显示效果 SCON=0; //初始化串口为工作方式0(同步通信方式,TxD输出同步脉冲) lie=0x7fff; //列选标志初始化 while(1) //重复循环显示

{for(j=0;j<5;j++) //j用来控制屏上1帧显示内容停留的时间,即用来控制滚动速度 { for(i=1;i<=31;i+=2)

{P0=0xff;//先关显示,以免164内数据移动过程中在屏上产生不良影响,大家可以把这两句去掉比较下显示效果

P1=0xff;

SBUF=text[m+i];//从串口发送数据,补全整一列数据 while(TI==0); TI=0;

SBUF=text[m+i-1];//从串口发送字模数据(为什么要先发后一个数据,看下电路应该会明白吧:) while(TI==0); //等待发送完毕 TI=0; P0=lie%256;//选中要显示的那列,同时等于打开了那列的显示 P1=lie/256;

delay(); //延时,等待一段时间,让这列显示的内容在人眼内产生\"视觉暂留\"现象,略知生理的人应该都知道吧。 lie=_iror_(lie,1); //列选标志移位,准备用来选中下一列 } }//返回显示下一列,直到16列都显示完成 m+=2;//显示内容向后移一列 if(m>608)//这个数据为你的字模数组的大小-32,我的是640-32= m=0; } }

/*延时子程序*/ void delay() {uint n;

for(n=0;n<200;n++) {;} }

三 实验报告要求

(1)画出硬件电路图及程序流程图;

(2)整理实验程序清单,并给程序加详细注释; (3)解决实验中出现的问题并进行总结; (4)给出实验结果及对实验的改进意见。

思考题

1. 汉字显示的原理是什么?

2. 考虑如何进行图案显示,并给出编程思想。

实验9 1602 液晶显示屏显示 A

一 实验目的与要求

(1) 掌握单片机扩展液晶显示器接口的设计与编程; (2) 利用1602液晶显示器显示字符A。 二 实验内容

单片机实验箱液晶显示屏部分可以分别挂接 12864 中文汉字屏、1602 字母显示屏、0802 字母显示屏等,随机附带的是 1602 字母显示屏,可以显示 2 行每行 16 个英文字符。0802 液晶屏和 1602 液晶屏完全兼容。其编程方法,指令都是完全一样的,所不同的是他只能显示 2 行每行 8 个字符。12864 中文液晶则可以显示128*64 点阵,包括带字库和不带字库两种,目前市面上较多的都是带字库的。

下面我们简要介绍一下 1602 显示屏的操作方法。 单片机实验箱的 1602 液晶的接线原理如下图所示:

0802/1602/12864 的接线原理图:

1、 2、 3、

连线图:

在单片机实验箱中,用8pin的数据线连接cpu的p0口与液晶显示的数据口。

用一个2pin的连接线连接+5v的电源,切忌不能插反。

用一个4pin的连接线连接cpu的p1口的p1.0,p1.1,p1.2,p1.3与液晶显示屏的rs,wr,en。

实验样例程序如下:

用 1602 显示屏显示一个字母 A。

RS BIT P1.1 RW BIT P1.2 E BIT P1.3

ORG 0000h AJMP main ORG 0030h main:

MOV P0,#00000001B ;清屏 ACALL ENABLE

MOV P0,#00000001B ;清屏 ACALL ENABLE

MOV P0,#00111000B ;显示功能 ACALL ENABLE

MOV P0,#00001111B ;显示开关控制 ACALL ENABLE

MOV P0,#00000110B ;输入模式 ACALL ENABLE MOV P0,#80H ;数据存贮器地址 ACALL ENABLE

mov p0,#41h ;ASCII 码 SETB RS CLR RW CLR E

ACALL DELAY SETB E AJMP $

ENABLE: CLR RS ;送命令 CLR RW CLR E

ACALL DELAY SETB E RET

DELAY:

MOV P0,#0FFH CLR RS SETB RW CLR E NOP SETB E

JB P0.7,DELAY ;判断忙标志 RET END

三 实验报告要求

(1)画出硬件电路图及程序流程图;

(2)整理实验程序清单,并给程序加详细注释; (3)解决实验中出现的问题并进行总结; (4)给出实验结果及对实验的改进意见。

思考题

1. 1602显示的原理是什么?

2. 考虑如何进行汉字显示和图案显示,并给出编程思想。

实验 10 93c46 实验

一 实验目的与要求

(1) 掌握采用93C46(EEPROM)的硬件接口技术; (2) 熟悉EEPROM的工作原理。

二.实验的内容

93c46 是 1k 位串行 EEPROM 储存器。 每一个储存器都可以通过 DI/DO 引脚写入或读出。它的存储容量为 1024 位,内部为 128×8 位或 64×

16 位。93C46 为串行三线 SPI 操作芯片,在时钟时序的同步下接收数据口 的指令。指令码为 9 位十进制码,具有 7 个指令,读、擦写使能、擦除、写、全擦、全写及擦除禁止。该芯 片擦写时间快,有擦写使能保护,可靠性高,擦写次数可达 100 万次,以下给出了 93C46 与单片机的接线图, 和引脚说明。

接线方法:

1 用一个 4PIN 数据排线一端插入 CPU 部分 JP53(P3 口)的

P3.4,P3.5,P3.6,P3.7。另外一端插入 93C46 部分的输入端 JP46. 2 用一条 8PIN 的数据排线把 CPU 部份的 P2 口JP52)接到八路指示灯

部份的 JP32。

此程序先把 8 路跑马灯的数据写入 93C46, 然后读出送 P2 口显示。运行程序可以观察到 8 路跑马灯。为证明 93C46 的作用,可以拔下 93c46 的数据线,再次运行程序,则没有跑马灯。

DO_93C46 BIT P3.4 DI_93C46 BIT P3.5 SK_93C46 BIT P3.6 CS_93C46 BIT P3.7

BIT_CNT DATA 10H BIT_SEND DATA 11H DATSEND DATA 12H

ORG 0000H LJMP MAIN

ORG 0030H MAIN: MOV 20H,#00H MOV R1,#20H ;93c46地址 MOV R3,#30H ;R3,R4接受数据寄存器 MOV R4,#40H MOV DPTR,#TABLE ;传送TABLE表地址 MOV R2,#04H ;定义写循环次数 J1: MOV A,#0 MOVC A,@A+DPTR ;读第一个存储数据 MOV R6,A INC DPTR MOV A,#0 MOVC A,@A+DPTR ;读第二个存储数据 INC DPTR MOV R5,A LCALL WRITE INC R1 ;存储地址自增 INC R1 DJNZ R2,J1 MOV R2,#04H ;定义读循环次数 MOV 20H,#00H MOV R1,#20H ;从起始位置开始读J2: LCALL READ ;调用读程序 INC R1 ;自增地址 INC R1 DJNZ R2,J2 JMP MAIN

;****************************************************************** ;名称:读指令(READ指令)

;功能:把 93C46 中 R1 所指向的存储器的数据读到 R6(H),R5(L)

;****************************************************************** READ:

LCALL START_93C46

MOV DATSEND,#06H ;发送读操作指令 MOV BIT_SEND,#03H LCALL SEND_DATA

MOV DATSEND,R1 ;发送写入地址 MOV BIT_SEND,#06H LCALL SEND_DATA

SETB DO_93C46 ;准备读入数据 MOV BIT_CNT,#16 ;8X8 READ1:

SETB SK_93C46 ;产生一个时钟信号 SETB SK_93C46 CLR SK_93C46 CLR SK_93C46 NOP

MOV C,DO_93C46 ;读取 DO 的信息 MOV A,R3 ;移位保存 RLC A MOV R3,A MOV A,R4 RLC A MOV R4,A

DJNZ BIT_CNT,READ1 MOV P0,R4 LCALL DELAY MOV P0,R3 LCALL DELAY

LCALL STOP_93C46 RET

WRITE:

LCALL WEN_93C46 LCALL START_93C46

MOV DATSEND,#05H ;发送写入操作指令

MOV BIT_SEND,#03H LCALL SEND_DATA

MOV DATSEND,R1 ;发送写入地址 MOV BIT_SEND,#06H

LCALL SEND_DATA

MOV DATSEND,R6 ;发送写入数据 MOV BIT_SEND,#08H LCALL SEND_DATA MOV DATSEND,R5 MOV BIT_SEND,#08H LCALL SEND_DATA

LCALL STOP_93C46 LCALL WDS_93C46 RET

;******************************************************************

;名称:WEN_93C46(EWEN 指令) ;功能:93C46 写允许

;****************************************************************** WEN_93C46:

LCALL START_93C46

MOV DATSEND,#04H ;发送开始位和写允许操作码,共 3 位

MOV BIT_SEND,#03H

LCALL SEND_DATA ;调用发送子程序 MOV DATSEND,#30H ;发送 6 位的指令操作码

MOV BIT_SEND,#06H LCALL SEND_DATA LCALL STOP_93C46 RET

;****************************************************************** ;名称:START_93C46

;功能:片选 93C46 做好读/写数据的准备

;****************************************************************** START_93C46:

SETB DO_93C46 SETB DI_93C46 CLR SK_93C46 SETB CS_93C46

JNB DO_93C46,$ ;查询器件是否繁忙

SETB SK_93C46 CLR SK_93C46 CLR CS_93C46 CLR SK_93C46 CLR DI_93C46 SETB CS_93C46 RET

;****************************************************************** ;名称:SEND_DATA

;功能:数据发送子程序,把待发送数据 DATSEND 的低 BIT_SEND 位送到 DI 上

;****************************************************************** SEND_DATA:

MOV BIT_CNT,BIT_SEND

MOV A,#08H ;计算要移位的个数 CLR C

SUBB A,BIT_CNT

MOV BIT_CNT,A

JZ SEND_DATA2 ;如果发送的位数为 8 位,则不用移位,跳转

MOV A,DATSEND ;把要送出数据的移到 DATSEND 的最高位 SEND_DATA1:

RL A

DJNZ BIT_CNT,SEND_DATA1 JMP SEND_DATA3 SEND_DATA2:

MOV A,DATSEND ;把要送出的 8 位数据 DATSEND 传给 A

;(只有 8 位数据都要送出时才执行这条指令) SEND_DATA3:

MOV BIT_CNT,BIT_SEND SEND_DATA4:

RLC A ;移位送出 BIT_SEND 位数据

JC SEND_DATA5

CLR DI_93C46 ;发送 0 码 JMP SEND_DATA6 SEND_DATA5:

SETB DI_93C46 ;发送 1 码 NOP NOP

SEND_DATA6:

SETB SK_93C46 ;产生移位时钟信号 CLR SK_93C46

DJNZ BIT_CNT,SEND_DATA4 RET

;****************************************************************** ;名称:STOP_93C46

;功能:停止对 93C46 操作

;****************************************************************** STOP_93C46:

CLR SK_93C46 CLR DI_93C46 CLR CS_93C46 SETB DO_93C46 RET

;******************************************************************

;名称:WDS_93C46(EWDS 指令) ;功能:93C46 写禁止

;****************************************************************** WDS_93C46:

LCALL START_93C46

MOV DATSEND,#04H ;发送开始位和写禁止操作码,共 3 位

MOV BIT_SEND,#03H

LCALL SEND_DATA ;调用发送子程序 MOV DATSEND,#00H ;发送 6 位的指

令操作码

MOV BIT_SEND,#06H LCALL SEND_DATA LCALL STOP_93C46 RET

DELAY: MOV R4,#20 D1: MOV R5,#20 D2: MOV R6,#248 DJNZ R6,$ DJNZ R5,D2 DJNZ R4,D1 RET

TABLE : DB 01H ,02H ,04H, 08H ;广告一个灯左移 DB 10H ,20H ,40H, 80H ;

END

三 实验报告要求

(1)画出硬件电路图及程序流程图;

(2)整理实验程序清单,并给程序加详细注释; (3)解决实验中出现的问题并进行总结; (4)给出实验结果及对实验的改进意见。

思考题

1. 对93c46的操作的原理是什么?

2. 考虑如何如何用数码管显示93c46数据,并给出编程思想。

实验 11 综合实验 18B20 数字温度显示系统

一 实验目的与要求

(1) 掌握采用18B20温度传感器的硬件接口技术;

(2) 熟悉读取18B20的温度数据,和软件编程。

二、实验的内容

用 18B20(数字温度采集)74LS47(数码管译码)74LS138(三八译码) DS18B20 是 DALLAS 公司生产的一线式数字温度传感器,具有 3 引脚 TO-92 小体积封装形式;温度测量范围为-55℃~+125 ,可编程为 9 位~12 位 A/D 转换精度,测温分辨率可达 0.0625℃,被测温度用符号扩展的 16 位数字量方式串行输出. 主机控制:

DS18B20完成温度转换必须经过三个步骤:初始化、ROM操作指令、存储器操作指令。

必须先启动 DS18B20 开始转换,再读出温度转换值。本程序仅挂接一个芯片,使用默认的 12 位转换精度,外接供电电源,读取的温度值高位字节送 WDMSB 单元,低位字节送 WDLSB 单元,再按照温度值字节的表示格式及其符号位,经过简单的变换即可得到实际温度值。 18b20 原理图

DS18B20 的引脚

运行程序数码管后 4 位显示当前测试到的温度。在 本 系 统 中:采用了74LS47(数码管译码 )74LS138(三八译码 ) 。即P0口的P0.0,P0.1,P0.2,P0.3四个端口接到 74LS47 进行硬件数码管译码,然后输出到数码管部分的数据口 JP5。P0.4,P0.5,P.0.6 三个端口接到 74LS138 进行 38 译码,然后输出到数码管的位控制 JP8. 系统综合原理图:

36

1 用一根单条数据线把 18B20 的 JP39 接到 CPU 部分的 J33(P3 口)的 P3.0

2 用一条 4PIN 的排线,把数码管译码部份的(74LS47)的con4 接到 CPU 部份 P0 口的 JP51 的

P0.0,P0.1,P0.2,0.3四个端口。(即插入 P0 口的上半部分)。 3

用一条 8PIN 的排线。 把数码管译码部份

的输出端(74LS47)的con8,接到数码管部分的数据口 J5_2。

4 用一条 4PIN 的排线,把 38 译码部份的 J36 接到 CPU 部份 P0 口的 JP51 的 P0.4,P0.5,P0.6,07四个端口。(即插入 P0 口的下半部分)。此处不太好插入,小心操作。 5

用一条 8PIN 的排线。 把 38 译码部份的

输出端 J37,接到数码管部分的显示位口 J4_1。

实验例程源程

37

ORG 0000H AJMP MAIN ORG 000BH LJMP TIMER0

ORG 0030H MAIN:

MOV SP,#60H MOV R2,#4

MOV R0,#40H ;初始化显示缓冲区 OVER: MOV @R0,#00H INC R0

DJNZ R2,OVER

MOV TMOD,#01H ;定时器工作在方式1(16位计数器)

MOV TH0,#LOW(65536-10000) ;定时器赋初值 MOV TL0,#HIGH(65536-10000) SETB EA ;CPU开中断 SETB ET0 ;T0开中断 SETB TR0 ;启动定时器0 LOOP:

LCALL GET_TEMP LCALL TRANSITION LJMP LOOP

GET_TEMP:

CLR PSW.4

SETB PSW.3 ;设置工作寄存器当前所在的区域 CLR EA ;使用 ds1820 一定要禁止任何中断产生

LCALL INT ;调用初使化子程序 MOV A,#0CCH

LCALL WRITE ;送入跳过 ROM 命令 MOV A, #44H

LCALL WRITE ;送入温度转换命令

LCALL INT ;温度转换完全,再次初使化 ds1820

MOV A,#0CCH

LCALL WRITE ;送入跳过 ROM 命令 MOV A,#0BEH

LCALL WRITE ;送入读温度暂存器命令 LCALL READ

MOV R7,A ;读出温度值低字节存入 R7 LCALL READ

MOV R6,A ;读出谩度值高字节存入 R6 SETB EA RET

38

TRANSITION:

MOV 43H,#0 ;假设是正数 MOV A,R6 ANL A,#0F0H

CJNE A,#0F0H,F1 ;要是正的就跳转 MOV 43H,#10 ;负数 MOV A,#0FFH XRL A,R7 ADD A,#1 MOV R7,A MOV A,#0FFH XRL A,R6 ADDC A,#0 MOV R6,A F1:

MOV A,#0F0H ANL A,R7 MOV 50H,A MOV A,#0FH ANL A,R6 ORL A,50H SWAP A MOV B,#2 DIV AB

MOV B,#100; 分离出百位 DIV AB MOV 42H,A

MOV A,#10; 余数继续分离十位和个位 XCH A,B DIV AB MOV 41H,A MOV 40H,B RET

TIMER0:

MOV DPTR,#TABLE MOV A,40H

MOVC A,@A+DPTR MOV P0,A

MOV P1,#0efh ;选中第八个数码管 CALL T1MS MOV A,41H

MOVC A,@A+DPTR MOV P0,A

MOV P1,#0f7h ;选中第七个数码管 CALL T1MS

MOV A,42H

MOVC A,@A+DPTR MOV P0,A

MOV P1,#0fbh ;选中第六个数码管 CALL T1MS MOV A,43H

MOVC A,@A+DPTR MOV P0,A

MOV P1,#7fh ;选中第五个数码管 CALL T1MS

MOV TL0,#LOW(65536-10000) ;定时器10MS中断 MOV TH0,#HIGH(65536-10000) RETI

;延时1ms子程序 T1MS:

mov r5,#4 TT: mov r6,#124 djnz r6,$ djnz r5,TT ret

INT: ;初始化 ds1820 子程序 CLR EA

L0:CLR P3.7 ;ds1820 总线为低复位电平 MOV R2,#250 L1:CLR P3.7

DJNZ R2,L1 ;总线复位电平保持 500us SETB P3.7 ;释放 ds1820 总线 MOV R2,#30

L4:DJNZ R2,L4 ;释放 ds1820 总线保持 60us CLR C ;清存在信号 ORL C,P3.7

JC L0 ;存在吗?不存在则重新来 MOV R6,#80 L5:ORL C,P3.7 JC L3

DJNZ R6,L5 SJMP L0

L3:MOV R2,#240 L2:DJNZ R2,L2 RET

WRITE: ;向 ds1820 写操作命令子程序 CLR EA

MOV R3,#8 ;写入 ds1820 的 bit 数,一个字节 8 个 bit

39

WR1:SETB P3.7 MOV R4,#8

RRC A ;把一个字节 data(A)分成 8 个 bit 环移给 C

CLR P3.7 ;开始写入 ds1820 总线要处于复位(低)状态

WR2:DJNZ R4,WR2 ;ds1820 总线复位保持 16us MOV P3.7,C ;写入一个 bit MOV R4,#20

WR3:DJNZ R4,WR3 ;等待 40us DJNZ R3,WR1 ;写入下一个 bit

SETB P3.7 ;重新释放 ds1820 总线 RET READ:

CLR EA

MOV R6,#8 ;连续读 8 个 bit RE1:CLR P3.7 ;读前总线保持为低 MOV R4,#4 NOP

SETB P3.7 ;开始读 总线释放 RE2:DJNZ R4,RE2 ;持续 8us

MOV C,P3.7 ;从 ds1820 总线读得一个 bit RRC A ;把读得的位值环移给 A MOV R5,#30

RE3:DJNZ R5,RE3 ;持续 60us DJNZ R6,RE1 ;读下一个 bit

SETB P3.7 ;重新释放 ds1820 总线 RET

;************************************************* TABLE:

db 03H ;显示0 db 9fH ;显示1 db 25H ;显示2 db 0dH ;显示3 db 99H ;显示4 db 49H ;显示5 db 41H ;显示6 db 1fH ;显示7 db 01H ;显示8 db 09H ;显示9 db 0fdH ;显示- db 0FEH ;显示.

END

因篇幅问题不能全部显示,请点此查看更多更全内容

Top