单片机编程软件的基本使用 - 图文

更新时间:2024-03-04 17:25:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

硬件实验报告

学生:张小强

学号:1252100210 指导老师:莫荣

实验一: 单片机开发系统应用初步

——基本I/O口赋值 1. 内容提要:

1) KEIL C软件对程序进行编译调试及烧录软件的使用方法。 2) 单片机基本I/O口的驱动方式、特点等。

3) 汇编语句的基本用法;对基本I/O口的赋值方法;程序的具体流程等。

2.实验目的及要求:

1) 课前预习好编程的基本知识。程序的基本概念、*.asm、*.c、*.hex、*.uv2所表示的文件类型等。

2) 熟练掌握不同数据类型之间的相互转换,不同类型的数据在程序中的表示方法等。

3)课前弄清楚单片机I/O口的基本驱动方式,理解何谓上拉及下拉方式,单片

机驱动电流、灌入电流等概念。 4) 复习数码管的相关知识,弄清数码管需显示某个字符应如何对其进行控制等。

3.实验源程序及流程图:

ORG 0000H AJMP MAIN

MAIN: MOV P0,#0FH JMP MAIN END

开始 对P0口赋值 跳转至主程序

4. 实验的实施:

1) 实验前准备:基础知识的统计学习

结束 A. 程序:完成某种任务的计算机代码。 B. 文件类型:

*.asm:汇编语言编写的程序文件。 *.c: c语言编写的程序文件。

*.hex:机器语言文件,指通过*.asm、*.c等程序编译成功后转换而得

到的hex文件。

*.uv2:表示keil c软件的工程文件。

C. 对源程序的相关阐释:

ORG 0000H 定义程序起始地址

AJMP MAIN 直接跳到main(主程序)

MAIN: MOV P0,#0FH 对p0口赋初值 JMP MAIN 跳转到main END 程序结束

2) 通过keil c进行程序编译,生成正确的*.hex机器语

言文件:

A. 打开keil c,建立工程文件:

a.在主菜单下右键点击选中project

再点击New Project新建工程文件,弹出下面对话框:

b选择保存位置,定义文件名,点击保存,弹出下面对话框

c选择Atmel下的89c51,点击确定,则就完成新建工程文件,相当于搭建了一个工作平台

d:对工程文件的调整:

右键单击targte 1,选中options for target‘targte 1’弹出下面对话框:

按以上图示步骤则可完成对工程文件的调整,这样则可以将编译成功的程序转

换为hex文件。

B 新建文本窗口,保存为程序文件,编写程序: a在主菜单下右键单击File

再点击New,弹出以下窗口,

b.此时显示的对话框则是编译的文本窗口,再次右键点击Fiel,右键选中Save As或save弹出下面对话框:

c.选择保存位置,定义文件名并填写后缀(实验中选择汇编语言,则后缀为.asm),点击保存,弹出以下对话框就把文本保存为程序文件,这样更有利于程序的编写。

此时我们就可以在对话框中编写程序了。

d.在对话框中编写程序,在fiel菜单下点击save保存:

这样我们就保存了一个程序文件。

C 把程序文件加载到工程文件下,并进行编译与调试: a.右键点击Source Group 1

右键点击选中Add Files to Group ‘source group 1’(添加文件到工程)弹出下面对话框

显示空白的窗口,是因为没有匹配的类型文件,正确的选择asm类型,则弹出相应的文件,选中要添加的文件,点击添加就可把程序文件加载到工程文件下。

b.在‘source group 1’下双击打开程序文件

则就可以弹出程序窗口进行编译与调试

点击build target进行编译,调试程序使编译窗口中显示无错就可以保存生成机器语言文件了。

3)用烧录软件将文件烧录到单片机中:

(因为下载器驱动不匹配等问题我使用了progisp烧录软件)

将单片机接入电脑中,打开progisp烧录软件,显示如下:

A.调入由程序

ORG 0000H AJMP MAIN

MAIN: MOV P0,#0FH JMP MAIN END

编写的文件,单片机显示如下:

B. 将程序改为

ORG 0000H AJMP MAIN

MAIN: MOV P0,#3FH JMP MAIN END

编译文件调入单片机,显示如下:

C. 将程序改为

ORG 0000H AJMP MAIN

MAIN: MOV P0,#00H

JMP MAIN END

编译文件调入单片机,显示如下:

D. 将程序改为

ORG 0000H AJMP MAIN

MAIN: MOV P0,#65H JMP MAIN END

编译文件调入单片机,显示如下:

E. 将程序改为

ORG 0000H AJMP MAIN

MAIN: MOV P2,#0fH JMP MAIN END

编译文件调入单片机,显示如下:

F. c语言编写的程序

#include void main(void) {

while(1) {

P0=0x0f; } }

新建工程,加入.c文件,编译文件后调入单片机,显示如下:

5. 实验中的问题总结 1) 下载器无法正常工作 2) 烧录软件不匹配 6. 实验心得体会

这次实验是通过观看老师的指导录像自己操作完成的, 此次实验也让我掌握了KEIL C软件对程序进行编译调试及烧录软件的使用方法,并掌握了各种类型文件的区别.

