找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

易首开发板的单片机c51开发语言入门2

[复制链接]
net2uizoo 发表于 2013-7-22 12:55:02 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×

1.        for(int aaa=0;aaa<10;aaa=aaa+1){ 这里(int aaa=0;是定义个循环次数变量aaa(int 前缀表示是整数型的),
并把他初始化为0,每次循环后执行aaa=aaa+1这个来把变量aaa的值加上后再赋值给aaa,
,在每次循环前先判断aaa是否小于10,如果成立则继续下一次循环,
可以想象:
第1次循环前,aaa等于0
第2次循环前,aaa等于1
第3次循环前,aaa等于2
第4次循环前,aaa等于3
第5次循环前,aaa等于4
。。。。。
因为每次循环后执行aaa=aaa+1来加1,
可以想象,直到第10次循环后aaa会等于10,
然后第11次循环前执行判断aaa<10,即10<10,不成立,所以不再执行第11次循环
,所以我们发现以上 已经做到了我们所要的循环功能且控制了循环次数(上面是10次),而不是无限制循环下去,
那么我们如果要循环20次呢:
只要
for(int aaa=0;aaa<20;aaa=aaa+1){


这个可以是把灯亮了再灭了的控制代码......

}

,如果我们要43次呢
只要
for(int aaa=0;aaa<43;aaa=aaa+1){


这个可以是把灯亮了再灭了的控制代码......

}

如果我们要动态调整循环次数呢:
只要
bbb=13
for(int aaa=0;aaa<bbb;aaa=aaa+1){


这个可以是把灯亮了再灭了的控制代码......

}
bbb=23
for(int aaa=0;aaa<bbb;aaa=aaa+1){


这个可以是把灯亮了再灭了的控制代码......

}

这样可以控制循环13次(先定义变量bbb等于13),再循环23次(先定义变量bbb等于23)






概念8.函数:

简单的数:函数就是一个功能块或者说代码块,比如
做菜的步骤是:开锅,加料,煮,开锅,加料,煮,开锅
这里每个步骤都可以看作C51代码里的一个函数,
比如我代码里要执行开锅,只要调用开锅这个函数,而不是每次要执行开锅,都要写好开锅的各个步骤(如关电源,用手拿锅盖,然后。。。。。),只要呼叫下开锅这个函数,他自己就去帮你完成开锅了,不用你自己写开锅的各个步骤,

定义一个函数的写法如下:

返回值类型 函数名(定义函数参数列表){



函数代码


}
用{号和}号包括住函数里的代码
执行一个函数的写法如下:


函数名(传入具体的函数参数);


定义一个函数的写法具体如:
int kaideng(int aaa){

执行开灯共变量aaa所定义的时间长度(秒为单位)的时间的代码.....
执行关灯.........
return 1;
}
以上这个是开灯用的函数,参数中变量aaa定义为整型,即int aaa,return 1表示执行完这个函数后返回一个值1,比如abc1=kaideng(1);那么kaideng(1)执行完就返回1给变量abc1,使abc1的值变为1
比如现在灯是灭的,我要去开灯,就可以调用kaideng(int aaa)这个函数

比如 kaideng(1);这样调用,就会发生开1秒时间的灯这个操作

比如 kaideng(3);这样调用,就会发生开3秒时间的灯这个操作

比如kaideng(20);这样调用,就会发生开20秒时间的灯这个操作



函数参数也可以多个,每个参数间用逗号分开,比如
定义一个含两个参数的开灯用的函数,其中一个参数变量定义开灯时长,另一个参数变量定义开灯亮度,
如:
int  kaideng2(int shijian,int liangdu){

执行开灯(亮度设置为变量liangdu定义的亮度)共变量shijian所定义的时间长度(秒为单位)的时间的代码.....
执行关灯.........
return 1;

}

比如现在灯是灭的,我要去开灯,就可以调用kaideng2(int shijian,int liangdu)这个函数

比如 kaideng2(1,20);这样调用,就会发生开1秒时间的灯这个操作,开灯亮度为20

比如 kaideng2(3,20);这样调用,就会发生开3秒时间的灯这个操作,开灯亮度为20

比如kaideng2(20,100);这样调用,就会发生开20秒时间的灯这个操作,开灯亮度为100




第二章:单片机c51开发之开发实例
1.        让led指示灯不断闪烁的代码实例

好了,相信自己,你已经足够强大,对自己说我能做到,我行,
你现在的水平已经可以编一个让led指示灯不断闪烁的代码:
下面我们来实现

第1,        我们要把led指示灯的一脚接到单片机的一个I/O口输出脚上即接到单片机的一个针脚上,

我们配套的开发板上的单片机c8051f340(高速型51单片机)一共有40个I/O口引脚,其他8个脚都是比如用作电源输入等无关的功能,可以先忽略,
这40个I/O口分别为P0,P1,P2,P3,P4共5个P口,每个P口有8个引脚,比如P0口就有
P0.1到P0.7这8个脚,
我们里看下我们的开发板:


开发板购买地址:
http://item.taobao.com/item.htm?id=19868132487

我们看到这款开发板上有我们需要的led指示灯2个(还有一个是电源灯,不管它),可以用来做这个让led指示灯不断闪烁的实验
再来看下这个开发板上的单片机(处理器)c8051f340的引脚图:










这个单片机上有P0,P1,P2,P3,P4共5个P口,每个P口有8个引脚,比如P0口就有
P0.1到P0.7这8个脚,

,比如我们把led指示灯的一脚接到单片机的P2.7 这个引脚上,如下图:

硬件上就如上图这样连接led指示灯和单片机

可以想象,由于led 指示灯一脚已经接电源负极了,如果再在另一脚即所连接的单片机的P2.7脚上输出个正电压即高电平1,这个led 指示灯的2脚就变为1正1负了,就会承受一个电压,所以此刻,led指示灯会亮,如果另一脚即所连接的单片机的P2.7脚上也输出个负电压即低电平0,那么这个led 指示灯的2脚就变为1负1负了,负负抵消,就不会承受任何电压,所以此刻,led指示灯会灭

所以让led 指示灯不断闪烁,我们的任务就是在单片机的P2.7脚上循环输出高电平1和低电平0,
比如先输出1,再0.5秒后再输出0,再0.5秒后输出1,再0.5秒后输出0...................,不断循环下去

下面我们开始写代码:

写代码前要学习一点:所有的c51程序代码都是从void main()函数开始执行的(void 表示这个main函数执行完不返回任何值)

我们先把控制led用的P2.7引脚映射到aaa变量:
sbit aaa=P2^7;

然后,我们开始写main主函数:
sbit aaa=P2^7;
void main(){


}



下一步要写main()内的函数内容,我们首先点亮led,用aaa=1;就行,使p2.7脚输出高电平,来点亮led
即:
sbit aaa=P2^7;
void main(){
aaa=1;

}

我们再定义一个延时函数,用来在led灯亮后,延时0.5秒再熄灭.:
void yanshi(int shijian){

for(int t=0;t< shijian;t=t+1){

for(int t2=0;t2< 1000;t2=t2+1){

}

}

}

不知道大家看懂这段代码没,因为可以经过计算得到一次for循环执行时间大约为几个单片机的时钟节拍,大约为1微秒(对于c8051f340这个单片机的处理速度来说),所以
for(int t2=0;t2< 1000;t2=t2+1){

}
这个一共执行1000次,大约能延时1毫秒时间.

for(int t=0;t< shijian;t=t+1){

for(int t2=0;t2< 1000;t2=t2+1){

}

}
就是循环shijian里定义的次数 次的for(int t2=0;t2< 1000;t2=t2+1){}这个,就是for(int t2=0;t2< 1000;t2=t2+1){}
这个东西本身再整体循环shijian里定义的次数 次,比如shijian=1000时,就是循环1000次for(int t2=0;t2< 1000;t2=t2+1){},一次for(int t2=0;t2< 1000;t2=t2+1){}用时1毫秒,所以循环1000次for(int t2=0;t2< 1000;t2=t2+1){},就是用时1000毫秒,也就是用时1秒,
所以如果我们循环500次,就能达到延时0,5秒的效果,即这样调用延时函数:yanshi(500);
所以我们再次修改我们的此次的实验代码为:
void yanshi(int shijian){

for(int t=0;t< shijian;t=t+1){

for(int t2=0;t2< 1000;t2=t2+1){

}

}

}

sbit aaa=P2^7;

void main(){
aaa=1;
yanshi(500);
aaa=0;
}

但是这样只能实现闪一下led灯就不再循环闪了,
所以我们再加一个循环代码:把aaa=1;yanshi(500);aaa=0;改为
for(;;){

aaa=1;yanshi(500);aaa=0;
}

,其中for(;;){ 。。。。。。}表示无限次循环执行{ 。。。。。。  }里的代码,

所以我们再次修改我们的此次最终的实验代码为:

void yanshi(int shijian){

for(int t=0;t< shijian;t=t+1){

for(int t2=0;t2< 1000;t2=t2+1){

}

}

}

sbit aaa=P2^7;

void main(){

for(;;){
aaa=1;
yanshi(500);
aaa=0;
}

}



*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-12-23 08:30 , Processed in 0.068144 second(s), 8 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表