单片机应用技术(第2版)课件 项目6 智能控制系统开发_第1页
单片机应用技术(第2版)课件 项目6 智能控制系统开发_第2页
单片机应用技术(第2版)课件 项目6 智能控制系统开发_第3页
单片机应用技术(第2版)课件 项目6 智能控制系统开发_第4页
单片机应用技术(第2版)课件 项目6 智能控制系统开发_第5页
已阅读5页,还剩53页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

综合应用与系统设计智能控制系统开发

单片机应用技术(第2版)模块四:综合应用与系统设计项目五智能控制系统开发任务一

步进电机控制与状态显示项目描述与任务目标项目描述

本项目旨在引导学习者综合运用电子电路设计、微控制器编程、传感器集成等多领域知识,完成4套具备实用价值的智能控制系统开发实践。项目以不同控制对象为核心切入点,通过理论探究与动手操作相结合的方式,帮助学习者掌握智能系统从硬件搭建到软件开发、调试的全流程开发技能。

在项目实施中,学习者将围绕步进电机、直流电机、温度控制和倒计时功能深入实践:首先系统梳理各控制对象的工作原理、驱动模式及控制逻辑;随后利用微控制器搭建硬件电路,编写控制程序实现各种控制功能;同时结合各种显示设备,设计直观的状态显示界面,实时反馈控制对象的状态。

通过本项目的实践,学习者不仅能巩固步进电机、直流电机、温度控制等专项知识,更能培养工程思维与问题解决能力,为后续复杂智能系统的设计与开发积累宝贵经验。知识目标了解LCD液晶显示屏显示方法和步进电机控制方法;能力目标能正确编写LCD显示程序;能控制步进电机动转。素养目标培养“工匠精神”与严谨细致的技术思维,培养“理论联系实际”的学习习惯与问题解决能力。一.步进电机的驱动原理实物图

内部接线

电路原理图步进电机正转依次驱动第1、2、3、4相线圈,步进电机反转依次驱动第4、3、2、1相线圈。二.LCD1602显示原理LCD1602是一种常见的液晶显示器件,其实物和电路图如下图所示。其中RS脚是指示当前数据口上的数据是命令还是数据选择引脚,RW脚是LCD1602读数据和写数据选择引脚,E脚是LCD1602的使能脚,7脚到14脚对应D0~D7是LCD1602的数据引脚。实物图

电路原理图二.LCD1602显示原理1.LCD1602写操作时序RS为高时表示D0~D7输出数据,RS为低时表示当前D0~D7输出命令,R/W为低表示写操作,E使能端高电平有效,时序图如图6-4所示,具体操作顺序为先输出RS,再输出R/W,再输出数据,最后控制使能端先高后低。二.LCD1602显示原理3.LCD1602常用指令介绍LCD1602常用的指令有设置显示模式、显示开关、清屏指令等功能指令码功能说明D7D6D5D4D3D2D1D0显示模式设置00111000设置显示模式为16字符2行每个字符点阵为5列7行,使用8位数据接口显示开/关光标设置00001000关闭显示00000110读或写一个字符后地址指针加一00001100开显示无光标清屏00000001显示清屏

,数据指针清零,所有显示清零二.LCD1602显示原理4..LCD1602初始化二.LCD1602显示原理5.LCD1602自定义字符取模

11111

1

1

1

1

11111

1

1

1

1

11111

