1.硬件设计
通过原理图分析,LED 采用共阳接法,即所有 LED 阳极管脚接电源 VCC(5V),阴极管脚通过一个限流电阻接到 P2 口上;要让 LED 发光即对应的阴极管脚应该为低电平,若为高电平则熄灭;所以如何配置P2口的高低电平(P2寄存器),就是怎么去控制这8颗LED灯。
2.软件设计
2.1.点亮一颗LED灯
功能需求:点亮D1这一颗LED灯
程序设计:根据原理图去配置对应的寄存器(P2口),去控制LED灯的亮灭状态,如:D1亮,其他灯不亮,即P20输入低电平,其他管脚输入高电平;
#include void main() { P2=0XFE;//1111 1110 D1灯亮,其他灯不亮 } 进阶1:除了main函数,增加循环语句while,while(1)表示当括号里边的逻辑表达式为真的时候;就执行大括号里边的内容 #include void main() { while(1) { P2=0XFE;//1111 1110 } } 进阶2:利用头文件中已经定义好的位寄存器,去单独控制我们想要控制的管脚,如:P2=0XFE-相当于P2_0=0 #include void main() { while(1) { P2_0=0;//P2=0XFE; } } 2.2.LED闪烁 功能需求:要让D1这颗LED灯,按固定延时呈闪烁现象 程序设计:闪烁无非就是将LED点亮,再熄灭,然后重复这个动作,但如果只是如下的程序方案,我们无法看到闪烁现象,因单片机的工作频率是以MHz为单位,亮灭之间,停留的时间太短,所以看到的现象就是个LED常亮的现象 #include void main() { while(1) { P2=0XFE;//1111 1110 点亮第一颗灯 P2=0XFF;//1111 1111 熄灭第一颗灯 } } 所以想要肉眼能看到LED的闪烁现象,需在亮灭之间,增加延时函数,如下:在亮灭各自的状态下,增加500毫秒延时; #include #include void Delay500ms() //@12.000MHz { unsigned char i, j, k; _nop_(); i = 4; j = 205; k = 187; do { do { while (--k); } while (--j); } while (--i); } void main() { while(1) { P2=0XFE;//1111 1110 Delay500ms();//延时500毫秒 P2=0XFF;//1111 1111 Delay500ms();//延时500毫秒 } } 延时函数,对初学者来说,不需要自己去编写,甚至其原理都可以不需要懂,可通过STC等工具自动生成,如: 2.3.LED流水灯 功能需求:LED流水灯的原理是让这8颗LED灯依次点亮,呈流水灯效果 软件设计:考虑LED灯依次点亮,考虑固定延时,如下:从第1-8颗灯依次点亮,且在每颗灯之间加入固定500ms的延时 #include #include void Delay500ms() //@12.000MHz { unsigned char i, j, k; _nop_(); i = 4; j = 205; k = 187; do { do { while (--k); } while (--j); } while (--i); } void main() { while(1) { P2=0XFE;//1111 1110 Delay500ms(); P2=0XFD;//1111 1101 Delay500ms(); P2=0XFB;//1111 1011 Delay500ms(); P2=0XF7;//1111 0111 Delay500ms(); P2=0XEF;//1110 1111 Delay500ms(); P2=0XDF;//1101 1111 Delay500ms(); P2=0XBF;//1011 1111 Delay500ms(); P2=0X7F;//0111 1111 Delay500ms(); } } 以上流水灯方案的的缺点是:延时固定,且不可调,除非重新修改延时函数;那怎么让流水灯的延时变得可调呢,如下: 进阶1:首先通过STC的延时计算器,生成1个固定的基本延时函数,然后增加无符号整形变量xms,然后通过改变delay函数括号里边的行参,即可调整每颗LED灯的延时参数; #include #include void Delay1ms(unsigned int xms) //@12.000MHz;设置无符号整形变量Xms { unsigned char i, j; while(xms)// 当xms非0,即循环后面的延时函数 { i = 2; j = 239; do { while (--j); } while (--i); xms--; } } void main() { while(1) { P2=0XFE;//1111 1110 Delay1ms(100);//延时100ms 执行括号里边的参数(行参) P2=0XFD;//1111 1101 Delay1ms(500);//延时500ms P2=0XFB;//1111 1011 Delay1ms(100); P2=0XF7;//1111 0111 Delay1ms(100); P2=0XEF;//1110 1111 Delay1ms(100); P2=0XDF;//1101 1111 Delay1ms(300);//延时300ms P2=0XBF;//1011 1111 Delay1ms(100); P2=0X7F;//0111 1111 Delay1ms(100); } } 3.知识点 3.1.while函数的应用 /*------------------------------------------------ 如果逻辑表达式成立 执行循环体 执行后再次判断 若还成立则继续执行直到表达式不成立 ------------------------------------------------*/ while(逻辑表达式) { 循环体; } 3.2.常用数据类型 3.3.延时函数的自动生成 通过STC生成想要的延时函数,需要注意的是系统频率要选择单片机对应的频率,确定需要延时的长度,选择适用单片机型号的指令集;
上一篇:51单片机-控制数码管
下一篇:c51单片机学习笔记-IO扩展(串转并)实验 - 74HC595
推荐阅读最新更新时间:2024-11-04 12:28
设计资源 培训 开发板 精华推荐
- z2m&& zigbee2mqtt网关
- LT3470AIDDB 3.3V 降压转换器的典型应用电路
- AM6TW-4803DZ ±3.3V 6 瓦单路输出 DC/DC 转换器的典型应用
- NCP1096GEVB:PoE-PD 接口控制器评估板,IEEE 802.3bt
- AZ7027RTR低压指示检测器典型应用电路
- 具有 8.5V 欠压锁定阈值的 LTC3119IUFD 12V 至 12V、1MHz 线路调节器的典型应用电路
- CS51031快速Pfet降压控制器的典型应用电路不需要补偿
- 用于首页应用的 LTC3374IUHF 降压稳压器的典型应用电路
- 电子CAD图3-1811571106
- 便携温湿度计