编程机器人第一课风扇得代码
- 格式:docx
- 大小:36.47 KB
- 文档页数:1
编程风扇说明书按键功能:任意状态下按“ON / OFF”——电源开/ 关。
正常状态下长按“UP”——清空所有已编辑好的内容。
正常状态下长按“MODE”——进入编程模式。
正常状态下按“DOWN”——跳到下一段闪字内容。
编程模式下按“MODE”——跳到下一个字符位(长按为保存已编好的内容同时退出编辑模式)。
编程模式下按“UP”——向上查找字符(长按为快速向上查找)。
编程模式下按“DOWN”——向下查找字符(长按为快速向下查找)。
使用方法:(1)按下“ON/OFF”开关打开风扇,风扇显示上次编辑过的闪字内容,若从未设置过,则显示如下初始的闪字内容:○1. PHASE 1 ○2. PHASE 2 ○3. PHASE 3○4. PHASE 4 ○5. PHASE 5 ○6. PHASE 6(2)编辑闪字内容,可按“DOWN”选择①②③④⑤⑥中的任意一段闪字内容按如下步骤设置:1、长按“MODE”进入编程模式,当光标闪烁,则开始编辑该段的首个字符位。
2、短按“UP”或“DOWN”可以向上或向下切换字符,长按为向上或向下快速查找。
3、每段有18个字符位可供编辑,短按“MODE”跳到下一个字符位进行编辑。
4、编辑好该段的全部内容后,长按“MODE”,保存该段信息并退出编程模式,返回正常状态。
(3)若需要编辑另一段闪字内容,在正常状态下按“DOWN”选择需要编辑的段,然后重复以上步骤。
(4) 在正常状态下长按“UP”将清除所有编辑过的内容,关闭电源开关并再次打开后,则显示初始的闪字内容。
(5)可供编辑的字符如下:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z♥★,:!?.()@。
#+-×÷=≠$¬€¢₤£&1234567890▊备注:“▊”为空格。
注意事项:(1)使用时请勿将风扇靠近面部和头发!(2)使用时请勿用手去触碰风扇叶片,请勿强制使其停止旋转!(3)请勿按压、挤压风扇头部以免损坏风扇!(4)当较长时间不使用时,请取出电池,以免电池漏液损坏风扇!(5) 不同品牌以及不同新旧程度的电池请勿混用!(6)连续使用时间超过4小时可能会出现发光内容抖动、显示不良或不显示等情况,此时只需停止使用5分钟,等待复位后重新打开使用即可恢复正常。
pwm 风扇控制python -回复PWM风扇控制是一种基于脉冲宽度调制技术的方法,可以通过调整电流的占空比来控制风扇的转速。
本文将介绍如何使用Python编程语言实现PWM风扇控制,以及如何应用于实际项目中。
第一步,我们需要准备一些硬件设备和材料,包括一个PWM风扇、一个Raspberry Pi或Arduino开发板、一根杜邦线和一个电源。
接下来,我们需要连接硬件。
首先,将杜邦线的一端连接到PWM风扇的控制引脚(通常标有“PWM”或“CFAN”),然后将另一端连接到开发板上的GPIO引脚。
确保连接正确,以及开发板和风扇的电源接地。
根据不同的开发板型号,引脚编号可能会有所不同,可以参考开发板的文档或引脚图进行正确的连接。
接下来,我们需要编写Python代码来控制PWM风扇。
首先,我们需要导入所需的模块,包括RPi.GPIO或Arduino的库。
然后,我们需要初始化GPIO引脚和设置PWM对象。
针对树莓派使用RPi.GPIO库的情况,可以按照以下步骤进行设置:pythonimport RPi.GPIO as GPIOimport timeGPIO.setmode(GPIO.BCM) # 使用BCM模式GPIO.setup(18, GPIO.OUT) # 将18号引脚设置为输出模式pwm = GPIO.PWM(18, 100) # 创建PWM对象,频率为100Hz pwm.start(0) # 启动PWM,默认占空比为0针对Arduino的库,则可以按照以下步骤进行设置:pythonimport pyfirmataimport timeboard = pyfirmata.Arduino('/dev/ttyACM0') # 设置串口pin = board.get_pin('d:9:p') # 设置引脚为PWM输出模式接下来,我们可以编写代码来控制PWM风扇的转速。
可以使用一个循环来不断地改变占空比,并通过调整占空比来调整风扇的转速。
第课程序设计智能风扇教学案HUA system office room 【HUA16H-TTMS2A-HUAS8Q8-HUAH1688】第9课程序设计——智能风扇教学案一、提出问题在前面的课程中,我们制作了手摇风扇,如图9-1所示。
那么如何让风扇更加智能呢?在日常生活中,我们都是通过开关来控制风扇,这节课我们就来给风扇加上开关,通过开关来控制风扇的转动。
二、联想我们要利用EV3控制器(图9-2)控制风扇的转动。
并且要使用一个按钮当作开关去控制风扇转动的开始和停止。
图9-1 手摇风扇图9-2 EV3控制器三、要求智能风扇制作1. 使用EV3控制电机转动风扇2. 通过开关控制风扇转动四、构建技能牌:触动传感器触动传感器相当于是机器人的手,当触动传感器的红色触点被按下或松开的时候,这些事件都可以被机器人所感知,如图9-3所示。
乐高触动传感器有三种状态:按压、松开和碰撞。
图9-3 触动传感器按压:当触点被按下后,触动记数加1。
松开:当触点松开后,触动记数加1。
碰撞:当触点按下,然后松开后,触动记数加1。
智能风扇的安装1.电机的选择电机选择乐高的中型电机,又称为高速电机,如图9-4所示。
它的转速在每分钟250转。
但是中型电机的扭矩相对较小。
图9-4 乐高中型电机2.电机的安装将风扇的手柄去掉,把电机直接安装在这个位置。
这时会发现风扇会往电机这一侧倾斜,为了调整好重心,在另一侧安装一个黑色的配重块。
这样使风扇能够平稳地立在桌面上,如图9-5所示。
图9-5 中型电机控制风扇转动3. 安装触动与EV3控制器电机通过数据线连接在输出口A,触动传感器通过数据线连接在输入口1,如图9-6所示。
图9-6 EV3控制风扇转动五、算法与程序算法:当第一次按下触动传感器时,风扇转动;再次按下触动传感器时,风扇停止。
程序:1.选择“等待”模块,并选择“触动传感器”的“比较”选项,端口选择1,状态选择“1”按压,如图9-7所示。
基于单片机stm32f103c8t6的简单风扇控制系统设计代码一、概述本文将介绍基于单片机STM32F103C8T6的简单风扇控制系统的设计代码。
该系统通过控制电机的转速来实现风扇的调节,可以根据温度传感器采集到的温度数据来自动调节风扇转速。
二、硬件设计1. 硬件组成本系统硬件组成如下:(1)STM32F103C8T6开发板(2)温度传感器DS18B20(3)LCD1602液晶显示屏(4)电位器(5)直流电机及驱动模块L298N2. 接线图下图为本系统的接线图:三、软件设计1. 程序框图本系统程序框图如下:2. 代码实现以下为本系统代码实现,包括初始化函数、温度读取函数、PWM输出函数以及主函数等。
(1)初始化函数:void SystemInit(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_5;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;GPIO_Init(GPIOA, &GPIO_InitStructure);TIM_TimeBaseStructure.TIM_Period = 999;TIM_TimeBaseStructure.TIM_Prescaler = 71;TIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up;TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse = 0;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM3, &TIM_OCInitStructure);TIM_OC2Init(TIM3, &TIM_OCInitStructure);TIM_OC3Init(TIM3, &TIM_OCInitStructure);}(2)温度读取函数:float ReadTemperature(void){uint8_t temp_byte1, temp_byte2;int16_t raw_temperature;float temperature;OneWire_Reset();OneWire_WriteByte(0xcc);OneWire_WriteByte(0x44);delay_us(750000);OneWire_Reset();OneWire_WriteByte(0xcc);OneWire_WriteByte(0xbe);temp_byte1 = OneWire_ReadByte();temp_byte2 = OneWire_ReadByte();raw_temperature = (temp_byte2 << 8) | temp_byte1;temperature=(float)raw_temperature/16.0;return temperature;}(3)PWM输出函数:void PWMOutput(uint16_t CCR1_Val, uint16_t CCR2_Val, uint16_t CCR3_Val){TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_SetCompare1(TIM3, CCR1_Val);TIM_SetCompare2(TIM3, CCR2_Val);TIM_SetCompare3(TIM3, CCR3_Val);TIM_Cmd(TIM3, ENABLE);}(4)主函数:int main(void){SystemInit();LCD_Init();float temperature;uint16_t duty_cycle;while (1){temperature = ReadTemperature();duty_cycle = (temperature - 25) * 10;if(duty_cycle > 999) duty_cycle = 999;PWMOutput(duty_cycle, duty_cycle, duty_cycle);LCD_Clear();LCD_Write_String("Temperature: ");LCD_Write_Float(temperature);delay_ms(500);}}四、总结本文介绍了基于单片机STM32F103C8T6的简单风扇控制系统的设计代码。
#include <reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit rs=P3^5; //数据\指令选择sbit rw=P3^6; //读\写选择sbit e=P3^4; //读\写使能;sbit ds=P2^2; //温度传感器信号线;sbit psb=P3^7;sbit in1=P1^6;sbit in2=P1^7;sbit en=P1^5;sbit dula=P2^6;sbit wela=P2^7;uint temp,num,show;float ftemp;uchar gao=10,di=2;uchar code hang1[]= {"当前温度:"};uchar code table[]="0123456789.c";uchar code hang2[]= {"当前档位:"};void writecom(uchar com);void writedat(uchar dat);void initinal(void);void delay(uint k){int i,j;for(i=k;i>0;i--) //i=xms即延时约xms毫秒;for(j=110;j>0;j--);}void dsreset() // ds18b20初始化函数;{uint i;ds=0; //拉低总线开始复位;i=103;while(i>0)i--;ds=1; //释放总线;i=4;while(i>0)i--; // 省去了等待芯片返回应答的过程;}bit readbit(void) //ds18b20读取一位数据;{uint i;bit dat;ds=0;i++;ds=1;i++;i++;dat=ds;i=8;while(i>0)i--;return(dat);}uchar tempread(void) //ds18b20读取一个字节的数据{uchar i,j,dat;dat=0;for(i=0;i<8;i++){j=readbit();dat=(j<<7)|(dat>>1);}return(dat);}void tempwrite(uchar dat) //向ds18b20写一个字节数据函数;{uint i;uchar j;bit testb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb==1) // 写1{ds=0; // 拉低总线以开始一个写时序i++;i++;ds=1; // 释放总线i=8;while(i>0)i--;}else // 写0{ds=0;i=8;while(i>0)i--;ds=1;i++;i++;}}}void delay50us(uint t) {uchar j;for(;t>0;t--)for(j=19;j>0;j--);}//12864写命令void writecom(uchar com) {rw=0;rs=0;delay50us(2);P0=com;e=1;delay50us(5);e=0;delay50us(5);}//12864写数据void writedat(uchar dat) {rw=0;rs=1;delay50us(1);P0=dat;e=1;delay50us(10);e=0;delay50us(10);}//12864初始化void initinal(void){delay50us(2); writecom(0x30); delay50us(4); writecom(0x30); delay50us(4); writecom(0x0f);delay50us(4); writecom(0x01); delay50us(240);writecom(0x06);delay50us(10);}void tempchang(void) // 开始获取温度并转化;{dsreset();delay(1);tempwrite(0xcc); // 写跳过读ROM指令;tempwrite(0x44); // 写温度转换指令;}uint gettemp() // 读取寄存器中存储的温度数据;{uchar a,b;dsreset();delay(1);tempwrite(0xcc);tempwrite(0xbe);a=tempread();b=tempread();temp=b;temp<<=8;temp=temp|a;ftemp=temp*0.0625;temp=ftemp*10+0.5;ftemp=ftemp+0.05;return temp;}void dangwei(){if(temp>330) num=0; //gettemp返回的温度值与设定值进行比较;从而设定档位;else if((temp>320)&&(temp<=330)) num=1;else if((temp>310)&&(temp<=320)) num=2;else if((temp>300)&&(temp<=310)) num=3;else{num=4;} }void su_du_zhuan_huan() //根据速度标志进行数据处理;{switch(num){ //利用脉宽调制(PWM),控制档位风速的大小,占空比越大,风速越大;case 0: num=0;gao=10; //当gao=0时,占空比最小,风扇停止转动;di=2;break;case 1: num=1;gao=8;di=4;break;case 2: num=2;gao=6;di=6;break;case 3: num=3;gao=4;di=8;break;case 4: num=4;gao=0;di=12;break;}}void qudong() //控制电机程序;{uchar i;if(di!=0){for(i=0;i<di;i++){en=0; //实现PWM信号低电平输出;delay(5); //利用显示函数起延时作用,这样也不影响数;}}for(i=0;i<gao;i++){en=1; //实现PWM信号高电平输出;delay(5);}}//主函数void main(){dula=0;wela=0;in1=1;in2=0;psb=1; // 选择显示模式为并行通信模式; initinal();dsreset();delay50us(1); //初始化液晶,清屏DDRAM; while(1){uchar i;uint a,b,c,d;tempchang();// en=0;dangwei();su_du_zhuan_huan();qudong();a=gettemp();b=a/100;c=a%100/10;d=a%100%10;writecom(0x80);for(i=0;i<10;i++){writedat(hang1[i]);delay50us(1);}writecom(0x88);for(i=0;i<10;i++){writedat(hang2[i]);delay50us(1);}writecom(0x85);writedat(table[b]);delay50us(1);writedat(table[c]);delay50us(1);writedat(table[10]);delay50us(1);writedat(table[d]); delay50us(1); writedat(table[11]); delay50us(4);writecom(0x8d); writedat(table[num]); delay50us(1);}}。
智能电风扇的设计学院**********************专业班级*****学生姓名****指导教师******20**年*月**日引言随着人们生活水平及科技水平的不断提高,现在家用电器在款式、功能等方面日益求精,并朝着健康、安全、多功能、节能等方向发展。
过去的电器不断的显露出其不足之处。
电风扇作为家用电器的一种,同样存在类似的问题。
现在电风扇的现状:大部分只有手动调速,再加上一个定时器,功能单一。
存在的隐患或不足:比如说人们常常离开后忘记关闭电风扇,浪费电且不说还容易引发火灾,长时间工作还容易损坏电器。
再比如说前半夜温度高电风扇调的风速较高,但到了后半夜气温下降,风速不会随着气温变化,容易着凉。
之所以会产生这些隐患的根本原因是:缺乏对环境的检测。
如果能使电风扇具有对环境进行检测的功能,当房间里面没有人时能自动的关闭电风扇;当温度下降时能自动的减小风速甚至关闭风扇,这样一来就避免了上述的不足。
本次设计就是围绕这两点对现有电风扇进行改进。
1.总体方案设计及功能描述本设计是以AT89C51单片机控制中心,主要通过提取热释电红外传感器感应到的人体红外线信息和温度传感器DS18B20得到的温度以及内部定时器设定时间长短来控制电风扇的开关及转速的变化。
功能描述:电风扇工作在四种状态:手动调速状态、自动调速状态、定时状态、停止状态。
手动状态时可以手动调节速度;自动状态时通过温度高低自动调节速度,如果出现手动现象则变为手动状态;定时状态时可以调节定时时间,并设定是否启动定时,之后可以手动退出,也可以在不操作6秒后自动退出进入手动状态;停止状态时可以被唤醒并进入自动状态。
当没有检测到人体存在超过3分钟或定时完毕时进入停止状态。
在数码管显示方面,当没有定时时,只显示气温,当定时启动时气温和定时剩余时间以3秒的速度交替显示。
系统方框图如下图所示,主要包括:输入、控制、输出三大部分8个功能模块。
图1-1系统方框图2.功能模块硬件简介与实现2.1键盘输入电路由于设计中用到的按键数目不多,所以可以直接用AT89C51的通用IO 端口且选用AT89C51的P1口(内部有上拉电阻)作为键盘接口。
写unity风扇开关代码Unity是一款强大的游戏开发引擎,可以用于开发各种类型的游戏。
本文将介绍如何使用Unity编写一个简单的风扇开关代码。
我们需要创建一个新的Unity项目。
打开Unity编辑器,点击“New Project”按钮,选择一个合适的项目名称和保存路径,然后点击“Create”按钮创建新项目。
接下来,我们需要创建一个3D场景,并在场景中添加一个风扇模型。
点击菜单栏的“GameObject”,选择“3D Object”,然后选择“Cube”来创建一个立方体。
将立方体缩放为合适的大小,作为风扇的主体。
然后,点击菜单栏的“GameObject”,选择“3D Object”,然后选择“Cylinder”来创建一个圆柱体。
将圆柱体缩放和移动到合适的位置,作为风扇的叶片。
接下来,我们需要为风扇创建一个脚本。
在Unity编辑器中,点击菜单栏的“Assets”,选择“Create”子菜单,然后选择“C# Script”来创建一个新的C#脚本。
将脚本命名为“FanSwitch”。
双击打开“FanSwitch”脚本,并在脚本中编写以下代码:```csharpusing UnityEngine;public class FanSwitch : MonoBehaviour{private bool isFanOn = false;private GameObject fanBlades;void Start(){fanBlades = GameObject.FindGameObjectWithT ag("FanBlades");}void Update(){if (Input.GetKeyDown(KeyCode.Space)){isFanOn = !isFanOn;if (isFanOn){fanBlades.GetComponent<Animator>().enabled = true;}else{fanBlades.GetComponent<Animator>().enabled =false;}}}}```在代码中,我们首先定义了一个布尔型变量isFanOn来表示风扇的开关状态,并且定义了一个GameObject类型的变量fanBlades来引用风扇的叶片。
单片机PWM温控C语言程序部分代码#include <reg52.h>#include <at89x52.h>#include <keyscan.h>extern void scan_full(void);extern unsigned char key_scan(void);extern bit key_ok;unsigned char pwm_set,key_value;unsigned char count;sbit PWM=P3^6; //将PWM定义为P3口的第六位?bit up,down,set_flag;unsigned char code BCD[]={0x3f,0x06,0x5b,0x4f, //此处是将0-F转换成0x66,0x6d,0x7d,0x07, //相应的BCD码0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delay1(unsigned char t){while(t--);}void pwm(void) interrupt 5//定时器2产生PWM波形{TF2=0; //定时器2的溢出标志要软件清除,//但当RCLK或TCLK为1时由硬件清除if((count>=pwm_set)&amt;&amt;(count<10))PWM=1;elsePWM=0;count++;if(count==10)count=0x00;}void key_pwm(unsigned char x)//把键值转化为PWM设置值{switch(x) //把矩阵键盘转化为独立键盘{case 1:up=1;break;case 2:down=1;break;case 3:set_flag=!set_flag;break;default:break;}//设置PWM参数:pwm_setif(up&amt;&amt;set_flag){pwm_set++;up=0;if(pwm_set>=10)pwm_set=0x00;}if(down&amt;&amt;set_flag){pwm_set--;down=0;if(pwm_set==0xff) //减到-1?pwm_set=9;}if(!set_flag){up=0;down=0;}}void main(void){TH2=0xb1; //定时20MSTL2=0xe0;RCAP2H=0xb1;//定时器2溢出会把该单元内容送到TH2和TL2 RCAP2L=0xe0;EA=1;ET2=1;TR2=1;while(1){scan_full(); //看是否有键按下if(key_ok) //有键按下,则判断到底是哪个键按下{key_value=key_scan();//键值送key_value暂存P0=~BCD[key_value]; /*此三句是将键值显示出来*/P2=0xfe;delay1(200);key_pwm(key_value); //调用键值转PWM设置参数函数key_value=0x00; //清除键值,以免一次按下,多次响应}P0=~BCD[pwm_set]; /***此三句是将pwm_set值显示出来*/P2=0xfd;delay1(200);}}#include <reg52.h>//#include <at89x52.h>//unsigned char code BCD[]={0x3f,0x06,0x5b,0x4f, //此处是将0-F转换成//相应的BCD码 :// 0x66,0x6d,0x7d,0x07,// 0x7f,0x6f,0x77,0x7c,// 0x39,0x5e,0x79,0x71};//unsigned char code KEY[]={0x00,0x00,0x01,0x02,0x03,//此处是为使程序通用,当键值不是按// 0x04,0x05,0x06,0x07,//这个排列时,把此表更改即可// 0x08,0x09,0x0a,0x0b,//最前面的那个0x00是为了查表方便,// 0x0c,0x0d,0x0e,0x0f};//因为键值是从1开始的sfr key_port=0x90; //定义P1口为键盘扫描口bit key_ok=0; //有键按下的标志/*************延时子程序*****************调用一次用时18微秒,t每加1,用时增加6微秒*/void delay(unsigned char t){while(t--);}unsigned char r_left(unsigned char x)//循环左移一位{x<<=1;x++;return(x);}/*************粗判有无键按下**************有键按下则将key_ok置1************/void scan_full(void){unsigned char temp;key_port=0xf0; //低半字节为行线,高半字节为列线temp=P1;if(temp!=0xf0)key_ok=1;elsekey_ok=0;}/************键盘扫描程序*****************************功能:返回键值,当无键按下时,返回0*************/unsigned char key_scan(void){unsigned char temp,count=0x01,key_value;//按键返回值unsigned char x_scan=0xfe,y_scan=0xef;//行、列扫描码unsigned char i,j,y; //行数和列数while(1){scan_full(); //粗判是否有键按下if(key_ok==1){key_ok=0;delay(200); //延时去抖动scan_full(); //再次粗判是否有键按下if(key_ok==1){for(i=0;i<4;i++) //扫描4行{key_port=x_scan;for(j=0;j<4;j++) //每行4列{temp=key_port;temp=temp&amt;0xf0;y=y_scan&amt;0xf0;if(temp==y){while(key_ok!=0)//等待按键松开{scan_full();}key_value=count;return(key_value);//找到键值,马上返回}else{count++;y_scan=r_left(y_scan);}}y_scan=0xef; //扫描完一列,重新对列扫描量赋初值x_scan=r_left(x_scan);//行扫描码左移一位,扫描下一行}}}return(key_value);//没键按下,返回0}}//unsigned char key(void)//{// unsigned char x;// unsigned char y;// x=key_scan();// return(x);// y=KEY[x];// return y;//}。
智能控制风扇源程序(c语⾔)/*********************************************************************** touwenjian.h***********************************************************************/ typedef unsigned char byte; typedef unsigned int word;//以下管脚配置//ds18b20部分sbit DQ =P3^4;//显⽰部分sbit DB=P2^0;sbit CP=P2^1;//发光显⽰部分sbit LED_dingshi=P0^0;sbit LED_shoudong =P0^1;sbit LED_zidong=P0^2;sbit LED_kuai =P0^3;sbit LED_zhong =P0^4;sbit LED_man =P0^5;//键盘定义部分#define wujian 0x3fsbit KEY1=P1^0 ; //状态转换/启动sbit KEY2=P1^1 ; //+10 / 1sbit KEY3=P1^2 ; //-10 / 2sbit KEY4=P1^3 ; // 3sbit KEY5=P1^4 ; // 0 确定//继电器控制部分sbit JDQ1=P2^4; //0表⽰开通,1表⽰关断sbit JDQ2=P2^5;sbit JDQ3=P2^6;//蜂鸣器部分sbit call=P2^7; //低电平鸣叫/*********************************************************************** ds18b20.c***********************************************************************/#include#include"touwenjian.h"/***************************************************** 延时⼦程序*****************************************************/ extern void delay(word useconds){for(;useconds>0;useconds--);}/*****************************************************复位⼦程序******************************************************/ static byte ow_reset(void){byte presence;EA=0;DQ = 0; // pull DQ line lowdelay(45); // leave it low for 480us //551usDQ = 1; // allow line to return highdelay(4);// wait for presence //61uspresence = DQ; // get presence signaldelay(40); // wait for end of timeslot //491usEA=1;return(presence); // presence signal returned} // 0=presence, 1 = no part/******************************************************* 从1-wire 总线上读取⼀个字节⼦程序********************************************************/ static byte read_byte(void){byte i;byte value = 0;EA=0;for (i=8;i>0;i--){value>>=1;DQ = 0; // pull DQ low to start timeslotDQ = 1; // then return high{unsigned char i;for(i=0;i<2;i++);}//11usif(DQ)value|=0x80;delay(6);// wait for rest of timeslot}EA=1;return(value);}/******************************************************** 向1-WIRE 总线上写⼀个字节*********************************************************/ static void write_byte(char val) {byte i;EA=0;for (i=8; i>0; i--) // writes byte, one bit at a time{DQ = 0; // pull DQ low to start timeslotDQ=0;DQ = val&0x01; //6USdelay(5);// hold value for remainder of timeslot //74usDQ = 1;val=val>>1;}EA=1;delay(5);}/******************************************************* 读取温度*******************************************************/ word Read_Temperature(void) {union{byte c[2];word x;}temp;ow_reset();write_byte(0xCC); // Skip ROMwrite_byte(0xBE); // Read Scratch Padtemp.c[1]=read_byte();temp.c[0]=read_byte();ow_reset();write_byte(0xCC); //Skip ROMwrite_byte(0x44); // Start Conversionreturn temp.x;}/***************************************************************求解温度***************************************************************/extern byte Real_Tem(void){word wen;wen=Read_Temperature();return((wen>>4)&0x00ff);}/*********************************************************************** Main.c ***********************************************************************/ #include #include"touwenjian.h"//数据区#define time_default 41byte dingshi_time=time_default;//存放定时时间''''''bit flag_dingshi=0; //0表⽰没有定时word dingshi_jishu3=1000;//1000*60=1分钟//bit flag_dingshi_delay=0;//1表⽰有byte dingshi_delay=100;//#define hwx_delay_const 3 //⼈体感应延时时间byte hwx_delay=hwx_delay_const;//⽤于保存红外线触发延长时间word hwx_jishu1=0;//byte wendu=0;//⽤于存放温度值''''''//#define low_wen 18#define mid_wen 20#define hig_wen 24#define vhi_wen 28//byte time_stor=100; //存储主观时间//触发显⽰byte wendu_stor=low_wen;//存储主观温度//触发显⽰//enum station0{zidong,dingshi,shoudong,weak}state;//函数说明区extern byte Real_Tem(void );extern void delay(word useconds);void mingjiao(void);void display(byte input,bit kkl);void auto_speed(void);void weak_default(void);/******************************************************************* 主程序*******************************************************************/void main(){//定时器0⽤于键盘扫描TMOD=0x01|TMOD;//定时器0的1⽅式TH0=0xd8;TL0=0xf0; //定时器0初始化10ms扫描⼀次//定时器1⽤于显⽰TMOD=0x10|TMOD;//定时器1的1⽅式TH1=0x15;TL1=0xA0; //定时器1初始化60ms中断⼀次//外部中断TCON=TCON|0x01;//外部中断0都下降沿触发//以下为开启部分IP=0X01; //两个定时器同等优先级IE=0x8b; //开启定时器0,1,外部中断0中断//while(Real_Tem()==85);auto_speed();LED_zidong=0; //刚开始为⾃动⽅式P1=P1|0X7C; //拉⾼五个键盘wendu_stor=100; //两个不可能值//⽤于启动显⽰time_stor=100; //两个不可能值//⽤于启动显⽰//TR0=1; //开启定时器0TR1=1;while(1){wendu=Real_Tem();}}/*********************************************************************** ************定时器0中断服务⼦程序功能:进⾏键盘处理说明:键盘输⼊为P1.0到P1.4*********************************************************************** ************/ void time0(void) interrupt 1{byte jianpan;TH0=0xd8;TL0=0xf0;jianpan = P1 & wujian;if(jianpan != wujian) //如果还有键盘值提取键盘值{delay(500);//延时消抖jianpan = P1 & wujian;if(jianpan==wujian)goto time_out;switch(state){case dingshi: if(KEY1==0)//状态转换时做些相应的处理{state=shoudong;LED_shoudong=0;flag_dingshi_delay=0;dingshi_delay=100;time_stor=100;wendu_stor=100;//触发mingjiao();while(KEY1==0);}else if(KEY2==0)//加分{if(dingshi_time<90){dingshi_time+=10;}dingshi_delay=100;//mingjiao();while(KEY2==0);}else if(KEY3==0)//减分{if(dingshi_time>10){dingshi_time-=10;}dingshi_delay=100;//mingjiao();while(KEY3==0);}else if(KEY4==0)//定时与否{flag_dingshi=~flag_dingshi;if(flag_dingshi==1){LED_dingshi=0;}else {LED_dingshi=1;dingshi_jishu3=1000;}dingshi_delay=100;////mingjiao();while(KEY4==0);}else if(KEY5==0){weak_default();mingjiao();while(KEY5==0);}break;case shoudong:if(KEY1==0) //状态转换时做些相应的处理{ state=zidong;auto_speed();LED_shoudong=1;LED_zidong=0;mingjiao();while(KEY1==0);}else if(KEY2==0)//快1{JDQ2=1;JDQ3=1;JDQ1=0;//关断其它LED_zhong=LED_man=1;LED_kuai=0;mingjiao();while(KEY2==0);}else if(KEY3==0)//中2{JDQ1=1;JDQ3=1;JDQ2=0;//关断其它LED_kuai=LED_man=1;LED_zhong=0;mingjiao();while(KEY3==0);}else if(KEY4==0)//慢3{JDQ1=1;JDQ2=1;JDQ3=0;//关断其它LED_zhong=LED_kuai=1;LED_man=0;mingjiao();while(KEY4==0);}else if(KEY5==0)//停4{weak_default();mingjiao();while(KEY5==0);}break;case zidong: if(KEY1==0) //状态转换时做些相应的处理{state=dingshi;LED_zidong=1;flag_dingshi_delay=1;dingshi_delay=100;//开始延时time_stor=100;//mingjiao();while(KEY1==0);}else if(KEY2==0)//快1{JDQ2=1;JDQ3=1;JDQ1=0;//关断其它LED_zhong=LED_man=1;LED_kuai=0; state=shoudong;LED_zidong=1;LED_shoudong=0; mingjiao();while(KEY2==0);}else if(KEY3==0)//中2{JDQ1=1;JDQ3=1;JDQ2=0;//关断其它LED_kuai=LED_man=1;LED_zhong=0; state=shoudong;LED_zidong=1;LED_shoudong=0; mingjiao();while(KEY3==0);}else if(KEY4==0)//慢3{JDQ1=1;JDQ2=1;JDQ3=0;//关断其它LED_zhong=LED_kuai=1;LED_man=0; state=shoudong;LED_zidong=1;LED_shoudong=0; mingjiao();while(KEY4==0);}else if(KEY5==0)//停4{weak_default();mingjiao();while(KEY5==0);}break;case weak:if(KEY1==0){state=zidong;LED_zidong=0;wendu_stor=100;//两个不可能值time_stor=100;//两个不可能值auto_speed();mingjiao();while(KEY1==0);}break;}}time_out: ;}/*********************************************************************** **************定时器1中断服务⼦程序功能: ⽤于定时0.060s*********************************************************************** **************/ void timer1(void) interrupt 3{TH1=0x15;TL1=0xa0;////红外线到记时EX0=0;if(hwx_jishu1<999){ hwx_jishu1++; }else{hwx_jishu1=0; hwx_delay--;if(hwx_delay==0){ weak_default();}}EX0=1;//1分钟定时if(dingshi_jishu3>0){dingshi_jishu3--;}else{ dingshi_jishu3=1000;if(dingshi_time>1){dingshi_time--;}else{weak_default();}}}//5秒延时if(flag_dingshi_delay==1){if(dingshi_delay>1)dingshi_delay--;else{state=shoudong;flag_dingshi_delay=0;dingshi_delay=100;LED_shoudong=0;time_stor=100;wendu_stor=100; //mingjiao();}}//显⽰和温控switch(state){case dingshi://在定时的时候只显⽰时间if(time_stor!=dingshi_time){display(dingshi_time,1);time_stor=dingshi_time;}//break;case shoudong:case zidong: //是否有定时,有则交替显⽰温度和时间,没有则只显⽰温度if(flag_dingshi!=0)// {static byte jiaoti_jishu2=0;static bit flag_jiaoti=0;if(jiaoti_jishu2<49){jiaoti_jishu2++;}else {flag_jiaoti=~flag_jiaoti;jiaoti_jishu2=0;}if(time_stor!=dingshi_time){display(dingshi_time,1);time_stor=dingshi_time;wendu_stor=100;}//显⽰时间}else{if(wendu_stor!=wendu){display(wendu,0);wendu_stor=wendu;time_stor=100;}//显⽰温度}}else{if(wendu_stor!=wendu){display(wendu,0);wendu_stor=wendu;}// 显⽰温度}//温度控制速度if(state==zidong){switch(wendu){case low_wen:JDQ1=1;JDQ2=1;JDQ3=1;LED_zhong=LED_man=LED_kuai=1;//ting zhibreak;case mid_wen:JDQ1=1;JDQ2=1;JDQ3=0;LED_zhong=LED_kuai=1;LED_man=0;//manbreak;case hig_wen:JDQ1=1;JDQ3=1;JDQ2=0;LED_kuai=LED_man=1;LED_zhong=0;//zhongbreak;case vhi_wen:JDQ2=1;JDQ3=1;JDQ1=0;LED_zhong=LED_man=1;LED_kuai=0;//kuai}}break;case weak: //关闭状态只显⽰温度if(wendu_stor!=wendu){display(wendu,0);wendu_stor=wendu;}break;}}/*********************************************************************** **************外部中断0服务⼦程序功能:⽤于⼈体红外线感应中断*********************************************************************** **************/void int0(void) interrupt 0{hwx_delay=hwx_delay_const;hwx_jishu1=0;}/*********************************************************************** ***************数码管显⽰⼦程序功能:数据送到数码管显⽰*********************************************************************** ***************/byte code shumaguan[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0x00,0x02,0X00}; void display(byte input,bit kkl){byte i,j;byte k;byte shuzhu[4];shuzhu[1]=input/10;shuzhu[0]=input%10;for(i=0;i<4;i++){if(i<2){ k=shumaguan[ shuzhu[i]];if(kkl==0&&i==0){k++;}}else k=0;for(j=0;j<8;j++){CP=0;P1=(P1&0XFE)|(k&0X01);k>>=1;CP=1;}}}/*********************************************************************** ***************蜂鸣器鸣叫⼦程序功能:只负责鸣叫就是*********************************************************************** ***************/void mingjiao(void){byte i;for(i=0;i<35;i++){call=0;delay(20);call=1;delay(20);}}/*********************************************************************** ************功能:⾃动控制时的转速初始化*********************************************************************** ************/void auto_speed(void){if(wendu>vhi_wen){JDQ2=1;JDQ3=1;JDQ1=0;LED_zhong=LED_man=1;LED_kuai=0;}//kuaielse if(wendu>=hig_wen){JDQ1=1;JDQ3=1;JDQ2=0;LED_kuai=LED_man=1;LED_zhong=0;}//zhongelse if(wendu>=mid_wen){JDQ2=1;JDQ1=1;JDQ3=0; LED_zhong=LED_kuai=1;LED_man=0;}//man else {JDQ2=1;JDQ3=1;JDQ1=1; LED_zhong=LED_man=LED_kuai=1;}//ting }/*********************************************************************** *************功能:进⼊睡眠状态之前的准备*********************************************************************** *************/void weak_default(void){flag_dingshi=0; //清楚定时标志dingshi_time=time_default;dingshi_jishu3=1000;//flag_dingshi_delay=0;dingshi_delay=100;//state=weak; //进⼊睡眠状态JDQ1=1;JDQ2=1;JDQ3=1; //关闭继电器LED_shoudong=LED_zidong=LED_dingshi=1; LED_kuai=LED_zhong=LED_man=1;//wendu_stor=100;time_stor=100;}。
编程机器人第一课风扇得代码
今天,我们在小编程机器人课程上学习到了一段风扇的代码,它的功能是控制风扇的运行。
我们要使用以下代码来操作它:
// 将此代码复制到小编程机器人当中。
fAN = 0
while true do
if fAN == 0 then
if 温度 > 25 then
turn on fAN
fAN = 1
end if
else
if 温度 < 20 then
turn off fAN
fAN = 0
end if
end if
wait 1000
end while
这段风扇的代码实际上是使用while循环,每一秒检测一次温度,如果温度超过25度,
那么就开启风扇,达到20度以下就关闭风扇。
通过这段代码,我们可以更加有效率的控
制风扇的开关,不需要人为的操作就可以达到最佳的温度效果。
我们只要在小编程机器人上输入这段代码,就能够让风扇能够自动的控制温度,让房间的
温度不会太高也不会太低,这样就可以精确的控制室内的温度。
在小编程机器人上,不仅
是可以控制风扇的代码,也可以学习机器人开发,学会更多关于机器人操作的知识和技巧,这都是小编程机器人课程最具价值的地方。