历史上的今天
今天是:2025年10月20日(星期一)
2022年10月20日 | STC89C52单片机 LED灯闪烁
2022-10-20 来源:csdn
LED闪烁
循环语句
循环语句
(1)while(条件表达式){语句}
只有当 while 后面圆括号内条件表达式的值为真时,程序才会重复执行花括号内语句,当条件表达式为假时则不执行花括号内语句。
(2)for([初值设定表达式];[循环条件表达式];[更新表达式])
{语句}
例:for(i = 1; i <= 100; i++)
{语句}
花括号内语句会被执行100次后才退出。
变量的定义
变量
变量是在程序执行过程中其值能不断变化的量。在使用一个变量之前必须进行定义,用一个标识符作为变量名,并指出它的数据类型。
注意:C语言中每条语句必须用分号结束。
常用定义格式如下:
数据类型 变量名;
例如:
unsigned char a; // 作用范围(0~255, 无符号字符型)
unsigned char b;
a = 5; b = 2;
b = 5 + a; (其中5是常量,a 与 b 都是变量,b最终的值等于10)
变量作用域
全局变量:在函数体外定义的变量通常为全局变量,作用范围: 从定义开始的整个程序
局部变量:在函数体内定义的变量通常为局部变量,作用范围:函数体内
软件延时
当单片机在处理某些事件的时候用户希望它处理完后间隔一段时间再去处理下一个事件,这时就需要用到延时。
常用的延时方法:
软件延时:优点使用简单;缺点浪费CPU资源
定时器延时:需要操作内部寄存器,节省CPU资源
IO口与一个字节位的数据对应关系
如果把一个字节的数据赋值给一组10口,其中数据的最低位对应此组10口的最低位,数据的最高位对应此组10口最高位。
例如
把十六进制数0xfe赋值给P1口他们的对应关系如下图所示
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IK8WiA7N-1604131653159)(img/IOandByte.png?imageView2/2/w/550)]](https://8.eewimg.cn/news/uploadfile/2022/1020/20221020103140244.png?imageView2/2/w/550)
总结:
每个LED灯对应着 2进制位置 1111 1111
每次写入程序需要通过十六进制数对变量进行赋值
例如:
点亮 LED2 LED3 LED5 的LED灯
需要 P1 = 0xe9;
对 0xe9 解析
在程序员计算器中
十进制为 233
二进制为 1110 1001
当转为二进制后,单片机加载该程序,会根据二进制组对相应的LED灯进行点亮,1110 1001 从高到低排列,
1110 第一个 1 代表P1^7 1为高电平 所以不亮
1110 第二个 1 代表P1^6 1为高电平 所以不亮
1110 第三个 1 代表P1^5 1为高电平 所以不亮
1110 第四个 0 代表P1^4 0为低电平 所以灯亮
1001 第一个 1 代表P1^3 1为高电平 所以不亮
1001 第二个 0 代表P1^2 0为低电平 所以灯亮
1001 第三个 0 代表P1^1 0为低电平 所以灯亮
1001 第四个 1 代表P1^0 1为高电平 所以不亮
点亮 LED6 灯
需要打开程序员计算器 对 二进制位置 1101 1111 进行换算
对应的16进制为 DF
所以 P1 = 0xdf;
即可只点亮 LED6 灯
程序部分
1.使 LED6 灯闪烁
#include unsigned int i; // 0~65535 全局变量 void main(){ // main 函数自身会循环 while(1){ // 一般在执行程序的时候需要 写出一个while的循环体来执行代码 // P1 = 0; // 点亮P1口8个LED // P1 = 0xe9; // 点亮 LED2 LED3 LED5灯 P1 = 0xdf; // 点亮 LED6 灯 i = 65535; while(i--); // 自定义的软件延时 P1 = 0xff; // 1111 1111 熄灭P1口 8个LED 不能直接使用 P1 = 1; 来熄灭8个LED灯 i= 65535; while(i--); } } // while(1){ // P1 = 0; // P1 = 0xff; // 1111 1111 熄灭P1口 8个LED 不能直接使用 P1 = 1; 来熄灭8个LED灯 // } // 当去掉软件延时器的时候,软件在执行的过程中会不断的循环,LED会反复的开启和关闭,所以通过人眼是无法辨别出来的 // 但是与常开启的LED相比亮度会相对较暗 2.使 LED1 灯闪烁 #include /*==================================== 函数 : delay(uint z) 参数 :z 延时毫秒设定,取值范围0-65535 返回值 :无 描述 :12T/Fosc11.0592M毫秒级延时 ====================================*/ void delay(unsigned int z){ // 毫秒级延时函数定义 unsigned int x, y; for (x = z; x > 0; x--){ for (y = 114; y > 0; y--){ } } } void main(){ // main函数自身会循环 delay(100); while(1){ P1 = 0XFE; // 点亮 LED1 灯 delay(100); // 延时 100毫秒 通过增加延时的时间或减少延时的时间,来控制灯的闪烁间隔 P1 = 0xff; // 关闭所有的LED 灯 delay(100); // 延时 100毫秒 通过增加延时的时间或减少延时的时间,来控制灯的闪烁间隔 } } 3.使 LED1、3、5、7 灯亮,使 LED2、4、6、8 灯闪烁; #include void delay(unsigned int z){ // 毫秒级延时函数定义 unsigned int x, y; for (x = z; x > 0; x--){ for (y = 114; y > 0; y--){ } } } void main(){ // main函数自身会循环 delay(100); while(1){ P1 = 0; // 0000 0000 // 使 LED1、2、3、4、5、6、7、8 灯亮 delay(500); // 延时 500毫秒 通过增加延时的时间或减少延时的时间,来控制流水灯的速度 P1 = 0XAA; // 1010 1010 // 关闭 2、4、6、8 灯 delay(500); // 延时 500毫秒 通过增加延时的时间或减少延时的时间,来控制流水灯的速度 } }
史海拾趣
|
摘要:简要介绍了CPLD/FPGA器件的特点和应用范围,并以分频比为2.5的半整数分频器的设计为例,介绍了在MAX+plus II开发软件下,利用VHDL硬件描述语言以及原理图的输入方式来设计数字逻辑电路的过程和方法。 关键词:VHDL CPLD/FPGA 数字逻辑电路 ...… 查看全部问答> |
|
#include #include \"math.h\" #define Num_of_Results 32 typedef unsigned char uchar; typedef unsigned int uint; static uint results[Num_of_Results]; //保存ADC转换结果的数组 flo ...… 查看全部问答> |
|
最近感知中国的驱动下,传感、泛在、物联网络得到了很多关注。传感网、物联网、泛在网从学术界来看虽然不是新名词,但当这些概念与广大老百姓接触时,大家还是容易被这几个词汇弄迷糊。于是打算浅析一次,算是抛砖引玉。 &nb ...… 查看全部问答> |
|
我刚开始接触WinCE,今天参照《WinCE.Net 程序设计》上面实例部分用PB定制系统内核。我电脑上安装了WinCE.Net 4.2 和EVC++4.0 。步骤如下: 第一步:用PB建立系统镜像。New Platform-BSP选择EMULATOR:X86和NATIONAL GEODE:X86-custom ...… 查看全部问答> |
|
原谅我。本来这个贴应该发布在信息区,不过那里都没有人看 TI 2011年MCU DAY研讨会,现场可能送开发板,我们坛子都没人得到消息 http://www.lierda.com/topic/MCUDAY2011.html 没剩几天了,大家赶紧 … 查看全部问答> |




