前言

学习了数码管扫描,按键扫描,定时器,中断,三极管,pwm后浅试项目。初始为2分钟倒计时,风速为A,红灯800ms闪烁一次,蓝灯跟随风速不同亮度不同,使用按键控制。按键k1控制计时,按后停止倒计时,k2k3为加减分钟,k4退出调时进行倒计时,没有按k1直接按k2k3k4控制风速A(占空比30)B(占空比50)C(占空比70)。

代码思路

使用定时器0和中断1使cnt每一ms加加一次,1000时清0同时让倒计时总秒数减一。pwm利用cnt%的结果来控制停止转动(如占空比70就是cnt%10小于8时通电大于等于8断电) 。按键k2k2一键多用(使k1控制变量a的值 见代码)。数码管扫描利用中断每1ms扫描一次消隐消抖,按键扫描中断使用16ms连续扫描。代码可优化空间为按键扫描使用for循环简化等,可提高空间为利用串口通信,红外通信控制。

主要问题

1:调时时数码管显示但停止计时

k1按后控制某变量数值改变,在计时模块在if(某变量==某某)里

2:单片机电流驱动不了电机

利用三极管放大电流

3:数码管只有一个亮

使用switch扫描时case要空一格在写数字,case后面语句某变量加加使下一次中断时显示下一行,注意这个某变量用局部静态变量或全局变量,否则只能显示一个数码管。case后break语句不能丢。

4:按键抖动

如果启用一个定时中断,每2ms进一次中断,扫描一次按键状态并且存储起来,连续扫描8次后,看看这连续8次的按键状态是否一致。8次按键的时间大概是16ms,这16ms内如果按键状态一直保持一致,那就可以确定现在按键处于稳定的阶段,而非处于抖动的阶段,如图8-12所示。

111111111111111弹起  01001  抖动0000000000000000000000按下 100101 抖动11111111111111111111111弹起

假如左边时间是起始0时刻,每经过2ms左移一次,每移动一次,判断当前连续的8次按键状态是不是全1或者全0,如果是全1则判定为弹起,如果是全0则判定为按下,如果0和 交错,就认为是抖动,不做任何判定。(参照代码)

#include<reg52.h>

sfr P4=0xe8;

sbit ADDR0=P1^0;

sbit ADDR1=P1^1;

sbit ADDR2=P1^2;

sbit ADDR3=P1^3;

sbit ENLED=P1^4;

sbit ENSEG=P1^5;

sbit mada37=P3^7;

sbit led_lan=P3^6;

sbit led_hong=P3^5;

sbit key_in1=P4^3;

sbit key_in2=P3^2;

sbit key_in3=P4^1;

sbit key_in4=P2^3;

sbit key_out1=P2^4;

sbit key_out2=P2^5;

sbit key_out3=P2^6;

sbit key_out4=P2^7;

unsigned char ledcode[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09}; //数码管显示转换表0123456789

unsigned char ledcode2[10]={0x02,0x9e,0x24,0x0c,0x98,0x48,0x40,0x1e,0x00,0x08};

unsigned char ledcode8[4]={0x11,0x01,0x63,0xff};

unsigned char led[5]={0x03,0x24,0x03,0x03,0x11};

unsigned int sec=120;

unsigned char flag1s=0;

unsigned char a=0;

unsigned char m=0;

unsigned int i;

bit key3sta=1;

bit key2sta=1;

bit key4sta=1;

bit key1sta=1;

void led_chang();

void main()

