完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
|
相关推荐
1个回答
|
|
一、实验任务
点亮第一个LED灯 二、步骤 1.按照之前的步骤建立一个实验一的文件夹,用keil软件在文件夹中建立实验一的项目。 项目名和文件名自己定。 2.编写代码 讲解及升级 首先是头文件 #include 然后就是正常的C语言代码编写 void main()//这里和普通C语言不一样的是主函数返回值类型不同 这里使用void { P2=0XA0;P0=0X00; //初始化程序 后面的博客会讲到 P2=0X80;P0=0XFF; //初始化程序 后面的博客会讲到 P00=1; //在51单片机中,引脚的使用格式是P0^0,15单片机中是P00即可 P01=0; //原因在于在15的头文件中,已经预处理过了 P02=0; //在15开发板中,led是共阳极的,共阳极自己百度,这里不再多做介绍 //所以当引脚为0,就是所谓的低电平时才会亮 while(1); //在这执行while(1)的目的是让程序停留在这里,不然程序就会结束,后面的知识主要就是在while(1)里面循环执行的。 } 在这里还有一个就是,对P0口的整体赋值,如P0=0xff。这一条语句和P00=1,P00=1,P01=1……P07=1,效果一样,最终二级制表示为P0=1111 1111.如上面的程序,可以设置为P0=0xf5,即P0=1111 1001。 升级版:led闪烁 #include unsigned int i; //无符号的整型值 void main(void) { P2=0XA0;P0=0X00; //初始化程序 P2=0X80;P0=0XFF; //初始化程序 while(1) { P00=0; for(i=0;i<65535;i++); // 在本程序中,就是让单片机在这一条语句中循环执行,占用“CPU”,达到等待的目的。 // 也可以调用类似的函数达到效果 P00=1; for(i=0;i<65535;i++); } } 再次升级:led交替闪烁 //LED交替闪烁程序 #include unsigned int i; void main(void) { P2=0XA0;P0=0X00; //初始化程序 P2=0X80;P0=0XFF; //初始化程序 while(1) { P00=0; for(i=0;i<65535;i++); P00=1; P01=0; for(i=0;i<65535;i++); P01=1; } } 流水灯 初步完成功能 #include unsigned int i; void main(void) { P2=0XA0;P0=0X00; //初始化程序 P2=0X80;P0=0XFF; //初始化程序 while(1) { P00=0; for(i=0;i<65535;i++); P00=1; P01=0; for(i=0;i<65535;i++); P01=1; P02=0; for(i=0;i<65535;i++); P02=1; P03=0; for(i=0;i<65535;i++); P03=1; P04=0; for(i=0;i<65535;i++); P04=1; P05=0; for(i=0;i<65535;i++); P05=1; P06=0; for(i=0;i<65535;i++); P06=1; P07=0; for(i=0;i<65535;i++); P07=1; } } 这也太长了吧,废话也好多,那直接跳转到本文最后。 优化 如果是小白,那就跟着我一步一步来,下面缩短一下,可以用本篇最上面提到的对P0口整体赋值,精简代码。如下: #include unsigned int i; void main(void) { P2=0XA0;P0=0X00; //初始化程序 P2=0X80;P0=0XFF; //初始化程序 while(1) { P0=0XFE; for(i=0;i<65535;i++); P0=0XFD; for(i=0;i<65535;i++); P0=0XFB; for(i=0;i<65535;i++); P0=0XF7; for(i=0;i<65535;i++); P0=0XEF; for(i=0;i<65535;i++); P0=0XDF; for(i=0;i<65535;i++); P0=0XBF; for(i=0;i<65535;i++); P0=0X7F; for(i=0;i<65535;i++); P0=0XFF; for(i=0;i<65535;i++); } } 还是好长,继续精简: #include void Delayms(int ms); //这里是延时函数,上面讲到过 void main(void) { P2=0XA0;P0=0X00; //初始化程序 P2=0X80;P0=0XFF; //初始化程序 while(1) { P0=0XFE; Delayms(100); P0=0XFD; Delayms(300); P0=0XFB; Delayms(500); P0=0XF7; Delayms(800); P0=0XEF; Delayms(1000); P0=0XDF; Delayms(2000); P0=0XBF; Delayms(3000); P0=0X7F; Delayms(2000); P0=0XFF; //运行到这里的时候,所有的等都熄灭,我们通常称为消隐。 Delayms(200); } } void Delayms(int ms) { int i,j; for(i=0;i for(j=845;j>0;j–); } 最终 但是感觉还是长,有好多代码都是相似的,能不能用循环实现呢?答案是可以的,这就是最终版: #include unsigned char LED; void Delayms(int ms); void main(void) { P2=0XA0;P0=0X00; //初始化程序 P2=0X80;P0=0XFF; //初始化程序 while(1) { for(LED=0;LED<8;LED++) //这里采用循环的方式实现功能,大幅度缩短了代码量 { P0=~(0X01< Delayms(1000); /这里要延时一下。举个例子,如果不延时,当第一个灯亮了以后,我们还没反应过来,第一个灯就熄灭,第一个灯的光还没在我们眼睛里成像就没了,看到的内容就是第一个灯没亮,其余的也是。/ } } } void Delayms(int ms) //延时函数的内容 { int i,j; for(i=0;i for(j=845;j>0;j–); } 总结 在本篇中,我们学习到了,点亮led灯的实验,其中涉及到的知识有:头文件的预处理,进制转换,变量定义的类型,延时函数的原理,还有最后在代码的注释中没给大家讲解的左移右移。 <<左移符号,>>右移符号。 0x01<<1,意思就是左移一位,由原来的0000 0001 变为 0000 0010 0x80>>1, 意思就是右移一位,由原来的1000 0000 变为 0100 0000 通过左移右移达到实现流水灯的效果。 还有代码中出现的一个~符号,这个符号是取反的意思,如原来是0xff(1111 1111),取反后就是0x00(0000 0000)。 同样的能够实现LED流水灯还有一个函数,核心代码如下: #include“intrins.h” //首先要加入头文件,crol()函数在此头文件中包含。 for(i=0;i<7;i++) { P0=crol(P0,1); //表示P0左移一位后重新将值赋给P0。 delay(1000); } 点亮一个小灯泡很简单,但是点亮小灯泡也可以进行组合,产生花里胡哨的效果,流水灯只是简单的应用,大家自己去探索吧。 |
|
|
|
只有小组成员才能发言,加入小组>>
3263 浏览 9 评论
2944 浏览 16 评论
3443 浏览 1 评论
8955 浏览 16 评论
4036 浏览 18 评论
1081浏览 3评论
561浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
554浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2290浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1849浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-11 03:31 , Processed in 0.777898 second(s), Total 45, Slave 37 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号