单片机c语言集锦.docx
- 文档编号:10527386
- 上传时间:2023-02-21
- 格式:DOCX
- 页数:44
- 大小:1.08MB
单片机c语言集锦.docx
《单片机c语言集锦.docx》由会员分享,可在线阅读,更多相关《单片机c语言集锦.docx(44页珍藏版)》请在冰豆网上搜索。
单片机c语言集锦
单片机c语言集锦
第一章 AT89S51单片机实验及实践系统板简介
AT89S51单片机实验及实践系统板(以后简介系统板)集成多个硬件资源模块,每个模块各自可以成为独立的单元,也可以相互组合,因此,可以为不同阶层的单片机爱好者及单片机开发者提供不同的开发环境。
每个硬件模块介绍如下:
1.继电器控制模块
系统板上提供了2路继电器控制模块,分布在系统板的最左上端区域中,输入信号由Realyin1和Realyin2端口输入分别控制两路继电器,继电器控制的信号分别由最上端的两个插针输入和输出。
分别称为“com1open1short1”,“com2open2short2”,由于这个两个继电器是单刀单掷控制,当继电器不吸合时,“com1”和“short1”相通,“com2”和“short2”相通;当继电器吸合时,“com1”和“open1”相通,“com2”和“open2”相通。
其电路原理图1.1所示:
图1.1
2.参考电压源模块
在系统板上写有“参考电压源”区域中,是由TL431来完成参考电压的调节,调节范围在0-2.50V之间;主要为是系统板上需要参考电压芯片或是为外部设备提供参考电压,由VarVrefOut端口输出。
其电路原理图如图1.2所示:
图1.2
3.三路可调电压模块
此模块主要是用于提供0-5V之间的可变的模拟电压值,即可以作为参考电压源也可以作为模拟电压信号。
这三路是相互独立的。
分别对应着由VR1,VR2,VR3端口输出。
具体的电路原理图如图1.3所示:
图1.3
4.电源模块
电源模块为系统板上其它模块提供+5V电源,电源输入有两种方式,一种为交直流电源从电源插座输入,输入的电压要求,直流输入应大于7.5V,交流输入应大于5V,通过7805三端稳压器得到5V的直流电源供给系统其它模块工作,另一种为从USB接口获取+5V电源,只要用相应配套的USB线从电脑主机获取+5V直流电源,在电源模块中加有保护电路,即电路中有短路,不会对7805三端稳压器及电脑主机电源有损害!
其电路原理图如图1.4所示:
图1.4
5.程序下载模块
该模块完成源程序代码下载到AT89S51或者是AT89S52芯片中,它需要和微机上的ISP下载器软件配合使用来完成这样的功能。
具体的电路原理图如图1.5所示:
图1.5
6.232电平转换模块
232电平转换采用MAX232芯片把TTL电平转换成RS-232电平格式,可以用于单片机与微机通信,以及单片机与单片机之间的通信,在该系统板上提供了两个DB9的接口,其中一个用ISP下载器模块的程序下载接口,称为“ISP Interface”,另一个接口为单片机与其它具有RS232接口的通信端口,称为“CommonPort”。
具体的电路原理图如图1.6所示:
图1.6
7.频率产生器模块
该模块采用555芯片产生一些连续频率的方波信号,由“WAVE GND”端口输出,其稳定可调的频率范围在5KHz-100KHz之间变化。
电路原理图如图1.7所示:
图1.7
8.音频放大模块
该音频放大模块采用LM386芯片作为音频的功率放大,音频信号由“SPKIN”端口输入,信号的输出由“SPK OUT”端口输出,只要在“SPK OUT”接一个喇叭即可。
具体的电路原理图如图1.8所示:
图1.8
9.模数转换模块
系统板上的模数转换模块采用ADC0809芯片,组成8路8位的A/D转换,8路模拟电压的输入由IN0-IN7的端口输入,控制ADC0809芯片工作的控制信号由“CLK OE EOC ST A2 A1 A0”端口输入,转换的数据从D0-D7的端口输出。
具体的电路原理图如图1.9所示:
图1.9
10.动态数码显示模块
该系统中采用8位的动态数码显示,控制数码显示的数据由两部分组成,一部分为笔段亮灭控制的信号输入由“A B C D E F G H”端口输入,而控制位显示的控制信号由“S1 S2 S3 S4 S5 S6 S7 S8”端口输入,同时该动态数码显示采用共阴数码管;具体的电路原理图如图1.10所示:
图1.10
11.四路静态数码显示模块
在该模块中,每一路端口对应着一个具体的数码管,具体的电路原理图如图1.11所示:
图1.11
12.8X8点阵模块
该系统板上提供了8X8点阵模块,用于理解单片机是如何控制点阵数码管的工作过程,它有两个输入控制端口,对于点阵数码管有行和列之分,这两个端口分别控制它们的行和列,“DR1-DR8”为8X8点阵模块的行信号控制端口,“DC1-DC8”为8X8点阵模块的列信号控制端口。
具体的电路原理图如图1.12所示:
图1.12
13.八路发光二极管指示模块
该模块采用8个发光二极管作为指示信号作用,即可以用排线来控制,也可以单个地控制每个发光二极管的亮灭,当控制信号为低电平时,发光二极管亮,为高电平时,发光二极熄灭;控制电平的输入由“L1-L8”输入。
电路原理图如图1.13
图1.12
14.三八译码模块
在系统板上提供了三八译码模块,控制译码器译码信号由“C B A”端口输入,译出的控制信号由“Y0-Y7”输出。
电路原理图如图1.14
图1.14
15.串并转换模块
该系统板上采用了四个74LS164(移位寄存器)作为串并转换模块,这四路串并转换模块已经级连起来。
串行数据从“RXD TXD”端口输入;具体的电路原理图如图1.15所示:
图1.15
16.数模转换模块
系统板上的数模转换模块采用了8位的D/A转换芯片DAC0832来完成数模转换过程,DAC0832是电流输出型D/A转换芯片,因此,后面接有集成运放LM358来完成电流到电压的转换。
其中的数字信号的输入从“D0-D7”端口输入,控制DAC0832工作的控制信号由“WR CS”端口输入,模拟量的输出从“AOUT”端口输出,由于LM358工作在双电源条件下,因此要给LM358加入±12V电压,从“+12V GND -12V”端口加入。
具体的电路原理图如图1.16所示:
图1.16
17.单片机系统
该系统板上的单片机系统把全部的I/O端口资源提供出来,因此,在实际应用的时候,可以灵活地组合成不同的单片机应用系统,该单片机采用12MHZ晶振,具体的电路原理图如图1.17所示:
18.四路拨动开关模块
开关控制信号由“K1 K2 K3 K4”端口输出,具体的电路原理图如图1.18所示:
图1.18
19.分频模块
该系统板上的分频电路采用2片74LS74来完成最大16分频,输入的时钟信号由“CKIN”端口输入,经过2片74LS74分频后的信号分别由“/1/2/4/8/16”端口输出,分别表示未分频,2分频,4分频,8分频,16分频;具体的电路原理图如图1.19所示
图1.19
20.四路单总线模块
为了适应新技术的需要,增加1-Wire总线接口,在本系统板上提供了四路1-Wire总线接口,数据传输通过“DQ1 DQ2 DQ3 DQ4”端口来完成;具体的电路原理图如图1.20所示:
图1.20
21.二线总线模块(I2C总线)
为了适应新技术的需要,增加了2路I2C总线接口,适用8脚的I2C总线芯片,左边的“PIN1PIN2PIN3PIN4PIN5PIN6”与上面的接口连接,右边的“PIN1PIN2PIN3PIN4PIN5PIN6”与下面的接口连接;具体的电路原理图如图1.21所示:
图1.21
22.独立式键盘模块
键盘是人机通信不可缺少的部件,独立式键盘是最基本的一种键盘方式,在本系统中提供了四个独立式按键;具体的电路原理图如图1.22所示:
图1.22
23.4×4行列式键盘模块
行列式键盘也即矩阵式键盘,它由行和列组成,在每个行列的交叉点上放置一个按键,这样4×4行列式键盘共需要16个键盘组成;具体的电路原理图如图1.23所示:
图1.23
24.32KB数据存储器模块
为了适应大容量的数据处理的需要,在系统板上加入了32KB数据存储器(RAM),数据总线从“D0-D7”的端口输入,高8位地址总线从“A8-A15”端口输入,控制数据存储器的读写控制信号从“ALE CS WR RD”端口输入,具体的电路原理图如图1.24所示:
图1.24
以上是“AT89S51单片机实验及实践系统板”的所有硬件资源简介,通过这24个模块之间的相互组合,可以设计出从基本的单片机系统到复杂的单片机应用控制系统的设计,是初学者对单片机入门和开发不可缺少的过程。
第二章 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、实验任务
如图4.1.1所示:
在P1.0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒。
2、电路原理图
图4.1.1
3、系统板上硬件连线
把“单片机系统”区域中的P1.0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上。
4、程序设计内容
(1)延时程序的设计方法
作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为0.2秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是如何设计呢?
下面具体介绍其原理:
如图4.1.1所示的石英晶体为12MHz,因此,1个机器周期为1微秒,2个机器周期2微秒
MOVR6,#20
D1:
MOVR7,#2482个 2
DJNZR7,$2个 2×248
DJNZR6,D12个 2×20=40
因此,上面的延时程序时间为10.002ms。
由以上可知,当R6=10、R7=248时,延时5ms,R6=20、R7=248时,延时10ms,以此为基本的计时单位。
如本实验要求0.2秒=200ms,10ms×R5=200ms,则R5=20,延时子程序如下:
DELAY:
MOVR5,#20
D1:
MOVR6,#20
D2:
MOVR7,#248
DJNZR7,$
DJNZR6,D2
DJNZR5,D1
RET
(2).输出控制
如图1所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETB P1.0指令使P1.0端口输出高电平,使用CLR P1.0指令使P1.0端口输出低电平。
5、程序框图
如图4.1.2所示
图4.1.2
6、汇编源程序
ORG0000H
START:
CLRP1.0
LCALLDELAY
SETBP1.0
LCALLDELAY
LJMPSTART
DELAY:
MOVR5,#20;延时子程序,延时0.2秒
D1:
MOVR6,#20
D2:
MOVR7,#248
DJNZR7,$
DJNZR6,D2
DJNZR5,D1
RET
END
7、C语言源程序
#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、实验任务
如图4.2.1所示,监视开关K1(接在P3.0端口上),用发光二极管L1(接在单片机P1.0端口上)显示开关状态,如果开关合上,L1亮,开关打开,L1熄灭。
2、电路原理图
图4.2.1
3、系统板上硬件连线
(1)把“单片机系统”区域中的P1.0端口用导线连接到“八路发光二极管指示模块” 区域中的L1端口上;
(2). 把“单片机系统”区域中的P3.0端口用导线连接到“四路拨动开关”区域中的K1端口上;
4、程序设计内容
(1).开关状态的检测过程
单片机对开关状态的检测相对于单片机来说,是从单片机的P3.0端口输入信号,而输入的信号只有高电平和低电平两种,当拨开开关K1拨上去,即输入高电平,相当开关断开,当拨动开关K1拨下去,即输入低电平,相当开关闭合。
单片机可以采用JB BIT,REL或者是JNB BIT,REL指令来完成对开关状态的检测即可。
(2).输出控制
如图3所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETB P1.0指令使P1.0端口输出高电平,使用CLR P1.0指令使P1.0端口输出低电平。
5、程序框图
开始
K1开关闭合了吗?
L1亮
L1灭
图4.2.2
6.汇编源程序
ORG00H
START:
JBP3.0,LIG
CLRP1.0
SJMPSTART
LIG:
SETBP1.0
SJMPSTART
END
7.C语言源程序
#include
sbitK1=P3^0;
sbitL1=P1^0;
voidmain(void)
{
while
(1)
{
if(K1==0)
{
L1=0;//灯亮
}
else
{
L1=1;//灯灭
}
}
}
3. 多路开关状态指示
1.实验任务
如图4.3.1所示,AT89S51单片机的P1.0-P1.3接四个发光二极管L1-L4,P1.4-P1.7接了四个开关K1-K4,编程将开关的状态反映到发光二极管上。
(开关闭合,对应的灯亮,开关断开,对应的灯灭)。
2.电路原理图
图4.3.1
3.系统板上硬件连线
(1. 把“单片机系统”区域中的P1.0-P1.3用导线连接到“八路发光二极管指示模块”区域中的L1-L4端口上;
(2. 把“单片机系统”区域中的P1.4-P1.7用导线连接到“四路拨动开关”区域中的K1-K4端口上;
4. 程序设计内容
(1. 开关状态检测
对于开关状态检测,相对单片机来说,是输入关系,我们可轮流检测每个开关状态,根据每个开关的状态让相应的发光二极管指示,可以采用JB P1.X,REL或JNB P1.X,REL指令来完成;也可以一次性检测四路开关状态,然后让其指示,可以采用MOV A,P1指令一次把P1端口的状态全部读入,然后取高4位的状态来指示。
(2. 输出控制
根据开关的状态,由发光二极管L1-L4来指示,我们可以用SETB P1.X和CLR P1.X指令来完成,也可以采用MOV P1,#1111XXXXB方法一次指示。
5.程序框图
开始
读P1口数据到ACC中
ACC内容右移4次
ACC内容与F0H相或
ACC内容送入P1口
图4.3.2
6.方法一(汇编源程序)
ORG00H
START:
MOVA,P1
ANLA,#0F0H
RRA
RRA
RRA
RRA
XORA,#0F0H
MOVP1,A
SJMPSTART
END
7.方法一(C语言源程序)
#include
unsignedchartemp;
voidmain(void)
{
while
(1)
{
temp=P1>>4;
temp=temp|0xf0;
P1=temp;
}
}
8.方法二(汇编源程序)
ORG00H
START:
JBP1.4,NEXT1
CLRP1.0
SJMPNEX1
NEXT1:
SETBP1.0
NEX1:
JBP1.5,NEXT2
CLRP1.1
SJMPNEX2
NEXT2:
SETBP1.1
NEX2:
JBP1.6,NEXT3
CLRP1.2
SJMPNEX3
NEXT3:
SETBP1.2
NEX3:
JBP1.7,NEXT4
CLRP1.3
SJMPNEX4
NEXT4:
SETBP1.3
NEX4:
SJMPSTART
END
9.方法二(C语言源程序)
#include
voidmain(void)
{
while
(1)
{
if(P1_4==0)
{
P1_0=0;
}
else
{
P1_0=1;
}
if(P1_5==0)
{
P1_1=0;
}
else
{
P1_1=1;
}
if(P1_6==0)
{
P1_2=0;
}
else
{
P1_2=1;
}
if(P1_7==0)
{
P1_3=0;
}
else
{
P1_3=1;
}
}
}
4. 广告灯的左移右移
1. 实验任务
做单一灯的左移右移,硬件电路如图4.4.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. 系统板上硬件连线
把“单片机系统”区域中的P1.0-P1.7用8芯排线连接到“八路发光二极管指示模块”
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 语言 集锦