如何led灯带实现开关功能看LED闪烁功能

上一篇笔记中,主要记录了通过shell脚本的方式实现对LED灯的亮灭控制。不难看出,实际上对GPIO的控制主要是通过对内核接口/sys/class/gpio下的文件进行操作。同样的方法,也可以通过C语言实现对GPIO口的控制。这篇笔记就记录了笔者通过C语言的方法实现对LED的控制。
第一步:先点亮LED
1、新建led.c文件,方法讲过:touch led.c。
2、利用vi编辑器对led.c进行编辑。源码如下所示:
1 #include &stdio.h&
2 #define GPIO_DIR "/sys/class/gpio/"
4 int main()
FILE *stream=NULL;
stream=fopen(GPIO_DIR"export","w");
fwrite("44",sizeof(int),2,stream);
fclose(stream);
stream=fopen(GPIO_DIR"gpio44/direction","r+");
fwrite("out",sizeof(char),3,stream);
fclose(stream);
stream=fopen(GPIO_DIR"gpio44/value","r+");
fwrite("1",sizeof(char),1,stream);
fclose(stream);
几点说明:
(1)第1行:包含了标准输入输出头文件stdio.h,程序里用到的fopen(),fwrite(),fclose()函数都是包含在stdio.h里面;
(2)第2行:定义一个路径;
(3)第6~10行:通过操作export文件添加gpio44引脚,相当于注册GPIO44端口;
(4)第13~15行:设置gpio44的方向属性;
(5)第17~19行:设置gpio44的数据为1,即高电平。
3、第二篇笔记已经详细的说明怎样编译,请参考:
这里直接进行编译并运行,运行完LED灯点亮了。
4、要实现LED灯的闪烁,还需要添加循环语句和延迟语句来控制亮灭的交替变化。接下来将上边的代码在进行更改,于是得到下边的代码。
1 #include &stdio.h&
2 #define GPIO_DIR "/sys/class/gpio/"
4 int main()
FILE *stream=NULL;
stream=fopen(GPIO_DIR"export","w");
fwrite("44",sizeof(int),2,stream);
fclose(stream);
stream=fopen(GPIO_DIR"gpio44/direction","r+");
fwrite("out",sizeof(char),3,stream);
fclose(stream);
printf("led on\n");
stream=fopen(GPIO_DIR"gpio44/value","r+");
fwrite("1",sizeof(char),1,stream);
fclose(stream);
usleep(500000);
printf("led of\n");
stream=fopen(GPIO_DIR"gpio44/value","r+");
fwrite("0",sizeof(char),1,stream);
fclose(stream);
usleep(500000);
几点说明:
(1)第2行:此处修改了GPIO_DIR的路径,使其指向/sys/class/gpio/文件,注意第7,11,18,23行也做了相应修改;
(2)15~27行:添加了while循环语句,再循环里面先点亮LED,延迟0.5s,然后再熄灭,延迟0.5s;
(3)usleep()函数是微秒级的延迟。
5、修改后的代码运行后就能实现LED灯交替闪烁了,其中闪烁间隔为0.5s。
第二步:讲解几个重要的知识
1、fopen()函数
包含头文件
#include &stdio.h&
FILE *fopen(char * filename,char * mode);
以mode指定的方式打开名为filename的文件
filename: 文件名 mode:打开模式
&&&&&&&&&&&&& r&& 只读方式打开一个文本文件
&&&&&&&&&&&&& rb& 只读方式打开一个二进制文件
&&&&&&&&&&&&& w&& 只写方式打开一个文本文件
&&&&&&&&&&&&& wb& 只写方式打开一个二进制文件
&&&&&&&&&&&&& a&& 追加方式打开一个文本文件
&&&&&&&&&&&& ab& 追加方式打开一个二进制文件
&&&&&&&&&&&&& r+& 可读可写方式打开一个文本文件
&&&&&&&&&&&&& rb+ 可读可写方式打开一个二进制文件
&&&&&&&&&&&&& w+& 可读可写方式创建一个文本文件
&&&&&&&&&&&&& wb+ 可读可写方式生成一个二进制文件
&&&&&&&&&&&&& a+& 可读可写追加方式打开一个文本文件
&&&&&&&&&&&&& ab+ 可读可写方式追加一个二进制文件
成功,返回一个文件指针(文件信息区的起始地址),否则返回0
2、fwrite()函数
包含头文件
#include &stdio.h&
int fwrite(char *ptr,unsigned size,unsigned n,FILE *fp);
把ptr所指向的n*size个字节输出到fp所指向的文件中
ptr-存放要写入的数据,
size-每个数据单位的字节数,
n-读入的数据单位个数
fp需要写入的文件
写到fp文件中的数据项个数
3、 fclose()函数
包含头文件
#include &stdio.h&
int fclose(FILE * fp);
关闭fp所指的文件,释放文件缓冲区
fp需要关闭的文件
0-无错,否则非零
注:以上三个函数都包含在标准输入输出头文件stdio.h里面
4、usleep()函数
这个函数是Linux系统函数。有一个函数与这个函数比较相似,也就是sleep()函数。下面对比说明一下
void usleep(int micro_seconds);
sleep(unisgned long);
本函数可暂时使程序停止执行。
本函数可暂时使程序停止执行。
micro_seconds 要暂停的微秒数
long 要暂停的秒数
5、sizeof()函数
(1)功能:计算数据空间的字节数
(2)与strlen比较:
1) strlen()计算字符数组的字符数,以"\0"为结束判断,不计算为'\0'的数组元素。
2)sizeof计算数据(包括数组、变量、类型、结构体等)所占内存空间,用字节数表示。
6、stdio.h包含的函数
二进制输入/输出
非格式化输入/输出
fgetc/getc
fputc/putc
格式化输入/输出
scanf/fscanf/sscanf
printf/fprintf/sprintf
其中常用到的几个函数原型:
int getchar()//从标准输入设备读入一个字符
int putchar()//向标准输出设备写出一个字符
int scanf(char*format[,argument&])//从标准输入设备读入格式化后的数据
int printf(char*format[,argument&])//向标准输出设备输出格式化字符串
char*gets(char*string)//从标准输入设备读入一个字符串
int puts(char*string)//向标准输出设备输出一个字符串
int sprintf(char*string,char*format[,&])//把格式化的数据写入某个字符串缓冲区
总结:通过这个实验掌握了利用C语言的方式去操作GPIO的方法。
阅读(...) 评论()  一、程序设计    我们选择图中的1作为单灯闪烁的控制目标,也就是我们将看到LED1单独闪烁。在我们编写程序前应该学会用程序流程图来表达我们的程序设计意图,特别是设计复杂程序的时候,更需要这一步骤。
  1.程序流程图设计    程序流程图又称之为程序框图,它是程序开发者最熟悉的一种算法表达工具。它独立于任何一种程序设计语言,能比较直观和清晰地描述过程的控制流程,易于学习掌握。因此,程序流程图是程序开发者最普遍采用的一种工具。
  程序流程图一般采用下面五种符号表示:
  ①起始框②终止框③处理过程框④判断框⑤流程线
 依据实训项目任务目标和流程图编写规则,《单灯闪烁器》程序流程图设计如下图。
  2.延时程序设计    分析程序流程图发现,要点亮LED和熄灭LED可以采用指令CLR P1.0和SETB Pl.0实现,延时要用什么指令实现呢?
  51指令系统没有专门的延时指令,需要我们编写一个延时子程序。为了编写延时子程序,先来学习几个相关的知识点:
  (1)振荡:也称时钟周期,是指为单片机提供时钟脉冲信号的振荡源的周期,与单片机系统的晶体()有关,振荡周期等于晶振的倒数。
  本系统的晶体振荡器的频率f=12M,所以振荡周期的计算公式:
  (2)状态周期:每个状态周期为时钟周期的2倍,是振荡周期经二后得到的。    (3)机器周期:一个机器周期包含6个状态周期S1-S6,也就是12个时钟周期。在一个机器周期内,CPU可以完成一个独立的操作。
  本系统的晶体振荡器的频率f=12MHz,时钟周期=12ms,所以机器周期的计算公式:
  (4)指令周期:它是指CPU完成一条指令操作所需的全部时间。每条指令的执行时间都是由一个或几个机器周期组成。MCS-51系统中,有单周期指令、双周期指令和四周期指令。如指令D2:DJNZR6,D2就是条双周期指令,也就是说执行这条指令需要2个机器周期,即需要2&s才可以执行完毕。
  单片机执行一条指令(D2:DJNZ R6.D2)需要2个微秒,如果让单片机执行62500次这条指令,那需要多少时间呢?可以计算得出是62500&2&s=125&S。
  操作码DJNZ的功能是自减1不为零跳转,冒号前面的D2为该条指令的标号,标号是地址的符号化,代表该条指令的地址位置。后面跟了当前工作寄存器R6和该条指令发生跳转时的目标地址D2。
  下面我们来分析下D2:DJNZ R6,D2这条指令的执行过程:
  第一步:把R6的内容减1。
  第二步:判断R6的内容是否为0。
  如果不等于0,就跳转到目标地址D2的地方去执行。因为本条指令的目标地址和标号都是D2,所以单片机将再继续执行一次指令D2:DJNZR6,D2。
  如果R6的内容等于0,就顺序执行下面的指令。
  如果我们设计子程序时,使得单片机重复执行这条指令(D2:DJNZ R6,D2)62500次后才能结束,也就是说单片机需要花125ms的时间来执行该延时子程序,相对于主程序来说本文所要编写的延时子程序的功能是延时125ms,就起到了延时的作用。
  延时子程序设计如下:
  在设计子程序的时候,一般开始的第一条指令一定要加标号,且标号命名的含义要和本子程序的功能相似,这样更方便程序的阅读与编写,如DELAY是延时的意思。子程序一定要以子程序返回指令RET结束。上面的延时子程序要执行250X250=62500次该指令D2:DJNZ R6,D2后才会结束,延时时间差不多是125ms。
  3.单灯闪烁程序设计    结合设计的程序流程图和延时子程序,编写程序如下:
