最近也是想加入一个实验室,考核题目就是写一个小风扇!下面是题目要求

由于我也是大一新生,也就自学了一点51和c语言知识,代码写的可能有点拙,还请多多指教!

#include <REGX52.H>
typedef unsigned char uchar;
typedef unsigned int uint;uint PWM,compare,Speed;//调速
uchar Nixie_Flag;//数码管扫描标志位
uchar irtime;//红外用全局变量
uchar ircord[4];  //客户码1+客户码2+操作码+操作反码
uchar irdata[33];  //1+8+8+8+8=33
uchar H=0;//关闭自动调速用变量
bit I=0;
uchar J=0;//定时用变量
bit K=0;
bit L=0;
uchar PWM1,compare1=2;//舵机角度用变量
uint Time;//摇头
uchar Q;
bit S;
uint Flag1,Flag2;   //按键扫描
bit Start;
bit Over;
int One_Minute=2000;//数码管显示时间用变量
int hundred=9;
int unit=9;
bit irpro_ok,irok;//红外
sbit IR=P3^2;
sbit Trig=P1^7;//超声波
sbit Echo=P1^6;
sbit ENA=P2^6;//电机
sbit IN1=P2^4;
sbit IN2=P2^5;
sbit IN3=P3^4;//舵机
sbit IN4=P3^5;
sbit LED1=P2^3;//LED显示遥控逐级档
sbit LED2=P1^3;//LED显示按键档
sbit LED3=P1^4;
sbit LED4=P1^5;
sbit Key1=P2^2;//按键
sbit Key2=P3^3;
sbit Key3=P2^1;
sbit Key4=P2^0;
sbit Control=P2^7;//舵机控制//void Delay(unsigned int xms)     //软件延时?太逊了吧
//{//  unsigned char i, j;
//  while(xms)
//  {//      i = 2;
//  j = 239;
//  do
//  {//      while (--j);
//  } while (--i);
//      xms--;
//  }
//}uint NixieTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极数码管
void Nixie(uint Location ,Number)
{switch(Location){case 1:P1_0=0;P1_1=1;P1_2=1;break;case 2:P1_0=1;P1_1=0;P1_2=1;break;case 3:P1_0=1;P1_1=1;P1_2=0;break;}P0=NixieTable[Number];}
void Nixie_Scan()   //数码管扫描
{if(Nixie_Flag==0) Nixie(1,compare);else if(Nixie_Flag==2) Nixie(2,hundred);else if(Nixie_Flag==4) Nixie(3,unit);else P0=0X00;
}
void Key_scan() //按键扫描干活
{if(Flag1<15){Start=1;return;}if(Flag1>=15){        Start=0;Flag1=0;if(Key1==0){H=0;Speed++;Speed%=4;if(Speed==0){compare=0;LED2=1;LED3=1;LED4=1;}else if(Speed==1){compare=2;LED2=0;LED3=1;LED4=1;}else if(Speed==2){compare=5;LED2=1;LED3=0;LED4=1;}else{compare=9;LED2=1;LED3=1;LED4=0;}Over=1;return;}else if(Key2==0){    H++;I=H%2;Over=1;return;}else if(Key3==0){hundred--;if(hundred<0) hundred=9;Over=1;return;}else{unit--;if(unit<0) unit=9;Over=1;return;}}
}
unsigned long Distance() //超声波处理程序
{unsigned char i=2;float time;float a;int distance=(int)a;T2CON=0;           //定时器2初始化TL2=0;TH2=0;RCAP2L=0;RCAP2H=0;Trig=0;Trig=1;while(--i);Trig=0;while(!Echo);TR2=1;                      //定时器2计算超声波时间while(Echo);TR2=0;time=(TH2*256+TL2)*0.9216;TH2=0;TL2=0;a=(time*1.7)/100;return distance;
}
void Timer1_Init(void)  //定时器1初始化用于红外记时译码
{TMOD &=0x0f;TMOD |=0x20;TH1=0X00;TL1=0X00;ET1=1;TR1=1;
}
void INT0_Init(void)    //用于红外接收外部中断0初始化
{IT0=1;EX0=1;
}
void ir_work(void)  //红外遥控器键码读取执行程序
{switch(ircord[2]){ case 0x19:compare=0;H=0;  //0 break;  case 0x45:compare=1;H=0;  //1break;case 0x46:compare=2;H=0; //2break;   case 0x47:compare=3;H=0;  //3break;case 0x44:compare=4;H=0; //4break;case 0x40:compare=5;H=0; //5break;case 0x43:compare=6;H=0; //6break;case 0x07:compare=7;H=0; //7break;case 0x15:compare=8;H=0; //8break;case 0x09:compare=9;H=0; //9break;case 0x16:H++;I=H%2;            //*break;case 0x0d:J++;K=J%2;L=1;   //#break;case 0x18:hundred--;if(hundred<0){hundred=9;}      //上break;case 0x52:unit--;if(unit<0){unit=9;}                       //下break;case 0x08:compare1++;if(compare1>4){compare1=1;}//左break;case 0x5a:compare1--;if(compare1<1){compare1=4;}//右break;case 0x1c:Q++;S=Q%2;                                                        //okbreak;default:break;}
}void ircordpro(void)       //读取红外数据码
{unsigned char i,j,k;unsigned char cord,value;k=1;for(i=0;i<4;i++){  for(j=1;j<=8;j++){cord=irdata[k];if(cord>7)value|=0x80;if(j<8){value>>=1;}k++;}ircord[i]=value;value=0;}irpro_ok=1;
}void Timer1_Routine(void) interrupt 3 using 1      //定时器1中断用于红外记时译码
{irtime++;
}
void Int0_Routine(void) interrupt 0     //外部中断0处理红外NFC协议客户码
{static unsigned char i;static bit startflag;if(startflag){if(irtime<50&&irtime>=33)i=0;irdata[i]=irtime;irtime=0;i++;if(i==33){irok=1;i=0;}}else{irtime=0;startflag=1;}
}void Timer0_init()  //定时器0初始化
{TMOD &=0Xf0;TMOD |=0x01;TH0=(65536-542)/256;TL0=(65536-542)%256;TF0=0;TR0=1;PT0=0;  //最低PT1=1; //次低PX0=0; //红外次高PX1=1;   //按键中断最高IPH=0x05;EA=1;ET0=1;
}
void Timer0_Routine() interrupt 1               //定时器0中断干活!
{TH0=(65536-542)/256;TL0=(65536-542)%256;//风扇电机PWM++;if(PWM>10) PWM=0;if(PWM<compare){ENA=1;LED1=0;}else {ENA=0;LED1=1;}//数码管扫描Nixie_Flag++;if(Nixie_Flag>=6) Nixie_Flag=0;Nixie_Scan();//舵机角度PWM1++;if(PWM1>40) PWM1=0;if(PWM1<compare1) Control=1;else Control=0;//自动摇头Time++;if(Time>12000) Time=0;//定时if(K==1){        if(L==1){One_Minute--;    if(One_Minute==0){unit--;}if(One_Minute<0){One_Minute=2000;}if(unit<0){unit=9;hundred--;}if(unit==0&&hundred==0){unit=9;hundred=9;IN1=0;IN2=0;L=0;S=0;Q=0;}}else{unit=9;hundred=9;}}else{IN1=0;IN2=1;}//按键扫描if(Start==1){Flag1++;}if(Over==1){Flag2++;if(Flag2>400){Flag2=0;Over=0;}}if(Key1==0||Key2==0||Key3==0||Key4==0){if(Over==0) Key_scan();}//红外接收处理if(irok){ircordpro();irok=0;}if(irpro_ok){ir_work();ircord[2]=0;}
}
void main()
{INT0_Init();Timer1_Init();Timer0_init();IN1=0;IN2=1;IN3=1;IN4=0;P2_0=1;P2_1=1;P2_2=1;P1_3=1;P1_4=1;P1_5=1;P2_7=0;for(;;){if(S==1) //摇头{while(1){if(S==0) break;if(I==1) {S=0;compare=2;break;}if(Time<=2000) compare1=1;else if(Time<=4000) compare1=2;else if(Time<=6000) compare1=3;else if(Time<=8000) compare1=4;else if(Time<=10000) compare1=3;else compare1=2;}}if(I==1) //超声波测距调速{while(1){                 if(H==0) break;if(I==0){compare=0;break;}if(S==1) {I=0;break;}if(Distance()<=10) compare=2;else if(Distance()<=20) compare=3;else if(Distance()<=30) compare=5;else if(Distance()<=40) compare=6;else if(Distance()<=60) compare=7;else compare=9;}}}
}

基于51的多功能小风扇,可以实现定时,摇头,超声波自动调速等功能相关推荐

  1. 【毕业设计】基于超声波与红外的自动调速风扇系统(代码开源) -物联网 嵌入式 stm32

    文章目录 1 简介 1 设计概要 2 系统设计 2.1 系统供电问题 2.2 自动/手动模式的切换 2.3 PWM信号的产生 2.4 单片机内部资源的分配 三.硬件搭建 3.1 单片机最小系统 3.2 ...

  2. 基于Arduino的自动调速风扇

    好久没有更新了,家里实在太乱,最近趁着618活动,买了一堆收纳抽屉和置物架,把家里彻底收拾了一下,然后客厅就成了这个奇葩样子,注孤生的节奏了. 话不多说,夏天到了,天气逐渐热起来,风扇成了必不可少的消 ...

  3. 51单片机+L293D控制直流电机起保停+数码管PWM调速显示

    51单片机+L293D控制直流电机起保停+数码管PWM调速显示 PWM速度10级可调 采用L293D驱动 数码管显示PWM当前占空比 可优化的地方是数码管可以采用其他驱动芯片来驱动,提高驱动能力和减少 ...

  4. 60、基于51单片机1602显示智能台灯坐姿定时+光线+红外+人体感应系统设计

    毕设帮助.开题指导.技术解答(有偿)见文末. 目录 摘要 一.硬件方案 二.设计功能 三.实物图 四.原理图 五.PCB图 六.Protues仿真 七.程序 八.资料包括 摘要 社会在不断进步,人类在 ...

  5. 基于51单片机的汽车测速仪表红外避障车辆高速测速方案原理图设计

    系统的功能分析 (附文件) 本设计由STC89C52单片机电路+红外避障传感器电路+LCD1602液晶显示电路+蜂鸣器报警电路+电源电路组成. 1.通过2个红外避障传感器检测人体反应的开始和结束,LC ...

  6. (毕业设计资料)基于51单片机人体追踪智能电风扇控制系统

    内容:人体追踪可控的电风扇,该电风扇应具有人体追踪,智能开关,智能调速的功能. (1)了解单片机.传感器和电机的知识: (2)通过PWM调速的原理来实现风扇随着不同温度自动调速的功能,当人走后风扇停止 ...

  7. 基于51单片机和物联网的智能家居系统(ESP8266物联网模块)

    前言 该智能家居系统以 STC89C52单片机为控制核心,结合 LCD1602 液晶显示屏.L298N电机驱动模块.光敏电阻,ESP8266WiFi模块,DS18B20温度计设计并实现了自动感光窗帘与 ...

  8. 基于51单片机的多层电梯(1-16层)运行系统仿真设计_层数可改

    基于51单片机的多层电梯(1-16层)运行系统仿真设计_层数可改 仿真图proteus 8.9 程序编译器:keil 4/5 编程语言:C语言 设计编号:S0027 视频演示 基于51单片机的多层电梯 ...

  9. 基于51单片机的课程设计(毕业设计)——电子贺卡

    本篇文章将介绍一个基于51单片机的电子贺卡,本作品可用于课程设计.毕业设计的参考.其所用到的外设硬件以及程序的代码量都是相对较少的,对于51单片机的初学者,通过本设计熟悉51单片机的使用是非常好的选择 ...

最新文章

  1. 《学习OpenCV3(中文版)》图书目录
  2. 逆元~(乘法逆元及其应用)
  3. 第三届Apache Flink比赛榜单
  4. 迷宫探索DFS(递归记录来回路径)
  5. Oracle静默安装
  6. java窗口小程序atm_简单的小程序实现ATM机操作
  7. poj -- 1042 Gone Fishing(枚举+贪心)
  8. Java 记录(4) java 生成 UUID ,java.util.UUID 使用
  9. oracle rman异地备份,通过RMAN磁盘备份进行异地恢复
  10. journalctl命令使用
  11. java对接银联商务扫码支付(银联商务扫码支付文档)
  12. 学术篇 | 不同需求的认知控制揭示了语义记忆和情景记忆提取共享的神经机制
  13. 国外广告联盟哪个好,六个高知名度平台
  14. Cepton宣布与美国底特律顶级汽车制造商合作,赢得业内最大ADAS激光雷达量产订单
  15. 商家入驻天猫商城需要多少钱 天猫入住有哪些常见问题
  16. 关于DebugView无法打印出KdPrint信息
  17. 使用python操作excel的xls文件和xlsx文件之间的批量导出和填充数据
  18. Removal【套路DP】
  19. En-Tan-Mo(ETM)项目周报(8.2-8.8)
  20. IDEA使用自带maven还是自行配置maven

热门文章

  1. 在vue项目中使用axios封装axios
  2. 数据库中主外键概念详细介绍
  3. 一个ABC眼中的中国创业环境
  4. 北鲲教程|基于 ABAQUS 的 CFRP 加固钢筋混凝土柱承载能力分析
  5. python ctypes详解-CTypes
  6. vue获取当前的月份_vue根据选择的月份动态展示当前月份的每一天并展示每一天所对应的星期几...
  7. Android 养成记-1 --1.3 标签拾色器
  8. ssis的數據分流,mark一下
  9. 【bugku CTF】MISC杂项:很普通的数独(isccctf)、啊哒、隐写、隐写2、多种方法解决、easy_crypto 、聪明的小羊、ping
  10. 多种方法求解“最大公约数”和“最小公倍数”