模吧

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

[单片机课堂] 第五课:进军!神奇的程序世界

  [复制链接]
发表于 2016-9-13 17:15:52 来自手机 | 显示全部楼层
闲麻烦LED没加限流电阻用IO直驱  不知道能亮多久呵呵
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2016-9-13 19:02:05 | 显示全部楼层
ldy7474 发表于 2016-9-13 12:33
谢谢老大解惑  将一个函数封装到另外一个函数再到主函数直接调用很巧妙  扩宽了思路也让程序更清晰  更好 ...

是的以后会学习按键程序
回复 支持 0 反对 1

使用道具 举报

发表于 2016-9-14 09:18:33 | 显示全部楼层
虽然不是很明白,慢慢会搞懂的,给自己加油。
回复 支持 0 反对 1

使用道具 举报

发表于 2016-9-14 09:48:34 | 显示全部楼层
建议楼主七彩灯用遥控器控制也加上,两种控制同步进行讲解,方便用在模型上的童鞋。

点评

这个在以后讲  详情 回复 发表于 2016-9-15 00:30
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-9-15 00:30:48 | 显示全部楼层
rensanny 发表于 2016-9-14 09:48
建议楼主七彩灯用遥控器控制也加上,两种控制同步进行讲解,方便用在模型上的童鞋。 ...

这个在以后讲
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 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;  //否则亮绿灯
}

赶快写程序试一下吧。


  1. #include<reg51.h>


  2. sbit LED_R=P3^4;//定义红灯
  3. sbit LED_G=P3^3;//定义绿灯
  4. sbit LED_B=P3^2;//定义蓝灯

  5. sbit Key1=P3^0;//定义按键


  6. void Delay1ms()                //@12.000MHz
  7. {
  8.         unsigned char i, j;

  9.         i = 12;
  10.         j = 169;
  11.         do
  12.         {
  13.                 while (--j);
  14.         } while (--i);
  15. }

  16. void delay_n_ms(unsigned int n) //自己定义的延时n毫秒函数
  17. {
  18.         while(n)         
  19.         {
  20.                 Delay1ms();
  21.                 n=n-1;//每循环一次n减小1
  22.         }   
  23. }


  24. main()
  25. {
  26.         
  27.         while(1)
  28.         {
  29.                
  30.                 if(Key1==0)  //如果按键按下,引脚读到低电平
  31.                 {
  32.                                 LED_R=1;
  33.                                 LED_G=0;
  34.                                 LED_B=0;  //亮红灯
  35.                 }
  36.                 else
  37.                 {
  38.                                 LED_R=0;
  39.                                 LED_G=1;
  40.                                 LED_B=0;  //否则亮绿灯
  41.                 }
  42.                
  43.                 delay_n_ms(100);//延时0.1秒 程序每秒检测10次按键

  44.         }
  45.         
  46. }
复制代码



回复 支持 0 反对 1

使用道具 举报

发表于 2016-9-15 20:45:55 来自手机 | 显示全部楼层
我爱萝丽爱萝丽 发表于 2016-9-15 13:29
1.2 按键输入

单片机的三要素是什么?我认为是输入、处理、输出。上一节已经学了简单的处理和输出,这一节 ...

中秋节快乐
老大又更新了我都等不急了马上做作业
我还有个想法  很多童鞋碰到接收机做好了某个通道没法控制   示波器太贵也没必要  但是
利用普通设备又没法检测到底是什么问题  可以开发一个专门检测通道是否有输出的设备
利用外部中断测量脉宽的办法再结合串口住手把数据发送到PC然后判断接收机是否正常工作



点评

原来的万能仪表有测量脉宽的功能。其实插上舵机就知道有没有输出了  详情 回复 发表于 2016-9-17 12:02
回复 支持 0 反对 1

使用道具 举报

发表于 2016-9-16 22:01:31 | 显示全部楼层
我爱萝丽爱萝丽 发表于 2016-9-15 13:29
1.2 按键输入

单片机的三要素是什么?我认为是输入、处理、输出。上一节已经学了简单的处理和输出,这一节 ...

请教萝莉大神 实验报告 上面的程序只能Key1按下的时候执行
else里面的程序松手之后又跳回if
该怎么做才能按一按下按键松手之后单片机执行
else
里面的语句?
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-9-17 12:02:34 | 显示全部楼层
ldy7474 发表于 2016-9-15 20:45
中秋节快乐
老大又更新了我都等不急了马上做作业
我还有个想法  很多童鞋碰到接收机做好了某个通道没法控 ...

