高校内部C语言单片机实验讲义Word文档格式.docx

上传人:b****5 文档编号:20659803 上传时间:2023-01-24 格式:DOCX 页数:49 大小:694.31KB
下载 相关 举报
高校内部C语言单片机实验讲义Word文档格式.docx_第1页
第1页 / 共49页
高校内部C语言单片机实验讲义Word文档格式.docx_第2页
第2页 / 共49页
高校内部C语言单片机实验讲义Word文档格式.docx_第3页
第3页 / 共49页
高校内部C语言单片机实验讲义Word文档格式.docx_第4页
第4页 / 共49页
高校内部C语言单片机实验讲义Word文档格式.docx_第5页
第5页 / 共49页
点击查看更多>>
下载资源
资源描述

高校内部C语言单片机实验讲义Word文档格式.docx

《高校内部C语言单片机实验讲义Word文档格式.docx》由会员分享,可在线阅读,更多相关《高校内部C语言单片机实验讲义Word文档格式.docx(49页珍藏版)》请在冰豆网上搜索。

高校内部C语言单片机实验讲义Word文档格式.docx

完成上面步骤后,我们就可以进行程序的编写了。

  (3)首先我们要在项目中创建新的程序文件或加入旧程序文件。

如果你没有现成的程序,那么就要新建一个程序文件。

在KEIL中有一些程序的Demo,在这里我们还是以一个C程序为例介绍如何新建一个C程序和如何加到您的第一个项目中吧。

点击图1-5中1的新建文件的快捷按钮,在2中出现一个新的文字编辑窗口,这个操作也可以通过菜单File-New或快捷键Ctrl+N来实现。

好了,现在可以编写程序了,光标已出现在文本编辑窗口中,等待我们的输入了。

第一程序嘛,写个简单明了的吧。

下面是经典的一段程序:

#include<

AT89X51.H>

stdio.h>

voidmain(void)

{

 SCON=0x50;

//串口方式1,允许接收

 TMOD=0x20;

//定时器1定时方式2

 TCON=0x40;

//设定时器1开始计数

 TH1=0xE8;

//11.0592MHz1200波特率

 TL1=0xE8;

 TI=1;

 TR1=1;

//启动定时器

 while

(1)

  {

   printf("

HelloWorld!

\n"

);

//显示HelloWorld

  }

}

图1-4选取芯片

图1-5新建程序文件

这段程序的功能是不断从串口输出"

字符,我们先不管程序的语法和意思吧,先看看如何把它加入到项目中和如何编译试运行。

 (4)点击图1-5中的3保存新建的程序,也可以用菜单File-Save或快捷键Ctrl+S进行保存。

因是新文件所以保存时会弹出类似图1-3的文件操作窗口,我们把第一个程序命名为test1.c,保存在项目所在的目录中,这时你会发现程序单词有了不同的颜色,说明KEIL的C语法检查生效了。

如图1-6鼠标在屏幕左边的SourceGroup1文件夹图标上右击弹出菜单,在这里可以做在项目中增加减少文件等操作。

我们?

quot;

AddFiletoGroup'

SourceGroup1'

弹出文件窗口,选择刚刚保存的文件,按ADD按钮,关闭文件窗,程序文件已加到项目中了。

这时在SourceGroup1文件夹图标左边出现了一个小+号说明,文件组中有了文件,点击它可以展开查看。

图1-6把文件加入到项目文件组中

  

(5)C程序文件已被我们加到了项目中了,下面就剩下编译运行了。

这个项目我们只是用做学习新建程序项目和编译运行仿真的基本方法,所以使用软件默认的编译设置,它不会生成用于芯片烧写的HEX文件,如何设置生成HEX文件就请看下面的第三课。

我们先来看图1-7吧,图中1、2、3都是编译按钮,不同是1是用于编译单个文件。

2是编译当前项目,如果先前编译过一次之后文件没有做动编辑改动,这时再点击是不会再次重新编译的。

3是重新编译,每点击一次均会再次编译链接一次,不管程序是否有改动。

在3右边的是停止编译按钮,只有点击了前三个中的任一个,停止按钮才会生效。

在4中可以看到编译的错误信息和使用的系统资源情况等,以后我们要查错就靠它了。

6是有一个小放大镜的按钮,这就是开启\关闭调试模式的按钮,它也存在于菜单Debug-Start\StopDebugSession,快捷键为Ctrl+F5。

图1-7编译程序

 (6)进入调试模式,软件窗口样式大致如图1-8所示。

