单片机控制电路开关程序完整程序
- 格式:doc
- 大小:29.50 KB
- 文档页数:5
中国石油大学(北京)实验报告实验课程:单片机原理及应用实验名称:实验二——指示灯/开关控制器一、实验目的学习汇编語言指令系统的编程与调试方法二、实验内容1、参照教材图A.19完成实验二电路原理图的绘制;2、根据图A.20的程序流程图编写汇编语言程序;3、利用ISIS的汇编工具查找并修正程序的语法错误和逻辑错误;4、观察仿真结果,完成实验报告。
三、实验要求1、电路原理图P1口读取开关状态的工作原理:通过P1的读引脚功能来实现,由于P1口内设上拉电阻,在开关闭合前读取高电平,经过三态门在P1.n输出高电平。
当开关闭合时,由于与地面相连,P1读取低电平,经过三态门在P1.n输出低电平。
P1口输出工作原理:单片机执行写P1,#data时,数据data经过内部总线送入锁存器储存。
当数据为,则该位锁存器输出Q=1,则非Q为0,场效应管截止,从而在引脚P1.n 上输出高电平;反之,如果数据为0,则Q=1,非Q为0,场效应管导通,引脚P1.n上输出低电平。
P2口控制LED灯的原理也是通过P2口的输出原理实现的,程序不断把P1的内容传递给P2。
当给P1口赋初值0或开关闭合时,P1.n输出0,P2口读取0,在引脚P2.n上输出低电平,由原理图中LED的摆放方式知LED灯低电平导通。
同理当给P1口赋初值#FFH 或开关断开时,P1.n输出1,P2口读取1,在引脚P2.n上输出高电平,LED灯截止,灯灭。
图1 实验原理电路图2、汇编源程序图2 汇编源程序3、程序调试过程1.源文件创建与编译(1)建立新的程序文件单击菜单栏“源代码”—“添加/删除源文件”选项,弹出“添加/移除源代码”对话框。
在“代码生成工具”下拉框内部选择“ASEM51”选项。
单击“新建”按钮,在适当文件目录下输入待建立程序的文件名(如text),核实文件类型为*ASM。
单击“打开”按钮,回应创建新文件提示后,系统弹出确认对话框。
单击“确认”按钮,在菜单“源代码”下可看到类似“1.text.ASM”的文件名,单击该文件名后可打开一个空白的文本文件。
51单片机按键控制电路设计内容总结一、引言在现代电子产品中,按键控制是一种常见的操作方式。
通过按下不同的按键,可以实现不同的功能。
而在电子设备的控制电路中,需要一种可靠的方式来检测按键的状态,并根据按键的状态来进行相应的操作。
本文将介绍基于51单片机的按键控制电路设计。
二、按键控制电路的基本原理按键控制电路的基本原理是通过检测按键的状态来确定按键是否被按下。
当按键被按下时,按键的状态会发生改变,通过检测这种状态的改变,可以触发相应的操作。
在51单片机中,可以通过外部中断来实现对按键状态的检测。
当按键被按下时,会触发外部中断,从而通知单片机按键的状态发生了改变。
三、按键控制电路的设计步骤1. 硬件设计在按键控制电路的硬件设计中,需要确定使用的按键数量,并选择合适的按键类型。
常见的按键类型有机械按键和触摸按键。
根据实际需求,选择合适的按键类型,并将其连接到51单片机的外部中断引脚上。
2. 软件设计在按键控制电路的软件设计中,需要编写相应的程序来实现对按键状态的检测和相应操作的执行。
在51单片机中,可以通过中断服务程序来实现对外部中断的响应。
当外部中断触发时,中断服务程序会被执行,并根据按键的状态来执行相应的操作。
四、案例分析下面以一个简单的案例来说明按键控制电路的设计。
假设我们需要设计一个LED灯的开关控制电路,通过按下按键可以控制LED灯的开关状态。
1. 硬件设计选择一个机械按键作为控制按键,并将其连接到51单片机的外部中断引脚上。
同时,将一个LED灯连接到51单片机的IO口上。
2. 软件设计编写相应的程序来实现按键状态的检测和LED灯开关状态的控制。
当按键被按下时,外部中断触发,中断服务程序被执行。
在中断服务程序中,通过读取按键的状态来确定按键是否被按下,并根据按键的状态来控制LED灯的开关状态。
五、总结通过本文的介绍,我们了解了按键控制电路的基本原理和设计步骤。
在51单片机中,可以通过外部中断来实现对按键状态的检测。
单片机检测交流电掉电程序(数码分段开关)
灯饰配件中有一种控制器叫数码分段开关,基本工作原理是利用墙壁开关
通断电来实现对多种负载的轮流亮灭,这其中就涉及到单片机如何检测交流电
掉电。
首先,要把交流电的同步信号提取出来,形成单片机能识别的低压信号,一般有2 中方法,一种是直接利用电阻分压法,把同步信号提取(适合非隔离
型电路)。
另外一种方法是利用光耦提取隔离的交流信号。
2 种方法如下所示:
光耦隔离取样电路
电阻分压取样电路
所取得的交流信号如下图:
本程序实现的功能是,第一次打开关,L1 亮,L2 灭,第二次打开关,L1 灭,L2 亮,第三次打开关,L1,L2 全亮,第四次打开关,L1,L2 全灭,如此循环。
那么,单片机检测交流电掉电,每隔一定时间检测一次交流信号输入口,如果
是低电平,开始计时,如果12MS-15MS 之后,还是低电平,说明交流电被断
过一次电,此时要做出相应的控制动作。
所用单片机为PIC16F676,RA5 上的
脚作为交流检测脚。
RC2,RC3 作为负载输出控制端。
程序如下:
#include__CONFIG(0X1B4);#define uchar unsigned char//宏定义,相当于uchar=unsigned char#define uint unsigned int//宏定义,相当于uint=unsigned int tips:感谢大家的阅读,本文由我司收集整编。
仅供参阅!。
基于单片机智能衣柜开关门控制电路智能家居技术的快速发展使得智能衣柜逐渐成为现代生活中的一部分。
基于单片机的智能衣柜开关门控制电路,是一种通过电子技术实现衣柜门自动开关的创新解决方案。
本文将探讨该电路的设计原理、关键组成部分及其工作流程,以及在实际应用中的优势和适用性。
设计原理与关键组成部分智能衣柜开关门控制电路的设计核心是单片机,通常选择性能稳定、功耗低的微控制器作为控制核心,如常见的STC系列或者STM32系列单片机。
单片机通过预设的程序控制衣柜门的开关动作,同时结合传感器获取环境信息,以实现智能化控制。
1. 传感器模块:光电传感器或红外传感器用于检测衣柜门的开关状态,即是否有物体靠近或离开。
这些传感器能够精确地感知门的开闭情况,从而触发单片机的相应动作。
2. 执行机构:电机或舵机作为执行机构,负责实际控制衣柜门的运动。
通过单片机的输出信号控制电机或舵机的转动方向和角度,从而完成门的开启和关闭。
3. 电源与驱动电路:提供给单片机和执行机构所需的电源电压,同时驱动电机或舵机工作的驱动电路也是整个电路设计中不可或缺的部分。
工作流程智能衣柜开关门控制电路的工作流程如下:传感器检测:光电传感器或红外传感器不断地监测衣柜门口的物体变化,例如物体的靠近或离开。
信号处理:传感器检测到门口物体状态变化后,将信号传输给单片机。
决策与控制:单片机接收到传感器信号后,根据预设的控制算法做出决策,例如判断是开门还是关门操作。
执行动作:单片机根据决策结果控制驱动电路,驱动电机或舵机执行相应的动作,实现衣柜门的开启或关闭。
反馈与优化:在门动作完成后,单片机可能会通过传感器或其他方式获取反馈信息,用于优化控制策略或进行用户提示。
优势与适用性智能化控制:可以根据实时环境条件智能地控制衣柜门的开关,提升使用便利性和用户体验。
节能环保:通过精确的控制算法和传感器技术,能够有效减少能源消耗,符合节能环保的发展趋势。
安全可靠:设计合理的电路结构和程序算法,确保衣柜门的开关操作稳定可靠,避免误操作或安全隐患。
2.模拟开关灯1.实验任务如图4.2.1所示,监视开关K1(接在P3.0端口上),用发光二极管L1(接在单片机P1.0端口上)显示开关状态,如果开关合上,L1亮,开关打开,L1熄灭。
2.电路原理图图4.2.13.系统板上硬件连线(1).把“单片机系统”区域中的P1.0端口用导线连接到“流水灯”区域中的L1端口上;(2).把“单片机系统”区域中的P3.0端口用导线连接到“独立键盘”区域中的K1端口上;4.程序设计内容(1).开关状态的检测过程单片机对开关状态的检测相对于单片机来说,是从单片机的P3.0端口输入信号,而输入的信号只有高电平和低电平两种,当拨开开关K1拨上去,即输入高电平,相当开关断开,当拨动开关K1拨下去,即输入低电平,相当开关闭合。
单片机可以采用JB BIT,REL或者是JNB BIT,REL指令来完成对开关状态的检测即可。
(2).输出控制如图3所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETB P1.0指令使P1.0端口输出高电平,使用CLR P1.0指令使P1.0端口输出低电平。
5.程序框图图4.2.26.汇编源程序ORG 00HSTART: JB P3.0,LIGCLR P1.0SJMP STARTLIG: SETB P1.0SJMP STARTEND7.C语言源程序#include <A T89X51.H>sbit K1=P3^0;sbit L1=P1^0;void main(void){while(1){if(K1==0){L1=0; //灯亮}else{L1=1; //灯灭}}}。
三档八小时遥控电风扇控制电路和单片机程序-----广东、五华、李标清大家都知道风扇是每家每户都不可缺少一个电器用品,现在已到夏天了气温渐渐上升用鸿运扇(或台扇)原来的机械式定时器,由于有些老人家说太噪很难入睡,普通型的定时器最长定时时间1小时,特别型的好像2小时经常都是睡到半梦半醒又被热醒了,只好拿风扇来“开刀”了,把它改成遥控三档八小时控制风扇,哈哈!如果朋友们也有这种困扰就不要等了马上开始行动吧!硬件联接与功能简介如下:;*****************************风扇控制程序*******************************;用P3.0\P3.1\P3.7 分别控制风速定时关机;P3.3\P3.4\P3.5分别为风速1 风速2 风速3;P1.0~P1.7分别接共阳极数码管A~H指示----->定时:\1H~8H定时\ 风速: 一~二~三;P1.7也作开机OUT控制,全部都是低电平有效。
;开发软件:TKStudio V3.2.5 (2011-05-22);注意晶体: 4MHZ MCU:89C2051系列;************************************************************************电原理图如下:电路板实物图:电路工作原理:市电220V/50HZ经J1进入后按下SW0开机键(或RY1的开关组,开机后由主控芯片控制保持RY1自锁)后通过R2\C0(泄放电阻R10)限流\D1\D2\ZD1\C2整流滤波稳压后得到12V的直流电压(用来给RY1提供工作电压用),再经Q4\ZD2稳压为5V直流给CPU AT89C2051 供电。
开机后默认为风速一档DS1显示为中文的一,不定时状态(即风扇一直工作到按下SW3关机键或市电停止为止,当然风扇马达有故障也会)每按下SW2定时按键一次DS1显示值会自动加一,定时时间也相对应的加一(可从1~8,再到不显示阿拉伯数字,循环。
目录目录 (1)中文摘要 (2)第一章概述 (5)第二章系统总体方案设计 (6)第三章硬件电路设计 (10)3.1键盘电路设计 (10)3.2 LED显示电路 (12)3.3 开锁警电路 (15)第四章软件设计 (17)4.1 软件设计思路 (17)4.2各子程序设计 (17)第五章系统调试 (22)第六章心得体会 (23)第七章参考文献 (24)附录 (25)源程序清单 (25)中文摘要摘要:在日常生活和工作中,住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。
若使用传统的机械式钥匙开锁,人们常需携带多把钥匙,使用极不方便,且钥匙丢失后安全性即大打折扣,随着科学技术的不断发展,人们对日常生活中的安全保险器件的要求越来越高。
为满足人们对锁得使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。
密码锁具有安全性高、成本低、功耗低、易操作等优点。
在安全技术防范领域,具有防盗报警功能的电子密码锁逐渐替代传统的机械式密码锁,克服了机械式密码锁密码量少、安全性能差的缺点,使密码锁无论在技术上还是在性能上都大大提高一步。
随着大规模集成电路技术的发展,特别是单片机的问世,出现了带微处理器的只能密码锁,它除了具有电子密码锁的功能外,还引进了智能化管理、专家分析系统等功能,从而使密码锁具有很高的安全性、可靠性,应用日益广泛。
随着人们对安全的重视和科技的发展,许多电子智能锁(指纹识别、IC卡辨认)已在国内外相继面世。
但是,这些产品的特点是针对特定的指纹和有效卡,只能适用于保密要求的箱、柜、门等。
而且指纹识别器若在公共场所使用存在容易机械损坏,IC卡还存在容易丢失、损坏等特点。
加上其成本较高,一定程度上限制了这类产品的普及和推广。
鉴于目前的技术水平与市场的接收程度,电子密码锁是这类电子防盗产品的主流。
基于以上思路,本次设计使用ATMEL公司的AT89C51实现—基于单片机的电子密码锁的设计,其主要具有如下功能:密码通过键盘输入,若密码正确,则将锁打开。
用单片机制作的定时开关控制器定时开关控制器在各种场合都有着极为广泛的用途。
本文利用凯思迪公司的k-51a单片机实验板设计的定时开关控制器具有简单易制、价格低廉、控制点数多、控制时间可精确到秒等特点,供有兴趣的朋友参考。
1.主板电路部分本电路主要是利用单片机at89c2051(-24pi)作为主控制元件,通过外围电路控制用电设备的电源,以达到定时开、关机的目的。
at89c2051具有体积小、功能强大、运行速度快、价格低廉等优点,非常适合制作集成度较高的控制电路。
图1为主电路原理图,图2为按其制作的主板(双面)大小只有95mm×70mm的器件位置图。
主板电路包括mcuat89c2051、键盘与显示、输入与输出口、复位和电源滤波等电路组成。
(1)键盘与表明表明电路由u2、u3、q1~q7和l1a、l2a共同组成。
u2为bcd-7段译码器(74ls47),通过单片机u1的p1.4~p1.7口将要显示字符的bcd码输入至u2的四个输出端的,经u2译码后输入适当的笔段驱动led数码管(共阳)。
led数码管表明使用动态读取方式,即为在某一时刻,只有一个数码管被照亮。
数码管的位选信号由单片机u1的p3.3~p3.5输入,经u3(74hc138)译码后通过q1~q6压缩,驱动适当的数码管。
r17~r24为限流电阻。
由于u2只能输出7段笔段码,而数码管除了七段笔段外,还要控制点亮小数点,因此,小数点必须有另外的驱动电路来完成,在这里,通过q7来驱动小数点。
当需要点亮小数点时,在u1的p1.3输出高电平即可。
键盘电路跟显示电路一样,采用扫描方式,利用动态显示时的数码管驱动位置信号来判断相应按键的状态。
u1的p3.3~p3.5口输出的bcd码经u3译码后,相应y口呈低电平,而u1的p3.7口平时为高电平(由于r8上拉),当某一键按下时,p3.7被下拉为低电平,这时mcu利用程序查询p3.7是否为低电平,如果p3.7为低电平,就读回u1p3.3~p3.5口的值(从缓冲区读取),则可判断是哪个按键按下,然后调用相应的处理程序进行处理。
用单片机控制继电器在现代电子控制系统中,单片机与继电器的结合应用十分广泛。
单片机作为控制核心,能够精确地控制继电器的开关动作,从而实现对各种电气设备的自动化控制。
单片机,也被称为微控制器,是一种集成在单个芯片上的微型计算机。
它具有体积小、功耗低、性能强等优点,能够完成复杂的计算和逻辑控制任务。
而继电器则是一种电气开关,通过电磁力来控制触点的闭合和断开,从而实现电路的通断控制。
要实现用单片机控制继电器,首先需要了解单片机的引脚功能和编程方法。
通常,单片机的引脚可以分为数字输入引脚、数字输出引脚、模拟输入引脚和模拟输出引脚等。
对于控制继电器,我们主要使用数字输出引脚。
在硬件连接方面,一般将单片机的数字输出引脚通过一个驱动电路与继电器的控制端相连。
这个驱动电路的作用是将单片机输出的低电平信号转换为能够驱动继电器工作的电流和电压。
常见的驱动电路有三极管驱动电路和继电器驱动芯片等。
以三极管驱动电路为例,其原理是利用三极管的开关特性来控制继电器。
当单片机的数字输出引脚输出高电平时,三极管导通,继电器线圈得电,触点闭合;当单片机输出低电平时,三极管截止,继电器线圈失电,触点断开。
在软件编程方面,需要根据所使用的单片机型号和开发环境来编写控制程序。
一般来说,程序的主要任务是设置单片机的引脚为输出模式,并在需要的时候输出高电平或低电平来控制继电器的开关。
例如,使用 C 语言在常见的 51 单片机上进行编程,首先需要包含相关的头文件,如`reg51h`。
然后定义控制继电器的引脚,如`sbit relay_pin = P1^0;`接下来,在主函数中进行初始化设置,将引脚设置为输出模式,如`relay_pin = 1;`表示将引脚设置为高电平输出。
为了实现更复杂的控制逻辑,可以使用定时器、中断等功能。
比如,通过定时器设定一定的时间间隔,让继电器按照一定的频率开关;或者在接收到外部中断信号时,改变继电器的状态。
在实际应用中,用单片机控制继电器有着广泛的用途。
单片机控制的电子密码锁(电路图+流程图+原理图)-课程设计单片机控制的电子密码锁(电路图+流程图+原理图) 摘要:本系统由单片机系统、矩阵键盘、LED显示和报警系统组成。
系统能完成开锁、超时报警、超次锁定、管理员解密、修改用户密码基本的密码锁的功能。
除上述基本的密码锁功能外,还具有调电存储、声光提示等功能,依据实际的情况还可以添加遥控功能。
本系统成本低廉,功能实用关键词:AT89S51,AT24C02, 电子密码锁,矩阵键盘一、引言随着人们生活水平的提高,如何实现家庭防盗这一问题也变的尤其的突出,传统的机械锁由于其构造的简单,被撬的事件屡见不鲜,电子锁由于其保密性高,使用灵活性好,安全系数高,受到了广大用户的亲呢。
设计本课题时构思了两种方案:一种是用以AT89s51为核心的单片机控制方案;另一种是用以74LS112双JK触发器构成的数字逻辑电路控制方案。
考虑到数字电路方案原理过于简单,而且不能满足现在的安全需求,所以本文采用前一种方案。
二、方案论证与比较方案一:采用数字电路控制。
其原理方框图如图1-1所示。
图2-1 数字密码锁电路方案采用数字密码锁电路的好处就是设计简单。
用以74LS112双JK触发器构成的数字逻辑电路作为密码锁的核心控制,共设了9个用户输入键,其中只有4个是有效的密码按键,其它的都是干扰按键,若按下干扰键,键盘输入电路自动清零,原先输入的密码无效,需要重新输入;如果用户输入密码的时间超过40秒(一般情况下,用户不会超过40秒,若用户觉得不便,还可以修改)电路将报警80秒,若电路连续报警三次,电路将锁定键盘5分钟,防止他人的非法操作。
电路由两大部分组成:密码锁电路和备用电源(UPS),其中设置UPS电源是为了防止因为停电造成的密码锁电路失效,使用户免遭麻烦。
密码锁电路包含:键盘输入、密码修改、密码检测、开锁电路、执行电路、报警电路、键盘输入次数锁定电路。
方案二:采用一种是用以AT89S51为核心的单片机控制方案。
单片机控制晶闸管电路的实现晶闸管是一种电子开关器件,其具有导通电阻小、可控性强等优点,因此在很多电子设备中被广泛应用。
单片机作为一种集成度高、控制能力强的微处理器,其对于晶闸管的控制也被广泛应用。
以下是单片机驱动晶闸管电路实现的步骤和注意事项:
步骤1:选择合适的晶闸管模块。
晶闸管模块包含控制电路、发光管等部分,可以简化单片机的控制方式。
选择时需要根据所需控制的电流大小、电压等参数进行选择。
步骤2:确定单片机控制方法。
单片机可以通过内部的GPIO口输出控制信号,控制晶闸管的导通与断开。
需要确定所需控制的电流大小、频率等参数,以确定控制方式。
步骤3:设计电路。
根据选定的晶闸管模块和单片机控制方式,设计电路并进行仿真。
步骤4:编写控制程序。
根据电路设计和控制方法,编写单片机控制程序,并进行调试。
注意事项:
1. 在接线和测试时需注意电路的安全性,对于高电压、高电流电路需使用安全设备进行保护;
2. 在控制程序编写时,需要对晶闸管的控制精度进行优化,以防止误操作和电路损坏;
3. 在测试和调试过程中,需要对控制引脚的状态进行监测,以确保电路的正确控制。
以上就是单片机驱动晶闸管电路的实现步骤和注意事项。
掌握这些知识,可以帮助我们更好地应用单片机控制晶闸管,实现更多的电子产品和应用。
stm32单片机继电器控制电路设计下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by the editor. I hope that after you download them, they can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you!In addition, our shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!STM32单片机继电器控制电路设计引言在现代电子控制系统中,继电器是一种常用的电子元件,用于控制高电流或高压的电路。
51单片机定时器设置51单片机,也被称为8051微控制器,是一种广泛应用的嵌入式系统。
它具有4个16位的定时器/计数器,可以用于实现定时、计数、脉冲生成等功能。
通过设置相应的控制位和计数初值,可以控制定时器的启动、停止和溢出等行为,从而实现精确的定时控制。
确定应用需求:首先需要明确应用的需求,包括需要定时的时间、计数的数量等。
根据需求选择合适的定时器型号和操作模式。
设置计数初值:根据需要的定时时间,计算出对应的计数初值。
计数初值需要根据定时器的位数和时钟频率进行计算。
设置控制位:控制位包括定时器控制寄存器(TCON)和中断控制寄存器(IE)。
通过设置控制位,可以控制定时器的启动、停止、溢出等行为,以及是否开启中断等功能。
编写程序代码:根据需求和应用场景,编写相应的程序代码。
程序代码需要包括初始化代码和主循环代码。
调试和测试:在完成设置和编程后,需要进行调试和测试。
可以通过观察定时器的状态和输出结果,检查定时器是否按照预期工作。
计数初值的计算要准确,否则会影响定时的精度。
控制位的设置要正确,否则会导致定时器无法正常工作。
需要考虑定时器的溢出情况,以及如何处理溢出中断。
需要考虑定时器的抗干扰能力,以及如何避免干扰对定时精度的影响。
需要根据具体应用场景进行优化,例如调整计数初值或控制位等,以达到更好的性能和精度。
51单片机的定时器是一个非常实用的功能模块,可以用于实现各种定时控制和计数操作。
在进行定时器设置时,需要注意计数初值的计算、控制位的设置、溢出处理以及抗干扰等问题。
同时需要根据具体应用场景进行优化,以达到更好的性能和精度。
在实际应用中,使用51单片机的定时器可以很方便地实现各种定时控制和计数操作,为嵌入式系统的开发提供了便利。
在嵌入式系统和微控制器领域,51单片机因其功能强大、使用广泛而备受。
其中,定时器中断功能是51单片机的重要特性之一,它为系统提供了高精度的定时和计数能力。
本文将详细介绍51单片机定时器中断的工作原理、配置和使用方法。
附录2主程序#include<>#define uchar unsigned char#define uint unsigned intsbit KEYON =P2^0; // 开始键sbit KEYOFF=P2^1; // 关闭键sbit KEYSET=P2^2; // 预约键sbit KEYINC=P2^3; //加1键sbit KEYDEC=P2^4; // 减1键sbit KEYFREE=P2^5; //预留键sbit POWER=P3^6; //电源开关指示灯sbit LED=P3^3 ; //按键指示灯uchar code dispcode[]={0x3f,0x06,0x05b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //0-9的字型码uchar data disbuf[]={0,0,0,0}; //显示缓冲区uchar hour,min ; //小时、分变量bit Onflag,flag;uchar Setflag;void delay(uchar); //延时子函数void init(void); //定时器初始化子函数uchar GetKeyNum(); //求按键号void Keyprocess(uchar); //按键处理子函数void calculate(); //计时子函数void display(); //显示子函数//--------------------主函数-------------------------void main(void){init();P1=0x00;while(1)display();}//-------------定时器TO、T1初始化,外部中断0初始化子函数-----void init(){TMOD=0x11; //TO、T1作定时器、工作方式1TH0=(65536-50000)/256 ; //定时50msTL0=(65536-50000)%256;TH1=(65536-50000)/256;TL1=(65536-50000)%256;IT0=1; //选择外部中断0为下降沿触发方式EX0=1; //开外部中断0ET1=1; //开定时器1ET0=1; //开定时器0EA =1; //开总中断TR0=1;}//----------显示子函数--------------------------void display(){uchar i,j=0x08;if((Setflag==0)&&!(min|hour)) //数码管显示“- - - -”{for(i=0;i<4;i++) disbuf[i]=dispcode[10];}else // 正常显示时间{disbuf[0] = dispcode[min%10]; //分个位disbuf[1] = dispcode[min/10]; //分十位disbuf[2] = dispcode[hour%10]+0x80; //小时个位disbuf[3] = dispcode[hour/10]; //小时十位}if((Setflag!=0)&flag) //如果调时,数码管闪烁显示{for(i=0;i<4;i++){if((disbuf[i]==0x3f)&&(i>2)) //不显示前面的0P0=0;elseP0=disbuf[i];if(Setflag==1) P1=j&0xfc; //调时,关断前两位位码else P1=j & 0xf3; //调分,关断后两位位码delay(5); //延时P1=0x00;j=j>>1;}}else //数码管正常显示{for(i=0;i<4;i++){if((disbuf[i]==0x3f)&&(i>2)) P0=0; //不显示前面的0else P0=disbuf[i];P1=j; //位选通delay(5); //延时P1=0X00;j=j>>1;}}}//--------------外部中断0中断函数---------------------------------void int0()interrupt 0 using 0{uchar keynum;display(); //动态显示程序作为去抖动if(INT0==0) //判断是否有按键按下{keynum=GetKeyNum(); //有效键,获取键值while(INT0==0); //等待按键释放Keyprocess(keynum); //按键处理}}//-----------------定时器0中断子函数----------------------------void time0() interrupt 1 //处理调时、显示器闪烁{static uchar ledcnt,num; //设置静态变量TH0=(65536-50000)/256; //定时50msTL0=(65536-50000)%256;if((Onflag && ((hour | min)!=0)) |! Onflag) //指示灯每隔闪烁{ledcnt++;if(ledcnt==10) // 10 X 50mS={ledcnt=0;LED=~LED;}}if(Setflag!=0) //调时闪烁{num++;if(num==5){num=0;flag=~flag;}}}//-------------定时器1中断子函数-------------------void time1() interrupt 3{TH1=(65536-50000)/256;TL1=(65536-50000)%256;calculate(); //计时}//-----------------求按键号-------------------------------uchar GetKeyNum(){uchar temp;if(KEYON==0) temp=1;if(KEYOFF==0) temp=2;if(KEYSET==0) temp=3;if(KEYINC==0) temp=4;if(KEYDEC==0) temp=5;if(KEYFREE==0) temp=6;return(temp);}//--------------------按键处理函数----------------------------void Keyprocess (uchar x){switch(x){case 1: //KEYON处理函数Onflag=1; //开Onflag标志Setflag=0; //关(Setflag)调时标志if((!Setflag)&&!(hour | min)) //没有调时且未处于预约,继电器通{POWER=0;LED=0;}elseTR1=1; //定时器1运行、执行计时程序break;case 2 : //KEYOFF,关处理,标志清0Onflag=0;Setflag=0;hour=0;min=0;POWER=1;LED=1;break;case 3: //预约调时/调分键,处理调时标志if(Onflag==0){Setflag++;if(Setflag==3) Setflag=1;}break;case 4: //加1键if(Setflag==1) //调时键,最大只能调到11{hour++;if(hour==12)hour=0;}if(Setflag==2) //调分键,最大只能调到59{min++;if(min==60)min=0;}break;case 5: //减1键if(Setflag==1) //调时键,减小时处理,最小0{hour-- ;if(hour==-1)hour=12;}if(Setflag==2) //调分键,减分处理,最小0{min--;if(min==-1)min=59;}break;}}//---------------------计算时间---------------------------------void caculate(){static uint tcount; //tcount为定时次数if((hour | min)!=0){tcount++; //1次50ms到,改变定时次数if(tcount==1200) //1200*50ms=1分钟{tcount=0; //初始化定时次数if(min==0) {min=60;hour--;}min--;}if((min==0)&(hour==0)) //预约时间到{POWER=0; //继电器接通LED=0;TR1=0;}}}//-----------------------定时void delay(uchar x){uchar j,k;for(j=x;j>0;j--)for(k=249;k>0;k--);}。
单片机的按键控制电路原理
单片机的按键控制电路原理如下:
1. 按键连接:按键通过两个引脚(通常是输入引脚)与单片机相连。
一个引脚连接到单片机的输入引脚,另一个引脚连接到地。
2. 按键操作:当按键按下时,按键两个引脚之间的电阻减小,导致电流从单片机的输入引脚流向地。
而当按键未按下时,两个引脚之间的电阻变大,导致电流无法流过,单片机的输入引脚处于高电平状态。
3. 单片机输入引脚设置:单片机输入引脚一般采用上拉电阻或下拉电阻来保持输入引脚的电平状态。
在按键未按下时,上拉电阻连接到单片机的电源电压上,将输入引脚上拉至高电平;在按键按下时,通过按键连接到地,产生低电平。
4. 电平检测:单片机在程序中通过读取输入引脚的电平状态来判断按键是否按下。
一个常见的做法是使用中断,当检测到按键按下时,中断服务程序会被触发执行相关操作。
5. 消抖:由于按键被按下或弹起时可能会产生抖动,为了消除抖动影响,常在按键控制电路中加入消抖电路,例如RC电路或者软件延时等。
总结:按键通过连接到单片机输入引脚实现电平状态的检测,单片机通过对输入
引脚的电平状态进行判定来实现按键操作的控制。
单片机多路开关课程设计一、课程目标知识目标:1. 理解单片机多路开关的基本原理,掌握其电路组成及功能;2. 学会使用编程软件对单片机进行编程,实现对多路开关的控制;3. 了解多路开关在实际应用中的使用场景,掌握相关电路的设计方法。
技能目标:1. 能够独立完成单片机多路开关电路的搭建,并进行调试;2. 掌握编程软件的使用,编写简单的程序实现对多路开关的控制;3. 培养学生动手实践能力,提高问题分析及解决能力。
情感态度价值观目标:1. 培养学生热爱科学,积极探索单片机技术的兴趣;2. 培养团队协作精神,学会与他人分享和交流;3. 增强学生对我国电子科技发展的自豪感,树立正确的价值观。
课程性质:本课程为实践性较强的课程,旨在让学生在实际操作中掌握单片机多路开关的知识。
学生特点:学生具备一定的电子基础知识,对单片机有一定了解,但编程和动手实践能力有待提高。
教学要求:注重理论与实践相结合,引导学生主动参与,提高学生的动手实践能力。
通过课程学习,使学生能够将所学知识应用于实际项目中,达到学以致用的目的。
二、教学内容1. 单片机基础知识回顾:介绍单片机的组成、工作原理及常用指令,为后续编程打下基础。
- 教材章节:第一章 单片机基础知识- 内容:单片机组成、工作原理、常用指令及简单程序编写。
2. 多路开关原理及电路设计:讲解多路开关的工作原理,指导学生设计实际应用电路。
- 教材章节:第二章 常用电路设计与分析- 内容:多路开关原理、电路设计方法、电路分析与调试。
3. 编程软件使用与编程技巧:教授编程软件的使用方法,介绍编程技巧,使学生能编写简单的控制程序。
- 教材章节:第三章 单片机编程软件与编程技巧- 内容:编程软件安装与使用、编程语言基础、编程技巧。
4. 单片机多路开关控制实现:结合前三部分内容,指导学生完成实际项目,实现多路开关的控制。
- 教材章节:第四章 单片机应用实例- 内容:项目需求分析、电路搭建、程序编写、调试与优化。
附录2主程序#include<>#define uchar unsigned char#define uint unsigned intsbit KEYON =P2^0; // 开始键sbit KEYOFF=P2^1; // 关闭键sbit KEYSET=P2^2; // 预约键sbit KEYINC=P2^3; //加1键sbit KEYDEC=P2^4; // 减1键sbit KEYFREE=P2^5; //预留键sbit POWER=P3^6; //电源开关指示灯sbit LED=P3^3 ; //按键指示灯uchar code dispcode[]={0x3f,0x06,0x05b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //0-9的字型码uchar data disbuf[]={0,0,0,0}; //显示缓冲区uchar hour,min ; //小时、分变量bit Onflag,flag;uchar Setflag;void delay(uchar); //延时子函数void init(void); //定时器初始化子函数uchar GetKeyNum(); //求按键号void Keyprocess(uchar); //按键处理子函数void calculate(); //计时子函数void display(); //显示子函数//--------------------主函数-------------------------void main(void){init();P1=0x00;while(1)display();}//-------------定时器TO、T1初始化,外部中断0初始化子函数-----void init(){TMOD=0x11; //TO、T1作定时器、工作方式1TH0=(65536-50000)/256 ; //定时50msTL0=(65536-50000)%256;TH1=(65536-50000)/256;TL1=(65536-50000)%256;IT0=1; //选择外部中断0为下降沿触发方式EX0=1; //开外部中断0ET1=1; //开定时器1ET0=1; //开定时器0EA =1; //开总中断TR0=1;}//----------显示子函数--------------------------void display(){uchar i,j=0x08;if((Setflag==0)&&!(min|hour)) //数码管显示“- - - -”{for(i=0;i<4;i++) disbuf[i]=dispcode[10];}else // 正常显示时间{disbuf[0] = dispcode[min%10]; //分个位disbuf[1] = dispcode[min/10]; //分十位disbuf[2] = dispcode[hour%10]+0x80; //小时个位disbuf[3] = dispcode[hour/10]; //小时十位}if((Setflag!=0)&flag) //如果调时,数码管闪烁显示{for(i=0;i<4;i++){if((disbuf[i]==0x3f)&&(i>2)) //不显示前面的0P0=0;elseP0=disbuf[i];if(Setflag==1) P1=j&0xfc; //调时,关断前两位位码else P1=j & 0xf3; //调分,关断后两位位码delay(5); //延时P1=0x00;j=j>>1;}}else //数码管正常显示 {for(i=0;i<4;i++){if((disbuf[i]==0x3f)&&(i>2)) P0=0; //不显示前面的0else P0=disbuf[i];P1=j; //位选通delay(5); //延时P1=0X00;j=j>>1;}}}//--------------外部中断0中断函数---------------------------------void int0()interrupt 0 using 0{uchar keynum;display(); //动态显示程序作为去抖动 if(INT0==0) //判断是否有按键按下{keynum=GetKeyNum(); //有效键,获取键值while(INT0==0); //等待按键释放Keyprocess(keynum); //按键处理}}//-----------------定时器0中断子函数----------------------------void time0() interrupt 1 //处理调时、显示器闪烁{static uchar ledcnt,num; //设置静态变量TH0=(65536-50000)/256; //定时50msTL0=(65536-50000)%256;if((Onflag && ((hour | min)!=0)) |! Onflag) //指示灯每隔闪烁 {ledcnt++;if(ledcnt==10) // 10 X 50mS={ledcnt=0;LED=~LED;}}if(Setflag!=0) //调时闪烁{num++;if(num==5){num=0;flag=~flag;}}}//-------------定时器1中断子函数-------------------void time1() interrupt 3{TH1=(65536-50000)/256;TL1=(65536-50000)%256;calculate(); //计时}//-----------------求按键号-------------------------------uchar GetKeyNum(){uchar temp;if(KEYON==0) temp=1;if(KEYOFF==0) temp=2;if(KEYSET==0) temp=3;if(KEYINC==0) temp=4;if(KEYDEC==0) temp=5;if(KEYFREE==0) temp=6;return(temp);}//--------------------按键处理函数----------------------------void Keyprocess (uchar x){switch(x){case 1: //KEYON处理函数Onflag=1; //开Onflag标志Setflag=0; //关(Setflag)调时标志if((!Setflag)&&!(hour | min)) //没有调时且未处于预约,继电器通{POWER=0;LED=0;}elseTR1=1; //定时器1运行、执行计时程序break;case 2 : //KEYOFF,关处理,标志清0Onflag=0;Setflag=0;hour=0;min=0;POWER=1;LED=1;break;case 3: //预约调时/调分键,处理调时标志if(Onflag==0){Setflag++;if(Setflag==3) Setflag=1;}break;case 4: //加1键if(Setflag==1) //调时键,最大只能调到11{hour++;if(hour==12)hour=0;}if(Setflag==2) //调分键,最大只能调到59{min++;if(min==60)min=0;}break;case 5: //减1键if(Setflag==1) //调时键,减小时处理,最小0{hour-- ;if(hour==-1)hour=12;}if(Setflag==2) //调分键,减分处理,最小0{min--;if(min==-1)min=59;}break;}}//---------------------计算时间--------------------------------- void caculate(){static uint tcount; //tcount为定时次数if((hour | min)!=0){tcount++; //1次50ms到,改变定时次数if(tcount==1200) //1200*50ms=1分钟{tcount=0; //初始化定时次数if(min==0){min=60;hour--;}min--;}if((min==0)&(hour==0)) //预约时间到{POWER=0; //继电器接通LED=0;TR1=0;}}}//-----------------------定时void delay(uchar x){uchar j,k;for(j=x;j>0;j--)for(k=249;k>0;k--);}。