本网站试开通微、小企业商家广告业务;维修点推荐项目。收费实惠有效果!欢迎在QQ或邮箱联系!
试试再找找您想看的资料
资料搜索:
查看相关资料 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款
copyright & &广电电器(中国梧州) -all right reserved& 若您有什么意见或建议请mail: & &
地址: 电话:(86)774-2826670& & &&)看得见或看不见的屏幕闪烁 该如何避免
日 00:58&&&出处:&& 作者:宋阳&& 编辑:宋阳 分享
   闪屏究竟是个什么东东?大家可以先来大致get一下显示器的成像原理,由于目前显示器市场已由一统天下,所以我们只讨论液晶显示器。首先,液晶显示器里非常重要的液晶分子是不发光的,但没有光我们只能看到一块黑板,因此必须给它后面铺上一层光,也就是LED背光源。在外界电压的刺激下,液晶分子们一激灵就会发生各种偏转,这些小动作会挡住后面的一部分光,也会透出一些光,这些通过的光投射在前面的彩色滤光片上,产生五颜六色的图案,也就形成了我们在显示器中所看到的图像。LED背光液晶屏的构造   但LED背光也不能一直这么傻乎乎的亮下去,否则黑夜也会变成白天,如何根据画面变化调整明暗呢?这就需要LED来调节光线亮度。LED的调光方式有两种,一种是PWM(脉冲宽度调制)调光,一种是非PWM调光。PWM调光就是让LED迅速地一次次开启和关闭,由于我们眼睛感知的亮度是一个长期过程,因此在一段时间内开启时间比例大,我们就觉得亮,反之关闭时间长则暗。说通俗一点,就是你正在快速翻动一本黑白页交错的子,如果是排列方式是两页白纸一页黑纸、两页白纸一页黑纸,那么在我们纵观来看,白色的感受要多于黑色,换算到PWM调光中就是LED每次的开启时间长于关闭时间,我们的眼睛就能感觉到亮。   这种调光方式在目前的市场上非常喜闻乐见,但恰恰就是它的开启关闭方式导致了我们开头提到的“闪屏”现象。这种闪烁的频率非常高,以至于普通人肉眼无法察觉,不过时间长了依然会感到视觉疲劳。有不少厂商采取了一些对策来改善,比如采用高频PWM调制方式,这相当于告诉我们“我翻的速度超级快,快到你看不出我在翻”,要说改善倒也有些,不过终归是个治标不治本的方法。   从左到右:PWM调光(闪屏), 高频PWM调光(暗时可能闪屏), 非PWM调光(护眼不闪屏)LED的另一种调光方式――非PWM调光,也叫做直流调光,它能够真正的摒除闪屏现象,在目前市场上像三星等大品牌用的就是这种方式,但由于成本高、难度大等原因,使用的厂商非常少。非PWM调光之所以不会产生闪烁现象,是因为LED这种材料其实也比较物质,你给它的电流大它就亮,给的小它就暗,因此可以直接通过改变LED的电流大小来调整亮度。不过这种调光方式的工艺比较复杂,要想使用需要经历长期大量的研究,目前市面上已经成熟的技术也有不少,三星零闪屏(Flicker Free)技术就是其中之一,这项技术让他们的显示器产品完全避免了闪屏现象。三星曲面显示器 “零闪屏”下显示效果依然出众   三星零闪屏(Flicker Free)技术也攻克了一些其他难题,比如LED材料在不同大小的电流下容易出现偏色现象,三星通过改变LED背光的荧光粉,以及让屏幕亮度的可调节性变小等方法,使屏幕的色温不会有非常明显的变化,更不会产生偏色现象。当你入手一台三星曲面显示器,你就能明白三星零闪屏(Flicker Free)技术究竟做得有多好了,它不但去除了闪屏还避免了偏色,这是许多厂商费尽心思也无法实现的。另外,三星曲面显示器的弧面设计也很酷,以人眼弧度为基础的黄金曲率能够提高观看时的沉浸式效果,带给你如IMAX一般的环绕式视觉体验。■