图中1为运行,当程序处于停止状态时才有效,2为停止,程序处于运行状态时才有效。

3是复位,模拟芯片的复位,程序回到最开头处执行。

按4我们可以打开5中的串行调试窗口,这个窗口我们可以看到从51芯片的串行口输入输出的字符,这里的第一个项目也正是在这里看运行结果。

这些在菜单中也有,这里不再一一介绍大家不妨找找看,其它的功能也会在后面的课程中慢慢介绍。

首先按4打开串行调试窗口,再按运行键,这时就可以看到串行调试窗口中不断的打?

HelloWorld!

这样就完成了您的第一个C项目。

最后我们要停止程序运行回到文件编辑模式中,就要先按停止按钮再按开启\关闭调试模式按钮。

然后我们就可以进行关闭KEIL等相关操作了。

  到此为止,初步学习了一些KEILuVision2的项目文件创建、编译、运行和软件仿真的基本操作方法。

其中一直有提到一些功能的快捷键的使用,的确在实际的开发应用中快捷键的运用可以大大提高工作的效率,建议大家多多使用,还有就是对这里所讲的操作方法举一反三用于类似的操作中。

图1-8调试运行程序

实验2:

清零、拆字、拼字程序及数据区传送子程序

掌握汇编语言设计和调试方法,熟悉键盘操作。

二、实验内容

(1)把2000H-20FFH的内容清零。

(2)把2000H的内容拆开,高位送2001H低位,低位送2002H低位,2001H、2002H高位清零,一般本程序用于把数据送显示缓冲区时用。

(3)把2000H、2001H的低位分别送入2002H高低位,一般本程序用于把显示缓冲区的数据取出拼装成—个字节。

(4)把R2、R3源RAM区首址内的R6、R7字节数据传送到R4、R5目的RAM区。

三、程序框图

(1)清零程序框图

(2)拆字程序框图

(3)拼字程序框图

(4)数据区传送程序框图

(1)用连续或单步方式运行程序,检查2000-20FF中执行程序前后的内容变化。

(2)用连续或单步方式运行程序,检查2000—2002H中内容变化情况。

(3)单步或用断点方式运行程序,检查2002H内容变化情况。

(4)在R2、R3中输入源首址(例如0000H),R4、R5中输入目的地址(例如2000H),R6、R7中输入字节数(例如1FFFH),运行程序,检查0000-1FFFH中内容是否和2000-3FFFH中内容完全—致。

实验3:

P1口亮灯实验、P1口转弯灯实验

(1)学习P1口的使用方法;

(2)学习延时子程序的编写。

三、实验内容

(1)P1口亮灯实验:

P1作为输出口,接八只发光二极管,编写程序,使发光二极管循环点亮。

P1口对准双向口,每一位都可独立地定义为输出线或输入线。

本实验中延时子程序采用指令循环来实现,机器周期(12/6MHz)*指令所需机器周期数*循环次数,在系统时间允许的情况下可以采用此方法。

(2)P1口转弯灯实验:

P1.0开关接5V时,右转弯灯闪亮,P1.1开关接5V时左转弯灯闪亮,P1.O、P1.1开关同时接5V或接地时,转弯灯均不闪亮。

四、程序框图

图2-1p1口亮灯实验程序框图

五、实验电路

图2-3P1口亮灯实验电路图

图2-4P1口转弯灯实验电路图

六、实验步骤

P1.O-P1.7用插针连至L1-L8,运行程序后,观察发光二极管闪亮移位情况。

P1.0接K1P1.1接K2P1.4-P1.7接L1L5L9L13连续运行本程序,应看到转弯灯正确闪亮,在用单步方式调试本程序时需修改延时子程序,(例可把延时程序第一个字节改成返回指令22H),以便观察。

七、思考

改变延时常数,使发光二极管闪亮时间改变。

修改程序,使发光二极管闪亮移位方向改变。

实验4:

单片机定时器实验

熟悉51定时/计数功能,掌握初始化编程方法。

计算机、实验箱或自制实验板

把定时器0外部输入的脉冲进行计数,并送显示器显示。

五、实验步骤

P3.4依次接T0-T7或单步脉冲输出孔,执行程序,观察数码管上计数脉冲的速度及个数。

实验5:

单片机计数器实验

学习51单片机内部定时/计数器使用方法。

51单片机内部定时计数器T0,按计数器模式工作于方式1,对P3.4(T0)引脚进行计数。

