51单片机 按键控制程序
基于51单片机实现的门禁控制系统设计
题目门禁控制系统设计【摘要】本设计是利用T7122M-I工业级ID读卡模块实现的门禁控制器,具有存储一张管理卡和多张用户卡的功能,同时管理人员还可以通过按键更改管理卡,增加、删除用户卡等操作,门禁刷卡控制刷卡距离约为5—12CM。
关键词:门禁系统、T7122M-I工业级读卡模块。
目录摘要 (2)第1章门禁系统的概述 (4)1.1 门禁系统概念 (4)1.2 门禁系统的特点 (4)第2章门禁系统的设计要求 (4)2.1 设计要求 (4)第3章门禁系统的方案论证 (4)3.1门禁系统的总体方案 (4)3.2门禁系统的各个方案论证 (5)3.2.1.单片机控制芯片模块 (5)3.2.1.键盘控制块 (5)第4章门禁系统的硬件部分 (6)4.1主控芯片部分 (6)4.2键盘控制部分 (7)4.3蜂鸣器控制部分 (8)4.4T7122M-I工业读卡模块 (8)第5章门禁系统的软件部分 (9)第6章门禁系统的软、硬件调试 (12)6.1硬件调试 (12)6.2软件调试 (12)6.3软、硬件设计注意事项 (12)结论 (13)致谢 (13)参考文献 (14)附录1:系统程序。
(15)第1章门禁系统的概述1.1 门禁系统概念出入口门禁控制系统采取以感应卡来取代用钥匙开门的方式。
使用者用一张卡可以打开多把门锁, 对门锁的开启也可以有一定的时间限制。
如果卡丢失了,不必更换门锁,只需将其从控制主机中注销。
出入口门禁控制系统是通过对出入口的准入情况进行控制、管理和记录的设备,对何人何时在何地进行详细跟踪,以实现中心对出入口的24小时控制、监视及管理。
1.2 门禁系统的特点系统将ID卡技术、计算机控制技术与电子门锁有机结合,用ID卡替代钥匙,配合计算机实现智能化门禁控制和管理,有效的解决了传统门锁的使用繁琐和无法信息记录等不足,利用数据控制器采集的数据实现数字化管理可为内部人力资源的有效管理等带来意想不到的效果。
电子钥匙:授权后的ID卡即可当作电子钥匙,将此电子钥匙感应器前一晃, 控制器对该卡进行身份验证,验证合法后即控制电子门锁自动打开。
单片机按键连按长按汇编程序
单片机按键连按长按汇编程序;=============================================================== ;程序编写人:兰建文;编写地点:51hei培训机构;时间:6月7日下午星期日;功能:本程序实现P0口的对2个数码管显示0到99,一个按键实现一次;按键只递加1次,到99回到0,按着不动不影响数码管动态显示;任何时;刻,任何一个按键,若按键连续按键3次,每次间隔时间不大于1秒,循;环显示0到9回到0。
若间隔时间大于1秒,显示加1,低电平亮;P2口实现对数码管的片选功能;=============================================================== ;==========================系统程序============================= ;=========================开始初始化============================ SHUCHU EQU P0 ;定义P0口为输出口PIANXUAN EQU P2 ;定义P2口为片选口SHUZI EQU 30H ;设置处理数据存放地址JIANBIT0 BIT 20H.0 ;设置按键标志位XIAN0 BIT 20H.2 ;显示标志位T_BIT BIT 21H.0 ;设置中断定时器0标志位LIANAN BIT 20H.1 ;设置连按标志位BIT4 BIT 20H.2MODE EQU 01HSHU EQU 40H;========================程序开始==============================ORG 00H ;程序开始LJMP START ;跳到STARTORG 0BH ;中断定时器0入口地址JMP T0_1 ;跳到定时器0服务程序ORG 0030H ;入口地址;=========================主程序=============================== START:MOV SP,#60H ;移开指针MOV SHUZI,#00 ;数据初始化MOV DPTR,#TAB ;查表初始化MOV P1,#0F8H ;设置P1.0口为输入CALL INIT ;开中断CLR JIANBIT0 ;按键标志位清0CLR LIANAN ;连按标志位清0CLR BIT4SETB T_BIT ;中断标志位置1MOV SHU,#0MOV R2,#0MOV R3,#0MOV R4,#0MOV R5,#200MAIN:JNB T_BIT,MAIN ;等待中断CLR T_BIT ;中断标志位清0JB BIT4,VVINC R3CJNE R3,#25,XXMOV R3,#00MOV R2,#0JMP DDXX:CJNE R2,#3,VVSETB LIANANMOV R2,#00DD:CLR BIT4VV:JB LIANAN,XUNHUAN ;判断是否有连按CC:CALL JISUAN ;计算分离十位和个位CALL DISPLAY ;显示个位和十位JNB JIANBIT0,PANDUAN;按键标志位=1判断P1.3口,若为0则判断按键是否抬起JNB P1.3,XIANSHI0 ;若没抬起(P1.3=0)则调到XIANSHI0 SETB BIT4INC R2MOV R3,#0CLR JIANBIT0 ;按键标志位清0CLR XIAN0 ;显示标志位清0JMP MAIN ;返回MAINPANDUAN:JB P1.3,MAIN ;若按键抬起则返回MAIN,若没有抬起按键标志位清0 SETB JIANBIT0JMP MAINXIANSHI0:JB XIAN0,MAINSETB XIAN0 ;显示标志位清0CALL JIACHULI ;加处理JMP MAINXUNHUAN:MOV A,SHUCJNE A,#10,KKKMOV SHU,#0CLR LIANANMOV A,SHUKKK: MOVC A,@A+DPTR ;查表MOV SHUCHU,AMOV PIANXUAN,#05INC R4CJNE R4,#50,OUTTINC SHUMOV R4,#0OUTT:JMP MAIN;====================定时中断0服务子程序======================== ;输入:无;输出:无;实现的功能:实现定时20MS,影响标志位T_BIT;=============================================================== T0_1:MOV TMOD,#MODE ;定时器1工作方式1MOV TL0,#0E0H ;设置定时初值MOV TH0,#0B1HSETB T_BIT ;定时标志位清0RETI;========================中断设置子程序========================= ;输入:无;输出:无;实现的功能:初始化设置定时器,设置初值;===============================================================INIT:MOV TMOD,#MODE ;定时器0工作方式1MOV TL0,#0E0HMOV TH0,#0B1HMOV IE,#82H ;开定时器中断0SETB TR0 ;开定时器0RET;========================计算子程序============================= ;输入:30H;输出:"A和B";实现的功能:把30H的数据的十位和个位分离出来;=============================================================== JISUAN:MOV A,SHUZI ;数据放在A中MOV B,#10 ;除数放在B中DIV AB ;商放在A中,余数放在B中RET;========================显示子程序============================= ;输入:"A";输出:"P0口";实现的功能:把A的数输出到P0口显示,十位和个位分开显示;=============================================================== DISPLAY:MOVC A,@A+DPTR ;查表MOV SHUCHU,A ;显示十位MOV PIANXUAN,#04H ;片选CALL DELAY ;查表MOV SHUCHU,#0FFH ;关闭数码管MOV A,BMOVC A,@A+DPTR ;查表MOV SHUCHU,A ;显示个位MOV PIANXUAN,#05H ;片选CALL DELAY ;延时MOV SHUCHU,#0FFH ;关闭数码管RET;======================加处理子程序============================= ;输入:无;输出:无;实现的功能:把30H地址加1;=============================================================== JIACHULI:MOV A,SHUZICJNE A,#99,L0 ;若A不等于9,则跳到LL MOV A,#00JMP L1L0:INC A ;自加一L1:MOV SHUZI,ARET;========================延时程序===============================;输入;无;输出: 无;实现的功能:延时一段时间;=============================================================== DELAY:MOV R6,#80L7:MOV R7,#80L8:DJNZ R7,L8DJNZ R6,L7RET;=====================共阳查表数据============================== TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;=======================程序结束================================ END一个按键控制一个灯,要求按一下按键,灯亮一直亮,再按一下按键灯灭,要带按键的去抖程序。
51单片机开发板使用手册
STU_MAIN单片机开发板使用手册第一章STU_MAIN 单片机开发板简介 (2)1.1 单片机开发板概述 (2)1.2 单片机开发板载资源介绍 (2)1.3 STU_MAIN 单片机开发板接口说明 (4)1.4 如何开始学习单片机 (5)第二章软件使用方法 ......................... . (6)2.1 KEIL 软件的使用方法 (6)2.2 STC-ISP 软件的安装与使用 (13)2.3 使用USB 口下载程序时设置步骤 (18)第三章STU_MAIN 开发板例程详细介绍 (21)3.1 准备工作 (21)3.2 安装STC-ISP下载程序 (21)3.3 闪烁灯 (22)3.4 流水灯 (23)3.5 单键识别 (25)3.6 利用定时器和蜂鸣器唱歌 (28)3.7 DS18B20 温度测量显示实验 (31)3.8 LCD1602 字符液晶显示 (36)3.9 串口通讯实验 (39)3.10 基于DS1302的多功能数字钟实验 (41)3.11 EEPROM X5045 实验 (47)第一章STU_MAIN 单片机开发板简介1.1 单片机开发板概述STU_MAIN 单片机开发板是经过精心设计开发出的多功能MCS-51 单片机开发平台。
该开发板集常用的单片机外围资源、串口调试下载接口于一身,可以让您在最短的时间内,全面的掌握单片机编程技术。
该开发板特别适合单片机初学者、电子及通信等专业的课程设计以及电子爱好者自学使用。
STU_MAIN 单片机开发板可作为单片机课程的配套设备,课程从最基本的预备知识开始讲起,非常详细的讲解KEIL 编译器的使用,包括软件仿真、测定时间、单步运行、全速运行、设置断点、调试、硬件仿真调试、变量观察等,整个过程全部用单片机的C 语言讲解,从C 语言的第一个主函数MAIN 讲起,一步步一条条讲解每一个语法、每条指令的意思,即使对单片机一巧不通,对C 语言一无所知,通过本课程的学习也可以让你轻松掌握MCS-51 单片机的C 语言编程。
51单片机矩阵键盘扫描程序
{
TH0=(65536-2000)/256;//重新赋值2ms
TL0=(65536-2000)%256;
Display(0,8); //调用数码管扫描
}
/*------------------------------------------------
unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};//显示段码值0~F
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
case 0xd7:return 11;break;//b
case 0xee:return 12;break;//c
case 0xed:return 13;break;//d
case 0xeb:return 14;break;//e
case 0xe7:return 15;break;//f
default:return 0xff;break;
}
}
/*------------------------------------------------
uS延时函数,含有输入参数unsigned char t,无返回值
unsigned char是定义无符号字符变量,其值的范围是
0~255这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下T=tx2+5 uS
51单片机红外遥控格力空调程序
51单片机红外遥控格力空调程序#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit key1=P3^4;//按键控制开机sbit key2=P3^5;//按键控制关机sbit key3=P3^6;//按键控制温度+sbit key4=P3^7;//按键控制温度-sbit out=P1^5;//发送IO口uchar wd1[15]={0x00,0x08,0x04,0x0c,0x02,0x0a,0x06,0x0e,0x01,0x09,0x05,0x0d,0x03,0x0b,0x07};uchar wd2[15]={0x0a,0x06,0x0e,0x01,0x09,0x05,0x0d,0x03,0x0b,0x07,0x0f,0x00,0x08,0x04,0x0c};uchar x=12;//开机28度/************晶振11.0592MHz**************/ void delay(uint xms){uint i,j;for(i=xms;i>0;i--) //i=xms即延时约xms毫秒for(j=112;j>0;j--);}void delay560us(void) //560us延迟函数{uint j;for(j=63;j>0;j--);}void delay4500us(void) //4.5ms延迟函数{uint j;for(j=516;j>0;j--);}void khz_2(uint num) //38KHZ脉冲占空比1:2{for(;num>0;num--){out=~out;}}void send0_a(void) //发送0{khz_2(42) ;//khz_3(21) ;out=1;delay560us();}void send1_a(void) //发送1 {khz_2(42) ;out=1;delay560us();delay560us();delay560us();}void leadcode_a(void) //发送引导码{khz_2(690) ;out=1;delay4500us();}/***************************关机****************************/void close( uchar a,uchar b,uchar c,uchar d) {uint i;leadcode_a();send1_a();for(i=0;i<7;i++)send0_a();if(a)send1_a();elsesend0_a();if(b)send1_a();elsesend0_a();if(c)send1_a();elsesend0_a();if(d)send1_a();elsesend0_a();send0_a();send0_a();send0_a();for(i=0;i<5;i++)send0_a();send1_a();for(i=0;i<6;i++)send0_a();send1_a();send0_a();send1_a();send0_a();send0_a();send1_a();send0_a();khz_2(42) ;out=1;delay(20);}void close1(uchar e,uchar f,uchar g,uchar h ) {uchar i;for(i=0;i<13;i++)send1_a();send0_a();send0_a();for(i=0;i<12;i++)send0_a();if(e)send1_a();elsesend0_a();if(f)send1_a();elsesend0_a();if(g)send1_a();elsesend0_a();if(h)send0_a();elsesend1_a();khz_2(42) ;out=1;delay(1000);/*******************************************//****************开机************************/}void open(uchar a,uchar b,uchar c,uchar d ){uint i;leadcode_a();send1_a();send0_a();send0_a();send1_a();for(i=0;i<4;i++)send0_a();if(a)send1_a();elsesend0_a();if(b)send1_a();elsesend0_a();if(c)send1_a();elsesend0_a();if(d)send1_a();elsesend0_a();send0_a();send0_a();send0_a();send0_a();for(i=0;i<5;i++)send0_a();send1_a();for(i=0;i<6;i++)send0_a();send1_a();send0_a();send1_a();send0_a();send0_a();send1_a();send0_a();khz_2(42) ;out=1;delay(20);}void open1(uchar e,uchar f,uchar g,uchar h) {uchar i;for(i=0;i<13;i++)send0_a();send1_a();send0_a();send0_a();for(i=0;i<12;i++)send0_a();if(e)send1_a();elsesend0_a();if(f)send1_a();elsesend0_a();if(g)send1_a();elsesend0_a();if(h)send1_a();elsesend0_a();khz_2(42) ;out=1;delay(1000);}void keyscan(){uchar a,b,c,d,e,f,g,h;if(key1==0){delay(10);if(key1==0){while(!key1);if(wd1[x] & 0x08)a=1;elsea=0;if(wd1[x] & 0x04)b=1;elseb=0;if(wd1[x] & 0x02)c=1;elsec=0;if(wd1[x] & 0x01)d=1;elsed=0;if(wd2[x] & 0x08) e=1;elsee=0;if(wd2[x] & 0x04)f=1;elsef=0;if(wd2[x] & 0x02)g=1;elseg=0;if(wd2[x] & 0x01)h=1;elseh=0;open(a,b,c,d);open1(e,f,g,h);}}if(key2==0){delay(10);if(key2==0){while(!key2);if((wd1[x] & 0x08)) a=1;elsea=0;if((wd1[x] & 0x04))b=1;elseb=0;if((wd1[x] & 0x02))c=1;elsec=0;if((wd1[x] & 0x01))d=1;elsed=0;if((wd2[x] & 0x08))e=1;elsee=0;if((wd2[x] & 0x04))elsef=0;if((wd2[x] & 0x02))g=1;elseg=0;if((wd2[x] & 0x01))h=1;elseh=0;close(a,b,c,d);close1(e,f,g,h);}}if(key3==0){delay(10);if(key3==0){while(!key1);x++;if((wd1[x] & 0x08)) a=1;elseif((wd1[x] & 0x04))b=1;elseb=0;if((wd1[x] & 0x02))c=1;elsec=0;if((wd1[x] & 0x01))d=1;elsed=0;if((wd2[x] & 0x08)) e=1;elsee=0;if((wd2[x] & 0x04))f=1;elsef=0;if((wd2[x] & 0x02))g=1;elseg=0;if((wd2[x] & 0x01))h=1;elseh=0;open(a,b,c,d);open1(e,f,g,h);}}if(key4==0){delay(10);if(key4==0){while(!key1);x--;if((wd1[x] & 0x08))a=1;elsea=0;if((wd1[x] & 0x04))b=1;elseb=0;if((wd1[x] & 0x02))c=1;elsec=0;if((wd1[x] & 0x01))d=1;elsed=0;if((wd2[x] & 0x08)) e=1;elsee=0;if((wd2[x] & 0x04))f=1;elsef=0;if((wd2[x] & 0x02))g=1;elseg=0;if((wd2[x] & 0x01))h=1;elseh=0;open(a,b,c,d);open1(e,f,g,h);}}}void init(){key1=1;key2=1;key3=1;key4=1;out=1;}void main(){init();while(1){keyscan();}}。
51单片机按键电路
51单片机键盘接口电路(含源程序)键盘是由若干按钮组成的开关矩阵,它是单片机系统中最常用的输入设备,用户能通过键盘向计算机输入指令、地址和数据。
一般单片机系统中采和非编码键盘,非编码键盘是由软件来识别键盘上的闭合键,它具有结构简单,使用灵活等特点,因此被广泛应用于单片机系统。
按钮开关的抖动问题组成键盘的按钮有触点式和非触点式两种,单片机中应用的一般是由机械触点组成的。
在下图中,当开<键盘结构图>图1图2关S未被按下时,P1。
0输入为高电平,S闭合后,P1。
0输入为低电平。
由于按钮是机械触点,当机械触点断开、闭合时,会有抖动动,P1。
0输入端的波形如图2所示。
这种抖动对于人来说是感觉不到的,但对计算机来说,则是完全能感应到的,因为计算机处理的速度是在微秒级,而机械抖动的时间至少是毫秒级,对计算机而言,这已是一个“漫长”的时间了。
前面我们讲到中断时曾有个问题,就是说按钮有时灵,有时不灵,其实就是这个原因,你只按了一次按钮,可是计算机却已执行了多次中断的过程,如果执行的次数正好是奇数次,那么结果正如你所料,如果执行的次数是偶数次,那就不对了。
为使CPU能正确地读出P1口的状态,对每一次按钮只作一次响应,就必须考虑如何去除抖动,常用的去抖动的办法有两种:硬件办法和软件办法。
单片机中常用软件法,因此,对于硬件办法我们不介绍。
软件法其实很简单,就是在单片机获得P1。
0口为低的信息后,不是立即认定S1已被按下,而是延时10毫秒或更长一些时间后再次检测P1。
0口,如果仍为低,说明S1的确按下了,这实际上是避开了按钮按下时的抖动时间。
而在检测到按钮释放后(P1。
0为高)再延时5-10个毫秒,消除后沿的抖动,然后再对键值处理。
不过一般情况下,我们常常不对按钮释放的后沿进行处理,实践证明,也能满足一定的要求。
当然,实际应用中,对按钮的要求也是千差万别,要根据不一样的需要来编制处理程序,但以上是消除键抖动的原则。
单片机驱动继电器仿真实验(按键控制)
sbit ks=P2^5; //定义开始按键连接 P 口
main()
{
while(1)
{ if(ks==0) { lamp=0;
//如果开始按键按下 //点亮灯泡
} if(tz==0) { lamp=1;
//如果停止按键按下 //熄灭灯泡
}
}
}
在上述 4 个程序段中我们发现,在程序的开头都进行了位定义。这种编程方 法的一个优点是程序通用性强。读者可以直接把程序复制到自己的系统中,只修 改程序开头的定义行的几个地址即可。
。由于普通按键的原理决定,普通按键都具有抖动的特点,也就是说,当按键 的静触头和动触痛接触瞬间,会产生抖动现象,简单说就是瞬间接通,又瞬间断 开的现象。这种现象会对原理图 1 所示的程序造成影响,产生按键按下后,有时 有效,有时没有效的现象。因此在进行实物制作的时候,原理图 1 对应的程序需 要添加软件防抖或者增加硬件防抖电路。而对于原理图 2 所对应的程序,则不需 要考虑按键抖动。
图 1 所示原理图驱动程序
汇编语言代码如下:
LAMP BIT P2.0 //根据原理图定义灯泡 AJ BIT P2.7 //根据原理图定义按键
ORG 0H
JMP MAIN
ORG 30H
MAIN:
JB AJ,$ JNB AJ,$
//等待按键松开
CPL LAMP
JMP MAIN
END 注意:程序一定要与原理图对应,上述汇编语言程序的前两行,是根据原理图定
ORG 0H
MAIN
ORG 30H
MAIN:
JB KS,$
CLR LAMP
JB TZ,$
SETB LAMP
JMP MAIN
END C 语言代码如下:
51单片机C语言程序设计源代码
新概念51单片机C语言教程----入门、提高、开发、拓展全攻略郭天祥编著电子工业出版社例2.2.1编写程序,点亮第一个发光二极管(part2_1.c P27)#include <reg52.h> //52系列单片机头文件sbit led1=P1^0; //声明单片机P1口的第一位void main() //主函数{led1=0; /*点亮第一个发光二极管*/}例2.2.2编写程序,点亮P1口的若干二极管(part2_2.c P39)#include <reg52.h> //52系列单片机头文件void main() //主函数{P1=0xaa;//while(1);}例2.5.1利用for语句延时特性,编写第一个发光二极管以间隔1S亮灭闪动的程序(part2_3.c P42)#include <reg52.h> //52系列单片机头文件#define uint unsigned int //宏定义sbit led1=P1^0; //声明单片机P1口的第一位uint i,j;void main() //主函数{while(1) //大循环{led1=0; /*点亮第一个发光二极管*/for(i=1000;i>0;i--) //延时for(j=110;j>0;j--);led1=1; /*关闭第一个发光二极管*/for(i=1000;i>0;i--) //延时for(j=110;j>0;j--);}}- 2 - 例2.6.1编写程序使第一个发光二极管以间隔500ms亮灭闪动。
(part2_4.c P48)#include <reg52.h> //52系列单片机头文件#define uint unsigned int //宏定义sbit led1=P1^0; //声明单片机P1口的第一位void delay1s(); //声明子函数void main() //主函数{while(1) //大循环{led1=0; /*点亮第一个发光二极管*/delay1s(); //调用延时子函数led1=1; /*关闭第一个发光二极管*/delay1s(); //调用延时子函数}}void delay1s() //子函数体{uint i,j;for(i=500;i>0;i--)for(j=110;j>0;j--);}例2.7.1编写程序使第一个二极管以亮200ms、灭800ms的方式闪动。
51单片机实验报告按钮开关精品文档6页
单片机实验制作实验题目:按钮开关应用实验完成时间:2013年5月31日系别:班级:姓名:学号:按钮开关应用实验一、实验目的1.掌握七段LED数码管的结构及工作原理;2.掌握共阳极LED数码管连接方法、及其静态和动态显示方法;3.进一步掌握并行接口芯片8255A的使用方法;4.掌握独立式按键的控制方法的设计。
二、实验器材七段LED数码管 89S51单片机三个按钮开关 30pF的两个微电容 1个0.1uF电容晶振限流电阻(220欧7个、10千欧2个、100千欧1个)导线若干三、实验说明1.按一下PB1按钮,LED数码管会显示一个数字1,再按一下会显示数字2,就这样连续按,数字将会从1依次变到9。
2.按一下PB0按钮(复位键),LED数码管上的数字将会从9归零。
3.按一下PB2按钮,LED数码管上的数字将从0变到9,连续按数字将会从9逐一的变到0。
4.所以此按钮开关的运用可以通过PB1按钮和PB2按钮以及PB0按钮的控制来进行简单的计数功能。
四、实验原理1.七段LED数码管的组成如图1所示,LED数码管由7个发光二极管组成,此外,还有一个圆点型发光二极管(在图中以dp表示),用于显示小数点。
通过七段发光二极管亮暗的不同组合,可以显示多种数字、字母以及其它符号。
LED 数码管中的发光二极管共有两种连接方法:共阳极接法:把发光二极管的阳极连在一起构成公共阳极。
使用时公共阳极接+5V。
这样阴极端输入低电平的段发光二极管就导通点亮,而输入高电平的则不点亮。
常用的七段LED数码管尺寸与引脚配置图七段LED数码管的七个LED组合图如图12.七段LED数码管的显示代码把发光二极管的阳极连在一起构成公共阳极。
使用时公共阳极接+5V。
这样阴极端输入低电平的段发光二极管就导通点亮,而输入高电平的则不点亮。
为了显示数字或符号,要为LED显示器提供代码,因为这些代码是为显示字形的,因此称之为字形代码。
七段发光二极管,再加上一个小数点位,共计八段。
51单片机三个按键选择三首不同的音乐播放,一个键停止播放
//取反音乐输出 IO
}
//****************************** //音乐符号串解释函数 //入口:要解释的音乐符号串,输出的音调串,输出的时长串
changedata(uchar *song,uchar *diao,uchar *jie)
{
uchar i,i1,j; char gaodi; //高低+/-12 音阶 uchar banyin;//有没有半个升音阶 uchar yinchang;//音长 uchar code jie7[8]={0,12,14,16,17,19,21,23}; //C 调的 7 个值
} if(!K2) {
while(!K2); play(song3);
} if(!K3) {
while(!K3);
//播放音乐 //播放音乐
} } }
play(mamahao); //播放音乐
――――――――――――――――――― 在奏乐函数里我们加上了: if((!K1)||(!K2)||(!K3)||(!K4))//发现按键,立即退出播放 { TR0=0; return; } 这是为了在正在播放音乐的时候也可以检测到按键,并且停止播放音乐,立即去处理下
第 27 课,三个按键选择三首不同的音乐播放,一个键停止播放
这一课我们用 4 个按键来控制播放音乐。K1-K3 每个键播放一首音乐,K4 按键停止 音乐的播放。 ――――――――――――――――― #define uchar unsigned char //定义一下方便使用 #define uint unsigned int #define ulong unsigned long #include <reg52.h> //包括一个 52 标准内核的头文件
单片机-4x4个矩阵按键控制数码管显示数字程序
单⽚机-4x4个矩阵按键控制数码管显⽰数字程序1 #include "8051.h"2 typedef unsigned char u8;3 typedef unsigned int u16;4 u8 smgduan[]= {5/*0 1 2 3 4 5 6 7 */60x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,7/*8 9 A B C D E F */80x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};910// P0⼝为数码管的位选的8位输⼊引脚11// P0 = 0x00;121314void Delayms(u16 ms);15void shumaguan(u8 n);16void DigDisplay();17void KeyTest();18void smg(u8 n, u8 m);19void key_4x4();2021void main()22 {23while(1)24 {25 key_4x4();26 }27 }2829// 不精确的延时函数30void Delayms(u16 ms)31 {32 unsigned int i, j;33for(i = ms; i > 0; i--)34for(j = 110; j > 0; j--);35return;36 }3738// 数码管根据74HC138译码器选择对应的段(选择哪个数码管显⽰)39void shumaguan(u8 n)40 {41switch(n)42 {43case0:44 LSA = 0;LSB = 0;LSC = 0;break;45case1:46 LSA = 1;LSB = 0;LSC = 0;break;47case2:48 LSA = 0;LSB = 1;LSC = 0;break;49case3:50 LSA = 1;LSB = 1;LSC = 0;break;51case4:52 LSA = 0;LSB = 0;LSC = 1;break;53case5:54 LSA = 1;LSB = 0;LSC = 1;break;55case6:56 LSA = 0;LSB = 1;LSC = 1;break;57case7:58 LSA = 1;LSB = 1;LSC = 1;break;59 }60 }6162// 数码管显⽰数字,并以⼗进制递增63void DigDisplay()64 {65 u8 i1 = 0;66 u8 i2 = 0;67 u8 i3 = 0;68 u8 i4 = 0;69 u8 i5 = 0;70 u8 i6 = 0;71 u8 i7 = 0;72 u8 i8 = 0;7374757677for (i8 = 0; i8 < 10; i8++)78for (i7 = 0; i7 < 10; i7++)79for (i6 = 0; i6 < 10; i7++)80for (i5 = 0; i5 < 10; i5++)81for (i4 = 0; i4 < 10; i4++)82for (i3 = 0; i3 < 10; i3++)83for (i2 = 0; i2 < 10; i2++)84for (i1 = 0; i1 < 10; i1++)85 {86 u16 cnt = 10;87while (cnt--)88 {89 shumaguan(0); //选中第⼀个数码管90 P0 = smgduan[i1]; //给他送⼀个数字91 Delayms(1); //稍微延时⼀下下92 shumaguan(1); //然后切换到第⼆个数码管。
51单片机控制直流电机调速系统流程图:
51单片机控制直流电机调速系统流程图:
题目:单片机控制直流电机调速系统——软件设计
1. 编一段显示程序分别显示当前的转速和我们所需要的转速。
显示用4段数码管来实现。
2:编一段PWM调速的程序,来控制脉冲的宽度从而来控制电机的转速。
3:通过霍尔传感器测速,利用霍尔把信号传给单片机,单片机利用计数器的功能来记录转速,并同时把转速用数码管显示出来。
4:由于真实的转速和我们所设订的转速可能存在很大的误差,所以要编一段PID调速的程序,通过PID调节来减少误差。
5.要3个按键,键1实现设定转速的功能,键2实现切换功能(从所设定的转速切换到真实的转速的显示,键3实现开关的功能。
利用51单片机,8个按键,8路发光二级管构成一个独立式键盘系统,按下8个按键,点亮对应的灯。
电子信息工程学院电子设计应用软件训练任务【训练任务】:1、熟练掌握PROTEUS软件的使用;2、按照设计要求绘制电路原理图;3、能够按要求对所设计的电路进行仿真;【基本要求及说明】:1、按照设计要求自行定义电路图纸尺寸;2、设计任务如下:利用51单片机,8个按键,8路发光二级管构成一个独立式键盘系统,按下8个按键,点亮对应的灯。
3、按照设计任务在Proteus 6 Professional中绘制电路原理图;4、根据设计任务的要求编写程序,在Proteus下进行仿真,实现相应功能。
【按照要求撰写总结报告】指导教师年月日负责教师年月日学生签字年月日成绩评定表电子设计应用软件训练总结报告一.任务说明本次任务是利用51单片机、按键以及发光二极管设计一个独立式键盘系统,要求独立简单可控。
首先要明确51单片机的工作原理,在此基础上编写单片机程序,再载入到所连电路原理图中实现按键控制二极管亮灭。
此次任务需要完成电路原理图的绘制、单片机汇编语言的编程。
目的是通过本次设计熟悉Proteus软件的工作环境,掌握基本的操作及流程以及对单片机汇编语言的进一步学习,使之前的学习得到巩固。
二.原理图绘制说明总体而言,一个完善的系统最重要的是稳定,精确,设计简单,修护容易,成本低,体积小。
满足以上条件的系统我们都可以说是完善的系统。
因此,我在设计中选用了一些比较成熟的器件,这些器件都经过时间的考验,能稳定的工作,同时,价格也相对便宜。
下面对原理图中主要的硬件进行简单介绍。
2.1 AT89C51的基本概述AT89C5l单片机,是一种低功耗、高性能的、片内含有4KB Flash ROM的8位CMOS 单片机,工作电压范围为2.7~6V(实际使用+5V供电),8位数据总线。
它有—个可编程的全双工串行通信接口,能同时进行串行发送和接收。
AT89C51具有4K并行可编程的非易失性FLASH程序存储器,可实现对器件串行在系统编程ISP和在应用中编程(IAP)。
51单片机:独立按键与矩阵按键控制数码管
51单⽚机:独⽴按键与矩阵按键控制数码管⼀,独⽴按键注意⼀下⼏点>按下的时候,电压被拉低,所以IO⼝要传低电平( 0x0 )>按下的时候要消除抖动 ( 延时10ms ),在判断,是否还是低电平,再做业务处理下⾯这段程序,就是通过⼀个独⽴按键连接到p1⼝,控制静态数码管的⼀段进⾏亮和灭的切换。
#include <reg52.h>sbit key_control = P1^0;sbit led = P0^0;typedef unsigned char u8;typedef unsigned int u16;void delay( u16 i ){while( i-- );}void key_press(){if( key_control == 0x0 ) {delay( 1110 );if( key_control == 0x0 ){led = ~led;}while( !key_control );}}void main (){/*while( 1 ){if( key_control == 0x0 ) {delay( 1110 ); //⼤概10msif ( key_control == 0x0 ) {led = 1;}}else if( key_control == 0x1 ) {delay( 1110 );if ( key_control == 0x1 ) {led = 0;}}}*/led = 0;while( 1 ) {key_press();}}⼆,当按键⽐较多的时候,⽤矩阵按钮,因为如果不⽤矩阵按钮,⼀个独⽴按键需要⼀个IO⼝,浪费资源。
如: 16个独⽴按键需要16个io⼝,⽽16个矩阵按键(4x4,⼀共8个管脚)需要8个IO⼝下⾯的程序,通过16个矩阵按钮,控制静态数码管,显⽰0~F#include <reg52.h>#define GPIO_DIG P0 //段选数码管#define GPIO_KEY P1 //矩阵按键typedef unsigned char u8;typedef unsigned int u16;void delay( u16 i ){while( i-- );}u8 key_value;//静态数码管段码u8 character [16] = { 0xC0, 0xF9 , 0xA4 , 0xB0 , 0x99 , 0x92,0x82 , 0xF8 , 0x80 , 0x90 , 0x88 , 0x83,0xC6 , 0xA1 , 0x86 , 0x8E};void key_down(){u8 count = 0;//⾏列扫描判断哪个键被按下GPIO_KEY = 0x0F; //⾼四位全部输出低电平,低四位输出⾼电平-->判断被按下的按钮所在的列if( GPIO_KEY != 0x0F ) { //有按键按下delay( 1110 ); //消除抖动if( GPIO_KEY != 0x0F ){switch( GPIO_KEY ){case0x07:key_value = 0; //矩阵第1列的按钮被按下break;case0x0B:key_value = 1; //矩阵第2列的按钮被按下break;case0x0D:key_value = 2; //矩阵第3列的按钮被按下break;case0x0E:key_value = 3; //矩阵第4列的按钮被按下break;}GPIO_KEY = 0xF0; //⾼四位输出⾼电平,低四位输出低电平-->判断被按下的按钮所在的⾏switch( GPIO_KEY ){case0x70:key_value = key_value; //矩阵第1⾏的按钮被按下break;case0xB0:key_value = key_value + 4; //矩阵第2⾏的按钮被按下break;case0xD0:key_value = key_value + 8; //矩阵第3⾏的按钮被按下break;case0xE0:key_value = key_value + 12; //矩阵第4⾏的按钮被按下break;}GPIO_DIG = character[key_value];//如果⼀直按下按键,等待500ms,强制退出while( ( count < 50 ) && ( GPIO_KEY != 0xF0 ) ) {count++;}}}}void main (){while( 1 ) {key_down();}}。
51单片机独立按键控制八路LED亮灭程序代码
//51单片机独立按键控制八路LED灯亮灭程序代码//#include <reg51.h> //调用头文件unsigned int count,count1; //定义两个int类型的变量sbit key=P3^5; //定义按键接入串口sbit key1=P3^4; //定义按键接入串口//以下是一个延时函数,便于后面程序按键的消抖,除了这个用途外,延时函数还有很多用途......//void delay(unsigned int ms){while(ms--);}//以下是一个声明的按键检测函数,在这个函数中通过count及count1两个变量的值来确定按键按下LED的亮灭,我这用了两个按键,不同按键控制LED从不同方向一次点亮,函数中采用了if语句与switch语句相结合,这是关键所在。
//void keysan(){if(key==0){delay(10);if(key==0){count++;switch(count){case 0:P1=0xff;break;case 1:P1=0xfe;break;case 2:P1=0xfd;break;case 3:P1=0xfb;break;case 4:P1=0xf7;break;case 5:P1=0xef;break;case 6:P1=0xdf;break;case 7:P1=0xbf;break;case 8:P1=0x7f;break;case 9:P1=0xff;break;}if(count>=9){count=0;}while(!key);}}delay(10);if(key1==0){delay(10);if(key1==0){count1++;switch(count1){case 0:P1=0xff;break; case 1:P1=0x7f;break; case 2:P1=0xbf;break; case 3:P1=0xdf;break; case 4:P1=0xef;break; case 5:P1=0xf7;break; case 6:P1=0xfb;break; case 7:P1=0xfd;break; case 8:P1=0xfe;break; case 9:P1=0xff;break; }if(count1>=9){count1=0;}while(!key1);}}}void main(){while(1){keysan();}}。
单片机原理(按键识别 )实验报告
教育资料
.
while (1) {
if(key==0) {
delay(1000); if(key==0) {
led=~led; while(key==0); }
} } } (2)按键识别 ( 按下灭,再按闪) #include<reg51.h> #define uint unsigned int #define uchar unsigned char sbit led=P2^6; sbit key=P2^7;
.
switch(j) { case 0 : led=0;break; case 1 : led=~led;delay(100);break; default:break; }
}
}
(3)按键识别 ( 按下数码管数值加 1) #include<reg51.h> #define uint unsigned int #define uchar unsigned char uchar code LedCode[]={ 0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x00}; uchar DispBuf[8]; sbit led=P2^6;
教育资料
.
if(hour>=24) {
hour=0; }
}
void main() {
uint i=2; while (1) {
if(key==0) {
delay(1000); if(key==0) {
i++; while(key==0); i=i%3;
教育资料
.
} } switch(i)