而在实验过程中遇到的最大问题是下载器无法正常连接与烧录软件无法正常工作,遇到问题后我先是检查各种软件是否安装正确,检查无误后我就请教其他人,有人说是驱动问题,但我不会解决,最后我去请教学长,学长帮我一遍遍实验,最后单片机终于可以正常工作!这个问题的解决让我明白:遇到问题一定要坚持不懈,不断地尝试才能解决问题!

实验二、基本控制语句应用

——简单广告牌霓虹灯设计

1. 内容提要:

1) 汇编语言控制语句应用。

2) 程序的循环、子程序调用、程序跳转等。 3) 单片机基本I/O口的驱动方式、特点等。

2.实验目的及要求:

1) 理解左移RL、右移RR概念。

2) 延时程序DELAY的具体执行过程、延时量控制等。 3) 掌握通过设置程序的跳转来实现程序循环的方法。

3.实验源程序及流程图:

ORG 0000H AJMP MAIN

MAIN: MOV P0,#00H MOV A,#01H LOOP: MOV P0,A RL A

JMP LOOP END

开始 P0及累加器A初始化A内容赋予P0 A内容左移 跳转至LOOP

4.实验的实施:

1) 实验前准备:基础知识的统计学习

结束 A. 左移RL与右移RR: 在汇编中RR和RL都是移位类指令,位

移类指令只能对累加器A进行移位, RR A 是指使累加器A内各位向右环移一位,例如累加器A原来各位为01111111,运行 RR A语句后,累加器A各位就变为10111111。

RL A 是指使累加器A内各位向左环移一位,例如累加器A原来各位为11111110,运行 RL A语句后,累加器A各位就变为11111101。

B. 为什么加入延时程序DELAY: 因为p0口变化速度太快,人眼

无法捕捉信息观察变化,加入延时程序,加长了执行时间,使其变化速度减慢,而便于观察!

C. DELAY的具体执行过程:

DELAY:MOV R2,#10H 对R2赋初值10H(十进制16) LOOP1:MOV R1,#0FFH 对R1赋初值FFH(十进制255) LOOP2:DJNZ R1,LOOP2 R1循环减一,直至为零

DJNZ R2,LOOP1 R2减一,不等于一时跳到LOOP1,直至R2为零 RET 子程序结束

D. 如何控制延时量:通过跳整R1与R2的初值调控延时变量。 E. 怎样设置程序的跳转来实现程序循环:通过插入子程序调用

函数跳转实现循环。

F. 对源程序的相关阐释:

ORG 0000H 定义程序起始地址

AJMP MAIN 直接跳到main(主程序)

MAIN: MOV P0,#00H 对p0口初始化 MOV A,#01H 给A一个初值

LOOP: MOV P0,A 把A的初值给p0口

RL A 左移指令,对A内的初值进行左移 JMP LOOP 跳转到LOOP

END 程序结束

3) 编写程序,烧录观察: A.

发现八个灯都亮,分析可知由于程序执行时速度太快造成的!可通过插入延时程序解决。 B

发现八个灯还是都亮,分析可知是程序中延时量太小的原因,可以修改延时量解决 C.

编译成功后调入单片机,发现有一个灯灭循环左移,变化速度稍快,可通过多次插入延时程序解决

D.

发现速度明显减缓,可是没有达到一个灯循环闪烁,没有与硬件相吻合,可以修改A的初值解决

E.

运行后发现达到了我们要做的要求:一只LED作流水状移动。

F:用c语言编程: #include

unsigned char i,c,d,temp=0xfe;

void delay(void) {

unsigned char a,b; for(a=0;a<255;a++) {

for(b=0;b<200;b++); } }

void main(void) {

while(1) {

for(i=0;i<8;i++) {

c=temp<>(8-i); P0=c|d; delay();

} } }

运行后发现可以正常运行。

G. 修改程序,使一个LED灯达到自左向右——自右向左——自左向

右反复循环如反弹状移动。

#include unsigned char i,c,d,temp=0xfe;

void delay(void) {

unsigned char a,b; for(a=0;a<255;a++) {

for(b=0;b<255;b++); } }

void main(void) { while(1) {

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

{

c=temp<>(8-i); P0=c|d; delay(); delay(); delay(); delay(); }

for(i=7;i>0;i--) {

c=temp<>(8-i); P0=c|d; delay(); delay(); delay(); delay(); } } }

运行发现无误,可以达到预计效果!

5. 实验中的问题总结

1)相关理论及概念无法理解。

2)实现一个LED灯左右循环时程序编译出错。

6.心得体会

此次实验做了简单的LED跑马效果,让我觉得那些夜晚的霓虹灯闪烁不在那么虚幻!最起码我们可以自己通过努力达到相应的效果。也让我觉得学习的C不在那么枯燥,也算是有用武之地了。

而刚接触单片机和汇编的我对于相关的概念和基础知识却是不能理解太多,在有限的时间里想要掌握更多的知识确实不太现实,这就需要我们现学现用,一步步的做,做不好就查阅资料、询问同学、请教学长,慢慢的调试,读懂并书写正确的程序,才能达到更好的效果。

#include

time0() interrupt 1 using 0 {

TH0=0X3C;TL0=0XB0;a++; }

main() {

TMOD=0X01;TH0=0X3C;TL0=0XB0; EA=1;ET0=1;TR0=1; while(1) {

if(a==40){a=0;P1_0=~P1_0;} if(P3_7==0){P3_7=~P3_7;} } }

本文来源:https://www.bwwdw.com/article/i0xa.html

Top