LCD1602内部有CGROM可以存放8个自定义字符。显示汉字“日”在需要显示的位为1,不需要显示的为0。“日”字在LCD1602中存放的字模数据为{0X1f,0X11,0X11,0X1f,0X11,0X11,0X1f}二.LCD1602显示原理6.LCD1602字模数据存入将取好字模的数据依次存入CGROM地地址0X40~0XF7中,即完成了第一个自定义字符存字模工作。其操作流程如下所示:二.LCD1602显示原理7.调用CGROM内容的字模在需要使用自定义字模时只需要给0X00即可显示汉字“日”第几个自定义字符CGROM地址首位调用自定义字符的数据第几个自定义字符CGROM地址首位调用自定义字符的数据00X400X0040X600X0410X480X0150X680X0520X500X0260X700X0630X580X0370X780X07二.LCD1602显示原理8.LCD1602显示自定义符号关键程序将自定义字符的字模存入CGROM中的程序如下所示。for(i=0;i<8;i++){LCD__Write_Com(0X40+i); //0X40表示存入的是第一个自定义字符的字模LCD__Write__Data(tab[i]); //tab中存放的是LCD1062的自定义字模数据}在LCD1602上显示自定义字符的程序如下所示.LCD__Write_Com(0X80);//在第一行第一个字符处显示字符二.LCD1602显示步进电机状态程序流程图模块四:综合应用与系统设计项目五智能控制系统开发任务二

直流电机调速与温度联动任务目标知识目标了解STC89C52生成PWM的方法,通过ADC0809采集PT100温度的方法。能力目标能使用定时器生成PWM波形;能使用ADC0809采集PT100采集温度。素养目标培养严谨规范的工程思维与工匠精神;提升解决实际硬件问题的实践素养与创新意识;培养团队沟通与协同解决技术难题的能力。一、温度采集电路使用ADC0809来采集PT100温度,实物和电路如图6-8所示,电阻R102与PT100构成串联分压电路,通过P8将模拟信号送到ADC0809转换数字量送入单片机。实物图

电路原理图二、采集PT100温度与PC机通信的电路设计PC机的串口(COM口)遵循RS232标准,其逻辑电平为±12V(逻辑“1”为-12V,逻辑“0”为+12V)而C51单片机引脚是TTL电平(逻辑“1”为5V/3.3V逻辑“0”为0V)因此必须使用电平转换芯片进行连接。

使用MAX232/SP3232芯片最经典、最可靠的方案、MAX232系列芯片内部集成了电荷泵,仅需外接少量电容即可完成±5V至±12V的电平转换,应用电路如图所示。重要原则PC端通常使用DB9接口,其2脚为RXD(接收),3脚为TXD(发送)连接时需遵循“交叉直连”原则:单片机的TXD应连接到PC的RXD单片机的RXD应连接到PC的TXD。二、采集PT100温度01ADC0809与单片机通信初始化在进行温度采集时,需确保ADC0809与单片机之间的通信正常;首先,通过单片机向ADC0809发送启动信号,使其进入工作状态。02模拟信号采样与A/D转换ADC0809会对输入的模拟信号进行采样和量化,将其转换为数字量。三、PWM简介在单片机系统中,PWM信号的生成依赖于定时器的精确控制。通过配置定时器的工作模式和初始值,可以实现不同频率和占空比的PWM输出。首先需要设置定时器的计数初值,这个值决定了PWM波形的周期。接着通过调整比较值来控制占空比,当计数值小于比较值时输出高电平,反之则输出低电平。PWM信号的极性也是一个重要参数,可以根据具体应用需求进行配置,以满足不同负载的驱动要求。四、STC89C52产生PWM的方法

在STC89C52单片机中,产生PWM信号需要合理配置定时器和相关寄存器。选择一个合适的定时器作为PWM信号的基础时钟源,并设置其工作模式为自动重装载模式,以确保PWM波形的周期性。通过调整定时器的初值和重载值,可以精确控制PWM信号的频率。

利用T0产生10kHz的方波,占空比可变范围为30%~100%,每次调整以10%步进变化。五、程序流程图六、源程序整个程序分为ADC0809初始化函数,ADC0809读取指定通道模拟量函数,温度计算函数,根据温度确定PWM占空比函数,定时器0初始化函数,定时器0中断服务函数、主函数七个部分。#include<reg52.h>#include<intrins.h>//ADC0809引脚定义sbitADC_A=P2^0;sbitADC_B=P2^1;sbitADC_C=P2^2;sbitADC_ALE=P2^3;sbitADC_START=P2^4;sbitADC_EOC=P2^5;sbitADC_OE=P2^6;//PWM控制引脚sbitMOTOR_PWM=P3^0;//全局变量unsignedcharadc_result;//ADC转换结果floattemperature;//计算得到的温度值unsignedcharpwm_duty_cycle;//PWM占空比(0~100)/∗∗∗@brief延时毫秒函数∗@paramms延时毫秒数∗/voiddelay_ms(unsignedintms){unsignedinti,j;for(i=0;i<ms;i++)for(j=0;j<110;j++);//根据晶振频率调整}/∗∗∗@briefADC0809初始化函数∗/voidADC_Init(void){ADC_A=0;//选择通道IN0ADC_B=0;ADC_C=0;ADC_ALE=0;//地址锁存使能初始为低ADC_START=0;//启动信号初始为低ADC_OE=0;//输出使能初始为低}/∗∗∗@briefADC0809读取指定通道模拟量∗@paramchannel通道号(0-7)∗@return转换结果(0-255)∗/unsignedcharADC_Read(unsignedcharchannel){unsignedcharresult;//设置通道地址ADC_A=channel&0x01;ADC_B=(channel>>1)&0x01;ADC_C=(channel>>2)&0x01;//锁存地址ADC_ALE=1;_nop_();_nop_();ADC_ALE=0;六、源程序//启动转换ADC_START=1;_nop_();_nop_();ADC_START=0;//等待转换结束while(ADC_EOC==0);//读取转换结果ADC_OE=1;result=P1;//从P1口读取数据ADC_OE=0;returnresult;}/∗∗∗@briefPT100温度计算函数∗@paramadc_valADC采样值(0~255)∗@return计算出的温度值(摄氏度)∗/floatCalculate_Temperature(unsignedcharadc_val){floatvoltage_ratio,r_pt100,temp;//防止除零错误if(adc_val==0)adc_val=1;//计算电压比例voltage_ratio=(float)adc_val/255.0;//计算PT100阻值(100Ω固定电阻分压)r_pt100=100.0∗((5.0/(voltage_ratio∗5.0))-1);//根据PT100特性计算温度(简化线性模型)//R(T)=R0(1+αT),所以T=(R-R0)/(R0∗α)//α≈0.00385(铂电阻温度系数)temp=(r_pt100-100.0)/(100.0∗0.00385);returntemp;}/∗∗∗@brief根据温度确定PWM占空比∗@paramtemp当前温度∗@returnPWM占空比(0~100)∗/unsignedcharGet_PWMDuty(floattemp){unsignedcharduty;//温度范围映射到占空比(假设工作范围0~100℃)if(temp<=0){duty=0;}elseif(temp>=100){duty=100;}else{duty=(unsignedchar)(temp);//线性映射}returnduty;}六、源程序/∗∗∗@brief定时器0初始化(PWM发生器)∗16位定时器模式,用于产生PWM波形∗/voidTimer0_Init(void){TMOD|=0x01;//定时器0工作在模式1(16位)TH0=0xFC;//初值设定(约1ms溢出,1

2MHz晶振)TL0=0x18;ET0=1;//使能定时器0中断EA=1;//使能全局中断TR0=1;//启动定时器0}/∗∗∗@brief定时器0中断服务程序∗用于产生PWM波形∗/voidTimer0_ISR(void)interrupt1{staticunsignedcharcount=0;TH0=0xFC;//重装初值TL0=0x18;count++;//计数器递增if(count>=100)count=0;//周期为100if(count<pwm_duty_cycle){MOTOR_PWM=1;//高电平时间}else{MOTOR_PWM=0;//低电平时间}}/∗∗∗@brief主函数∗/voidmain(void){//系统初始化ADC_Init();Timer0_Init();//主循环while(1){//读取ADC值adc_result=ADC_Read(0);//读取通道0(IN0)//计算温度temperature=Calculate_Temperature(adc_result);//获取PWM占空比pwm_duty_cycle=Get_PWMDuty(temperature);//延时一段时间再次测量delay_ms(500);}}模块四:综合应用与系统设计项目五智能控制系统开发任务三智能家居设计任务目标知识目标(1)了解智能家居系统的整体架构与组成部分;(2)了解利用传感器(如温湿度、光敏、红外等)进行环境感知的原理。能力目标(1)能基于STC89C52单片机设计核心控制单元;(2)能使用模块化思维设计各功能子系统(如安防、照明、环境监控等);(3)能集成多种传感器与执行机构(如继电器、步进电机等)实现控制联动;(4)能通过中断、定时器及通信(如串口)技术设计稳定可靠的系统控制逻辑。素养目标(1)培养系统性的工程设计思维与从需求分析到功能实现的能力;(2)提升综合运用不同技术模块解决复杂实际问题的素养;(3)锻炼独立或团队协作进行创新性方案设计与文档编制的综合能力。一、系统总体架构设计