原来的万能仪表有测量脉宽的功能。其实插上舵机就知道有没有输出了。你说的按键什么意思没看懂
回复 支持 0 反对 1

使用道具 举报

发表于 2016-9-17 13:24:54 来自手机 | 显示全部楼层
我爱萝丽爱萝丽 发表于 2016-9-17 12:02
原来的万能仪表有测量脉宽的功能。其实插上舵机就知道有没有输出了。你说的按键什么意思没看懂
...

简单点解释就是一键多功能
程序初始默认灯全灭  按第一次红灯亮
再按一次  黄灯亮红灯灭  再按一次黄灯灭禄灯亮  
我尝试着修改了程序
if(kely1==1)检测到按键按下
delay  ms(20);延时消抖
while(!kely);等待按键松开
然后i=i++;
用if判断i的值
if(i==1)
led1=1;开红灯
if(i==2)
led1=0关红灯
led2=1开黄灯
大概思路就是这样可是程序调不通
请教大神我的编程思路是否正确

点评

正好,你想的也是我刚讲的  详情 回复 发表于 2016-9-17 15:21
回复 支持 1 反对 0

使用道具 举报

发表于 2016-9-17 13:29:58 来自手机 | 显示全部楼层
我爱萝丽爱萝丽 发表于 2016-9-17 12:02
原来的万能仪表有测量脉宽的功能。其实插上舵机就知道有没有输出了。你说的按键什么意思没看懂
...

其实也就是借用串口助手  节省一个lcd
硬件开销就少很多电路也更简洁用8脚的ic接电脑就可以实现  当然这是我自己的想法  
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 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判断不同的值显示不同颜色不就可以了么?
本课的主要内容就是这些了,更多精彩下一课再见
  1. #include<reg51.h>


  2. sbit LED_R=P3^4;//定义红灯
  3. sbit LED_G=P3^3;//定义绿灯
  4. sbit LED_B=P3^2;//定义蓝灯

  5. sbit Key1=P3^0;//定义按键



  6. unsigned char mode; //定义一个数据,指示不同状态。定义后mode的值是0


  7. void Delay1ms()                //@12.000MHz
  8. {
  9.         unsigned char i, j;

  10.         i = 12;
  11.         j = 169;
  12.         do
  13.         {
  14.                 while (--j);
  15.         } while (--i);
  16. }

  17. void delay_n_ms(unsigned int n) //自己定义的延时n毫秒函数
  18. {
  19.         while(n)         
  20.         {
  21.                 Delay1ms();
  22.                 n=n-1;//每循环一次n减小1
  23.         }   
  24. }


  25. main()
  26. {
  27.         
  28.         while(1)
  29.         {
  30.                
  31.                 if(Key1==0)  //如果按键按下,引脚读到低电平
  32.                 {
  33.                         mode=mode+1;  //每按一次按键,颜色模式改变
  34.                         if(mode>7)
  35.                         {
  36.                                 mode=0;     //七种颜色切换完,回到0重新开始
  37.                         }
  38.                 }               
  39.                
  40.                 if(mode==0)                //模式0,熄灭
  41.                 {
  42.                                 LED_R=0;
  43.                                 LED_G=0;
  44.                                 LED_B=0;  
  45.                 }             //没有else可以不写
  46.                
  47.                 if(mode==1)  //模式1,红色
  48.                 {
  49.                                 LED_R=1;
  50.                                 LED_G=0;
  51.                                 LED_B=0;
  52.                 }
  53.                
  54.                 if(mode==2)  //模式2,黄色
  55.                 {
  56.                                 LED_R=1;
  57.                                 LED_G=1;
  58.                                 LED_B=0;
  59.                 }
  60.                
  61.                 if(mode==3)  //模式3,绿色
  62.                 {
  63.                                 LED_R=0;
  64.                                 LED_G=1;
  65.                                 LED_B=0;
  66.                 }
  67.                
  68.                 if(mode==4)  //模式4,青色
  69.                 {
  70.                                 LED_R=0;
  71.                                 LED_G=1;
  72.                                 LED_B=1;
  73.                 }
  74.                
  75.                 if(mode==5)  //模式5,蓝色
  76.                 {
  77.                                 LED_R=0;
  78.                                 LED_G=0;
  79.                                 LED_B=1;
  80.                 }
  81.                
  82.                 if(mode==6)  //模式6,紫色
  83.                 {
  84.                                 LED_R=1;
  85.                                 LED_G=0;
  86.                                 LED_B=1;
  87.                 }
  88.                
  89.                 if(mode==7)  //模式7,白色
  90.                 {
  91.                                 LED_R=1;
  92.                                 LED_G=1;
  93.                                 LED_B=1;
  94.                 }
  95.                
  96.                 delay_n_ms(150);//程序每0.15秒检测一次按键

  97.         }
  98.         
  99. }
