本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
第一章:单片机C51开发语言入门
阮老师 出品版权所有,盗用必究
配套学习用的单片机开发板购买地址:
http://item.taobao.com/item.htm?id=19868132487
单片机c51编程语言中所使用的数:
单片机c51编程语言中一共有3种类型的数:
1. 十进制表示的数, 如 55,,逢10进一,从0到9依次为0 1 2 3 4 5 6 7 8 9 这10个
2. 十六进制表示的数,如 01FF,,逢16进一,从0到15依次为0 1 2 3 4 5 6 7 8 9 a b c d e f这16个
3. 二进制表示的数,如0111010101这样的,逢2进一,从0到1依次为0 1这2个
所以十进制数16可以用十进制表示为16,用十六进制表示为 10 (逢16进一,所以 十六进制的10 =1X16+0X1=十进制的16 ) ,
用二进制表示为 10000 (逢2进一,所以从右到左第1位可达1,第2位为可达2=2x1,第3位可达4=2x2,第4位可以达到8=2x2x2,第五位可达16,所以十进制数16用二进制表示就为 10000)
同理,十进制数17,用十六进制表示为11,用二进制表示为10001
十进制数18,用十六进制表示为12,用二进制表示为10010
十进制数19,用十六进制表示为13,用二进制表示为10011
十进制数20,用十六进制表示为14,用二进制表示为10100
十进制数20,用十六进制表示为15,用二进制表示为10101
...........
基本概念
概念1.常数:这个好比固定不变的数,比如 1,比如112,比如235,就是说这些数在程序运行时不会变化,固定在一个值
c51代码执行方式:从上到下依次执行:
如
aaa=1;
bbb=3;
aaa=4;
aaa=aaa+bbb;
这里就是先执行aaa=1;这句,再执行bbb=3;这句,再aaa=4;........这样往下依次执行
概念2.变量:变量的名字只能是字母和数字的组合(且左边第1个字符不能为数字),变量,这个好比一个带编号的小容器,里面可以放一个数字,数字可以变化,但是容器还是那个(同一编号)
,比如变量A就好比编号为A的小容器,我可以在容器里放数字12,也可以放数字233,也可以放数字88,等等,
但是,我说,我要得到变量A加上1后的结果,那怎么运算的,很简单,把编号为A的小容器里的数拿出来,比如里面是12,加一后就是13,那么我得到13,比如里面是235,加1后就是236,那么我得到236,
比如看下面含变量的c51编程代码:
A=111;
B=A+22;
A=23;
B=A+31;
上面的代码里有2个变量A和B,
A=111,这句就是给变量A赋值,好比在编号为A的小容器里放入数字111
B=A+22,这句就是变量A加上22后,把得到的结果赋给变量B,好比取编号为A的小容器里放的数字,然后加上22,也就是111+22,把得到的结果133放入编号为B的小容器里,所以变量B的值变为133
A=23,这句就是重新给变量A赋值,好比在编号为A的小容器里放入数字23
B=A+31,这句就是变量A加上31后,把得到的结果赋给变量B,好比取编号为A的小容器里放的数字,然后加上22,也就是23+31,把得到的结果54放入编号为B的小容器里,所以变量B的值变为54
代码末尾的; 号是必须的,c51规定每行代码末尾都要加;号
概念3. 变量运算符号:和数学里的加减乘除类似,变量运算符号也有+-*/
比如A=B*22,就是把B乘上22后所得到的结果赋值给变量A
A=B+123就是把B加上123后所得到的结果赋值给变量A
还有求余数:%,比如A=3%4,就是3对4求余结果为3,把结果3写入变量A中。
还有对于二进制数而言的移位运算:如<<左移,比如 4向左移动一位变为多少?
就是 4<<1 变为多少?,十进制的4化为二进制后就是 0100, 所以二进制0100向左移动一位就是二进制1000,
二进制的1000就是十进制的8,所以4<<1等于8
一般是下面这样的c51代码形式
A=4;
A=A<<1;
,其中,A=A<<1 就是把A<<1向左移动一位后所得到的新值重新放入变量A中,
所以4<<1就是8,把结果8赋值给A,最后A的值为8
代码末尾的; 号是必须的,c51规定每行代码末尾都要加;号
概念4. 单片机寄存器的定义:
51单片机有很多寄存器,什么叫寄存器,简单的说就是控制器,
比如假设寄存器A1是开灯用的,那么我们比如可以只要在寄存器A1里写入数 11(假设),
就可以开启灯,点亮它,这里寄存器A1就像个 灯的控制器,
比如在寄存器A1里写入数11,灯1亮
在寄存器A1里写入数12,灯2亮
在寄存器A1里写入数13,灯3亮
。。。。。。
实际上,51单片机有很多寄存器,而这些寄存器不是控制一个灯那么简单,
比如51单片机的定时器1控制寄存器,可以控制定时器1是否启动,及控制定时器1的定时时间等,这些在以后的文章里讨论,51单片机的定时器1主要用于实现定时和间隔,比如在今晚7点开灯的自动程序就必须用51单片机的定时器1来作为定时用。
而在c51编程语言里,引用一个寄存器可以用sfr定义
,比如 sfr AAA1=0xa1;
这个就表示定义一个变量AAA1,这个变量AAA1就不单单用作普通容器放数字,
放入数字后,还能操作那个寄存器控制一些东西,0xa1表示这个寄存器的物理地址编号,
0x开头的表示是16进制,16进制的a1就是十进制的161(具体可以自己算),
代码末尾的; 号是必须的,c51规定每行代码末尾都要加;号
,至于寄存器的物理地址编号,就好比把单片机比作一个大厦,寄存器就是大厦里的各个房间,
寄存器的物理地址编号就是这些个房间的门牌号,用来索引房间和区分房间
概念5.单片机I/O口的定义
单片机是个芯片,他有很多引脚,就是针脚,如图:
看到里面有P0口的 P0.1到P0.7 共8个引脚,
这些引脚就是I/O口的引脚
对于这些引脚的用途,举个例子就是比如你要控制1个电灯的开关,怎么办
就需要一条线连接到电灯把,这些单片机的I/O口引脚就是中间桥梁,
比如如果上图中的I/O口引脚P1.7用来控制电灯,那么我们把P1.7设置为1,就是高电平(通俗的讲就是输出一个电压,再通俗的讲就是闪电一样有电压,^_^ ),那么这个P1.7脚输出的高电平就去控制电灯打开了它,
如果P1.7设置为0,就是低电平(通俗的讲就是没有任何输出电压),那么电灯就灭了。
实现这些功能要用到这样的c51代码:
sbit AAAA1=P1^7;
AAAA1=1;
这里可以放一段延时用的代码
AAAA1=0;
其中,sbit AAAA1=P1^7;
就是引用I/O口引脚P1.7,映射到新定义的变量AAAA1上
,那么,由于这个映射关系,如果向变量AAAA1里写1(即AAAA1=1;),就是把I/O口引脚P1.7设置为高电平,点亮外接的电灯
,写0(即AAAA1=0;)就是熄灭电灯.
所以你可以惊讶的发现,你已经很牛逼了,可以用代码控制外接电灯的亮和灭了!!,强大!!,继续努力学习!!。
概念6.单片机c51编程语言里变量的类型和代码写法:
注意点:c51中的变量在使用前都需要经过定义
注意点:一个字节是8位二进制数,所以一个字节能表示的数的范围是0到二进制的11111111,也就是能表示十进制的0到255
一共有5 种变量类型:
1. 整型变量:
简单的说就是数学里的整数型的东西(整型变量最大能表示0-65535的数,就是16位二进制数,即2个字节),定义一个整型变量的写法:如 int aaa; 其中int 这个英文词表示整数的意思,aaa是随便自己自定义的变量名
2. 小数型变量:
简单的说就是带小数点和小数位的东西, 定义一个小数型变量的写法:如 double aaa; 其中double 这个英文词表示小数的意思,aaa是随便自己自定义的变量名
3. 字节型或字符型变量:
这个变量类似整型变量,只不过能表示的范围小一点,比如只能表示0-255之间的数(就是8位二进制数的最大值,二进制的11111111就代表十进制的255,十进制的00000000到11111111就是0-255,一个字节就是8位二进制),,注意到:单片机I/O口比如P0口也是8条线,所以正好可以把P0口映射到一个字节型变量如aaa上,控制aaa就是控制P0口输出的数据,所谓的数据总线就是这个概念,变量aaa设置为值123,那么就可以在数据总线P0口上传输值123给其他芯片或模块,
4. 比特型的变量,就是位类型的变量:
就是一位二进制数,值只能为0或者1,可以用来表示真或者假这个逻辑运算的结果,或者用来控制单片机I/O口引脚如P1.7的输出高电平(1)还是低电平(0),比如上面说的
sbit AAAA1=P1^7;
AAAA1=1;
这里可以放一段延时用的代码
AAAA1=0;
这段代码,sbit就是定义一个映射到单片机I/O口引脚的位类型的变量
5. 长整型变量:
这家伙比整型变量更凶猛点,能表示0到4294967295 范围间的数,就是4字节数,也就是4X8=32位二进制数,
本质就是能表示比整型变量更大范围的数
此外,变量还区分有无负号,即能否表示负数,这个一般用不到(加了unsigned前缀的都是无负号类型的,就是正数,不能表示负数),此处忽略。
概念7.单片机c51编程语言里的 编程语句:
c51代码执行方式:从上到下依次执行:
如
aaa=1;
bbb=3;
aaa=4;
aaa=aaa+bbb;
这里就是先执行aaa=1;这句,再执行bbb=3;这句,再aaa=4;........这样往下依次执行
1.判断语句
写法:
if(条件1){
执行体1
}else{
执行体2
}
,其中:
if表示的意思是中文里的 “如果”,
else就是 否则的 意思
简单的说,就是判断一下情况来做对应的处理,
如果条件1成立则执行执行体1 里的代码,
如果条件1不成立则执行执行体2 里的代码,
比如我要判断今天的时间是否大于8点,大于8点就开灯,怎么写呢:
if(shijian>8){
执行开灯的代码。。。。
}else{
不开灯。。。。
}
当然shijian 这个变量要读取时间芯片里的时间,不能独立存在,
而执行开灯的代码。。。。 这个可以是比如 P1.7=1; 即设置P1.7引脚为高电平来开灯
2.循环语句:
比如我要把灯亮了再灭了,再亮再灭了,这样循环10次,(比如一些霓虹灯的闪烁效果),
就要用到循环语句:
写法如下:
for(第1次循环执行前执行这里 ; 每次循环执行前判断这里,看是否仍然成立,成立则继续下次循环 ; 每次循环执行完后执行这里 ){
每次循环执行这里的代码。。。。。
}
具体如下代码:
for(int aaa=0;aaa<10;aaa=aaa+1){
这个可以是把灯亮了再灭了的控制代码......
}
我们来仔细分析下上面的语句:
|
|