C语言基础知识Keil软件使用流水灯数码管74HC57374HC595doc.docx
《C语言基础知识Keil软件使用流水灯数码管74HC57374HC595doc.docx》由会员分享,可在线阅读,更多相关《C语言基础知识Keil软件使用流水灯数码管74HC57374HC595doc.docx(39页珍藏版)》请在冰豆网上搜索。
C语言基础知识Keil软件使用流水灯数码管74HC57374HC595doc
第一节单片机的用途
单片机是一种集成电路芯片,采用超大规模技术把具有数据处理能力(如算术运算,逻辑运算、数据传送、中断处理>的微处理器(CPU>,随机存取数据存储器(RAM>,只读程序存储器(ROM>,输入输出电路(I/O口>,可能还包括定时计数器,串行通信口(SCI>,显示驱动电路(LCD或LED驱动电路>,脉宽调制电路(PWM>,模拟多路转换器及A/D转换器等电路集成到一块单块芯片上,构成一个最小然而完善的计算机系统.这些电路能在软件的控制下准确、迅速、高效地完成程序设计者事先规定的任务.
单片机也被称为微控制器单片机由芯片内仅有CPU的专用处理器发展而来。
最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对提及要求严格的控制设备当中。
INTEL的Z80是最早按照这种思想设计出的处理器,从此以后,单片机和专用处理器的发展便分道扬镳。
b5E2RGbCAP
早期的单片机都是8位或4位的。
其中最成功的是INTEL的8031,因为简单可靠而性能不错获得了很大的好评。
此后在8031上发展出了MCS51系列单片机系统。
基于这一系统的单片机系统直到现在还在广泛使用。
随着工业控制领域要求的提高,开始出现了16位单片机,但因为性价比不理想并未得到很广泛的应用。
90年代后随着消费电子产品大发展,单片机技术得到了巨大的提高。
随着INTELi960系列特别是后来的ARM系列的广泛应用,32位单片机迅速取代16位单片机的高端地位,并且进入主流市场。
而传统的8位单片机的性能也得到了飞速提高,处理能力比起80年代提高了数百倍。
目前,高端的32位单片机主频已经超过300MHz,性能直追90年代中期的专用处理器,而普通的型号出厂价格跌落至1美元,最高端的型号也只有10美元。
当代单片机系统已经不再只在裸机环境下开发和使用,大量专用的嵌入式操作系统被广泛应用在全系列的单片机上。
而在作为掌上电脑和手机核心处理的高端单片机甚至可以直接使用专用的Windows和Linux操作系统。
单片机由于其不断完善的性能和其低廉的价格,收到了大家的拥戴,使其在仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域都发挥着不可替代的作用:
1.在智能仪器仪表上的应用
单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用于仪器仪表中,结合不同类型的传感器,可实现诸如电压、功率、频率、湿度、温度、流量、速度、厚度、角度、长度、硬度、元素、压力等物理量的测量.采用单片机控制使得仪器仪表数字化、智能化、微型化,且功能比起采用电子或数字电路更加强大.例如精密的测量设备(功率计,示波器,各种分析仪>.
2.在工业控制中的应用
用单片机可以构成形式多样的控制系统、数据采集系统.例如工厂流水线的智能化管理,电梯智能化控制、各种报警系统,与计算机联网构成二级控制系统等.
3.在家用电器中的应用
可以这样说,现在的家用电器基本上都采用了单片机控制,从电饭褒、洗衣机、电冰箱、空调机、彩电、其他音响视频器材、再到电子秤量设备,五花八门,无所不在.
4.在计算机网络和通信领域中的应用
现代的单片机普遍具备通信接口,可以很方便地与计算机进行数据通信,为在计算机网络和通信设备间的应用提供了极好的物质条件,现在的通信设备基本上都实现了单片机智能控制,从手机,电话机、小型程控交换机、楼宇自动通信呼叫系统、列车无线通信、再到日常工作中随处可见的移动电话,集群移动通信,无线电对讲机等.
5.单片机在医用设备领域中的应用
单片机在医用设备中的用途亦相当广泛,例如医用呼吸机,各种分析仪,监护仪,超声诊断设备及病床呼叫系统等等.
此外,单片机在工商,金融,科研、教育,国防航空航天等领域都有着十分广泛的用途.。
p1EanqFDPw
接下来就让我们从C语言编程开始,一步一步学习单片机,相信有一天,大家能利用单片机做出自己独具特色的作品来。
DXDiTa9E3d
第二节C语言基本知识
位运算是对二进制数据以位为单位C语言提供了六种位运算符。
参加运算的操作数可以是char类型、int类型和long类型的变量或常量。
实型是不能进行位运算的。
RTCrpUDGiT
一、基本运算符
位运算符及其功能优先级如表一:
表一:
运算符
名称
优先级
~
按位取反
1<高)
<<
左移
2
>>
右移
2
&
按位与
3
^
按位异或
4
|
按位或
5<低)
1、按位取反<~):
它的运算功能是对一个二进制数按位取反,即使每一位上的0变1,1变0。
例:
~101101=010010
2、左移位<<<):
它的运算功能是将一个二进制数的各位全部左移若干位,超过该数范围的高端舍去,低端补零。
例:
11101101<<2=10110100
3、右移位<>>)
它的运算功能是将一个二进制数的各位全部右移若干位。
右端低位移出部分舍去,高位部分补零。
例:
11101101>>2=00111011
注意:
对无符号数,右移时左边高位移入0;对于有符号的值,如果原来符号位为0(该数
为正>,则左边也是移入0。
如果符号位原来为1(即负数>,则左边移入0还是1,要取决于
用的计算机系统。
有的系统移入0,有的系统移入1。
移入0的称为“逻辑右移”,即简单右
移;移入1的称为“算术右移”。
例如:
a:
1001011111101101<用二进制形式表示)
a>>1:
0100101111110110(逻辑右移时>
a>>1:
1100101111110110(算术右移时>
不过,我们在单片机编程时,一般将变量都设置为无符号型的变量,如果大家在
以后的编程过程中用到有符号型的变量,就要注意这一点。
4、按位与<&)
它的功能是将运算符两边的数,按照二进制位进行与运算,如果两个对应的运算位都是1,则结果位为1,否则为0。
5PCzVD7HxA
例:
101101
&001010
001000
5、按位异或<^)
它的功能是将运算符两边的数,按照二进制位进行异或运算,如果两个对应的运算位的数不同,则该位结果为1,否则结果为0。
jLBHrnAILg
例:
10110100
^111111111
01001011
6、按位或<|)
它的功能是将运算符两边的数,按照二进制位进行或运算,如果两
个对应的运算位都是0,则结果位为0,否则为1。
例:
101101
|001010
101111
二、位自反赋值运算符
位自反赋值运算符与赋值运算符和算术自反运算符是同级的,只高于逗号运算符,低于所有其他运算符。
其结合性是自右向左。
位自反赋值运算符共有五个,其运算符及作用如表二:
xHAQX74J0X
表二:
符号
名称
用途
&=
位与赋值
a&=b等价于a=a&b
|=
位或赋值
a|=b等价于a=a|b
^=
位按位加赋值
a^=b等价于a=a^b
<<=
位左移赋值
a<<=b等价于a=a<
>>=
位右移赋值
a>>=b等价于a=a>>b
C语言的位运算的基本功能就给大家介绍到这里,位运算在对单片机的操作中起着举足轻重的作用,位运算还能实现许多特殊的功能LDAYtRyKfE
如:
保留原值<与0相∧);)不用临时变量来交换两个值<可通过语句:
<a=a∧b。
b=b∧a。
a=a∧b)来实现),大家可以自己查资料Zzz6ZB2Ltk
学习,这里就不给大家多作介绍了。
三、二进制与十六进制的转换
十六进制与二进制基本相同,二进制用“0和1”来表示,十六进制的表示形式为0Xmn:
其中X可小写,在具体表示时,mn用“0~9”以及“A~F”来替换。
将一个二进制数转换为十六进制数的具体步骤如下:
dvzfvkwMI1
1、取四合一,向左每四位二进制取成一位,如果向左取四位后,取到最高
位时候,如果无法凑足四位,可以在最左边,即整数的最高位添0,凑
足四位。
2、接着将这四位二进制按权相加,相加后结果如果是“10~15”就依次
用“A~F”表示,如果相加结果是“0~9”,就用原数表示。
3、按顺序进行排列,得到的数字就是我们所求的十六进制数。
例:
将二进制110101转换为十六进制的过程如下:
1101→13→用D110→不足四位,添零→0110→6;
最终结果:
0x6d<0X6D或0X6d或0x6D)
由于在用C语言编写C语言程序时不涉及到小数,所以这里不多作介绍,大家有兴趣可以自己查资料学习。
第三节STC12C5410性能介绍
STC12C5410系列单片机是由宏晶科技生产的单时钟/机器周期
<1T)的兼容8051内核单片机,是高速/低功耗的新一代8051单片机,全新的流水线/精简指令集结构,内部集成MAX810专用复位电路。
其主要性能特点如下:
rqyn14ZNXI
1.增强型1T流水线/精简指令集结构8051CPU。
2.工作电压:
5.5V‐3.4V<5V单片机)/3.8V‐2.0V<3V单片机)。
3.工作频率范围:
0‐35MHz,相当于普通8051的0‐420MHz。
4.用户应用程序空间12K/10K/8K/6K/4K/2K字节。
5.片上集成512字节RAM。
6.通过I/O口<27/23个),复位后为:
准双向口/弱上拉<普通8051传统I/O口)可设置成四种模式:
准双向口/弱上拉,推挽/强上拉,仅为输入/高阻,开漏。
EmxvxOtOco
7.ISP<在系统可编程)/ASP<在应用可编程),无需专用编程器
可通过串口8.EPROM功能。
9.看门狗。
10.内部集成MAX810专用复位电路<外部晶振20M以下时,可省外部复位电路)。
11.时钟源:
外部高精度晶体/时钟,内部R/C振荡器用户在下载用
户程序时,可选择是使用内部R/C振荡器还是外部晶体/时钟常
温下内部R/C振荡器频率为:
5.65MHz~5.95MHz精度不高时,可选择使用内部时钟,但因为有温漂,应认为是5MHz~6.5MHz。
SixE2yXPq5
12.共2个16位定时器/计数器。
13.PWM(4位>/PCA<可编程计数器阵列),也可用来在实现4个定
时器。
14.ADC,10位精度ADC,共8路。
15.通用异步串行口16.SPI同步通信口,主模式/从模式。
17.工作温度范围:
0‐75℃/-40‐+85℃。
18.封装:
PDIP—28,SOP—28,PDIP—20,SOP—20,TSSOP—20,PLCC—32
STC12C5410AD单片机中包含中央处理器、程序存储器可以说STC12C5410AD单片机几乎包含了数据采集和控制中所需的所有单元模块,可称得上一个片上系统控系统。
STC12C5410引脚图
第四节Keil软件的使用方法
KeilC51软件是众多单片机应用开发的优秀软件之一,它集编辑,编译,仿真于一体,支持汇编语言和C语言的程序设计,界面友好,易学易用。
kavU42VRUs
以下介绍的是KeiluVision2,如果你使用的是KeiluVision3,你需要根据单片机的型号,在相关设置上稍作改动<相关的地方后面有说明)!
y6v3ALoS89
下面介绍KeilC51软件的使用方法:
进入KeilC51后,屏幕如下图所示。
几秒钟后出现编辑界面:
进入KeilC51后的编辑界面
(1)新建工程
单击Project菜单,在弹出的下拉菜单中选中NewProject选项
然后选择你要保存的路径,输入工程文件的名字,比如保存到D盘的CMJ51文件夹里,工程文件的名字为CMJ1
如下图所示,然后点击保存.M2ub6vSTnP
这时会弹出一个对话框,要求你选择单片机的型号,可以根据用户使用的单片机来选择,实验板上使用的是STC12C5410AD,我们在对话框中找不到这一款单片机。
它是新一代的51单片机,因为51内核单片机具有通用性,所以这里我们可以选一块89C51就行。
如下图所示,选择89C51之后,右边栏是对这个单片机的基本的说明,然后点击确定.0YujCfmUCw
用KeiluVision3的话,根据实验板上单片机的型号,我们应做如下选择:
<以后的操作KeiluVision3和KeiluVision2都一样)eUts8ZQVRd
完成上一步骤后,屏幕如下图所示
到现在为止,我们还没有编写一句程序,下面开始编写我们的第一个程序。
<2>新建文件
在下图中,单击“File”菜单,再在下拉菜单中单击“New”选项
新建文件后屏幕如下图所示
此时光标在编辑窗口里闪烁,这时可以键入用户的应用程序了。
键入程序后界面如下:
单击file菜单下的save,出现一个对话框,键入文件名,后缀名为.c<用C语言
编程时用)或.asm<用汇编语言编程时用)或.h<自己建立库文件时用),进行保存到D盘CMJ51文件夹下,界面如下:
sQsAEJkW5T
点击保存即可,出现如下界面。
(3)添加文件
回到编辑界面后,单击“Target1”前面的“+”号,然后在“SourceGroup1”上单击右键,弹出如下菜单GMsIasNXkA
然后单击“AddFiletoGroup‘SourceGroup1’”屏幕如下图所示
选中cmj1.asm,然后单击“Add”屏幕好下图所示:
<如果用C语言编程,选中“.c”文件即可。
(4>汇编连接单击如下图所示的图标出现如下界面:
<5)运行看结果
单击如下图的图标出现如下界面:
单击一次下图的图标(stepinto>,程序就能运行一条,一直到程序的结束运行结束后,直接可以在如下界面中看结果。
特殊功能寄存器中的内容可以在界面中直接看到,存储单元的内容在memory#1中输入如上图所示的地址,即可看到该单元的内容为66H。
TIrRGchYzg
下面进行工程配置。
点击Project菜单下的OptionsforTarget‘Target1’。
7EqZcWLZNX
在弹出对话框的Target项里输入晶振为12M,然后勾上UseOn-chipROM。
在Output项里勾上CreateHEXFile。
这就是产生要烧写的.hex文件。
然后点击Project菜单里的buildtarget或Rebuildalltargetfiles以编译要烧写的.hex文件。
lzq7IGf02E
编译完成后,会在下面OutputWindow里显示编译成功与否的信息和错误提示。
Keil软件的使用就介绍到这里,大家可以通过下一节流水灯的实验来熟悉对该软件的使用。
第五节流水灯的控制
1、怎样点亮一个发光二极管
点亮放光二极管的程序如下:
#include//52系列单片机头文件
sbitled=P1^0。
//声明单片机P1口的第一位
voidmain(>//主函数
{
led=0。
//点亮第一个发光二极管
}
从上面的程序大家可以看到:
点亮第一个发光二极管,就是通过控制单片机的P1.0口,让其输出低电平,这样就在单片机的P1.0口、发光二极管、电源之间形成回路,从而点亮发光二极管。
由于是对单片机的P1口的第一位进行操作,为了书写和理解的方便,我们将P1口的第一位定义为led,实际上也可省掉这一步,直接用程序进行位操作,如:
zvpgeqJ1hk
#include//52系列单片机头文件
voidmain(>//主函数
{
P1^0=0。
//让单片机在P1.0口输出低电平,
//从而点亮第一个发光二极管
}
2、流水灯的控制
相必大家对单片机的位操作已经有了一定的了解,接下来就让我们一起来学习对多个发光二极管的控制,制作出一串串闪亮的流水灯。
首先向大家介绍一下51单片机里常用的函数——循环左移与循环右移函数:
大家可以打开Keil软件安装文件夹,定位到Keil\C51\HLP文件夹,打开此文件夹下的C51lib,这是C51自带库函数帮助文件。
在索引栏找到_crol_函数,双击打开它介绍,如下:
NrpoJac3v1
_crol_
#include
unsignedchar_crol_(unsignedcharc,/*charactertorotateleft*/1nowfTG4KI
unsignedcharb>。
/*bitpositionstorotate*/
Description:
The_crol_routinerotatesthebitpatternforthecharactercleftbbits.Thisroutineisimplementedasanintrinsicfunction.Thecoderequiredisincludedin-lineratherthanbeingcalled.fjnFLDa5Zo
ReturnValue:
The_crol_routinereturnstherotatedvalueofc.tfnNhnE6e5
Attributes:
reentrant,intrinsic
SeeAlso:
_cror_,_irol_,_iror_,_lrol_,_lror_HbmVN777sL
Example
#include
voidtst_crol(void>{
chara。
charb。
a=0xA5。
b=_crol_(a,3>。
}/*bnowis0x2D*/V7l4jRB8Hs
它是一个循环左移函数,使用格式如:
_crol_例如:
83lcPA59W9
#include//使用_crol_时需包含的头文件
#include//52系列单片机头文件
voidmain(>
{
unsignedinta=01101111;
_crol_}
执行完程序后,a=01111011。
_cror_表示循环右移,其用法和_crol_类似,这里就不多作介绍了。
接下来我们通过一段程序的演示来学习:
/*函数功能:
1、依次让第一个至第八个发光二极管点亮,每个发光二极管亮一秒;2、轮流亮完后,所有发光二极管都亮一秒,然后所有发光二极管都灭一秒;3、依次让第八个至第一个发光二极管点亮,每个发光二极管亮一秒;4、轮流亮完后,所有发光二极管都亮一秒,然后所有发光二极管都灭一秒;5、依次循环下去*/mZkklkzaaP
#include//52系列单片机头文件
#include//使用_crol_、_cror_时需包含的头文件
voiddelay_ms(unsignedunsignedintxms>//软件延时函数,其中xmsAVktR43bpw
{//为参数,表示延时xms
unsignedinti。
for(i=110。
i>0。
i-->
for(i=xms。
i>0。
i-->。
}
unsignedintb。
//定义变量b,用来控制第几个发光二极管亮
voidmain(>
{
P1=0X00。
while(1>
{
P0=0xfe。
//11111110,第一个灯亮
//因为进入循环后有延时,所以这里不需要延时
for(b=0。
b<=6。
b++>//for循环,依次点亮剩余7个发光二
{//极管
delay_ms<1000);//延时1000ms=1s
P0=_crol_(P0,1>。
//循环左移一位->第一次循环
//P0=11111101第二个灯亮
}
delay_ms<1000);//延时1000ms=1s,让最后一个灯灯亮1s
P0=0x00。
//让所有发光二极管都亮
delay_ms<1000);//延时1000ms=1s,让所有灯亮1s
P0=0xff。
//让所有发光二极管都灭
delay_ms<1000);//延时1000ms=1s,让所有灯灭1s
P0=0x7f。
//01111111,最后一个灯亮
for(b=0。
b<=6。
b++>
{
delay_ms<1000);//延时1000ms=1s
P0=_cror_(P0,1>。
//循环右移一位->第一次循环
//P0=10111111,倒数第二个灯亮
}
delay_ms<1000);//延时1000ms=1s,让第一个灯亮1s
P0=0x00。
//让所有发光二极管都亮
delay_ms<1000);//延时1000ms=1s,让所有灯亮1s
P0=0xff。
//让所有发光二极管都灭
delay_ms<1000);//延时1000ms=1s,让所有灯灭1s
}
}
除这种方法实现流水灯外,利用左移、右移指令与逻辑运算也能实现循环移动,大家只要多动动手,就能够随心所欲地控制发光二极管的闪烁。
ORjBnOwcEd
第六节数码管的静态显示
一、数码管的介绍:
数码管是电路中常见的显示原件,按段数的多少可分为七段数码管和八段数码管七段数码管多一个发光二极管单元<多一个小数点显示);按照显示"8"的个数,可分为1位、2位、4位等数码管,如下图所示:
2MiJTy0dTT
按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。
共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极COM>的数码管。
共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极uEh0U1Yfmh
共阳数码管在应用时应将公共极接到+5V或+3.3V,当某一字段
发光二极管的阴极为低电平时,相应字段就点亮。
当某一字段的阴极为高电平时,相应字段就不亮。
共阴数码管在应用时应将公共极COMIAg9qLsgBX
接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。
当某一字段的阳极为低电平时,相应字段就不亮。
WwghWvVhPE
二、数码管的显示:
任何一个7段码管都有128种显示模式,而其中的数字0-9是最为有用也是最常见的。
通过控制共阳极<共阴极)数码管的阴极<阳极),可以让数码管显示不同的字符,下表是共阴数码管的码段:
asfpsfpi4k
符号
编码
符号
编码