基于STC89C52的智能家居系统包含照明灯、电机驱动模块等执行设备层,主控芯片根据处理结果输出控制信号,驱动这些执行器完成特定的动作或任务。

执行设备层本系统以STC89C52单片机作为核心控制器,负责接收并处理来自各传感器的输入信号,根据预设逻辑进行判断,并协调整个系统的运行。

核心控制器

传感器感知层该系统包含多种传感器,构成感知层,用于实时采集环境或设备状态信息(如温度、光照、位置等),并将这些信号转换为电信号输入给主控芯片。

人机交互/通信层系统通过LCD显示屏或串口通信构成人机交互与通信层,用于将系统的工作状态、数据或报警信息实时反馈给用户,方便监控与调试。二、硬件模块简介与连接执行器:LED

灯(模拟灯)、步进电机(模拟窗帘控制)。

执行模块人机交互:OLED

显示屏(信息显示)及独立按键(模式设置、单独控制)。通信接口:MAX232

芯片构成串口模块,可与电脑上位机通信。

交互与通信模块传感器:DS18B20(温度)、光敏电阻(光照)。

感知模块设计各模块与单片机的引脚连接,将

DS18B20

接

P1.0,光敏电阻通过

ADC0809

连接的

AD

口连接到单片机

I/O

口;照明灯

LED0

接

P1.1,步进电机接

P1.4

到

P1.7。

接口连接设计控制器:STC89C52

单片机。

核心控制器

智能家居控制系统硬件设计三、DS18B20简介单总线通信严格依赖于精确的时序。所有操作均由主机(通常是MCU)发起,通过控制DQ线的电平高低和持续时间来发送命令和数据。

单总线通信时序与控制DS18B20是一款数字温度传感器,采用单总线(1-Wire)通信协议,具有高精度、抗干扰能力强、接口简单等特点。它可以直接将温度转换为数字信号输出,无须外部ADC转换器。DS18B20温度传感器简介单总线(1-Wire)是DallasSemiconductor(现MaximIntegrated)开发的一种异步、半双工、主从式串行通信协议。它仅使用一根数据线(DQ)和一根地线(GND)即可实现双向通信和供电(寄生供电模式),具有接口简单、节省I/O口、便于扩展等优点,广泛应用于DS18B20、DS2401等数字温度传感器和电子识别芯片中。

