单片机实验报告2
时间:2021-10-01 来源:博通范文网 本文已影响 人
目录 一、实验一··········································1 二、实 验二··········································7 三、实验三·········································11 四、实验四·········································15
一 实验一验实证验器数计/时定ﻩ 定时/计数器验证实验
一、
实验目得
熟悉定时/计数器T0得特点,学会合理选择定时方式并能根据具体情况结合软件得方式定时。
二、
实验 设备及器件
IBM PC机 一台 PROTEUS 硬件仿真软件 Keil C51。
三、
实验内容
用AT89C51单片机得定时/计数器T0产生1s得定时时间,作为秒计数时间,当1s产生时秒计数加1;秒计数到60时,自动从0开始。
四、
实验要求
要求采用Proteus软件实现上述实验.
五、
实验步骤
1.打开Proteus ISIS编辑环境,按照表1-1所列得元件清单添加元件。
元件名称 所属类 所属子类 AT89C51 Microprocessor 8051 Family CAP Capacitors Generic CAP-ELEC Capacitors Generic CRYSTAL Miscellaneous —— RES Resistors Generic 7SEG--CAT—GRN Optoelectronics 7—Segment Displays PULLUP Modeling Primitives Digital[Miscellaneous] 表1- 1 元件清单
元件全部添加后,在Proteus ISIS得编辑区域中按图1—1所示得原理图连接硬件电路。
图1 — 1 电路原理图
2.根据参考程序绘出流程图,并辅以适当得说明。
流程图如图1 1 —2 2 所示: :
开始单片机数码管初始化设置定时器0初始化开中断是否有中断?进入中断程序送时间常数COUNT+1是否计够1秒?YN中断返回NSECOND+1是否等于60秒?YSECOND归零Y分离计数值十位个位N查表显示十位个位 图1 1- - 2 程序流程图
3.打开KeilμVision4,新建Keil项目,选择AT89C51单片机作为CPU,将参考程序导入到“Source Group 1”中.在“Options for Target”对话窗口中,选中“Output”选项卡中得“Create HEX File”选项与“Debug”选项卡中得“Use:Proteus VSM Simulator”选项。编译汇编源程序,改正程序中得错误。
4.在Proteus ISIS中,选中AT89C51并单击鼠标左键,打开“Edit ponent"对话窗口,设置单片机晶振频率为12MHz,在此窗口中得“Program File”栏中,选择先前用Keil生成得、HEX文件。在Proteus ISIS得菜单栏中选择“File"→“Save Design”选项,保存设计,在Proteus ISIS得菜单栏中,打开“Debug”下拉菜单,在菜单中选中“Use Remote Debug
Monitor”选项,以支持与Keil得联合调试.5.在Keil得菜单栏中选择“Debug”→“Start/Stop Debug Session“选项,或者直接单击工具栏中得“Debug”→“Start/Stop Debug Se
ssion"图标,进入程序调试环境。按“F5”键,顺序运行程序。调出“Proteus ISIS"界面可以瞧到7段数码管显示从0~59s得计数值,每个数值显示1s,如图1—3所示。
图
1 1 — 3
程序运行结果
六、
实验 程序
SECOND EQU 30H COUNT H13 UQEﻩ0GROﻩﻩ0 Hﻩ
LJMP START
ORG0 HBﻩﻩ
LJMP INT_T0 START: H00#,DNOCESﻩﻩVOMﻩ
H00#,TNUOCﻩ VOMﻩ ELBAT#,RTPDﻩ VOMﻩﻩ AﻩﻩRLCﻩﻩ
MOV
A,0Pﻩ
MOV
A,2Pﻩ
MOV H00#,DOMTﻩﻩ
652/)00005—63556(#,0HTﻩ VOMﻩ 652 DOM)00005—63556(#,0LTﻩ VOMﻩﻩ 0RT BTESﻩﻩ 0TE BTESﻩﻩ
AEﻩBTESﻩ
H28#,EI
VOMﻩ
LJMP $ﻩINT_T0:MOV 652/)00005—63556(#,0HTﻩﻩ VOMﻩﻩ
652 DOM)00005—63556(#,0LTﻩ CNIﻩﻩ
COUNT
MOV
TNUOC,Aﻩ ﻩ CJNE 2I,02#,Aﻩ
VOMﻩﻩ COUNT,#00H
ﻩ CNIﻩ SECOND
ﻩ MOV
A,SECOND
CJNE 1I,06#,Aﻩ ﻩ MOV
H00#,DNOCESﻩI1:
MOV DNOCES,Aﻩﻩ ﻩ MOV H01#,Bﻩﻩ
VIDﻩﻩ AB
MOVC A,A+DPTR
VOMﻩ P0,A
B,AﻩﻩVOMﻩ
RTPD+A,AﻩCVOMﻩ A,2PﻩﻩVOMﻩﻩI2:
ITERﻩTABLE:
DB3 H66,HF4,HB5,H60,HFﻩ
DB 6DH,7DH,07H,7FH,6FH
DNEﻩ七、
思考题
1.罗列一下 Proteus 软件得能带给我们得好处, , 指出一点最能帮助您得地方。
使用Proteus软件能使我们方便得搭建电路,同时在没有元器件得情况下进行便于仿真,方便我们在将程序写入单片机前确认运行就是否正确,同时可在采购器件之前即可开始开发产品,而不必等到器件采购完后搭建电路才进行程序调试。
2.用 用 Proteu s 界面中得播放键运行仿真与 Ke i lμVision4 得环境中联调运行它们两者得区别在什么地方?
用Proteus界面中得播放键运行仿真仅可以观察运行结果,即程序运行在硬件表面上得表现。而联调得时候可以再Keil软件里查瞧各寄存器与存储器得状况,即硬件得内部情况。
3.K K eil 软件软件仿真与 P r ote us 得仿真对比..
使用Proteus仿真可从硬件得角度观察仿真结果,使仿真结果更加形象直观,使我们可从硬件运行状态清楚得判断运行结果就是否正确。而在Keil环境中则就是从程序得角度通过观察程序中数据得变化来观察仿真结果,需要对程序运行结果充分了解.八、
实验总结 及相关问题
通过本次实验了解了Ptoteus软件得使用方法,以及在掌握了Keil得使用方法下,学会了Proteus与Keil软件联调得方法。
在用Proteus中由于忽略了要在总线处放置网络标号导致联调失败,最后通过观察发现数码管引脚电平无变化发现此问题,放置网络标号后运行仿真时数码管引脚电平发生变化可就是数码管却没有变亮,经过多次检查接线,未发现接线错误后,觉得可能就是软件本身错误,故将总线及数码管周围硬件线路重新绘制一遍后再次运行仿真及可得到图1—3得结果。
二 实验二机片单ﻩ 单片机 O I/O 口控制实验
一、
实验目得
利用单片机得P1 口作IO 口,使同学学会利用P1 口作为输入与输出口。
二、
实验设备及器件
IBM PC 机 一台 DP—51PRO、NET 单片机仿真器、编程器、实验仪三合一综合开发平台一台
三、
实验内容
1.编写一段程序,用P1 口作为控制端口,使D1 区得LED 轮流亮。
2.编写一段程序,用P1、0~P1、6 口控制LED,P1、7 控制LED 得亮与灭(P1、7 接按键,按下时LED 亮,不按时LED 灭) .
四、
实验要求
学会使用单片机得P1 口作IO 口,如果有时间同学也可以利用P3 口作IO 口来做该实验.
五、
实验步骤
1.用导线把A2 区得J61 接口与D1 区得J52 接口相连。原理如图2—1 所示。
图2 — 1 实验二 原理图
2.先编写一个延时程序。
延时程序 见程序1 1 子程序 DELAY 。
3.将LED 轮流亮得程序编写完整并使用TKStudy ICE 调试运行。
LED 轮流亮程序见程序1 。
调试运行结果 :D1 区 LE D轮流亮..
4.使用导线把A2 区得J61 接口得P1、0~P1、6 与D1 区得 J52 接口得LED1~LED7 相连,另外A2 区J61 接口得P1、7 与D1 区得J53 得KEY1 相连. 5.编写P1、7 控制LED 得程序,并调试运行。(按下K1 瞧就是否全亮).P1 、7 控制L ED 得程序见程序2 2 。
调试运行结果:按下 P1 、7 7 后 D1 区LE E D全灭。
6.A2 区J61 接口得P1、7 与D1 区得J54 得SW1 相连。然后再使用TKStudy ICE 运行程序,查瞧结果。
P1 、7 控制L ED 得程序见程序2 2 。
调试运行结果:按下P1 1 、7后D1 1 区LE E D全亮。
六、
实验参考程序
序 程序 1: :
ORG
0000 HﻩLJMP
NIAMﻩORG
0100H MAIN: MOV
A,#0FFH
CLR CﻩﻩMAINLOOP:CALL YALEDﻩ A
CLRﻩﻩ
A,1Pﻩ VOMﻩ
SJMP POOLNIAMﻩDELAY: MOV
R7,#0 LOOP: MOV
0#,6Rﻩ
DJNZ $,6Rﻩ $,6R ZNJDﻩﻩ ﻩ DJNZ R6,$
ﻩ DJNZ R7,LOOP
RET
ﻩ END 程序 2 2: :
ORG
000H LJMP MAIN ORG 0010 HﻩMAIN: JB
DELTES,7、1PﻩCLRLED:CLR
0、1Pﻩ
CLR 1、1Pﻩﻩ
RLCﻩ P1、2
ﻩ CLR
3、1Pﻩ
CLR 4、1Pﻩﻩ ﻩ CLR
P1、5
RLCﻩ P1、6
ﻩ SJMP MAIN SETLED:SETB P1、0
ﻩ SETB 1、1Pﻩ
2、1P BTESﻩ 3、1PﻩBTESﻩﻩ
SETB 4、1Pﻩ
SETB 5、1Pﻩ
6、1PﻩBTESﻩ NIAMﻩPMJSﻩﻩ DNEﻩﻩ七、
实验思考题
1.请同学思考一下, , 想出几个实现以上功能得编程方法。
程序1可利用单片机得定时计数器通过选择定时计数器工作方式与预置初值设定延时时间,通过定时计数器产生得中断在中断程序中对A进行移位后输出至P1口.程序2可在判断P1、7高低电平后根据判断结果直接将#80H或#7F直接送P1口而不必逐位进行位操作。
2.请同学再思考一下, , 第二个程序中如果使用 KEY1 作为外部中断控制 LED D 得亮与灭时, , 程序应如何修改。
此时将KEY1接/INT0口,在主程序中开启外部中断设置外部中断触发方式,通过中断服务子程序控制LED亮灭。程序如下所示: 0GROﻩ00 Hﻩ LJMP MAIN
ORG3000 序程务服断中ﻩ;Hﻩ LJMP DELTESﻩMAIN: MOV H04#,PSﻩ 断中部外开; 0TE BTESﻩ CLR 0TIﻩ ;设置为电平触发
SETB AEﻩCLRLED:CLR P1、0
CLR P1、1
2、1PﻩRLCﻩ CLR 3、1Pﻩ 4、1PﻩRLCﻩ CLR P1、5
CLR 6、1Pﻩ DELRLC PMJSﻩSETLED:SETB P1、0
1、1PﻩBTESﻩ SETB P1、2
3、1PﻩBTESﻩ 4、1P BTESﻩ SETB 5、1Pﻩ 6、1P BTESﻩ ITERﻩ
DNEﻩ八、
实验总结 及相关问题
通过本次实验掌握了使用 TKStudy ICE 进行硬件仿真调试得方法,在设置仿真器驱动程序声明时对 C:\Keil 目录下得Tools、ini 文件添加描述时,由于添加得路径错误导致无法进行硬件仿真调试,修改为正确路径后方可在DEBUG 窗口中得 Use 选项中找到对应得选项。使用 TKStudy ICE 进行硬件仿真调试相比本学期得电子系统设计中用到得调试方法更快捷,使用更方便. 与此同时,通过本次实验对单片机得 I/O 控制有了更深入得了接,同时加深入对单片机I/O 编程得理解.实验三
串转并 O I/O 口实验
一、
实验目得
熟悉并掌握串转并得I/O口扩展方法。
二、
实验设备及器件
IBM PC机 一台 DP-51PRO、NET单片机仿真器、编程器、实验仪三合一综合开发平台 一台
三、
实验内容
1.写程序,通过单片机得P1口控制74HC164得串行输入端口,实现串并转换.
2.验证串并转换数据得正确性。
四、
实验要求
熟悉串并转换芯片得工作原理,学会使用串并转换芯片扩展单片机得I/O 口资源.
表3-1 74HC 164 真值表
五、
实验步骤
1. 短接C5区JP10接口,将C5区J43接口与A2区J61接口得P10~P13对应相连 (CLK对P10等等)。如图3-1所示。
图3 —1 实验 三 原理图
2。
运行编写好得软件程序,完成一次串并转换。
实验 程序 见 实验参考程序。
2. 使用C2区得逻辑笔或D1区得J52接口(LED指示灯)测试并行输出数据Q0~Q7数据得正确性。
调试运行结果:通过观察 LE D得亮灭情况可判断完成一次串并转换, , 且转换结果正确无误..
六、
实验参考程序
CLK
0、1P UQEﻩDINA
EQU P1、1 DINB
EQU P1、2 CLR164 3、1P UQEﻩORG0000 HﻩﻩLJMP NIAMﻩORG0010 HﻩﻩMAIN:
MOV
SP,#60H
ﻩ NOP
CLR
CLK
SETB BNIDﻩ
RLCﻩﻩ CLR164
461RLC BTESﻩﻩ
HFF0#,Aﻩ VOMﻩ VOMﻩﻩ
H80#,4RﻩSLCHG: RLC
Aﻩ
C,ANIDﻩ VOMﻩ
SETB
CLK
PONﻩ
KLC
RLCﻩ
PONﻩ GHCLS,4R
ZNJDﻩﻩ $ PMJSﻩﻩ
END 七、
实验思考题
参考图 3—2电路图,尝试编写软件程序,实现 8 位 LED 流水灯得控制。
图 图 3 、2 实验原理图
可利用单片机得定时计数器通过选择定时计数器工作方式与预置初值设定延时时间,通过定时计数器产生得中断在中断程序中对A进行移位。程序如下所示:
CLK
EQU
0、1Pﻩ ﻩ DINA
1、1P UQEﻩ ﻩ DINB
2、1P
UQEﻩ
CLR164 EQU P1、3
0 GROﻩ000 Hﻩ
LJMP MAIN
ﻩ ORG
000BH
;定时器 0 中断服务程序
LJMP SLCHG MAIN:
H06#,PSﻩ VOMﻩ
NOP
CLR
CLK
BNID BTESﻩ
461RLCﻩﻩRLCﻩ ﻩ SETB 461RLCﻩ
MOV
HFF0#,Aﻩ
MOV
1式方作工 0 器时定ﻩ;H10#,DOMTﻩ VOMﻩﻩ
数常间时 sm2 送ﻩ;H81#,0HTﻩ
HCF0#,0LTﻩ VOMﻩ ﻩ SETB
0RTﻩ ;开中断
0TEﻩBTESﻩ
AEﻩBTESﻩ
$ PMJSﻩSLCHG: MOV ﻩ H81#,0HTﻩ
MOV
HCF0#,0LTﻩ A
CLRﻩﻩ C,ANID
VOMﻩﻩ ﻩ SETB
CLK
NOP
KLCﻩ RLCﻩ RETI
DNEﻩ八、
实验总结 及相关问题
由于具有之前实验得基础所以本实验基本没碰到什么问题,调试运行都符合实验要求,通过本次实验对串并转化程序得编写有了一定了解,通过编写流水灯程序加深了对单片机串并口得了解。
实验四
继电器控制实验
一、
实验目得
加深理解继电器得工作原理与特点,掌握利用单片机得IO口控制继电器得一般方法。
二、
实验设备及器件
IBM PC机 一台 DP—51PRO、NET单片机仿真器、编程器、实验仪三合一综合开发平台 一台
三、
实验内容
1.利用D1区得拨动开关与LED,学习继电器得工作原理与特点。
2.编写一段程序,用P1、0口控制继电器,继电器控制LED得亮与灭,(与CLOSE连通时,一盏LED亮;不连通时该LED灭。与OPEN连通时,另一盏LED亮,不通时该LED灭).
四、
实验要求
学会继电器得使用与利用单片机得IO口控制继电器得方法。
五、
实验步骤
图4 -1 继电器驱动控制电路图
1.用短路帽短接JP7,使用导线把D1区J54接口得SW1与C7区J9接口得KJ(任意一根针)相连接。
2.使用导线把D1区J52接口得LED1、LED2与C7区J103接口得OPEN1,CLOSE1分别相连,另外C7区J103接口得1接地(GND)。
3.接好线后,同学可以拨动D1区得SW1拨动开关,观察现象(拨到1时LED2亮,拨到0时LED1亮),并得出结论。
运行结果: : 拨到1 时LED 2 亮,拨到0 时L ED 1 亮 ,说明每拨动一次开关改变一次继电器得状态。
4.然后把C7 区J9 接口得KJ 改接到A2 区得J61 接口得P10。再编写一个程序程序(参考实验二), 使P1、0 口延时一段时间后改变电平值,来控制继电器得开关。
实验 程序见实验参考程序。
调试运行结果: : 两 个 LED 交替变亮, , 继电器状态不断改变。
六、
实验参考程序
ORG 0000 HﻩLJMP MAIN ORG
0100H MAIN: MOV
R7,#0 LOOP: MOV
0#,6Rﻩ ﻩ DJNZ $,6Rﻩ $,6RﻩZNJDﻩﻩ ﻩ DJNZ $,6Rﻩ POOL,7RﻩZNJDﻩﻩ ﻩ CPL
0、1Pﻩ NIAM PMJSﻩﻩ
DNEﻩ
七、
实验思考题
1.请同学思考一下,改由 OPEN 2 、2 、CLOSE2 时本实验如何进行。
同使用OPEN1、1与CLOSE1时连接方法类似,把D1区J52接口得LED1、LED2与C7区J103接口得OPEN2,CLOSE2分别相连,另外C7区J103接口得2接地(GND)即可。
2.请同学再思考一下, 继电器得用途,并举例说明。
继电器就是一种电控制器件,就是当输入量(激励量)得变化达到规定要求时,在电气输出电路中使被控量发生预定得阶跃变化得一种电器。它具有控制系统(又称输入回路)与被控制系统(又称输出回路)之间得互动关系。通常应用于自动化得控制电路中,它实际上就是用小电流去控制大电流运作得一种“自动开关”。故在电路中起着自动调节、安全保护、转换电路等作用。
按照其工作原理可有以下应用:电磁继电器固体继电器温度继电器舌簧继电器时间继电器高频继电器极化继电器其她类型得继电器 八、
实验总结 及相关问题
由于具有之前实验得基础所以本实验基本没碰到什么问题,调试运行都符合实验要求,通过本次实验了解了继电器得控制方法。对继电器这一器件有了一定了解。
很随性的文章!
好厉害!
姓名:侯伟专业:电气工程及其自动化
《微机原理与应用》实验报告
学号:2015012214 年级:2015级
2017年秋季学期
实验一 LCM控制实验
1、功能要求
1、掌握利用单片机控制字符型LCM1602的方法;
2、完成与LCM1602的接口,并尝试各种显示功能。
2、硬件原理
3、软件程序流程
4、程序清单
#include "reg52.h"
#define uchar unsigned char #define uint unsigned int uint q;
uchar str1[]="wu li xue yuan"; uchar str2[]="houwei2015012214";
sbit E=P2^2; sbit RW=P2^1 ; sbit RS=P2^0;
void delay(uint z) { uint x,y;
for(x=z;x>0;x--)
for(y=100;y>0;y--) ; }
void write_com(uchar com) {
RS=0;
RW=1;
H1:
P0=0xff;
E=1;
q=P0;
E=0;
if(q&0x80)
goto H1 ;
RS=0;
RW=0;
P0=com;
E=1;
delay(5);
E=0; }
void write_data(uchar DATE) {
RS=0;
RW=1;
H2:
P0=0xff;
E=1;
q=P0;
E=0;
if(q&0x80)
goto H2 ;
RS=1;
RW=0;
P0=DATE;
delay(5);
E=1;
delay(5);
E=0; } void init()
{
E=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01); write_com(0x80);
}
void main()
{ uchar i;
init(); for(i=0;i
write_data(str1[i]);
delay(100); } write_com(0x80+0x40); for(i=0;i
write_data(str2[i]);
delay(100); } while(1) {
delay(200);
write_com(0x0f);
write_com(0x1e);
}
}
5、实验心得及建议
C语言编写函数不同于汇编语言,函数嵌套使得程序变得精炼,此外一定要读懂每个器件的硬件设计,做到软硬件结合
实验二基于I2C总线的EEPROM读写实验
1、功能要求
1熟悉24C02的芯片功能。
22掌握采用单片机和IC芯片的硬件接口技术。 3掌握24C02的读写程序的设计和调试方法。 4向芯片中写入10个字节,然后再读出显示。
2、硬件原理
3、软件程序流程
总流程: 写n个字节流程:
读n个字节流程:
4、程序清单
#include "reg52.h"
void Delay(unsigned #define WriteDeviceAddre 0xa0 { #define ReadDeviceAddre 0xa1
while(n!=0)
n--; sbit
SCL=P1^0;
} sbit
SDA=P1^1;
void Start()
int n)
{ SDA=1; Delay(10); SCL=1; Delay(10); SDA=0; Delay(10); SCL=0; Delay(10); }
void Stop()
{ SDA=0; Delay(10); SCL=1; Delay(10); SDA=1; Delay(10); }
void Ack() {
int i;
SCL=1;
Delay(10);
while(SDA==1&&i
i++;
SCL=0;
Delay(10);
}
void NoAck() {
SDA=1;
Delay(10);
SCL=1;
Delay(10);
SCL=0;
Delay(10);
}
void Write8bit(unsigned char input) {
unsigned char
temp;
for(temp=8;temp!=0;temp--)
{
SDA=(bit)(input&0x80);
Delay(10);
SCL=1;
Delay(10);
SCL=0;
input=input
} }
void WriteI2C(unsigned char Wdata ,unsigned char RomAddre ) {
Start();
Write8bit(WriteDeviceAddre);
Ack();
Write8bit(RomAddre);
Ack();
Write8bit(Wdata);
Ack();
Stop(); }
int Read8bit()
{
unsigned char temp,rbyte=0; for(temp=8;temp!=0;temp--) {
SCL=1;
Delay(10);
rbyte=rbyte
Delay(10);
rbyte=rbyte|SDA;
SCL=0;
Delay(10);
}
return(rbyte); }
int ReadI2C(unsigned char RomAddre) {
int Data;
Start();
Write8bit(WriteDeviceAddre);
Ack();
Write8bit(RomAddre);
Ack();
Start();
Write8bit(ReadDeviceAddre);
Ack();
Data=Read8bit(); NoAck(); Stop(); return Data; }
void
main() {
int
writeByte[]={1,2,3,4,5,6,7,8,9,10};
int
readByte[10];
int i;
P2=0x00;
for(i=0;i
{
WriteI2C(writeByte[i],0x00+i); Delay(1000000); } i=0; while(1) {
Delay(900000000);
readByte[i]=ReadI2C(i+0x00); P2=readByte[i];
Delay(90000000);
i++;
if(i==10)
i=0; } }
5、实验心得及建议
I2C总线的协议比较多,程序编写起来比较困难,这要求我们对24C02芯片十分清楚,如果对它的协议不够清楚,读写函数很难实现
实验三A/D转换实验
1、功能要求
1 掌握A/D转换芯片ADC0809转换性能及编程方法。 2 掌握A/D转换芯片ADC0809与单片机的接口方法。 3 通过实验了解单片机如何进行数据采集。
4.利用实验箱产生0-5V的模拟电压。编写程序,采集该模拟电压并将转换的结果用发光二极管显示。
5.采集光敏电阻的亮度变化,设置门限值,实现超过门限值使蜂鸣器报警的功能。
2、硬件原理
3、软件程序流程
4、程序清单
#include #include
#define uchar unsigned char
#define uint unsigned int
sbit ADC_START=P2^0; sbit ADC_ALE =P2^1; sbit ADC_OE
=P2^2; sbit ADC_EOC =P2^3; sbit clk
=P2^7;
sbit E=P2^6; sbit R_W=P2^5; sbit D_I=P2^4;
sbit D0=P0^0; sbit D1=P0^1; sbit D2=P0^2; sbit D3=P0^3; sbit D4=P0^4; sbit D5=P0^5; sbit D6=P0^6;
sbit D7=P0^7;
//unsigned data i; unsigned char q;
void WCOM(unsigned char d); /*写指令函数*/
void Dat(unsigned char d); /*写数据函数*/
void Imim(); /*初始化*/
void Clearcld(); /*清屏*/
void Delay() { int d; for(d=0;d
_nop_(); } }
void Timer0Init() { TMOD|=0X01; TH0=0XFC;
TL0=0XFF;
ET0=1; EA=1; TR0=1;
}
void init0809() {
ADC_START=0;
ADC_OE=0;
ADC_ALE=0;
_nop_();
_nop_();
ADC_ALE=1;
//ALE=1时地址进入锁
存器
_nop_();
P3=0x07;
_nop_();
ADC_ALE=0;
//ALE=0时地址被锁存住 }
void ADC_0809() {
ADC_START=0; _nop_();
_nop_();
_nop_();
ADC_START=1;
//上升沿复位
_nop_();
_nop_();
_nop_();
ADC_START=0;
//下降沿开始
_nop_();
_nop_();
_nop_();
while(!ADC_EOC); //等待转换结束
ADC_OE =1;
_nop_();
_nop_();
_nop_();
Dat(0x30+(uchar)D0);
Dat(0x30+(uchar)D1);
Dat(0x30+(uchar)D2);
Dat(0x30+(uchar)D3);
Dat(0x30+(uchar)D4);
Dat(0x30+(uchar)D5);
Dat(0x30+(uchar)D6);
Dat(0x30+(uchar)D7);
Delay();
ADC_OE =0; }
void WCOM(unsigned char d) { R_W=1; D_I=0; LOOP: P1=0xFF; E=1; q=P1; E=0; if(q&0x80) {
goto LOOP; } R_W=0; D_I=0; P1=d; E=1; E=0; } void Dat(unsigned char d) { R_W=1; D_I=0; LOOP: P1=0xFF; E=1; q=P1; E=0; if(q&0x80) {
goto LOOP; } D_I=1; R_W=0; P1=d; E=1; E=0; } void Imim() { P1=0xFF; E=0; WCOM(0x38);
WCOM(0x08); WCOM(0x06); Clearcld(); WCOM(0x0c); }
void Clearcld() { D_I=0; R_W=0; // P0=0x01; WCOM(0x01); }
void main() {
int i; init0809();
Imim(); Clearcld(); WCOM(0x02);
Timer0Init();
Delay();
while(1)
{
WCOM(0x80);
ADC_0809();
WCOM(0X88);
for(i=0;i
Dat(\\" \\");
WCOM(0X80+0x40);
for(i=0;i
Dat(\\" \\");
} }
void Timer0() interrupt 1 { static uint i; TH0=0XFC; TL0=0xFF; i++; if(i==1) {
i=0;
clk=~clk;
} }
5、实验心得及建议
该实验硬件电路出错次数较多,需要锻炼排错的能力,结合软件程序,一步一步检查,这样每一部分都十分清楚
实验四D/A转换实验
1、功能要求
1.了解D/A(DAC0832)的基本原理和功能。
2.掌握D/A(DAC0832)和单片机的硬件接口以及软件设计方法。 3.软件编程使DAC0832转换模块循环输出锯齿波。 4.软件编程使DAC0832转换模块循环输出正弦波。
2、硬件原理
3、软件程序流程
4、程序清单
#include
#define uchar unsigned char
sbit key=P2^2;
uchar i;
uchar code sin_tab[]=
{
0x80,0x83,0x85,0x88,0x8a,0x8d,0x8f,0x92,0x94,0x97,
0x99,0x9b,0x9e,0xa0,0xa3,0xa5,0xa7,0xaa,0xac,0xae,
0xb1,0xb3,0xb5,0xb7,0xb9,0xbb,0xbd,0xbf,0xc1,0xc3,
0xc5,0xc7,0xc9,0xcb,0xcc,0xce,0xd0,0xd
1,0xd3,0xd4,
0xd6,0xd7,0xd8,0xda,0xdb,0xdc,0xdd,0xde,0xdf,0xe0,
0xe1,0xe2,0xe3,0xe3,0xe4,0xe4,0xe5,0xe5,0xe6,0xe6,
0xe7,0xe7,0xe7,0xe7,
//输出电压从0到最大值,正弦波1/4部分
0xe7,0xe7,0xe7,0xe7,0xe6,0xe6,0xe5,0xe5,0xe4,0xe4,
0xe3,0xe3,0xe2,0xe1,0xe0,0xdf,0xde,0xdd,0xdc,0xdb,
0xda,0xd8,0xd7,0xd6,0xd4,0xd3,0xd1,0xd0,0xce,0xcc,
0xcb,0xc9,0xc7,0xc5,0xc3,0xc1,0xbf,0xbd,0xbb,0xb9,
0xb7,0xb5,0xb3,0xb1,0xae,0xac,0xaa,0xa7,0xa5,0xa3,
0xa0,0x9e,0x9b,0x99,0x97,0x94,0x92,0x8f,0x8d,0x8a,
0x88,0x85,0x83,0x80,
//输出电压从最大值到0,正弦波1/2部分
0x7d,0x7b,0x78,0x76,0x73,0x71,0x6e,0x6c,0x69,0x67,
0x65,0x62,0x60,0x5d,0x5b,0x59,0x56,0x54,0x52,0x4f,
0x4d,0x4b,0x49,0x47,0x45,0x43,0x41,0x3f,0x3d,0x3b,
0x39,0x37,0x35,0x34,0x32,0x30,0x2f,0x2d,0x2c,0x2a,
0x29,0x28,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x1f,
0x1e,0x1d,0x1d,0x1c,0x1c,0x1b,0x1b,0x1a,0x1a,0x1a,
0x19,0x19,0x19,0x19,
//输出电压从0到最小值,正弦波3/4部分
0x19,0x19,0x19,0x19,0x1a,0x1a,0x1a,0x1b,0x1b,0x1c,
0x1c,0x1d,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,
0x25,0x26,0x28,0x29,0x2a,0x2c,0x2d,0x2f,0x30,0x32,
0x34,0x35,0x37,0x39,0x3b,0x3d,0x3f,0x41,0x43,0x45,
0x47,0x49,0x4b,0x4d,0x4f,0x52,0x54,0x56,0x59,0x5b,
0x5d,0x60,0x62,0x65,0x67,0x69,0x6c,0x6e,0x71,0x73,
0x76,0x78,0x7b,0x7d
};
void delay()
{
uchar j;
for(j=20;j>0;j--);
}
void juchibo()
{
for(i=0;i
P1=(uchar)i;
}
void main() {
while(1) {
if(key)
{
for(i=0;i
{
P1=sin_tab[i];
delay();
}
if(i==255)
i=0;
}
}
else
{
juchibo();
}
}
}
5、实验心得及建议
锯齿波循环部分没彻底明白,导致锯齿波和三角波不能切换。另外硬件电路搭建时也要认真
实验五基于MAX232的单片机与微机串行通信实验
1、功能要求
学习使用MAX232实现单片机与微机的串行通讯。使用串口调试助手软件正确接收发送数据。
2、硬件原理
3、软件程序流程
4、程序清单
#include"reg51.h"
void main() { unsigned char a; SCON=0X50; PCON=0X80; TMOD=0X20; TH1=0XFD; 率为19.2k TL1=0XFD; TR1=1;
ES=0;
while(1) {
while(!RI); RI=0;
a=SBUF; 串行口方式1
SBUF=a;
while(!TI); //设定波特
TI=0; }
}
//
5、实验心得及建议
该实验软件部分和硬件部分都比较简单,关键是弄懂单片机的PC机谁发送谁接收