复制代码



回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-9-17 15:21:14 | 显示全部楼层
ldy7474 发表于 2016-9-17 13:24
简单点解释就是一键多功能
程序初始默认灯全灭  按第一次红灯亮
再按一次  黄灯亮红灯灭  再按一次黄灯灭 ...

正好,你想的也是我刚讲的
回复 支持 0 反对 1

使用道具 举报

发表于 2016-9-17 15:23:10 | 显示全部楼层
请问
unsigned char mode; //定义一个数据,指示不同状态

这个MODE是不是自动从0开始赋值,要不程序如何知道从哪个开始执行

点评

是的,这个多亏你提醒,会补充  详情 回复 发表于 2016-9-18 02:17
回复 支持 1 反对 0

使用道具 举报

发表于 2016-9-17 16:29:26 | 显示全部楼层
顶一个,萝丽的教学方式非常适合我这零基础的,简单易懂,不像书上那样拐弯抹角。希望萝丽代码多点注译。第五课:进军!神奇的程序世界  作者:机甲老顽童 6154

点评

恩,基本上都注释了  详情 回复 发表于 2016-9-18 02:35
回复 支持 1 反对 0

使用道具 举报

发表于 2016-9-17 17:45:33 来自手机 | 显示全部楼层
815023524 发表于 2016-9-17 15:23
请问
unsigned char mode; //定义一个数据,指示不同状态


你可以在程序开头  mode=0;
用程序mode决定开始的值我是这么理解的
我还没有做实验不好下结论

回复 支持 1 反对 0

使用道具 举报

发表于 2016-9-17 19:15:53 来自手机 | 显示全部楼层
我爱萝丽爱萝丽 发表于 2016-9-17 14:01
1.3 多种模式切换



谢谢楼主解惑  还有新型的按键检测思路的确不错  让我茅塞顿开  我的单片机没接按键我是用面板板加杜邦线 做的实验时每次用导线去碰GND   我先做实验看看0.15秒的延时够不够不够我自己再改
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-9-18 02:17:27 | 显示全部楼层
815023524 发表于 2016-9-17 15:23
请问
unsigned char mode; //定义一个数据,指示不同状态

是的,这个多亏你提醒,会补充
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-9-18 02:35:53 | 显示全部楼层
yrj 发表于 2016-9-17 16:29
顶一个,萝丽的教学方式非常适合我这零基础的,简单易懂,不像书上那样拐弯抹角。希望萝丽代码多点注译。
...

恩,基本上都注释了
回复 支持 0 反对 1

使用道具 举报

发表于 2016-9-18 14:46:38 来自手机 | 显示全部楼层
本帖最后由 ldy7474 于 2016-9-18 14:59 编辑
我爱萝丽爱萝丽 发表于 2016-9-18 02:35
恩,基本上都注释了


楼主现在彩灯基本上都玩透了要不接下来教我们  硬件PWM和软件  PWM 很多人都听说过这个名词  感兴趣的人非常多  现在15w104内部除了中断和定时器  就没啥可以学的了  下期的课程我个人建议用 STC15w408AS这个片子来开展便宜内部功能也足够丰富  基本新型51的内部资源它都有选DIP28的版本IO也多方便扩展其它功能 能玩好久不用晶振用面包板做实验电路特别方便电路越简单做测试效率高很多

点评

你的思维还是不对,你想的是赶快学更多知识,而不是认真做项目。学了表层的知识就认为已经会了,实际上做项目还是抓瞎。只有深入做项目才能真正学会单片机。以后会用到408单片机的  详情 回复 发表于 2016-9-19 02:17
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|关于模吧|APP下载|广告报价|小黑屋|手机版|企业会员|商城入驻|联系我们|模吧 ( 冀公网安备13080502000084号 )

© 2013-2020 Moz8.com 模吧,玩出精彩!