单片机控制电路开关程序完整程序
- 格式: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口的值(从缓冲区读取),则可判断是哪个按键按下,然后调用相应的处理程序进行处理。
附录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--);}。