单片机实践教程.docx

上传人:b****6 文档编号:7246484 上传时间:2023-05-11 格式:DOCX 页数:130 大小:1.03MB
下载 相关 举报
单片机实践教程.docx_第1页
第1页 / 共130页
单片机实践教程.docx_第2页
第2页 / 共130页
单片机实践教程.docx_第3页
第3页 / 共130页
单片机实践教程.docx_第4页
第4页 / 共130页
单片机实践教程.docx_第5页
第5页 / 共130页
单片机实践教程.docx_第6页
第6页 / 共130页
单片机实践教程.docx_第7页
第7页 / 共130页
单片机实践教程.docx_第8页
第8页 / 共130页
单片机实践教程.docx_第9页
第9页 / 共130页
单片机实践教程.docx_第10页
第10页 / 共130页
单片机实践教程.docx_第11页
第11页 / 共130页
单片机实践教程.docx_第12页
第12页 / 共130页
单片机实践教程.docx_第13页
第13页 / 共130页
单片机实践教程.docx_第14页
第14页 / 共130页
单片机实践教程.docx_第15页
第15页 / 共130页
单片机实践教程.docx_第16页
第16页 / 共130页
单片机实践教程.docx_第17页
第17页 / 共130页
单片机实践教程.docx_第18页
第18页 / 共130页
单片机实践教程.docx_第19页
第19页 / 共130页
单片机实践教程.docx_第20页
第20页 / 共130页
亲,该文档总共130页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

单片机实践教程.docx

《单片机实践教程.docx》由会员分享,可在线阅读,更多相关《单片机实践教程.docx(130页珍藏版)》请在冰点文库上搜索。

单片机实践教程.docx

单片机实践教程

单片机应用实践教程

 

温州大学瓯江学院信息系

 

第一部分:

C51基础入门

一、C语言的特点

优点:

1、语言简洁;2、可移植性好(80%);3、表达能力强;4、表达方式灵活;5、可进行结构化程序设计;6、可以直接操作计算机硬件;7、生成目标代码质量高。

缺点:

1、不能自动检查数组的边界;2、各种运算符的优先级别太多;3、某些运算符具有多种用途。

二、一般C51语言的结构:

#include<>/*预处理命令*/

longfun1();/*函数说明*/

floatfun2();

fun1()/*功能函数1*/

{

....../*函数体*/

}

main()/*主函数*/

{

....../*主函数体*/

}

fun2()/*功能函数2*/

{

....../*函数体*/

}

三、C语言的数据类型

数据类型长度值域

unsignedchar单字节0~255

signedchar单字节-128~+127

unsignedint双字节0~65535

signedint双字节-32768~+32767

unsignedlong四字节0~4294967295

signedlong四字节-2147483648~+2147483647

float四字节±1.175494E-38~±3.402823E+38

*1~3字节对象的地址

Bit位0或1

sfr单字节0~255

sfr16双字节0~65535

sbit位0或1

四、51单片机存储器结构及类型

五、C51例程

程序如下:

#include//预处理命令

voidmain(void)//主函数名

{

unsignedinta;//定义变量a为unsignedint类型

unsignedcharb;//定义变量b为unsignedchar类型

do

{//dowhile组成循环

for(a=0;a<65535;a++)

P1_0=0;//65535次设P1.0口为低电平,点亮LED

P1_0=1;//设P1.0口为高电平,熄灭LED

for(a=0;a<30000;a++);//空循环

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

P1_1=0;//255次设P1.1口为低电平,点亮LED

P1_1=1;//设P1.1口为高电平,熄灭LED

for(a=0;a<30000;a++);//空循环

}

while

(1);

}

第二部分:

实验板资源

AT89S51单片机实验及实践系统板集成了多个硬件资源模块,每个模块各自可以成为独立的单元,也可以相互组合,因此,可以为不同层次的学生提供合适的开发环境。

1.单片机系统

该系统板上的单片机系统把全部的I/O端口资源提供出来,因此,在实际应用的时候,可以灵活地组合成不同的单片机应用系统,该单片机采用11.0592MHZ晶振,具体的电路原理图如图1所示:

图1