{

bit key1backup=1;

bit key2backup=1;

bit key3backup=1;

bit key4backup=1;

unsigned int h=100;

EA=1;

ENLED=1;

ENSEG=0;

ADDR3=1;

mada37=0; //1时停,0时转

TMOD=0x01;

TH0=0xfc;

TL0=0x67;

ET0=1;

TR0=1;

key_out4=0;

key_out3=1;

key_out2=1;

key_out1=1;

led_hong=0;

led_lan=1;

while(1)

{

if(key1sta!=key1backup)

{

if(key1backup==0)

a=1;

key1backup=key1sta;

}

if(flag1s==1)

{

if(a==0)

{

flag1s=0;

sec--;

if(sec<=0)

{

m=3;

EA=0;

P0=0xff;

}

}

led[0]=ledcode[sec/60/10%10];

led[1]=ledcode2[sec/60%10];

led[2]=ledcode[sec%60/10%10];

led[3]=ledcode[sec%60%10];

led[4]=ledcode8[m];

}

if(i==800)

led_hong=1;

if(i>=900)

led_hong=0;

if(a==0)

{

if(key4sta!=key4backup)

{

if(key4backup==0)

m=2;

key4backup=key4sta;

}

if(key2sta!=key2backup)

{

if(key2backup==0)

m=0;

key2backup=key2sta;

}

if(key3sta!=key3backup)

{

if(key3backup==0)

m=1;

key3backup=key3sta;

}

}

if(m==0) //2o

{

if((i%10)<=3)

{mada37=0;

led_lan=1; }

if((i%10)>3)

{ mada37=1;

led_lan=0;}

}

if(m==1) //50

{

if((i%2)==0)

{mada37=1;

led_lan=0;}

if((i%2)==1)

{mada37=0;

led_lan=1;}

}

if(m==2) //70

{

if((i%10)<=7)

{mada37=0;

led_lan=1;}

if((i%10)>7)

{mada37=1;

led_lan=0;}

}

if(m==3) //0

{

mada37=1;

led_lan=0;

}

if(a==1)

{

if(key4sta!=key4backup)

{

if(key4backup==0)

a=0;

i=0;

key4backup=key4sta;

}

if(key1sta!=key1backup)

{

if(key1backup==0)

m=3;

key1backup=key1sta;

}

if(key2sta!=key2backup)

{

if(key2backup==0)

{

if(sec<=5940)

sec+=60;

}

key2backup=key2sta;

}

if(key1sta!=key1backup)

{

if(key1backup==0)

m=3;

key1backup=key1sta;

}

if(key3sta!=key3backup)

{

if(key3backup==0)

{

if(sec>=60)

sec-=60;

}

key3backup=key3sta;

}

}

}

}

void ledscan()

{

static unsigned char b=0;

P0=0xff;

switch(b)

{

case 0:ADDR0=1;ADDR1=1;ADDR2=1;b++;P0=led[0];break;

case 1:ADDR0=0;ADDR1=1;ADDR2=1;b++;P0=led[1];break;

case 2:ADDR0=1;ADDR1=0;ADDR2=1;b++;P0=led[2];break;

case 3:ADDR0=0;ADDR1=0;ADDR2=1;b++;P0=led[3];break;

case 4:ADDR0=0;ADDR1=0;ADDR2=0;b=0;P0=led[4];break;

}

}

void chongzhi_jishi()

{

TH0=0xfc;

TL0=0x67;

i++;

if(i>=1000)

{

flag1s=1;

i=0;

}

}

void zhongduan0() interrupt 1 //1ms

{

static unsigned char key3keybuf=0xff;

static unsigned char key2keybuf=0xff;

static unsigned char key4keybuf=0xff;

static unsigned char key1keybuf=0xff;

chongzhi_jishi();

ledscan();

key4keybuf=(key4keybuf<<1)|key_in4;

if(key4keybuf==0x00)

{

key4sta=0;

}

else if(key4keybuf==0xff)

{

key4sta=1;

}

key3keybuf=(key3keybuf<<1)|key_in3;

if(key3keybuf==0x00)

{

key3sta=0;

}

else if(key3keybuf==0xff)

{

key3sta=1;

}

key2keybuf=(key2keybuf<<1)|key_in2;

if(key2keybuf==0x00)

{

key2sta=0;

}

else if(key2keybuf==0xff)

{

key2sta=1;

}

key1keybuf=(key1keybuf<<1)|key_in1;

if(key1keybuf==0x00)

{

key1sta=0;

}

else if(key1keybuf==0xff)

{

key1sta=1;

}

}