看过本文的人还看了
2.2万人浏览 2万人浏览 6810人浏览 5224人浏览2013年1月 硬件/嵌入开发大版内专家分月排行榜第一2012年10月 硬件/嵌入开发大版内专家分月排行榜第一2012年9月 硬件/嵌入开发大版内专家分月排行榜第一2012年8月 硬件/嵌入开发大版内专家分月排行榜第一2012年7月 硬件/嵌入开发大版内专家分月排行榜第一2012年6月 硬件/嵌入开发大版内专家分月排行榜第一2012年5月 硬件/嵌入开发大版内专家分月排行榜第一2012年4月 硬件/嵌入开发大版内专家分月排行榜第一2012年3月 硬件/嵌入开发大版内专家分月排行榜第一2012年2月 硬件/嵌入开发大版内专家分月排行榜第一2012年1月 硬件/嵌入开发大版内专家分月排行榜第一2011年11月 硬件/嵌入开发大版内专家分月排行榜第一2011年10月 硬件/嵌入开发大版内专家分月排行榜第一2011年9月 硬件/嵌入开发大版内专家分月排行榜第一
2014年10月 硬件/嵌入开发大版内专家分月排行榜第二2014年2月 硬件/嵌入开发大版内专家分月排行榜第二2013年10月 硬件/嵌入开发大版内专家分月排行榜第二2013年8月 硬件/嵌入开发大版内专家分月排行榜第二2013年3月 硬件/嵌入开发大版内专家分月排行榜第二2012年12月 硬件/嵌入开发大版内专家分月排行榜第二2012年11月 硬件/嵌入开发大版内专家分月排行榜第二2011年12月 硬件/嵌入开发大版内专家分月排行榜第二
2013年4月 硬件/嵌入开发大版内专家分月排行榜第二2007年9月 硬件/嵌入开发大版内专家分月排行榜第二
2013年5月 硬件/嵌入开发大版内专家分月排行榜第三2012年9月 硬件/嵌入开发大版内专家分月排行榜第三2007年11月 硬件/嵌入开发大版内专家分月排行榜第三
2012年1月 硬件/嵌入开发大版内专家分月排行榜第二2011年11月 硬件/嵌入开发大版内专家分月排行榜第二2011年10月 硬件/嵌入开发大版内专家分月排行榜第二2011年9月 硬件/嵌入开发大版内专家分月排行榜第二
2012年3月 硬件/嵌入开发大版内专家分月排行榜第三2012年2月 硬件/嵌入开发大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 android led闪烁功能 的文章

 

随机推荐