将其数值按二进制数在P1口驱动LED灯上显示出来。

四、实验电路连线

P1.0●-----------------------●LED0

P1.1●-----------------------●LED1

P1.2●-----------------------●LED2

P1.3●-----------------------●LED3

P1.4●-----------------------●LED4

P1.5●-----------------------●LED5

P1.6●-----------------------●LED6

P1.7●-----------------------●LED7

●-----------------------●T0(P3.4)

五、实验说明

本实验中内部计数器起计数器的作用。

外部事件计数脉冲由T0(P3.4)脚引入定时器T0。

单片机在每个机器周期采样一次输入波形,因此单片机至少需要两个机器周期才能检测到一次跳变,这就要求被采样电平至少维持一个完整的机器周期,以保证电平在变化之前即被采样。

同时这就决定了输入波形的频率不能超过机器周期频率。

开始

设置T0工作方式

(方式1、计数模式)

开始计数

计数,输出计数值

六、参考程序框图

实验6:

单片机串行口实验

1.掌握8051串行口方式0工作方式及编程方法。

2.掌握利用串行口扩展I/O通道的方法。

启东单片机综合实验箱,导线,数码管,74ls164等。

利用8051串行口和串行输入并行输出移位寄存器74LS164,扩展一个8位输出通道,用于驱动一个数码显示器,在数码显示器上循环显示8031串行口输出的0—9这10个数字。

串行口工作在方式0时,可通过外接移位存储器实现串并行转换。

在这种方式下,数据为8位,只能从RXD端输入输出,TXD端总是输出移位同步时钟信号,其波特率固定为晶振频率1/12。

由软件置位串行控制寄存器(SCON)的REN后才能启动串行接收,在CPU将数据写入SBUF寄存器后,立即启动发送。

待8位数据输完后,硬件将SCON寄存器的TI位置1,TI必须由软件清零。

四、实验线路

五、参考程序清单

#include<

kc_sfrs.h>

#defineLEDLen6

unsignedcharvolatileOUTBIT;

//位控制口

unsignedcharvolatileOUTSEG;

//段控制口

unsignedcharvolatileIN;

//键盘读入口

#pragmalocate(OUTBIT=0x8002)//定义各端口的地址

#pragmalocate(OUTSEG=0x8004)

#pragmalocate(IN=0x8001)

#pragmainterrupt(Sio_int=0x200c)//定义串口中断向量

unsignedcharLEDBuf[LEDLen];

//显示缓冲

unsignedcharRCVBUF,HasRcv;

unsignedcharconstLEDMAP[]={//八段管显示码

0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71

};

voidDelay(unsignedcharCNT)

unsignedchari;

while(CNT--!

=0)

for(i=100;

i!

=0;

i--);

voidDisplayLED()

unsignedchari,j,k;

unsignedcharPos;

unsignedcharLED;

Pos=0x20;

//从左边开始显示

for(i=0;

i<

LEDLen;

i++){

OUTBIT=0;

//关所有八段管

LED=LEDBuf[i];

OUTSEG=LED;

OUTBIT=Pos;

//显示一位八段管

Delay

(1);

Pos>

>

=1;

//显示下一位

}

unsignedcharconstKeyTable[]={//键码定义

0x16,0x15,0x14,0xff,

0x13,0x12,0x11,0x10,

0x0d,0x0c,0x0b,0x0a,

0x0e,0x03,0x06,0x09,

0x0f,0x02,0x05,0x08,

0x00,0x01,0x04,0x07

unsignedcharTestKey()

//输出线置为0

return(~IN&

0x0f);

//读入键状态(高四位不用)

unsignedcharGetKey()

unsignedcharj;

unsignedchark;

i=6;

//找出键所在列

do{

OUTBIT=~Pos;

k=~IN&

0x0f;

}while((--i!

=0)&

&

(k==0));

//键值=列X4+行

if(k!

=0){

i*=4;

if(k&

2)

i+=1;

elseif(k&

4)

i+=2;

8)

i+=3;

doDelay(10);

while(TestKey());

//等键释放

return(KeyTable[i]);

//取出键码

}elsereturn(0xff);

voidSio_int()