2.八路发光二极管指示模块

该模块采用8个发光二极管作为指示信号作用,即可以用排线来控制,也可以单个地控制每个发光二极管的亮灭,当控制信号为低电平时,发光二极管亮,为高电平时,发光二极熄灭。

电路原理图如图2。

图2

3.四路动态数码显示模块

在该模块中,共有四路LED七段数码显示器,七段码和位码通过不同的地址输入,具体的电路原理如图3所示。

图3

4.三八译码模块

在系统板上提供了三八译码模块,控制译码器译码信号由“C B A”端口输入,译出的控制信号由“Y0-Y7”输出。

电路原理图如图4所示。

图4

5.音频放大模块

该音频放大模块采用LM386芯片作为音频的功率放大,音频信号由“SPKIN”端口输入,信号的输出由“SPK OUT”端口输出,只要在“SPK OUT”接一个喇叭即可,或采用直接驱动小型蜂鸣器。

具体的电路原理图如图5所示:

图5

6.继电器控制模块

系统板上提供了1路继电器控制模块。

电路原理图如图6所示:

图6

7.4×4行列式键盘模块

行列式键盘也即矩阵式键盘,它由行和列组成,在每个行列的交叉点上放置一个按键,这样4×4行列式键盘共需要16个键盘组成。

具体的电路原理图如图7所示:

图7

8.232电平转换模块

232电平转换采用MAX232芯片把TTL电平转换成RS-232电平格式,可以用于单片机与微机通信,以及单片机与单片机之间的通信。

具体的电路原理图如图8所示:

图8

9.模数转换模块

系统板上的模数转换模块采用ADC0809芯片,组成8路8位的A/D转换,8路模拟电压的输入由IN0-IN7端口输入,控制ADC0809芯片工作的控制信号由CLK/OE/EOC/ST/A2/A1/A0端口输入,转换的数据从P0口输出。

具体的电路原理图如图9所示:

图9

10.数模转换模块

系统板上的数模转换采用8位D/A转换芯片DAC0832来完成,DAC0832是电流输出型D/A转换芯片,因此,后面接有集成运放LM324来完成电流到电压的转换。

其中的数字信号的输入从P0口输入,控制DAC0832工作的控制信号由WR和CS_0832端输入,由于LM324工作在双电源条件下,因此要给LM324加入±12V电压。

具体的电路原理图如图10所示:

图10

11.二线总线模块(I2C总线)

I2C总线(Inter-IntegratedCircit)是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。

具体的电路原理图如图所示:

图11

第三部分:

KeilC软件使用

KeilC51软件是众多单片机应用开发的优秀软件之一,它集编辑,编译,仿真于一体,支持汇编,PLM语言和C语言的程序设计,界面友好,易学易用。

下面介绍KeilC51软件的使用方法

进入KeilC51后,屏幕如下图所示。

几秒钟后出现编辑界

启动KeilC51时的屏幕

                   进入KeilC51后的编辑界面

 简单程序的调试

 学习程序设计语言、学习某种程序软件,最好的方法是直接操作实践。

下面通过简单的编程、调试,引导大家学习KeilC51软件的基本使用方法和基本的调试技巧。

 1)建立一个新工程

 单击Project菜单,在弹出的下拉菜单中选中NewProject选项

 

 2)然后选择你要保存的路径,输入工程文件的名字,比如保存到C51目录里,工程文件的名字为C51

如下图所示,然后点击保存.

 3)这时会弹出一个对话框,要求你选择单片机的型号,你可以根据你使用的单片机来选择,keilc51几乎支持所有的51核的单片机,我这里还是以大家用的比较多的Atmel的89C51来说明,如下图所示,选择89C51之后,右边栏是对这个单片机的基本的说明,然后点击确定.

 4)完成上一步骤后,屏幕如下图所示

 到现在为止,我们还没有编写一句程序,下面开始编写我们的第一个程序。

 5)在下图中,单击“File”菜单,再在下拉菜单中单击“New”选项

  

 新建文件后屏幕如下图所示