单总线(1-Wire)通信协议020103DS18B20数字温度传感器与单总线通信协议010203初始化时序1.初始化时序(复位脉冲+存在脉冲)这是每次通信开始前的“握手”过程,用于检测总线上是否存在从机设备,并使其同步,如图

6 ̄11

所示。

主机复位脉冲:主机将

DQ

线拉低至少

480μs(最小值),然后释放(拉高)。

从机存在脉冲:从机在检测到主机释放总线后,会在

15~60μs

内将

DQ

线拉低

60~240μs,作为响应。

主机接收检测:主机在释放总线后,会切换到接收模式,并在

60~240μs

的时间窗口

内采样

DQ

线。

如果采样到低电平,则表示总线上有从机设备存在,初始化成功。写时序2.写时序(写“0”和写“1”)主机向从机写入

1

位数据。

无论是写“0”还是写“1”,都以主机拉低

DQ

线开始,区别

在于低电平的持续时间。

写“0”时序,如图

6 ̄12

所示:主机拉低

DQ

线;保持低电平

60~120μs(典型值);主机

释放总线(拉高)。

从机在主机拉低后的

15~60μs

采样

DQ

线,若为低电平则判定为“0”。

整个写“0”时隙至少持续

60μs,之后需要至少

1μs

的恢复时间。

从机在主机拉低后的

15~60μs

内采样

DQ

线,若为高电平则判定为“1”。

整个写“1”时隙同样至少持续

60μs,之后需要恢复时间。读时序3.主机从从机读取

1

位数据

读时序由主机发起,通过一个短暂的拉低脉冲来“请求”数据,然后从机在特定的时

间窗口内控制总线电平,如图

6 ̄14

所示。

读时序步骤:①主机拉低

DQ

线至少

1μs,然后释放(拉高),启动读时隙。

②从机在检测到主机释放总线后,如果要发送“0”,则继续拉低

DQ

线;如果要发送

“1”,则释放总线(DQ

被上拉电阻拉高)。

③主机在启动读时隙后的

15μs

内,必须完成对

DQ

线的采样。

采样到的电平即为读

取到的数据位(0

或

1)。

④整个读时隙至少持续

60μs,之后需要恢复时间。三、DS18B20简介

功能命令ROM命令在成功完成初始化(复位)后,主机将发送一系列命令来操作总线上的从机设备。命令分为ROM命令和功能命令两大类。ROM命令(5位命令码)用于在总线上有多个从机设备时,寻址特定的设备。每个单总线器件都有一个全球唯一的64位ROMID(包括8位家族码、48位序列号和8位CRC校验码)。搜索ROM[0xF0]:主机通过此命令可以识别总线上所有从机设备的64位ROMID。这是一个复杂的逐位协商过程。读取ROM[0x33]:仅当总线上只有一个从机时使用。主机发送此命令后,从机会将自己的64位ROMID发送给主机。匹配ROM[0x55]:这是最常用的寻址命令。主机发送此命令后,紧接着发送一个64位的ROMID,只有与此ID完全匹配的从机才会响应后续的功能命令。其他从机忽略后续通信。跳过ROM[0xCC]:忽略ROM地址,直接向总线上的所有从机广播功能命令。仅当总线上只有一个从机,或需要同时操作所有同类型从机(如同时启动所有DS18B20进行温度转换)时使用。报警搜索[0xEC]:仅搜索那些设置了报警标志的从机设备(如DS18B20的温度超过了设定的阈值)。在通过ROM命令选定目标从机(或跳过ROM)后,主机发送功能命令来执行具体的操作,如读取温度、写入配置等。下面以DS18B20温度传感器为例。温度转换命令[0x44]:启动温度转换。对于寄生供电的DS18B20,主机必须在转换期间(最多750ms)持续提供强上拉。读暂存器命令[0xBE]:读取DS18B20暂存器(Scratchpad)的9个字节,包括温度值、高低报警阈值和配置寄存器等。写暂存器命令[0x4E]:向DS18B20的暂存器写入数据,通常用于设置高低温报警阈值和配置寄存器(分辨率)。复制暂存器命令[0x48]:将暂存器中的报警阈值和配置数据复制到EEPROM中,掉电后不丢失。召回EEPROM命令[0xB8]:将EEPROM中存储的报警阈值和配置数据恢复到暂存器中。读供电方式命令[0xB4]:检测DS18B20的供电模式(寄生供电或外部供电)。