if((sp_stat&

0x40)){//RI位是否为1?

RCVBUF=sbuf_rx;

HasRcv=1;

voidmain()

ioc1=0x20;

//P2.0设为TXD功能

sp_con=0x09;

//串口模式1,允许接收

baud_rate=0x9b;

//波特率2400BPS@6MHz

baud_rate=0x80;

int_mask1=0x00;

//禁止RI和TI中断

int_mask=0x40;

//允许串口中断(0x200C)

HasRcv=0;

LEDBuf[0]=0xff;

LEDBuf[1]=0xff;

LEDBuf[2]=0xff;

LEDBuf[3]=0xff;

LEDBuf[4]=0x00;

LEDBuf[5]=0x00;

enable();

//允许中断

while

(1){

if(!

HasRcv){

DisplayLED();

//显示

if(TestKey())//如果有键按下

sbuf_tx=GetKey();

//则用串口输出

}else{

//已收到数据

LEDBuf[5]=LEDMAP[RCVBUF&

0x0f];

//显示低4位

LEDBuf[4]=LEDMAP[RCVBUF/0x10];

//显示高4位

实验7:

工业顺序控制实验

掌握工业顺序控制程序的简单编程,中断的使用。

二、实验预备知识

在工业控制中,象冲压、注塑、轻纺、制瓶等生产过程,都是一些继续生产过程,按某种顺序有规律地完成预定的动作,对这类继续生产过程的控制称顺序控制,倒注塑机工艺过程大致按“合模→注射→延时→开模→产伸→产退”顺序动作,用单片机最易实现。

8032P1.0-P1.6控制注塑机的七道工序,现模拟控制七只发光二极管的点亮,低电平有效,设定每道工序时间转换为延时,P3.4为开工启动开关,高电平启动。

P3.3为外部故障输入模拟开关,低电平报警,P1.7为报警声音输出,设定6道工序只有一位输出,第七道工序三位有输出。

按实验电路图接好连线。

执行程序,把K1接到电平,观察发光二极管点亮情况,确定工序执行是否正常,然后把K2置为低电平,看是否有声音报警,恢复中断1,报警停,又从刚才报警时一道程序执行下去。

可用单步、单步跟踪,非全速断点、全速断点、连续执行功能调试软件,直到符合自己程序设计要求为止。

实验8:

8255PA口控制PB口、8255控制交通灯

掌握单片机系统中扩展外围芯片的方法,了解8255芯片的结构及编程方法。

用8255PA口作开关量输入口,PB口作输出口。

(2)8255控制交通灯

(1)8255Pa口控制PB口

四、实验电路

(1)8255Pa口控制PB口

(2)8255控制交通灯

(1)8255Pa口控制PB口:

8255PA口接K1-K8,PB口接L1-L8运行程序,按Kl-K8,观察L1-L8发光二极管是否对应点亮。

8255PA0-PA7PB0-PB3接发光二极管L15-L13、L11-L9、L7-L5、L3-L1。

执行程序,初始状态为四个路口的红灯全亮之后,东西路口的绿灯亮,南北路口的红灯亮,东西路口方向通车,延时一段时间后东西路口的绿灯熄灭,黄灯开始闪烁,闪烁若干次后,东西路口红灯亮,而同时南北路口的绿灯亮,南北路口方向开始通车,延时一段时间后,南北路口的绿灯熄灭,黄灯开始闪烁,闪烁若干次后,再切换到东西路口方向,之后重复以上过程。

实验9:

单片机键盘输入、数码管显示实验

掌握51系统中键盘和显示器的接口方法。

掌握中断的使用方法。

了解c51的编辑,编译方法。

(1)用AT89S51的并行口P1接4×

4矩阵键盘,以P1.0-P1.3作输入线,以P1.4-P1.7作输出线;

在数码管上显示每个按键的“0-F”序号。

(2)4×

4矩阵键盘识别处理:

每个按键有它的行值和列值,行值和列值的组合就是识别这个按键的编码。

矩阵的行线和列线分别通过两并行接口和CPU通信。

每个按键的状态同样需变成数字量“0”和“1”,开关的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。

键盘处理程序的任务是:

确定有无键按下,判断哪一个键按下,键的功能是什么;

还要消除按键在闭合或断开时的抖动。

两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。

三、程序清单

unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

unsignedchartemp;

unsignedcharkey;

unsignedchari,j;

voidmain(void)

{

while

(1)

{

P3=0xff;

P3_4=0;

temp=P3;

temp=temp&

if(temp!

=0x0f)

for(i=50;

i>

0;

i--)

for(j=200;

j>

j--);

switch(temp)

case0x0e:

key=7;

break;

case0x0d:

key=8;

case0x0b:

key=9;

case0x07:

key=10;

}

P1_0=~P1_0;

P0=table[key];

0

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1