找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2853|回复: 20
收起左侧

请大家给小弟指点一下迷津。由于刚刚上手单片机程序

  [复制链接]
ID:607312 发表于 2021-1-22 16:03 | 显示全部楼层 |阅读模式
有一台风扇,上电时蜂鸣器长响一声(200ms)
有1个触摸开关按钮和一个风速触摸按钮。
按一下开关,风扇打开,默认1挡,再按一下开关,风扇关闭。
当风扇关闭时,按风速按钮,无反应
当风扇打开时,按一下风速按钮,风速变2挡,再按一下风速按钮,风速变3挡,再按一下风速按钮,
风速又变回1挡,无限循环
无论风速在哪个挡,只要按下开关键,都关闭
没按一次按钮,蜂鸣器嘀一声(100ms)


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


回复

使用道具 举报

ID:390416 发表于 2021-1-22 17:28 | 显示全部楼层
视频百度下载:https://pan.baidu.com/s/1qY6X3eG  
资料下载地址:https://pan.baidu.com/s/1bp4HLl9
给你发两个百度盘网址 希望对你的问题有帮助
回复

使用道具 举报

ID:235200 发表于 2021-1-22 22:49 | 显示全部楼层
当内功不够时,先从一个一个的IO口控制开始,不要搞太复杂的控制
回复

使用道具 举报

ID:213173 发表于 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. }
复制代码
回复

使用道具 举报

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

使用道具 举报

ID:826754 发表于 2021-1-23 10:47 | 显示全部楼层
wulin 发表于 2021-1-23 08:40
有画流程图的时间都可以写完代码了。

大神,这个代码可以用STC8G的单片机吗?
回复

使用道具 举报

ID:826754 发表于 2021-1-23 11:16 | 显示全部楼层
wulin 发表于 2021-1-23 08:40
有画流程图的时间都可以写完代码了。

程序中这句的主要起什么作用呢?每一种芯片是不一样的吗?
sfr AUXR=0x8E;                                                   //辅助寄存器
回复

使用道具 举报

ID:716656 发表于 2021-1-23 12:25 | 显示全部楼层
川蜀浪子 发表于 2021-1-23 11:16
程序中这句的主要起什么作用呢?每一种芯片是不一样的吗?
sfr AUXR=0x8E;                             ...

把程序复制到keil,编译,没问题。注释掉你不懂的这一行。看看提示哪有错误
回复

使用道具 举报

ID:213173 发表于 2021-1-23 13:59 | 显示全部楼层
川蜀浪子 发表于 2021-1-23 11:16
程序中这句的主要起什么作用呢?每一种芯片是不一样的吗?
sfr AUXR=0x8E;                             ...

你没有仔细看最前面的注释:程序适合STC15W104。考虑楼主用8脚芯片,所以推荐此型号。51头文件没有AUXR寄存器。所以要定义此特殊功能寄存器。
回复

使用道具 举报

ID:213173 发表于 2021-1-23 14:02 | 显示全部楼层
川蜀浪子 发表于 2021-1-23 10:47
大神,这个代码可以用STC8G的单片机吗?

同一公司产品,没用什么特殊功能,原则上没有问题。
回复

使用道具 举报

ID:826754 发表于 2021-1-23 16:04 | 显示全部楼层
压着我头发啦 发表于 2021-1-23 12:25
把程序复制到keil,编译,没问题。注释掉你不懂的这一行。看看提示哪有错误

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

51hei截图_20210123160121.png
回复

使用道具 举报

ID:826754 发表于 2021-1-23 16:05 | 显示全部楼层
wulin 发表于 2021-1-23 14:02
同一公司产品,没用什么特殊功能,原则上没有问题。

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

使用道具 举报

ID:517951 发表于 2021-1-23 16:44 | 显示全部楼层
代码发出来,看下又没问题
回复

使用道具 举报

ID:213173 发表于 2021-1-23 20:14 | 显示全部楼层
川蜀浪子 发表于 2021-1-23 16:04
请问一下使用STC8F的芯片,编译后出现重新定义是怎么回事?注译掉这行代码又可以。

STC8F.H头文件里已包含sfr AUXR=0x8E;当然会提示重复定义。注释掉即可。
回复

使用道具 举报

ID:878420 发表于 2021-1-23 20:49 | 显示全部楼层
学习C51半个月,一个计时小程序写不出来。书能看懂,自己写就是写不出来,被PLC编程逻辑固化了,用C语言写,总是不对,郁闷啊
回复

使用道具 举报

ID:607312 发表于 2021-1-23 21:13 | 显示全部楼层
munuc_w 发表于 2021-1-23 09:05
单片机应用编程,必须先有正确的硬件平台,控制软件随着硬件平台而变。就楼主的问题,如果是弱电控制,可 ...

能不能帮忙画一下流程图呢,方便理解。我现在想不到怎么画流程图。万分感谢
回复

使用道具 举报

ID:607312 发表于 2021-1-23 21:17 | 显示全部楼层
wulin 发表于 2021-1-23 08:40
有画流程图的时间都可以写完代码了。

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

使用道具 举报

ID:420836 发表于 2021-1-24 09:49 | 显示全部楼层
这里有很多优秀的单片机专家提供建议。 很有帮助。
回复

使用道具 举报

ID:880098 发表于 2021-1-24 14:01 | 显示全部楼层
wulin 发表于 2021-1-23 08:40
有画流程图的时间都可以写完代码了。

AUXR=0X8E先把16进制换成2进制,10001110,这个是规定寄存器的功能。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:592807 发表于 2021-1-25 08:42 | 显示全部楼层
cdiyy 发表于 2021-1-23 21:17
感谢大师的指教,小弟我刚刚接触单片机不久,我想通过流程图的方式来增强理解算法的问题。能不能帮帮忙画 ...

流程图就这样。
51hei截图20210125084124.png
回复

使用道具 举报

ID:847443 发表于 2021-1-25 16:38 | 显示全部楼层
你可以先用仿真的方法,这样就不用搭建硬件,由易到难,仿真能实现,硬件上基本就问题不大。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表