单总线命令集0201三、DS18B20简介01020304050607主机发送SkipROM[0xCC](如果只有一个传感器)。ROM命令再次发送复位脉冲和存在脉冲,开始新的通信周期。再次初始化主机发送ReadScratchpad[0xBE]。再次功能命令主机发送复位脉冲,DS18B20回应存在脉冲。初始化主机发送ConvertT[0x44]启动温度转换,并等待转换完成(或通过延时)。功能命令再次发送SkipROM[0xCC]。再次ROM命令主机连续读取9个字节的数据,其中前2个字节即为温度值。读取数据三、DS18B20简介四、OLED屏简介本任务使用SSD1306驱动芯片,支持I2C接口,分辨率128像素×64像素。接口由于C51无硬件I2C,需软件模拟。OLED屏使用说明OLED显示屏如图6-15所示,是一款基于有机发光二极管技术的显示器件,具备以下几大显著特点:自发光特性、高对比度、快速响应、宽视角、低功耗、轻薄柔性。OLED屏特点OLED显示屏概述五、软件模拟IIC程序整个程序分为起始信号、停止信号、发送一个字节、初始化序列四个部分。//I2C引脚定义sbitSCL=P2.0;sbitSDA=P2.1;//I2C起始信号voidI2C_Start(void){SDA=1;SCL=1;Delay_us(5);SDA=0;Delay_us(5);SCL=0;}//I2C停止信号voidI2C_Stop(void){SDA=0;SCL=1;Delay_us(5);SDA=1;Delay_us(5);}//发送一个字节voidI2C_SendByte(unsignedchardat){unsignedchari;for(i=0;i<8;i++){SDA=(dat&0x80)?1:0;dat<<=1;SCL=1;Delay_us(5);SCL=0;Delay_us(5);}//等待应答SDA=1;SCL=1;Delay_us(5);SCL=0;}OLED初始化序列voidOLED_Init(void){Delay_ms(100);//上电延时//初始化命令序列OLED_WriteCmd(0xAE);//关闭显示OLED_WriteCmd(0xD5);//设置时钟分频OLED_WriteCmd(0x80);OLED_WriteCmd(0xA8);//设置多路复用率OLED_WriteCmd(0x3F);OLED_WriteCmd(0xD3);//设置显示偏移五、软件模拟IIC程序OLED_WriteCmd(0x00);OLED_WriteCmd(0x40);//设置起始行OLED_WriteCmd(0x8D);//电荷泵设置OLED_WriteCmd(0x14);OLED_WriteCmd(0x20);//内存地址模式OLED_WriteCmd(0x00);OLED_WriteCmd(0x40);//设置起始行OLED_WriteCmd(0x8D);//电荷泵设置OLED_WriteCmd(0x14);OLED_WriteCmd(0x20);//内存地址模式OLED_WriteCmd(0x00);OLED_WriteCmd(0xA1);//段重映射OLED_WriteCmd(0xC8);//扫描方向OLED_WriteCmd(0xDA);//设置COM引脚配置OLED_WriteCmd(0x12);OLED_WriteCmd(0x81);//对比度设置OLED_WriteCmd(0xCF);OLED_WriteCmd(0xD9);//预充电周期OLED_WriteCmd(0xF1);OLED_WriteCmd(0xDB);//VCOMH电平OLED_WriteCmd(0x40);OLED_WriteCmd(0xA4);//正常显示OLED_WriteCmd(0xA6);//正常显示(非反相)OLED_WriteCmd(0xAF);//开启显示}六、程序流程图七、部分源程序#include<reg52.h>#include<intrins.h>#include"ds18b20.h"#include"adc0809.h"#include"oled.h"#include"motor.h"#include"led.h"//系统状态定义#defineMODE_AUTO0#defineMODE_MANUAL1//传感器引脚定义sbitPIR_SENSOR=P3^0;//人体红外传感器sbitLIGHT_SENSOR=P3^1;//光线传感器//控制引脚定义sbitBUZZER=P2^0;//蜂鸣器sbitRELAY=P2^1;//继电器//全局变量unsignedcharsystem_mode=MODE_AUTO;//系统模式floattemperature=0.0;//温度值unsignedintlight_value=0;//光照值unsignedcharpir_status=0;//人体感应状态bitalarm_flag=0;//报警标志/∗∗∗@brief延时函数∗/voiddelay_ms(unsignedintms){unsignedinti,j;for(i=0;i<ms;i++)for(j=0;j<110;j++);}/∗∗∗@brief系统初始化∗/voidSystem_Init(void){//IO端口初始化P0=0x00;P1=0x00;P2=0x00;P3=0x00;//传感器初始化DS18B20_Init();ADC0809_Init();//OLED显示初始化OLED_Init();//步进电机初始化Motor_Init();//LED初始化LED_Init();//中断初始化EA=1;//开启总中断七、部分源程序//显示欢迎信息OLED_Clear();OLED_ShowString(0,0,"SmartHome");OLED_ShowString(0,2,"SystemReady");delay_ms(1000);OLED_Clear();}/∗∗∗@brief读取所有传感器数据∗/voidRead_Sensors(void){//读取温度temperature=DS18B20_GetTemp();//读取光照强度light_value=ADC0809_Read(0);//通道0//读取人体感应状态pir_status=PIR_SENSOR;}/∗∗∗@brief环境控制逻辑∗/voidEnvironment_Control(void){//光照联动控制LEDif(light_value<100){//光照较暗LED_On();}else{LED_Off();}//温度联动控制步进电机(模拟空调)if(temperature>28.0){Motor_SetSpeed(3);//高速制冷}elseif(temperature>25.0){Motor_SetSpeed(2);//中速制冷}elseif(temperature<18.0){Motor_SetSpeed(1);//低速制热}else{Motor_Stop();//停止}}/∗∗∗@brief安防控制逻辑∗/voidSecurity_Control(void){staticunsignedcharlast_pir=0;if(pir_status&&!last_pir){//检测到人体进入alarm_flag=1;BUZZER=1;//蜂鸣器报警RELAY=1;//启动报警设备OLED_ShowString(0,6,"ALARM:INTRUSION");}elseif(!pir_status&&last_pir){//人体离开alarm_flag=0;七、部分源程序BUZZER=0;//停止报警RELAY=0;//关闭报警设备OLED_ShowString(0,6,"");}last_pir=pir_status;}/∗∗∗@brief更新显示信息∗/voidUpdate_Display(void){//显示温度OLED_ShowString(0,0,"Temp:");OLED_ShowFloat(40,0,temperature,2,1);OLED_ShowString(80,0,"C");//显示光照值OLED_ShowString(0,2,"Light:");OLED_ShowNum(40,2,light_value,3);//显示系统模式OLED_ShowString(0,4,"Mode:");if(system_mode==MODE_AUTO){OLED_ShowString(40,4,"AUTO");}else{OLED_ShowString(40,4,"MANUAL")}//显示电机状态OLED_ShowString(80,4,"M:");if(temperature>28.0){OLED_ShowString(100,4,"COOL");}elseif(temperature<18.0){OLED_ShowString(100,4,"HEAT");}else{OLED_ShowString(100,4,"STOP");}}/∗∗∗@brief主函数∗/voidmain(void){//系统初始化System_Init();while(1){//读取传感器数据Read_Sensors();//执行控制逻辑if(system_mode==MODE_AUTO){Environment_Control();//环境自动控制Security_Control();//安防控制}//更新显示Update_Display();//延时delay_ms(500);}}模块四:综合应用与系统设计项目五智能控制系统开发任务四倒计时器设计任务目标知识目标(1)了解倒计时制作方法;(2)了解倒计时程序编写方法。能力目标(1)能正确使用定时器;(2)能检测按键;(3)能用数码管正确显示倒计时。素养目标(1)培养“工匠精神”与严谨细致的技术思维;(2)培养“理论联系实际”的学习习惯与问题解决能力。一、定时器设置0102定时器初始化定时器初始化函数如下:

void

Timer0_Init(void)//10

毫秒@

11.0592

MHz{TMOD

&

=

0xF0;//设置定时器模式

TL0

=

0x00;//设置定时初始值

TH0

=

0xDC;//设置定时初始值

TF0

=

0;//清除

TF0

标志

ET0

=

1;//定时器

T0

中断允许

EA=

1;//总中断开启

TF0

=

0;//清除

TF0

标志

TR0

=

1;//定时器

0

开始计时}定时中断计数51

单片机定时器不能直接定时

1

s,任务中定时器设置为

10

ms,在中断程序对定时

器进行计数,中断

100

次既为

1

s。二、按键检测任务中按键检测使用定时器来进行,利用定时器的10ms做为消抖。按键检测初始化第二次进中断再判断是否有按键按下,有则执行倒计时。二次确认与执行第一次检测有按键开启标志。首次检测与标志设置if(keyflag==1){Downtime=1;//执行开启倒计时

}if(key==0)//有按键按下

Keyflag=1;//按键标志置1。程序代码示例三、显示函数01初始化显示缓存数码管显示将需要显示的内容放入显示缓存

disp[]内。02更新显示内容显示时改变显示缓存中的内容,显示的值就发生变化。03执行显示程序数码管显示程序如下:Dispnum(){P0

=

tab[disp[0]];}四、倒计时器程序流程图五、源程序#include<reg52.h>#include<intrins.h>//数码管显示相关定义#defineDIG_PORTP0//段选数据端口sbitWEI1=P2^0;//第1位数码管位选sbitWEI2=P2^1;//第2位sbitWEI3=P2^2;//第3位sbitWEI4=P2^3;//第4位sbitWEI5=P2^4;//第5位sbitWEI6=P2^5;//第6位sbitWEI7=P2^6;//第7位sbitWEI8=P2^7;//第8位//外部中断按键定义(连接P3.2

INT0)sbitKEY_START_STOP=P3^2;//全局变量unsignedcharcodeDIG_CODE[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,//0-70x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,//8-15(A-F)0x00//16:全灭};unsignedcharDisplay_Buffer[8];//显示缓冲区

存放8位数码管要显示的数字编码unsignedinttime_count=500;//倒计时时间计数

单位10ms500代表5.00sunsignedchartimer1_10ms_cnt=0;//定时器1中断次数计数

用于产生10ms时基unsignedcharsys_state=0;//系统状态:0-停止1-倒计时运行2-倒计时结束unsignedchardisplay_index=0;//数码管动态扫描索引/∗∗@brief延时函数(粗略延时)@paramt延时时间∗/voiddelay(unsignedintt){while(t--);}/∗∗@brief数码管显示数字到缓冲区将5s(如500)转换为“00-00-05”格式放入缓冲区∗/voidupdate_display_buffer(void){unsignedinttemp=time_count;//time_count是10ms的计数500代表5s//计算百分秒、秒、分(本例中分和秒始终为0