此时光标在编辑窗口里闪烁,这时可以键入用户的应用程序了,但笔者建议首先保存该空白的文件,单击菜单上的“File”,在下拉菜单中选中“SaveAs”选项单击,屏幕如下图所示,在“文件名”栏右侧的编辑框中,键入欲使用的文件名,同时,必须键入正确的扩展名。

注意,如果用C语言编写程序,则扩展名为(.c);如果用汇编语言编写程序,则扩展名必须为(.asm)。

然后,单击“保存”按钮。

 6)回到编辑界面后,单击“Target1”前面的“+”号,然后在“SourceGroup1”上单击右键,弹出如下菜单

 然后单击“AddFiletoGroup‘SourceGroup1’”屏幕如下图所示

 选中Test.c,然后单击“Add ”屏幕好下图所示

 注意到“SourceGroup1”文件夹中多了一个子项“Text1.c”了吗?

子项的多少与所增加的源程序的多少相同

 7)现在,请输入如下的C语言源程序:

 #include         //包含文件

 #include

 voidmain(void)          //主函数

 {    

  SCON=0x52;

  TMOD=0x20;

  TH1=0xf3;

  TR1=1;              //此行及以上3行为PRINTF函数所必须

  printf(“HelloIamKEIL.\n”);  //打印程序执行的信息

  printf(“Iwillbeyourfriend.\n”);

  while

(1);

 }

 在输入上述程序时,读者已经看到了事先保存待编辑的文件的好处了吧,即Keilc51会自动识别关键字,并以不同的颜色提示用户加以注意,这样会使用户少犯错误,有利于提高编程效率。

程序输入完毕后,如下图所示

 8)在上图中,单击“Project”菜单,再在下拉菜单中单击“BuiltTarget”选项(或者使用快捷键F7),编译成功后,再单击“Project”菜单,在下拉菜单中单击“Start/StopDebugSession”(或者使用快捷键Ctrl+F5),屏幕如下所示

 9)调试程序:

在上图中,单击“Debug”菜单,在下拉菜单中单击“Go”选项,(或者使用快捷键F5),然后再单击“Debug”菜单,在下拉菜单中单击“StopRunning”选项(或者使用快捷键Esc);再单击“View”菜单,再在下拉菜单中单击“SerialWindows#1”选项,就可以看到程序运行后的结果,其结果如下图所示

至此,我们在KeilC51上做了一个完整工程的全过程。

但这只是纯软件的开发过程,如何使用程序下载器看一看程序运行的结果呢?

10)单击“Project”菜单,再在下拉菜单中单击“

”在下图中,单击“Output”中单击“CreateHEXFile”选项,使程序编译后产生HEX代码,供下载器软件使用。

把程序下载到AT89S51单片机中。

第四部分:

实验及实践课题

实验一闪烁灯

1. 实验任务

如图所示:

在P1.0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒。

2. 电路原理图

 

 

3.源程序

#include

sbitL1=P1^0;

 

voiddelay02s(void)//延时0.2秒子程序

{

unsignedchari,j,k;

for(i=20;i>0;i--)

for(j=20;j>0;j--)

for(k=248;k>0;k--);

}

 

voidmain(void)

{

while

(1)

{

L1=0;

delay02s();

L1=1;

delay02s();

}

}

实验二模拟开关灯

1.实验任务

如图所示,监视开关K1(接在P3.0端口上),用发光二极管L1(接在单片机P1.0端口上)显示开关状态,如果开关合上,L1亮,开关打开,L1熄灭。

2.电路原理图

3.C语言源程序

#include

sbitK1=P3^0;

sbitL1=P1^0;

voidmain(void)

{

while

(1)

{

if(K1==0)

{

L1=0;//灯亮

}

else

{

L1=1;//灯灭

}

}

}

实验三灯的左移右移

1.实验任务

做单一灯的左移右移,硬件电路如图所示,八个发光二极管L1-L8分别接在单片机的P1.0-P1.7接口上,输出“0”时,发光二极管亮,开始时P1.0→P1.1→P1.2→P1.3→┅→P1.7→P1.6→┅→P1.0亮,重复循环。

2.电路原理图

图4.4.1

3.C语言源程序

#include

unsignedchari;

unsignedchartemp;

unsignedchara,b;

