ldy7474
发表于 2016-9-13 17:15:52
闲麻烦LED没加限流电阻用IO直驱不知道能亮多久呵呵
我爱萝丽爱萝丽
发表于 2016-9-13 19:02:05
ldy7474 发表于 2016-9-13 12:33
谢谢老大解惑将一个函数封装到另外一个函数再到主函数直接调用很巧妙扩宽了思路也让程序更清晰更好 ...
是的以后会学习按键程序
rensanny
发表于 2016-9-14 09:18:33
虽然不是很明白,慢慢会搞懂的,给自己加油。
rensanny
发表于 2016-9-14 09:48:34
建议楼主七彩灯用遥控器控制也加上,两种控制同步进行讲解,方便用在模型上的童鞋。
我爱萝丽爱萝丽
发表于 2016-9-15 00:30:48
rensanny 发表于 2016-9-14 09:48
建议楼主七彩灯用遥控器控制也加上,两种控制同步进行讲解,方便用在模型上的童鞋。 ...
这个在以后讲
我爱萝丽爱萝丽
发表于 2016-9-15 13:29:21
本帖最后由 我爱萝丽爱萝丽 于 2016-11-9 04:35 编辑
1.2 按键输入
单片机的三要素是什么?我认为是输入、处理、输出。上一节已经学了简单的处理和输出,这一节再学一下输入你就可以毕业啦 ≧▽≦
单片机最普遍的输入就是按键。
知识点(20) 按键的工作原理:
单片机引脚设置为高电平,通过按键接到地。
按键没有按下:单片机引脚还是高电平;
按键被按下:单片机引脚接地,变成低电平。程序读一下引脚电平就可以知道有没有按下。
知识点(21) 为什么通常按键接地
单片机的引脚在默认模式下,引脚内部是串联一个电阻接到正极的,当你的按键导通时,电流很小,不会有什么影响。
但是单片机的低电平是没有串联电阻的,如果你用按键连到正极,相当于将正反短路,可能会损坏引脚。
程序如何读引脚的状态?同样,要想先读引脚,也要先定义才能用,在我们焊接的电路中,一个按键接在P3.0引脚上:
sbit Key1=P3^0;定义之后,不进可以控制,还可以读。
知识点(22) if判断语句
if(?){ 1 } 如果?是真的,执行括号1里面的程序
else{ 2 } 否则就执行2里面的程序
单片机有哪些语句?循环和判断,无非就这两种,所有复杂的程序都是这两个组合起来的。
现在你已经都学了,是不是感觉单片机其实也没那么复杂?
知识点(23) =和==
等于 和 是否等于。
单片机语言中,有两种等于号,这点务必分清。
n=1000; n等于1000,是向n写入1000
n==1000; n是否等于1000?是对n进行判断。
知识点(24) 判断引脚状态的程序实例
if(Key1==0)//如果按键按下,引脚读到低电平
{
LED_R=1;
LED_G=0;
LED_B=0;//亮红灯
}
else
{
LED_R=0;
LED_G=1;
LED_B=0;//否则亮绿灯
}
赶快写程序试一下吧。
#include<reg51.h>
sbit LED_R=P3^4;//定义红灯
sbit LED_G=P3^3;//定义绿灯
sbit LED_B=P3^2;//定义蓝灯
sbit Key1=P3^0;//定义按键
void Delay1ms() //@12.000MHz
{
unsigned char i, j;
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
void delay_n_ms(unsigned int n) //自己定义的延时n毫秒函数
{
while(n)
{
Delay1ms();
n=n-1;//每循环一次n减小1
}
}
main()
{
while(1)
{
if(Key1==0)//如果按键按下,引脚读到低电平
{
LED_R=1;
LED_G=0;
LED_B=0;//亮红灯
}
else
{
LED_R=0;
LED_G=1;
LED_B=0;//否则亮绿灯
}
delay_n_ms(100);//延时0.1秒 程序每秒检测10次按键
}
}
ldy7474
发表于 2016-9-15 20:45:55
我爱萝丽爱萝丽 发表于 2016-9-15 13:29
1.2 按键输入
单片机的三要素是什么?我认为是输入、处理、输出。上一节已经学了简单的处理和输出,这一节 ...
中秋节快乐
老大又更新了我都等不急了马上做作业
我还有个想法很多童鞋碰到接收机做好了某个通道没法控制 示波器太贵也没必要但是
利用普通设备又没法检测到底是什么问题可以开发一个专门检测通道是否有输出的设备
利用外部中断测量脉宽的办法再结合串口住手把数据发送到PC然后判断接收机是否正常工作
ldy7474
发表于 2016-9-16 22:01:31
我爱萝丽爱萝丽 发表于 2016-9-15 13:29
1.2 按键输入
单片机的三要素是什么?我认为是输入、处理、输出。上一节已经学了简单的处理和输出,这一节 ...
请教萝莉大神 实验报告 上面的程序只能Key1按下的时候执行
else里面的程序松手之后又跳回if
该怎么做才能按一按下按键松手之后单片机执行
else
里面的语句?
我爱萝丽爱萝丽
发表于 2016-9-17 12:02:34
ldy7474 发表于 2016-9-15 20:45
中秋节快乐
老大又更新了我都等不急了马上做作业
我还有个想法很多童鞋碰到接收机做好了某个通道没法控 ...
原来的万能仪表有测量脉宽的功能。其实插上舵机就知道有没有输出了。你说的按键什么意思没看懂
ldy7474
发表于 2016-9-17 13:24:54
我爱萝丽爱萝丽 发表于 2016-9-17 12:02
原来的万能仪表有测量脉宽的功能。其实插上舵机就知道有没有输出了。你说的按键什么意思没看懂
...
简单点解释就是一键多功能
程序初始默认灯全灭按第一次红灯亮
再按一次黄灯亮红灯灭再按一次黄灯灭禄灯亮
我尝试着修改了程序
if(kely1==1)检测到按键按下
delayms(20);延时消抖
while(!kely);等待按键松开
然后i=i++;
用if判断i的值
if(i==1)
led1=1;开红灯
if(i==2)
led1=0关红灯
led2=1开黄灯
大概思路就是这样可是程序调不通
请教大神我的编程思路是否正确
ldy7474
发表于 2016-9-17 13:29:58
我爱萝丽爱萝丽 发表于 2016-9-17 12:02
原来的万能仪表有测量脉宽的功能。其实插上舵机就知道有没有输出了。你说的按键什么意思没看懂
...
其实也就是借用串口助手节省一个lcd
硬件开销就少很多电路也更简洁用8脚的ic接电脑就可以实现当然这是我自己的想法
我爱萝丽爱萝丽
发表于 2016-9-17 14:01:37
本帖最后由 我爱萝丽爱萝丽 于 2016-9-18 02:34 编辑
1.3 多种模式切换
前面学习的按键检测只能简单的切换两种状态,如果想要通过按键改变七种色彩该怎么做呢?
通常一般的单片机教材在讲按键检测时,都会教你用delay延时等待按键弹起、等待按键稳定……我不会这样给你讲。这样有什么问题吗?
我的导师在喝酒时都会大骂教材中的各种错误,“等待按键弹起?按键坏了弹不起来怎么办?程序死机??!”
而在我看来,教材中的各种错误,影响远不止这么点。很多学生学了delay检测按键,一辈子都只会用delay,容易养成错误的程序思维,走向歧途,缺乏对单片机的“时间片”的概念,日后难以写出复杂、实时性的程序。所以,我要在一开始,就把“时间片”的概念深印在你心中。
知识点(25) 单片机的运行与“时间片”
首先要知道,单片机能干什么?我们的电脑CPU实际上也可以看成是一个速度超快的单片机,它能一边挂QQ、一边看网页、一边打游戏,它是不是可以同时处理很多任务?NO,事实上,单片机同一时间,只能做一件事,CPU只是聪明的划分出了很多很小的“时间片”,一个很短的时间内,只执行QQ,另一个很短的时间内,只执行游戏,一秒钟内“时间片”切换几十次,看起来就像是同时在做多种事了。这种方式是单片机最正确的处理方式,以后在考虑程序时,先从时间片角度出发!
我们现在的任务很简单,检测按键,然后改变颜色,现在还用不到时间片这么高大上的东西,但对检测周期还要有一个概念:人类按一次按键大概需要0.3秒,我们大概每0.15秒检测一下按键就能满足需要。
知识点(26) 如何区分多种状态
我们的七色光芒有七种颜色,如果算上熄灭,至少有8种状态,怎么用程序对应8种状态呢?
你需要先定义一个数据:比如mode;如果mode等于0,代表熄灭,mode等于1,代表红色……mode不同的值就能代表不同状态。
知识点(27) unsigned char mode;
unsigned char 是定义数据的关键字,代表定义一个大小是0~255的数。255种模式,够用了吧。
知识点(28) 全局变量
我们定义的mode在整个程序中都会用到,所以需要定义在程序开头,它就叫做全局变量。
定义在程序开头的变量默认都是0。
想到怎么做了吗?我们每检测一次按键,就改变一下mode的值,指示颜色改变了,再用if判断不同的值显示不同颜色不就可以了么?
本课的主要内容就是这些了,更多精彩下一课再见
#include<reg51.h>
sbit LED_R=P3^4;//定义红灯
sbit LED_G=P3^3;//定义绿灯
sbit LED_B=P3^2;//定义蓝灯
sbit Key1=P3^0;//定义按键
unsigned char mode; //定义一个数据,指示不同状态。定义后mode的值是0
void Delay1ms() //@12.000MHz
{
unsigned char i, j;
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
void delay_n_ms(unsigned int n) //自己定义的延时n毫秒函数
{
while(n)
{
Delay1ms();
n=n-1;//每循环一次n减小1
}
}
main()
{
while(1)
{
if(Key1==0)//如果按键按下,引脚读到低电平
{
mode=mode+1;//每按一次按键,颜色模式改变
if(mode>7)
{
mode=0; //七种颜色切换完,回到0重新开始
}
}
if(mode==0) //模式0,熄灭
{
LED_R=0;
LED_G=0;
LED_B=0;
} //没有else可以不写
if(mode==1)//模式1,红色
{
LED_R=1;
LED_G=0;
LED_B=0;
}
if(mode==2)//模式2,黄色
{
LED_R=1;
LED_G=1;
LED_B=0;
}
if(mode==3)//模式3,绿色
{
LED_R=0;
LED_G=1;
LED_B=0;
}
if(mode==4)//模式4,青色
{
LED_R=0;
LED_G=1;
LED_B=1;
}
if(mode==5)//模式5,蓝色
{
LED_R=0;
LED_G=0;
LED_B=1;
}
if(mode==6)//模式6,紫色
{
LED_R=1;
LED_G=0;
LED_B=1;
}
if(mode==7)//模式7,白色
{
LED_R=1;
LED_G=1;
LED_B=1;
}
delay_n_ms(150);//程序每0.15秒检测一次按键
}
}
我爱萝丽爱萝丽
发表于 2016-9-17 15:21:14
ldy7474 发表于 2016-9-17 13:24
简单点解释就是一键多功能
程序初始默认灯全灭按第一次红灯亮
再按一次黄灯亮红灯灭再按一次黄灯灭 ...
正好,你想的也是我刚讲的
815023524
发表于 2016-9-17 15:23:10
请问
unsigned char mode; //定义一个数据,指示不同状态
这个MODE是不是自动从0开始赋值,要不程序如何知道从哪个开始执行
机甲老顽童
发表于 2016-9-17 16:29:26
顶一个,萝丽的教学方式非常适合我这零基础的,简单易懂,不像书上那样拐弯抹角。希望萝丽代码多点注译。http://www.moz8.com//mobcent//app/data/phiz/default/03.png
ldy7474
发表于 2016-9-17 17:45:33
815023524 发表于 2016-9-17 15:23
请问
unsigned char mode; //定义一个数据,指示不同状态
你可以在程序开头mode=0;
用程序mode决定开始的值我是这么理解的
我还没有做实验不好下结论
ldy7474
发表于 2016-9-17 19:15:53
我爱萝丽爱萝丽 发表于 2016-9-17 14:01
1.3 多种模式切换
谢谢楼主解惑还有新型的按键检测思路的确不错让我茅塞顿开我的单片机没接按键我是用面板板加杜邦线 做的实验时每次用导线去碰GND 我先做实验看看0.15秒的延时够不够不够我自己再改
我爱萝丽爱萝丽
发表于 2016-9-18 02:17:27
815023524 发表于 2016-9-17 15:23
请问
unsigned char mode; //定义一个数据,指示不同状态
是的,这个多亏你提醒,会补充
我爱萝丽爱萝丽
发表于 2016-9-18 02:35:53
yrj 发表于 2016-9-17 16:29
顶一个,萝丽的教学方式非常适合我这零基础的,简单易懂,不像书上那样拐弯抹角。希望萝丽代码多点注译。
...
恩,基本上都注释了
ldy7474
发表于 2016-9-18 14:46:38
本帖最后由 ldy7474 于 2016-9-18 14:59 编辑
我爱萝丽爱萝丽 发表于 2016-9-18 02:35
恩,基本上都注释了
楼主现在彩灯基本上都玩透了要不接下来教我们硬件PWM和软件PWM 很多人都听说过这个名词感兴趣的人非常多现在15w104内部除了中断和定时器就没啥可以学的了下期的课程我个人建议用 STC15w408AS这个片子来开展便宜内部功能也足够丰富基本新型51的内部资源它都有选DIP28的版本IO也多方便扩展其它功能 能玩好久不用晶振用面包板做实验电路特别方便电路越简单做测试效率高很多