仅百分秒变化)//格式:第1—2位:分

第4—5位:秒

第7—8位:百分秒(实际显示5s内的百分秒)//为了显示5s倒计时

我们显示“00-00-XX”

XX从05.00递减到00.00//这里简化处理

将time_count(500~0)转换为两位整数(50~0)显示在最后两位//更精确的做法是显示“00.00”到“05.00”

但需要小数点和更复杂的转换。本例展示核心逻辑。五、源程序//示例:将时间(单位10ms)转换为“秒.百分秒”的两位整数部分显示//例如time_count=500(5.00s)->显示0500//time_count=499(4.99s)->显示0499unsignedcharsecond_high,second_low,ms_high,ms_low;unsignedinttotal_cs=time_count;//总厘秒数(1厘秒=10ms)//分解出秒部分(整数秒)和厘秒部分//注意:total_cs=500代表5.00秒

即500厘秒unsignedintseconds=total_cs/100;//整数秒(0—5)unsignedintcentiseconds=total_cs%100;//百分秒(0—99)//转换为十进制数码second_high=seconds/10;second_low=seconds%10;ms_high=centiseconds/10;ms_low=centiseconds%10;//存入显示缓冲区

假设8位数码管布局为:[分十位][分个位][-][秒十位][秒个位][-][百分秒十位][百分秒个位]//本例中分钟始终为0

我们显示“00-00-05”到“00-00-00”的倒计时//缓冲区索引:01234567//分十分个横线秒十秒个横线厘十厘个Display_Buffer[0]=DIG_CODE[0];//分十位0Display_Buffer[1]=DIG_CODE[0];//分个位0Display_Buffer[2]=0x40;//显示“-”(横线)

段码为0x40(共阴)Display_Buffer[3]=DIG_CODE[second_high];//秒十位Display_Buffer[4]=DIG_CODE[second_low];//秒个位Display_Buffer[5]=0x40;//显示“-”Display_Buffer[6]=DIG_CODE[ms_high];//百分秒十位Display_Buffer[7]=DIG_CODE[ms_low];//百分秒个位//如果倒计时结束

全部显示0或特定符号(如“-”)if(sys_state==2){//倒计时结束

可以显示全0或特定结束标志

例如最后两位显示“FF”Display_Buffer[6]=DIG_CODE[0];Display_Buffer[7]=DIG_CODE[0];}}五、源程序/∗∗@brief定时器0初始化(用于数码管动态扫描1ms中断)∗/voidtimer0_init(void){TMOD&=0xF0;//清除T0的控制位TMOD|=0x01;//设置T0为模式1(16位定时器)TH0=0xFC;//装入初值1ms中断一次(12MHz晶振)TL0=0x18;ET0=1;//允许T0中断TR0=1;//启动T0}/∗∗@brief定时器1初始化(用于倒计时基准10ms中断)∗/voidtimer1_init(void){TMOD&=0x0F;//清除T1的控制位TMOD|=0x10;//设置T1为模式1(16位定时器)TH1=0xD8;//装入初值10ms中断一次(12MHz晶振)TL1=0xF0;ET1=1;//允许T1中断//TR1先不启动

由按键控制}/∗∗@brief外部中断0初始化(用于启动/停止按键)∗/voidint0_init(void){IT0=1;//设置INT0为下降沿触发方式EX0=1;//允许INT0中断}/∗∗@brief系统初始化/voidsys_init(void){DIG_PORT=0x00;//段选端口初始化为全灭P2=0x00;//位选端口初始化为全灭(共阴数码管

位选低电平选中)EA=1;//开启总中断timer0_init();//初始化定时器0(数码管扫描)timer1_init();//初始化定时器1(倒计时)int0_init();//初始化外部中断0sys_state=0;//初始状态为停止time_count=500;//初始倒计时时间5s(50010ms)update_display_buffer();//更新显示缓冲区初始值}/∗∗@brief主函数∗/五、源程序voidmain(void){sys_init();//系统初始化while(1){//主循环主要处理状态更新和显示刷新(显示刷新在中断中完成)//这里可以添加其他功能

如状态指示灯控制等//数码管动态扫描和倒计时均在中断服务程序中处理//主循环可以保持空转或执行低优先级任务//为了降低功耗

可以添加休眠指令