模拟风扇控制系统(按键控制)相关推荐

  1. 蓝桥杯单片机第七届省赛-模拟风扇控制系统

    九层妖塔 起于垒土 ● 改编自国信长天蓝桥杯官方蓝皮书例程,按照自己的习惯进行了补充和修改 蓝桥杯单片机第七届省赛-模拟风扇控制系统 Notes1:按键按下后在某些情况下给一定的缓冲时间 Notes2 ...

  2. 基于单片机的模拟风扇控制系统

    1.试题 (1)功能简述 "模拟风扇控制系统"能够模拟电风扇工作,通过按键控制风扇的转动速度和定时时间,数码管实时显示风扇的工作模式,动态倒计时显示剩余的定时时间,系统主要由数码管 ...

  3. 基于MSP430G2553的模拟风扇控制系统

    基于MSP430G2553的模拟风扇控制系统 本次设计是通过CCS和AD15设计的一个模拟风扇控制系统,该系统主要包括独立键盘电路模块.直流稳压电路模块.程序下载电路模块.数码管显示模块.三极管LED ...

  4. 蓝桥杯单片机CT107D_16_模拟风扇控制系统

    #include<reg52.h> #include"onewire.h"sbit L8 = P0^7; //工作LED sbit L1 = P0^0; sbit L2 ...

  5. 蓝桥杯单片机第七届省赛题详细讲解(模拟风扇控制系统)

    看之前强烈建议先自己做一遍!!! 演示视频 题目讲解 完整程序 main.c onewire.h onewire.c 工程文件 演示视频 题目讲解 首先还是从整个赛题的程序框图开始看起,如图. 做题之 ...

  6. 第七届蓝桥杯初赛——————模拟风扇控制系统

    代码部分(实现题目要求的全部功能) #include<stc15f2k60s2.h> #include<intrins.h> #define uchar unsigned ch ...

  7. 家用风扇控制系统c语言程序设计,智能风扇控制系统设计.doc

    - PAGE IV - 摘 要 由于当今信息技术的高速发展,温度的测量与控制系统在工业和农业以及人们的日常活动中充当着一个日趋重要的角色,它对我们的日常生活具有诸多的影响,因此温度的采集以及其控制系统 ...

  8. 单片机控制小风扇马达c语言,模拟风扇控制电路(单片机C程序设计)

    原标题:模拟风扇控制电路(单片机C程序设计) /* 1.定时设置每按一下定时值在0分---2分----4分---6分----8分--10循环 2.主电机工作方式有三种,A.PWM为三分之一 B.PWM ...

  9. 基于自适应算法和增量式PID算法的模拟直升飞机控制系统

    基于自适应算法和增量式PID算法的模拟直升飞机控制系统 文章目录 基于自适应算法和增量式PID算法的模拟直升飞机控制系统 控制系统硬件 单片机系统 传感器系统介绍 直升机模拟系统介绍 系统模块介绍 A ...

最新文章

  1. Redis总结(二)C#中如何使用redis
  2. delphi tabsheet多标签自适应宽度_HTML 图像 img 标签
  3. vba 判断控件有无_6小时,写了一篇适合Excel小白学的VBA入门教程
  4. 图像主观质量评价 评分_图像质量分析工具哪家强?
  5. 中如何移动物体在画面中的位置_如何在弱光环境中拍摄运动物体
  6. cesium+ geoserverTerrainProvide+png展示3D高程图展示
  7. springboot+aop+自定义注解,打造通用的全局异常处理和参数校验切面(通用版)
  8. 5在ios上无法选取文件_无法在 Ubuntu 20.04 上安装 Deb 文件?这是你需要做的! | Linux 中国...
  9. Flutter进阶—质感设计之表单输入
  10. 负载均衡的几种算法Java实现代码
  11. 零基础java学习---温故而知新
  12. BackdoorBench
  13. 随着公网对讲机市场占有率得不断增长,部分对讲机厂家为了得到用户的认可,不断升级对讲机及时以及对讲机的功能和性能,因此越来越多的全国对讲机以及公网对讲机问世。但是某些用户不清楚对讲机的原理,不禁会问
  14. 色温CCT与色坐标xy互换
  15. 2019重庆大学计算机学院研究生,【计算机】计算机学院举行2019级研究生年级大会...
  16. 车辆识别码VIN校验位计算方法及实现-Java
  17. TensorFlow从1到2(十一)变分自动编码器和图片自动生成
  18. python做积分_利用python求积分的实例
  19. 安卓虚拟摄像头_iPhone 的第四颗摄像头位置,为什么给了激光雷达?
  20. 视频画中画效果该怎么实现?这款软件让你一秒成大神

热门文章

  1. SQL Server 2017中的Python:增强的数据库内机器学习
  2. Lichee RV DOCK初试点灯
  3. ESC服务器新手上路
  4. ​男子用ChatGPT编假新闻被采取刑事强制措施;苹果M3芯片下半年量产;Safari超Edge,成第二大桌面浏览器|极客头条...
  5. L2-016 愿天下有情人都是失散多年的兄妹 (25 分)
  6. Android语音播报商家收款及相关TTS语音文件合成
  7. centos hostname修改
  8. Vuetify Icon Picker
  9. 2018兰亭序系列书法作品集
  10. 关于互联网金融贷款业务的整体梳理