voiddelay(void)

{

unsignedcharm,n,s;

for(m=20;m>0;m--)

for(n=20;n>0;n--)

for(s=248;s>0;s--);

}

voidmain(void)

{

while

(1)

{

temp=0xfe;

P1=temp;

delay();

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

{

a=temp<

b=temp>>(8-i);

P1=a|b;

delay();

}

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

{

a=temp>>i;

b=temp<<(8-i);

P1=a|b;

delay();

}

}

}

程序改进:

#include

#include//内部函数库,共包含8条指令

unsignedchari=1;

unsignedchartemp;

unsignedchara,b;

voiddelay(void)

{

unsignedcharm,n,s;

for(m=20;m>0;m--)

for(n=20;n>0;n--)

for(s=248;s>0;s--);

}

voidmain(void)

{

temp=0xfe;

P1=temp;

delay();

while

(1)

{

a=_crol_(temp,i++);

P1=a;

delay();

}

}

实验四I/O并行口直接驱动LED显示

1.实验任务

如图3所示,利用AT89S51单片机的P0端口的P0.0-P0.7连接到一个共阴数码管的a-h的笔段上,数码管的公共端接地。

在数码管上循环显示0-9数字,时间间隔0.2秒。

2.电路原理图

图4.7.1

3.系统板上硬件连线

把“单片机系统”区域中的P0.0/AD0-P0.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个数码管的a-h端口上;要求:

P0.0/AD0与a相连,P0.1/AD1与b相连,P0.2/AD2与c相连,……,P0.7/AD7与h相连。

4.程序设计内容