但本例简化处理;}}/∗∗@brief定时器0中断服务函数(数码管动态扫描)∗/voidtimer0_isr(void)interrupt1{TH0=0xFC;//重装初值TL0=0x18;//先关闭所有位选

消隐P2=0x00;//根据当前扫描索引

输出段码DIG_PORT=Display_Buffer[display_index];//开启对应位选switch(display_index){case0:WEI1=1;break;case1:WEI2=1;break;case2:WEI3=1;break;case3:WEI4=1;break;case4:WEI5=1;break;case5:WEI6=1;break;case6:WEI7=1;break;case7:WEI8=1;break;default:break;}//更新扫描索引

准备下一次显示display_index++;if(display_index>=8){display_index=0;}}/∗∗@brief定时器1中断服务函数(10ms时基

用于倒计时)∗/voidtimer1_isr(void)interrupt3{TH1=0xD8;//重装初值TL1=0xF0;//只有在倒计时运行状态下

才更新时间五、源程序if(sys_state==1){if(time_count>0){time_count--;//倒计时递减(每10ms减1)update_display_buffer();//更新显示缓冲区}else{//倒计时结束time_count=0;sys_state=2;//状态变为“结束”TR1=0;//停止定时器1update_display_buffer();//更新显示为结束状态}}}/∗∗@brief外部中断0服务函数(启动/停止按键处理)∗/voidint0_isr(void)interrupt0{delay(1000);//简单延时消抖

实际应用建议用定时器消抖if(KEY_START_STOP==0){//再次确认按键按下(低电平有效)if(sys_state==0){//状态0(停止)->状态1(运行):开始倒计时sys_state=1;time_count=500;//重置时间为5秒TR1=1;//启动定时器1(开始倒计时)update_display_buffer();}elseif(sys_state==1){//状态1(运行)->状态0(停止):停止倒计时sys_state=0;TR1=0;//停止定时器1(暂停倒计时)//保持当前时间显示}elseif(sys_state==2){//状态2(结束)->状态0(停止):复位sys_state=0;time_count=500;//重置时间为5秒TR1=0;//确保定时器1停止update_display_buffer();}}//等待按键释放(简单处理)while(!KEY_START_STOP);}模块四:综合应用与系统设计项目五智能控制系统开发任务六

十字路口交通灯控系统的搭建与调试一、实训目标理解交通控制系统这类民生工程的技术价值,体会电子技术在保障公共安全、提升生活效率中的重要作用。

工程价值理解掌握51系列单片机(以STC89C52为例)I/O口的工作原理及配置方法,理解交通信号灯控制系统的逻辑控制流程,包括红、黄、绿灯的时序切换规则,熟悉LED数码管(或LED信号灯模块)的驱动方式与接线规范。

知识与技能掌握能独立完成单片机最小系统与交通信号灯模块的硬件接线,排查基础接线故障;能编写并调试C51程序,实现十字路口红、黄、绿灯按预设时序循环运行;能结合实训要求优化程序逻辑,添加紧急情况(如行人通行)辅助功能,提升动手实践与问题解决能力。

实践能力培养020103

交通信号灯控制系统实训目标二、实训原理

交通信号灯控制系统原理

硬件控制原理STC89C52

单片机的

P1

口、P2

口配置为推挽输出模式,通过高低电平控制

LED

信号

灯的亮灭。以

P2

口为例。P2.0 ̄P2.2:控制东西方向红、黄、绿灯(分别对应电平低亮/高亮,可根据接线调整为

低电平点亮)。P2.3 ̄P2.5:控制南北方向红、黄、绿灯。预留

P1

口引脚,可拓展行人通行按钮、数码管显示等功能。LED

信号灯采用串联限流电阻的驱动方式,确保工作电流在安全范围(5~10

mA),

避免烧毁

LED。

软件控制原理通过

C51

语言编写时序控制程序,利用延时函数实现红、黄、绿灯的亮灭时长,通过

I/O

口电平赋值实现方向切换。预设标准时序:东西绿灯、南北红灯:30

s;

东西黄灯、南北红灯:5

s;

东西红灯、南北绿灯:30

s;

东西红灯、南北黄灯:5

s;

循环执行上述流程,实现交通信号灯的有序控制。0102硬件接线1.硬件接线

(1)搭建单片机最小系统

按教材规范连接电源(VCC接

5

V、GND

接

GND)、晶振电路(12

MHz

晶振+2

个

30

pF

电容)、复位电路(10μF

电容+10

kΩ电阻),确保开发板上电后指示灯正常亮起。

(2)信号灯接线

取

3

组红、黄、绿

LED

模块,分别对应东西方向(E ̄W)和南北方向(S ̄N),每组

3

个信号灯,每个

LED

正极接单片机输出引脚(如东西红灯接

P2.0),负极串联

220Ω电阻后接

GND,重复接线,完成南北方向信号灯(南北红灯接

P2.3、南北黄灯接

P2.4、南北绿灯接

P2.5)与

P2

口的连接。(3)接线检查

用万用表检测各引脚与

GND

的通断,确认无短路、错接情况,核对引脚编号与程序定义的一致性,避免“引脚错位”故障。程序编写与编译2.程序编写与编译

程序框架搭建(C51

代码核心框架):三、实训内容与步骤四、源程序#include<reg52.h>//定义引脚sbitE_W_Red=P2^0;//东西红灯sbitE_W_Yellow=P2^1;//东西黄灯sbitE_W_Green=P2^2;//东西绿灯sbitS_N_Red=P2^3;//南北红灯sbitS_N_Yellow=P2^4;//南北黄灯sbitS_N_Green=P2^5;//南北绿灯//延时函数(12MHz晶振,约1s延时,可根据需求调

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论