51单片机按键控制程序

合集下载

单片机按键连按长按汇编程序

单片机按键连按长按汇编程序

单片机按键连按长按汇编程序;=============================================================== ;程序编写人:兰建文;编写地点: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单片机矩阵键盘扫描程序

51单片机矩阵键盘扫描程序
void Timer0_isr(void) interrupt 1
{
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单片机应用程序实例
图 9.1 3.系统板上硬件连线 (1. 把“单片机系统”区域中的 P3.7/RD 端口连接到“独立式键盘”区域中的 SP1 端口上; (2. 把“单片机系统”区域中的 P1.0-P1.4 端口用 8 芯排线连接到“八路发光二 极管指示模块”区域中的“L1-L8”端口上;要求,P1.0 连接到 L1,P1.1 连接到 L2,
广告灯的左移右移
1. 实验任务
做单一灯的左移右移,硬件电路如图 4.1 所示,八个发光二极管 L1-L8 分别接在单 片机的 P1.0-P1.7 接口上,输出“0”时,发光二极管亮,开始时 P1.0→P1.1→P1.2→P1.3→┅→P1.7→P1.6→┅→P1.0 亮,重复循环。
2. 电路原理图
图 4.1
每次送出的数据是不同,具体的数据如下表 1 所示
P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 L8 L7 L6 L5 L4 L3 L2 1111111 1111110 1111101 1111011
P1.0 L1 0 1 1 1
说明
L1 亮 L2 亮 L3 亮 L4 亮
1110111 1 1101111 1 1011111 1 0111111 1
一键多功能按键识别技术
1.实验任务 如图 9.1 所示,开关 SP1 接在 P3.7/RD 管脚上,在 AT89S51 单片机的 P1 端口接有四 个发光二极管,上电的时候,L1 接在 P1.0 管脚上的发光二极管在闪烁,当每一次按 下开关 SP1 的时候,L2 接在 P1.1 管脚上的发光二极管在闪烁,再按下开关 SP1 的时 候,L3 接在 P1.2 管脚上的发光二极管在闪烁,再按下开关 SP1 的时候,L4 接在 P1.3 管脚上的发光二极管在闪烁,再按下开关 SP1 的时候,又轮到 L1 在闪烁了,如此轮 流下去。 2.电路原理图

51单片机红外遥控格力空调程序

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单片机按键电路

51单片机键盘接口电路(含源程序)键盘是由若干按钮组成的开关矩阵,它是单片机系统中最常用的输入设备,用户能通过键盘向计算机输入指令、地址和数据。

一般单片机系统中采和非编码键盘,非编码键盘是由软件来识别键盘上的闭合键,它具有结构简单,使用灵活等特点,因此被广泛应用于单片机系统。

按钮开关的抖动问题组成键盘的按钮有触点式和非触点式两种,单片机中应用的一般是由机械触点组成的。

在下图中,当开&lt;键盘结构图>图1图2关S未被按下时,P1。

0输入为高电平,S闭合后,P1。

0输入为低电平。

由于按钮是机械触点,当机械触点断开、闭合时,会有抖动动,P1。

0输入端的波形如图2所示。

这种抖动对于人来说是感觉不到的,但对计算机来说,则是完全能感应到的,因为计算机处理的速度是在微秒级,而机械抖动的时间至少是毫秒级,对计算机而言,这已是一个“漫长”的时间了。

前面我们讲到中断时曾有个问题,就是说按钮有时灵,有时不灵,其实就是这个原因,你只按了一次按钮,可是计算机却已执行了多次中断的过程,如果执行的次数正好是奇数次,那么结果正如你所料,如果执行的次数是偶数次,那就不对了。

为使CPU能正确地读出P1口的状态,对每一次按钮只作一次响应,就必须考虑如何去除抖动,常用的去抖动的办法有两种:硬件办法和软件办法。

单片机中常用软件法,因此,对于硬件办法我们不介绍。

软件法其实很简单,就是在单片机获得P1。

0口为低的信息后,不是立即认定S1已被按下,而是延时10毫秒或更长一些时间后再次检测P1。

0口,如果仍为低,说明S1的确按下了,这实际上是避开了按钮按下时的抖动时间。

而在检测到按钮释放后(P1。

0为高)再延时5-10个毫秒,消除后沿的抖动,然后再对键值处理。

不过一般情况下,我们常常不对按钮释放的后沿进行处理,实践证明,也能满足一定的要求。

当然,实际应用中,对按钮的要求也是千差万别,要根据不一样的需要来编制处理程序,但以上是消除键抖动的原则。

c51常用程序大全

c51常用程序大全

2.独立按键:51开发板独立键和矩阵键盘不能同时用,会有冲突
sbit s2=P3^4;
while(1) { if(s2==0) led=0; else led=1; }
//通过大循环不断扫描按键状态(方法一)
if(s2==0)
//消抖动 (方法二)
{
delay_ms(20);
if(s2==0)
{
while(!s2); //等待按键释放
//0000 0011 设置定时器0为工作方式3
TH0= 256-250 ; //6 以1s装初值,12M溢出4000次,11.0592溢出3686次 TL0= 256-250 ; //6 EA=1; //开总中断 ET0=1; //定时器/计数器0 中断允许位 ET1=1; //开定时器1中断 TR0=1; //启动定时器0 TR1=1; //启动定时器0的高8位计数器 while(1) //程序停止在这里等待中断发生
delay_ms(20);//延时30ms scan1=P3; if((scan1&0xf0)!=0xf0)//二次判键是否按下 {
P3=0x0f;//线翻转法 delay_ms(1);//延时 scan2=P3;//读P3口的状态 keycode=scan1|scan2; //组合成键编码 while(P3!=0x0f); //等待按键释放 for(j=0;j<=15;j++)
作用:对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当汇编NOP指令,延时几微
秒。 NOP指令为单周期指令(即为12个时钟周期),1/12 us可由晶振频率算出延时时间,对于12M晶振, 延时1uS;对于11.0592M,则n个NOP指令为单周期为1.08155 us * n 对于延时比较长的,要求在大于10us,采用C51中的循环语句来实现

单片机驱动继电器仿真实验(按键控制)

单片机驱动继电器仿真实验(按键控制)

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单片机秒表程序设计

51单片机秒表程序设计

51单片机秒表程序设计1. 简介秒表是一种用于测量时间间隔的计时器,常见于体育比赛、实验室实验等场合。

本文将介绍如何使用51单片机设计一个简单的秒表程序。

2. 硬件准备•51单片机开发板•LCD液晶显示屏•按键开关•连接线3. 程序流程3.1 初始化设置1.设置LCD液晶显示屏为8位数据总线模式。

2.初始化LCD液晶显示屏。

3.设置按键开关为输入模式。

3.2 主程序循环1.显示初始界面,包括“00:00:00”表示计时器初始值。

2.等待用户按下开始/暂停按钮。

3.如果用户按下开始按钮,则开始计时,进入计时状态。

4.如果用户按下暂停按钮,则暂停计时,进入暂停状态。

5.在计时状态下,每隔1毫秒更新计时器的数值,并在LCD液晶显示屏上显示出来。

6.在暂停状态下,不更新计时器的数值,并保持显示当前数值。

3.3 计时器控制1.定义一个变量time用于存储当前的计时器数值,单位为毫秒。

2.定义一个变量running用于标记计时器的状态,0表示暂停,1表示运行。

3.定义一个变量start_time用于存储计时器开始的时间点。

4.定义一个变量pause_time用于存储计时器暂停的时间点。

5.在计时状态下,每隔1毫秒更新time的值为当前时间与start_time的差值,并将其转换为小时、分钟、秒的表示形式。

6.在暂停状态下,保持time的值不变。

3.4 按键检测1.检测按键开关是否被按下。

2.如果按键被按下,判断是开始/暂停按钮还是复位按钮。

3.如果是开始/暂停按钮,并且当前处于计时状态,则将计时状态设置为暂停状态,并记录暂停时间点为pause_time;如果当前处于暂停状态,则将计时状态设置为运行状态,并记录开始时间点为当前时间减去暂停时间的差值。

4.如果是复位按钮,则将计时器数值重置为0,并将计时状态设置为暂停。

4. 程序代码示例#include <reg51.h>// 定义LCD控制端口和数据端口sbit LCD_RS = P1^0;sbit LCD_RW = P1^1;sbit LCD_EN = P1^2;sbit LCD_D4 = P1^3;sbit LCD_D5 = P1^4;sbit LCD_D6 = P1^5;sbit LCD_D7 = P1^6;// 定义按键开关端口sbit START_PAUSE_BTN = P2^0;sbit RESET_BTN = P2^1;// 定义全局变量unsigned int time = 0; // 计时器数值,单位为毫秒bit running = 0; // 计时器状态,0表示暂停,1表示运行unsigned long start_time = 0; // 开始时间点unsigned long pause_time = 0; // 暂停时间点// 函数声明void delay(unsigned int ms);void lcd_init();void lcd_command(unsigned char cmd);void lcd_data(unsigned char dat);void lcd_string(unsigned char *str);void lcd_clear();void lcd_gotoxy(unsigned char x, unsigned char y);// 主函数void main() {// 初始化设置lcd_init();while (1) {// 显示初始界面lcd_clear();lcd_gotoxy(0, 0);lcd_string("00:00:00");// 等待用户按下开始/暂停按钮while (!START_PAUSE_BTN && !RESET_BTN);// 判断按钮类型并处理计时器状态if (START_PAUSE_BTN) {if (running) { // 当前处于计时状态,按下按钮将进入暂停状态 running = 0;pause_time = time;} else { // 当前处于暂停状态,按下按钮将进入计时状态running = 1;start_time = get_current_time() - pause_time;}} else if (RESET_BTN) { // 复位按钮按下,重置计时器time = 0;running = 0;}}}// 毫秒级延时函数void delay(unsigned int ms) {unsigned int i, j;for (i = ms; i > 0; i--) {for (j = 110; j > 0; j--);}}// LCD初始化函数void lcd_init() {lcd_command(0x38); // 设置8位数据总线模式lcd_command(0x0C); // 显示开,光标关闭lcd_command(0x06); // 光标右移,不移动显示器lcd_command(0x01); // 清屏}// 向LCD发送指令函数void lcd_command(unsigned char cmd) {LCD_RS = 0;LCD_RW = 0;LCD_EN = 1;LCD_D4 = cmd >> 4 & 1;LCD_D5 = cmd >> 5 & 1;LCD_D6 = cmd >> 6 & 1;LCD_D7 = cmd >> 7 & 1;delay(1);LCD_EN = 0;LCD_D4 = cmd >> 0 & 1;LCD_D5 = cmd >> 1 & 1;LCD_D6 = cmd >> 2 & 1;LCD_D7 = cmd >> 3 & 1;delay(1);LCD_EN = 0;}// 向LCD发送数据函数void lcd_data(unsigned char dat) { LCD_RS = 1;LCD_RW = 0;LCD_EN = 1;LCD_D4 = dat >> 4 & 1;LCD_D5 = dat >> 5 & 1;LCD_D6 = dat >> 6 & 1;LCD_D7 = dat >> 7 & 1;delay(1);LCD_EN = 0;LCD_D4 = dat >> 0 & 1;LCD_D5 = dat >> 1 & 1;LCD_D6 = dat >> 2 & 1;LCD_D7 = dat >> 3 & 1;delay(1);LCD_EN = 0;}// 向LCD发送字符串函数void lcd_string(unsigned char *str) {while (*str) {lcd_data(*str++);delay(5);}}// 清屏函数void lcd_clear() {lcd_command(0x01);}// 设置光标位置函数void lcd_gotoxy(unsigned char x, unsigned char y) {unsigned char addr;if (y == 0)addr = x | (0x80 + y);else if (y == 1)addr = x | (0xC0 + y);lcd_command(addr);}5. 总结本文介绍了使用51单片机设计一个简单的秒表程序。

51单片机三个按键选择三首不同的音乐播放,一个键停止播放

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 标准内核的头文件

51单片机按键等控制代码

51单片机按键等控制代码

8 位立即数带进位加到累加器 累加器带借位减去寄存器内容 累加器带借位减去直接地址单元 累加器带借位减去间接 RAM 内容 累加器带借位减去 8 位立即数 累加器加 1 寄存器加 1 直接地址单元内容加 1 间接 RAM 内容加 1 DPTR 加 1 累加器减 1 寄存器减 1 直接地址单元内容减 1 间接 RAM 内容减 1 A 乘以 B A 除以 B 累加器进行十进制转换
3、 逻辑操作类指令 助记符 ANL A,Rn ANL A,direct ANL A,@Ri ANL A,#data8 ANL direct,A ANL direct,#data8 ORL A,Rn ORL A,direct ORL A,@Ri ORL A,#data8 ORL direct,A ORL direct,#data8 XRL A,Rn XRL A,direct XRL A,@Ri XRL A,#data8 XRL direct,A XRL direct,#data8 CLR A CPL A RL A RLC A RR A
进位位和直接地址位相“与”
ANL C,/bit
进位位和直接地址位的反码相“与”
ORL C,bit
进位位和直接地址位相“或”
ORL C,/bit
进位位和直接地址位的反码相“或”
MOV C,bit
直接地址位送入进位位
MOV bit,C
进位位送入直接地址位
字节数 1 2 1 2 1 2 2 2 2 2 2 2
功能说明 寄存器内容加到累加器 直接地址单元内容加到累加器 间接 RAM 内容加到累加器 8 位立即数加到累加器 寄存器内容带进位加到累加器 直接地址单元内容带进位加到累加器 间接 RAM 内容带进位加到累加器
字节数 1 2 1 2 1 2 1

51单片机编程实例大全

51单片机编程实例大全

//实例 16:用 P0 显示左移运算结果
#include<reg51.h> //包含单片机寄存器的头文件 void main(void) {
P0=0x3b<<2;//将左移运算结果送 P0 口,P0=1110 1100B=0xec while(1)
; //无限循环,防止程序“跑飞” }
//实例 17:"万能逻辑电路"实验
}
//实例 10:用 P0、P1 口显示乘法运算结果
#include<reg51.h> //包含单片机寄存器的头文件 void main(void) {
unsigned char m,n; unsigned int s; m=64;
n=71; s=m n; 位送 P0 口
/256 除以 256 的商 的余数
//s=64 71=4544,需要 16 位二进制数表示,高 8 位送 P1 口,低 8
//由于 4544=17 256+192=H3 16 16 16+H2 16 16+H1 16+H0 //两边同除以 256,可得 17+192/256=H3 16+H2+(H1 16+H0)
//因此,高 8 位 16 进制数 H3 16+H2 必然等于 17,即 4544
//无限循环
{ P1=0xfe; //P1=1111 1110B, P1.0 输出低电平 delay(); //延时一段时间 P1=0xff; //P1=1111 1111B, P1.0 输出高电平 delay(); //延时一段时间
}
}
//实例 3:将 P1 口状态分别送入 P0、P2、P3 口:认识 I/O 口 的引脚功能

51单片机实验报告按钮开关

51单片机实验报告按钮开关

单片机实验制作实验题目:按钮开关应用实验完成时间: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单片机 矩阵键盘 千百十个 加1减1

51单片机 矩阵键盘 千百十个 加1减1
break;
default: break;
}
}
}
void xianshi()//显示当前数值
{
//显示个位
P1_3=0;//开位码控制位,此段接PNP三极管8550的基极,低电平开位码。
P0=dis[ge];//显示段码
delay();//每次亮的状态为50us
P0=0xff;//清除数码管显示,因为是共阳极的,故为0xff。如不清除,则数码管上有鬼影
//51单片机控制四个数码管,P2口接4*4矩阵式键盘,采用行列翻转的原理,1键按下千位加1,5键按下千位减一,;2键按下百位加1,6键按下百位减1;
//3键按下十位加1,7键按下十位减1;4键按下个位加1,8键按下个位键1
#include<reg52.h>
#define uchar unsigned char
uchar row,col,k=0xff;//定义行、列、返回值、循环控制变量
unsigned char qian,bai,shi,ge;
sbit P1_3=P1^3;//个位位码
sbit P1_2=P1^2;//十位位码
sbit P1_1=P1^1;//百位位码
sbit P1_0=P1^0;//千位位码
break;
case 0xBd: k=7;//第二行第三列的按键按下(代号为7),数码管十位减1
if(shi==0) shi=9;
else shi=shi-1;
break;
case 0x7d: k=8;//第二行第四列的按键按下(代号为8),数码管个位减1
if(ge==0) ge=9;
else ge=ge-1;
P2=0xf0;
while((P2&0xf0)!=0xf0);//等待键释放(松手检测)

按键功能实验报告总结(3篇)

按键功能实验报告总结(3篇)

第1篇一、实验背景按键作为电子设备中常见的输入装置,其功能丰富,应用广泛。

本实验旨在通过设计和实现一系列按键功能,加深对按键工作原理的理解,并提高电子设计实践能力。

二、实验目的1. 掌握按键的基本原理和电路设计方法。

2. 熟悉按键在不同应用场景下的功能实现。

3. 培养电子设计实践能力,提高问题解决能力。

三、实验内容1. 实验器材:51单片机最小核心电路、按键、LED灯、电阻、电容、面包板等。

2. 实验内容:(1)单按键控制LED灯闪烁(2)按键控制LED灯点亮与熄灭(3)按键控制LED灯亮度调节(4)按键实现数字时钟调整(5)按键实现多功能计数器(6)按键实现密码输入与验证四、实验步骤1. 根据实验要求,设计电路图,并选择合适的元器件。

2. 使用面包板搭建实验电路,包括单片机、按键、LED灯、电阻、电容等。

3. 编写程序,实现按键功能。

4. 对程序进行调试,确保按键功能正常。

5. 实验完成后,撰写实验报告。

五、实验结果与分析1. 单按键控制LED灯闪烁实验结果:按下按键,LED灯闪烁;松开按键,LED灯停止闪烁。

分析:本实验通过单片机定时器实现LED灯的闪烁。

当按键按下时,定时器开始计时;当定时器达到设定时间后,LED灯点亮;定时器继续计时,当达到设定时间后,LED灯熄灭。

如此循环,实现LED灯的闪烁。

2. 按键控制LED灯点亮与熄灭实验结果:按下按键,LED灯点亮;再次按下按键,LED灯熄灭。

分析:本实验通过单片机的I/O口控制LED灯的点亮与熄灭。

当按键按下时,单片机将I/O口置为高电平,LED灯点亮;当按键再次按下时,单片机将I/O口置为低电平,LED灯熄灭。

3. 按键控制LED灯亮度调节实验结果:按下按键,LED灯亮度逐渐增加;松开按键,LED灯亮度保持不变。

分析:本实验通过单片机的PWM(脉宽调制)功能实现LED灯亮度的调节。

当按键按下时,单片机调整PWM占空比,使LED灯亮度逐渐增加;松开按键后,PWM占空比保持不变,LED灯亮度保持不变。

单片机C语言-第3章51单片机P0-P3口的C51编程3

单片机C语言-第3章51单片机P0-P3口的C51编程3
(3)键值表:用户在设计键盘程序时,将所有按 键的键值,按照一定的顺利,在code区建立一 个表格,该表格称为键值表。
3.3.3 多个按钮型开关—键盘
2.独立式键盘接口技术
当按键的数量比较少(≤8)时,可采用独立式按键硬 件结构。独立式按键是指直接采用一根 I/O口线构成的 单个按键电路。每个独立式按键单独占用一根I/O口线, 每根I/O口线上的按键的工作状态不会影响其他I/O口线 的工作状态。
• 分析:
• 相当于S1为一个控制开关,控制着 灯的亮、灭闪烁;
• 与例题3-8不同。定义一个位单元, 按键每动作一次,该位单元取反:该单 元为0时,灯全亮,该单元为1时,灯闪 烁。
• include<reg51.h> • #define uchar unsigned char • #define uint unsigned int • sbit S1=P3^2; • bit key=0; //定义一个位,存储按键的动作(偶、奇) • void dlxms( uint xms) • { uint t1, t2; • for( t1=0; t1<xms; t1++) • for( t2=0; t2<110; t2++); •}
• #define uint unsigned int
• uchar data keycode=8;
//键值的初值设为8
• uchar data dir_buf;
//显示缓冲区
• code uchar dirtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0xbf};//显 示的代码表
• sbit K2=P1^6;

51单片机:独立按键与矩阵按键控制数码管

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亮灭程序代码

//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();}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档