(1.LED数码显示原理

七段LED显示器内部由七个条形发光二极管和一个小圆点发光二极管组成,根据各管的极管的接线形式,可分成共阴极型和共阳极型。

LED数码管的g~a七个发光二极管因加正电压而发亮,因加零电压而不以发亮,不同亮暗的组合就能形成不同的字形,这种组合称之为字形码,下面给出共阴极的字形码见表

“0”

3FH

“8”

7FH

“1”

06H

“9”

6FH

“2”

5BH

“A”

77H

“3”

4FH

“b”

7CH

“4”

66H

“C”

39H

“5”

6DH

“d”

5EH

“6”

7DH

“E”

79H

“7”

07H

“F”

71H

(2.由于显示的数字0-9的字形码没有规律可循,只能采用查表的方式来完成我们所需的要求了。

这样我们按着数字0-9的顺序,把每个数字的笔段代码按顺序排好!

建立的表格如下所示:

TABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH

6.C语言源程序

#include

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

0x6d,0x7d,0x07,0x7f,0x6f};

unsignedchardispcount;

voiddelay02s(void)

{

unsignedchari,j,k;

for(i=20;i>0;i--)

for(j=20;j>0;j--)

for(k=248;k>0;k--);

}

voidmain(void)

{

while

(1)

{

for(dispcount=0;dispcount<10;dispcount++)

{

P0=table[dispcount];

delay02s();

}

}

}

实验五按键识别方法

1.实验任务

每按下一次开关SP1,计数值加1,通过AT89S51单片机的P1端口的P1.0到P1.3显示出其的二进制计数值。

2.电路原理图

3.系统板上硬件连线

(1.把“单片机系统”区域中的P3.7/RD端口连接到“独立式键盘”区域中的SP1端口上;

(2.把“单片机系统”区域中的P1.0-P1.4端口用8芯排线连接到“八路发光二极管指示模块”区域中的“L1-L8”端口上;要求,P1.0连接到L1,P1.1连接到L2,P1.2连接到L3,P1.3连接到L4上。

4.

程序设计方法

(1.其实,作为一个按键从没有按下到按下以及释放是一个完整的过程,也就是说,当我们按下一个按键时,总希望某个命令只执行一次,而在按键按下的过程中,不要有干扰进来,因为,在按下的过程中,一旦有干扰过来,可能造成误触发过程,这并不是我们所想要的。

因此在按键按下的时候,要把我们手上的干扰信号以及按键的机械接触等干扰信号给滤除掉,一般情况下,我们可以采用电容来滤除掉这些干扰信号,但实际上,会增加硬件成本及硬件电路的体积,这是我们不希望,总得有个办法解决这个问题,因此我们可以采用软件滤波的方法去除这些干扰信号,一般情况下,一个按键按下的时候,总是在按下的时刻存在着一定的干扰信号,按下之后就基本上进入了稳定的状态。

具体的一个按键从按下到释放的全过程的信号图如上图所示:

从图中可以看出,我们在程序设计时,从按键被识别按下之后,延时5ms以上,从而避开了干扰信号区域,我们再来检测一次,看按键是否真得已经按下,若真得已经按下,这时肯定输出为低电平,若这时检测到的是高电平,证明刚才是由于干扰信号引起的误触发,CPU就认为是误触发信号而舍弃这次的按键识别过程。

从而提高了系统的可靠性。

由于要求每按下一次,命令被执行一次,直到下一次再按下的时候,再执行一次命令,因此从按键被识别出来之后,我们就可以执行这次的命令,所以要有一个等待按键释放的过程,显然释放的过程,就是使其恢复成高电平状态。

(2.对于按键识别的指令,我们依然选择如下指令JB BIT,REL指令是用来检测BIT是否为高电平,若BIT=1,则程序转向REL处执行程序,否则就继续向下执行程序。

或者是 JNB BIT,REL指令是用来检测BIT是否为低电平,若BIT=0,则程序转向REL处执行程序,否则就继续向下执行程序。

5.C语言源程序

#include

unsignedcharcount;

voiddelay10ms(void)

{

unsignedchari,j;

for(i=20;i>0;i--)

for(j=248;j>0;j--);

}

voidmain(void)

{

while

(1)

{

if(P3_7==0)

{

delay10ms();

if(P3_7==0)

{

count++;

if(count==16)

{

count=0;

}

P1=~count;

while(P3_7==0);

}

}

实验六七段LED动态显示输出

1、实验任务

参考实验五,利用实际实验板的四位LED,显示数字“1234”。

2、电路及说明

C51实验开发板上有4只共阴的LED七段显示器,4只LED显示器采用动态方式显示,参见图3-3。

4只LED七段显示器的4个共阴极1234分别连接地址为8000H的8位寄存器74LS374的Q0-Q3上,地址为6000H的8位寄存器74LS374的Q0-Q7分别连接到上七段显示器的ABCDEFG和DP上。

因此6000H寄存器输出LED显示的字形,8000H寄存器输出控制显示的灯位,如:

(6000H)=00111111,(8000H)=11111110,1号灯显示“0”,其余灯不亮;(6000H)=00000110,(8000H)=11110011,3号灯和4号灯显示“1”,其余灯不亮。

其中“00111111”和“00000110”为和字形“0”和“1”的字段码,表3-1为字段码和字形对应表。

(8000H)的低4位控制显示的4个灯位,低电平显示,高电平不显示,显示的字形由(6000H)输出值决定,可参见表3-1字段码和字形对应表。

动态LED显示器电路图

译码电路图

所谓的动态显示,就是4只LED显示器不能同时显示,一次只能点亮一只LED显示器,4只LED显示器轮流点亮,利用人眼的视觉暂留和LED显示器余辉,就可看到4只LED显示器同时点亮,但亮度有所下降。

可见,动态显示也需要合适延时,才会有较好的显示效果。

表3-1字段码和字形对应表

字段码

字形

字段码

字形

DpGFEDCBA

十六进制码

DpGFEDCBA

十六进制码

00111111

3FH

01111111

7FH

00000110

06H

01101111

6FH

01011011

5BH

01110111

77H

01001111

4FH

01111100

7CH

01100110

66H

00111001

39H

01101101

6DH

01011110

5EH

01111101

7DH

01111001

79H

00000111

07H

01110001

71H

2、源程序(略)

关键指令:

#include

#include

#defineLED_segXBYTE[0x6000]//段码

#defineLED_lightXBYTE[0x8000]//灯位

unsignedchardisplay(unsignedchar,unsignedchar);

unsignedcharlight[4]={0xfe,0xfd,0xfb,0xf7};//扫描值灯位码

unsignedcharseg[16

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

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2