标题: 请大家给小弟指点一下迷津。由于刚刚上手单片机程序 [打印本页]

作者: cdiyy    时间: 2021-1-22 16:03
标题: 请大家给小弟指点一下迷津。由于刚刚上手单片机程序
有一台风扇,上电时蜂鸣器长响一声(200ms)
有1个触摸开关按钮和一个风速触摸按钮。
按一下开关,风扇打开,默认1挡,再按一下开关,风扇关闭。
当风扇关闭时,按风速按钮,无反应
当风扇打开时,按一下风速按钮,风速变2挡,再按一下风速按钮,风速变3挡,再按一下风速按钮,
风速又变回1挡,无限循环
无论风速在哪个挡,只要按下开关键,都关闭
没按一次按钮,蜂鸣器嘀一声(100ms)


以上功能说明我想通过流程图的方式表达出来,但是内功不够。麻烦大家帮帮忙指教一下。谢谢大家



作者: 人人学会单片机    时间: 2021-1-22 17:28
视频百度下载:https://pan.baidu.com/s/1qY6X3eG  
资料下载地址:https://pan.baidu.com/s/1bp4HLl9
给你发两个百度盘网址 希望对你的问题有帮助
作者: csmyldl    时间: 2021-1-22 22:49
当内功不够时,先从一个一个的IO口控制开始,不要搞太复杂的控制
作者: wulin    时间: 2021-1-23 08:40
有画流程图的时间都可以写完代码了。
  1. //程序适合STC15W104,时钟11.0592MHz
  2. #include <reg51.H>                                         //单片机头文件
  3. sfr AUXR=0x8E;                                                   //辅助寄存器
  4. #define uint unsigned int                         //宏定义数据类型uint
  5. #define uchar unsigned char                 //宏定义数据类型uchar
  6. //输入输出端口定义
  7. sbit key1=P3^0;                                                //开关
  8. sbit key2=P3^1;                                                //调速
  9. sbit OUT1=P3^2;                                                //风速1挡
  10. sbit OUT2=P3^3;                                                //风速2挡
  11. sbit OUT3=P3^4;                                                //风速3挡
  12. sbit Buzzer=P3^5;                                                //蜂鸣器
  13. //全局变量声明
  14. bit   Switch=0;                                                //开关机标志位
  15. uchar Speed=0;                                                //速度控制变量
  16. uint  num;
  17. /*------------------------
  18.     初始化定时器
  19. ------------------------*/
  20. void Timer0Init()                //250微秒@11.0592MHz
  21. {
  22.         AUXR &= 0x7F;                //定时器时钟12T模式
  23.         TMOD &= 0xF0;                //设置定时器模式
  24.         TMOD |= 0x02;                //设置定时器模式
  25.         TL0 = 0x1A;                   //设置定时初值
  26.         TH0 = 0x1A;                        //设置定时重载值
  27.         TR0 = 1;                                //定时器0开始计时
  28.         ET0 = 1;                                //开T0中断
  29.         EA  = 1;                                //开总中断
  30. }
  31. /*------------------------
  32.     按键扫描函数
  33. ------------------------*/
  34. void keyscan()       
  35. {
  36.         static bit key_sign=0;                        //按键状态标志
  37.         static uint count=0;                        //计数变量                       
  38.         if(!key1||!key2)                                //检测有按键操作
  39.         {
  40.                 if(++count>=1400 && key_sign==0)//消抖延时
  41.                 {
  42.                         key_sign=1;                                //按键状态标志置1
  43.                         num = 400;                                //蜂鸣器响100ms
  44.                         TR0 = 1;                                        //定时器0开始计时
  45.                         if(!key1)                                //检测开关键按下
  46.                         {
  47.                                 Switch=~Switch;                //开关机标志位取反
  48.                                 if(Switch)
  49.                                         Speed=1;                        //默认1挡
  50.                                 else Speed=0;                        //停
  51.                         }
  52.                         if(!key2 && Switch==1)        //检测调速键按下并且开机有效
  53.                         {
  54.                                 Speed++;
  55.                                 if(Speed>=4)                        //循环调速
  56.                                         Speed=1;
  57.                         }
  58.                 }
  59.         }       
  60.         else
  61.         {
  62.                 key_sign=0;                                        //按键状态标志清0
  63.                 count=0;                                        //消抖计数清0
  64.         }
  65. }
  66. /*------------------------
  67.     主函数
  68. ------------------------*/
  69. void main()                                                       
  70. {
  71.         num=800;//蜂鸣器响200ms
  72.         Timer0Init();
  73.         while(1)
  74.         {
  75.                 keyscan();
  76.                 switch(Speed)
  77.                 {
  78.                         case 0: OUT1=1;OUT2=1;OUT3=1;break;//停止
  79.                         case 1: OUT1=0;OUT2=1;OUT3=1;break;//1挡
  80.                         case 2: OUT1=1;OUT2=0;OUT3=1;break;//2挡
  81.                         case 3: OUT1=1;OUT2=1;OUT3=0;break;//3挡
  82.                 }
  83.         }
  84. }
  85. /*----------------------------
  86. 中断服务函数(驱动无源蜂鸣器)
  87. -----------------------------*/
  88. void Timer0Interrupt(void) interrupt 1
  89. {
  90.         static uint count=0;                        //计数变量
  91.         count++;
  92.         Buzzer=~Buzzer;                                //驱动无源蜂鸣器
  93.         if(count>=num)
  94.         {
  95.                 TR0 = 0;                                                //关闭定时器
  96.                 count=0;                                                //清0
  97.                 Buzzer=1;                                        //复位
  98.         }
  99. }
复制代码

作者: munuc_w    时间: 2021-1-23 09:05
单片机应用编程,必须先有正确的硬件平台,控制软件随着硬件平台而变。就楼主的问题,如果是弱电控制,可以用计数的方法实现,电源开关计数在0和1之间循环,0关风扇,1启动风扇并作为调速的必要条件。调速开关在0,1,2(或1,2,3)之间循环,0对应1档,1对应2档,2对应3档。

作者: 川蜀浪子    时间: 2021-1-23 10:47
wulin 发表于 2021-1-23 08:40
有画流程图的时间都可以写完代码了。

大神,这个代码可以用STC8G的单片机吗?
作者: 川蜀浪子    时间: 2021-1-23 11:16
wulin 发表于 2021-1-23 08:40
有画流程图的时间都可以写完代码了。

程序中这句的主要起什么作用呢?每一种芯片是不一样的吗?
sfr AUXR=0x8E;                                                   //辅助寄存器
作者: 压着我头发啦    时间: 2021-1-23 12:25
川蜀浪子 发表于 2021-1-23 11:16
程序中这句的主要起什么作用呢?每一种芯片是不一样的吗?
sfr AUXR=0x8E;                             ...

把程序复制到keil,编译,没问题。注释掉你不懂的这一行。看看提示哪有错误
作者: wulin    时间: 2021-1-23 13:59
川蜀浪子 发表于 2021-1-23 11:16
程序中这句的主要起什么作用呢?每一种芯片是不一样的吗?
sfr AUXR=0x8E;                             ...

你没有仔细看最前面的注释:程序适合STC15W104。考虑楼主用8脚芯片,所以推荐此型号。51头文件没有AUXR寄存器。所以要定义此特殊功能寄存器。
作者: wulin    时间: 2021-1-23 14:02
川蜀浪子 发表于 2021-1-23 10:47
大神,这个代码可以用STC8G的单片机吗?

同一公司产品,没用什么特殊功能,原则上没有问题。
作者: 川蜀浪子    时间: 2021-1-23 16:04
压着我头发啦 发表于 2021-1-23 12:25
把程序复制到keil,编译,没问题。注释掉你不懂的这一行。看看提示哪有错误

请问一下使用STC8F的芯片,编译后出现重新定义是怎么回事?注译掉这行代码又可以。

51hei截图_20210123160121.png (107.09 KB, 下载次数: 98)

51hei截图_20210123160121.png

作者: 川蜀浪子    时间: 2021-1-23 16:05
wulin 发表于 2021-1-23 14:02
同一公司产品,没用什么特殊功能,原则上没有问题。

刚试了一下8F的芯片可以用。

作者: rayin    时间: 2021-1-23 16:44
代码发出来,看下又没问题
作者: wulin    时间: 2021-1-23 20:14
川蜀浪子 发表于 2021-1-23 16:04
请问一下使用STC8F的芯片,编译后出现重新定义是怎么回事?注译掉这行代码又可以。

STC8F.H头文件里已包含sfr AUXR=0x8E;当然会提示重复定义。注释掉即可。
作者: 51mcu学习    时间: 2021-1-23 20:49
学习C51半个月,一个计时小程序写不出来。书能看懂,自己写就是写不出来,被PLC编程逻辑固化了,用C语言写,总是不对,郁闷啊
作者: cdiyy    时间: 2021-1-23 21:13
munuc_w 发表于 2021-1-23 09:05
单片机应用编程,必须先有正确的硬件平台,控制软件随着硬件平台而变。就楼主的问题,如果是弱电控制,可 ...

能不能帮忙画一下流程图呢,方便理解。我现在想不到怎么画流程图。万分感谢
作者: cdiyy    时间: 2021-1-23 21:17
wulin 发表于 2021-1-23 08:40
有画流程图的时间都可以写完代码了。

感谢大师的指教,小弟我刚刚接触单片机不久,我想通过流程图的方式来增强理解算法的问题。能不能帮帮忙画一下呢

作者: TTQ001    时间: 2021-1-24 09:49
这里有很多优秀的单片机专家提供建议。 很有帮助。
作者: jyb-jyb-2    时间: 2021-1-24 14:01
wulin 发表于 2021-1-23 08:40
有画流程图的时间都可以写完代码了。

AUXR=0X8E先把16进制换成2进制,10001110,这个是规定寄存器的功能。
作者: 黄youhui    时间: 2021-1-25 08:42
cdiyy 发表于 2021-1-23 21:17
感谢大师的指教,小弟我刚刚接触单片机不久,我想通过流程图的方式来增强理解算法的问题。能不能帮帮忙画 ...

流程图就这样。

51hei截图20210125084124.png (18.37 KB, 下载次数: 77)

51hei截图20210125084124.png

作者: jchrui    时间: 2021-1-25 16:38
你可以先用仿真的方法,这样就不用搭建硬件,由易到难,仿真能实现,硬件上基本就问题不大。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1