51单片机矩阵按键电路图+程序(数码管显示)
51单片机(四位数码管的显示)程序
51单片机(四位数码管的显示)程序基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管上显示“P_ _ _”4个字符;2)等待按键,如按了任何一个键,则将这4个字符清除,改为显示“0000”4个字符(为数字的0)。
最佳答案下面这个程序是4x4距阵键盘,LED数码管显示,一共可以到0-F显示,你可以稍微改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你!#include<at89x52.h>unsigned char codeDig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1 ,0x86,0x8e}; //gongyang数码管0-F 代码unsigned char k; //设置全局变量k 为键盘的键值/************************************键盘延时函数****************************/void key_delay(void) //延时函数{int t;for(t=0;t<500;t++);}/************************************键盘扫描函数******************************/void keyscan(void) //键盘扫描函数{unsigned char a;P2 = 0xf0; //键盘初始化if(P2!=0xf0) //有键按下?{key_delay(); //延时if(P2!=0xf0) //确认真的有键按下?{P2 = 0xfe; //使行线P2.4为低电平,其余行为高电平key_delay();a = P2; //a作为缓存switch (a) //开始执行行列扫描{case 0xee:k=15;break;case 0xde:k=11;break;case 0xbe:k=7;break;case 0x7e:k=3;break;default:P2 = 0xfd; //使行线P2.5为低电平,其余行为高电平a = P2;switch (a){case 0xed:k=14;break;case 0xdd:k=10;break;case 0xbd:k=6;break;case 0x7d:k=2;break;default:P2 = 0xfb; //使行线P2.6为低电平,其余行为高电平a = P2;switch (a){case 0xeb:k=13;break;case 0xdb:k=9;break;case 0xbb:k=5;break;case 0x7b:k=1;break;default:P2 = 0xf7; //使行线P2.7为低电平,其余行为高电平a = P2;switch (a){case 0xe7:k=12;break;case 0xd7:k=8;break;case 0xb7:k=4;break;case 0x77:k=0;break;default:break;}}}break;}}}}/****************************** ***主函数*************************************/ void main(void){while(1){keyscan(); //调用键盘扫描函数switch(k) //查找按键对应的数码管显示代码{case 0:P0=Dig[0];break;case 1:P0=Dig[1];break;case 2:P0=Dig[2];break;case 3:P0=Dig[3];break;case 4:P0=Dig[4];break;case 5:P0=Dig[5];break;case 6:P0=Dig[6];break;case 7:P0=Dig[7];break;case 8:P0=Dig[8];break;case 9:P0=Dig[9];break;case 10:P0=Dig[10];break;case 11:P0=Dig[11];break;case 12:P0=Dig[12];break;case 13:P0=Dig[13];break;case 14:P0=Dig[14];break;case 15:P0=Dig[15];break;default:break; //退出}}}/**********************************end***************************************/。
51单片机4×4矩阵按键扫描方法
key=0xf0;//低四位为0
if(key==0xf0)//若无变化,证明按键松开
return 0;//返回0
else//否则,按键未松开
return 1;//返回1
}
//*********主函数*********//
int main()
{
key=0xff;//按键初始化
led=0xff;//关闭LED灯
//送至led显示
/*
eg:如果是第三行第二列按键按下
则第3个、第6(2列+4)个LED灯亮
如下图所示(Proteus仿真电路图)
*/
}
}
led_arry[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//数组定义,便于显示
//******检测是否有按键按下*****//
uchar Check_Button()
{
key=0x0f;//高四位为0
if(key==0x0f)//若无变化,证明无按键按下
return 0;//返回0
else//否则
return 1;//返回1
}
//********行检测********//
uchar Line[]={0x0e,0x0d,0x0b,0x07}; //那个按键按下,检测出的状态则对应数组中的第几个数
void Check_Line()
{
uchar i;
key=0x0f;//高四位为0
/*****4×4按键扫描******/
/***编程要点
1.首先检测是否有按键按下
2.若有按键按下,即进行行检测,列检测
3.行检测:高4位设为0,低4位为1,进行检测0x0f
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个毫秒,消除后沿的抖动,然后再对键值处理。
不过一般情况下,我们常常不对按钮释放的后沿进行处理,实践证明,也能满足一定的要求。
当然,实际应用中,对按钮的要求也是千差万别,要根据不一样的需要来编制处理程序,但以上是消除键抖动的原则。
数码管显示简易计算器说明书
目录一、原理图设计说明 (1)1.1数码管硬件电路设计 (1)1.2矩阵键盘电路设计: (2)二、程序设计说明 (3)2.1键盘扫描程序设计 (3)2.2算术运算程序设计 (4)2.3显示程序设计 (5)三、工作原理图及程序流程图 (6)四、程序清单 (9)五、参考文献 (15)一、原理图设计说明1.1数码管硬件电路设计数码管数据显示的硬件电路由单片机、4 位共阳极数码管、位驱动电路、限流电阻等组成。
实验板中用杜邦线将P7 与单片机IO 口相连(这里以P0 口为例)。
用跳线将P8 与单片机P2 低四位相连,P0 口送出数码管段选码,P2 送出位选码。
图1-1 数码管硬件电路原理图1.2矩阵键盘电路设计:4*4 矩阵键盘行输入接单片机P1.0-P1.3,列输入接单片机P1.4-P1.7,通过扫描方式检测是否有键按下,并确定键值,使用矩阵键盘时注意给P10 矩阵键盘选择端使能。
对键盘进行编号,S3-S18,按下相应按键,在数码管上显示相应键值(0-F)。
例如按下S10 键,显示A,按下S0 键,显示0。
图1-2 矩阵键盘电路原理图二、程序设计说明2.1键盘扫描程序设计键盘扫描程序的过程为:开始时,先判断是否有键闭合,无键闭合时,返回继续判断,有键闭合时,先去抖动,然后确定是否有键按下,若无键按下,则返回继续判断是否有键闭合,若有键按下,则判断键号,然后释放,若释放按键完毕,则返回,若没有释放按键,则返回继续释放。
其流程图如图2-1所示。
图2-1 键盘扫描程序流程图算术运算程序的过程为:先判断输入的运算符是+、-、*、/ 中的哪一个,若是+或-,则要判断运算结果是否溢出,溢出则显示错误信息,没溢出就显示运算结果,若是/,则要先判断除数是否为零,为零就显示错误信息,不为零则显示运算结果,若是-,则直接显示运算结果。
其流程图如图2.2所示。
图2-2 算术运算程序设计流程图先是程序的过程为:显示开始时,先进行LED的初始化,判断是否显示,若不显示,则返回,若显示,则进行相应功能的设置,然后送地址和数据,再判断是否显示完,显示完则返回,没有显示完则继续送地址。
51单片机键盘数码管显示(带程序)
期中大作业学院:物理与电子信息工程学院课题:【利用8255和51单片机实现数码管显示按键数值的程序】要求:【4*4矩阵键盘,按0到15,数码管上分别显示0~9,A~F】芯片资料:8255:8255是Intel公司生产的可编程并行I/O接口芯片,有3个8位并行I/O口。
具有3个通道3种工作方式的可编程并行接口芯片(40引脚)。
其各口功能可由软件选择,使用灵活,通用性强。
8255可作为单片机与多种外设连接时的中间接口电路。
8255作为主机与外设的连接芯片,必须提供与主机相连的3个总线接口,即数据线、地址线、控制线接口。
同时必须具有与外设连接的接口A、B、C口。
由于8255可编程,所以必须具有逻辑控制部分,因而8255内部结构分为3个部分:与CPU连接部分、与外设连接部分、控制部分。
8255特性:1.一个并行输入/输出的LSI芯片,多功能的I/O器件,可作为CPU总线与外围的接口。
2.具有24个可编程设置的I/O口,即3组8位的I/O口,分别为PA口、PB口和PC 口。
它们又可分为两组12位的I/O口:A组包括A口及C口(高4位,PC4~PC7),B组包括B口及C口(低4位,PC0~PC3)。
A组可设置为基本的I/O口,闪控(STROBE)的I/O闪控式,双向I/O三种模式;B组只能设置为基本I/O或闪控式I/O两种模式,而这些操作模式完全由控制寄存器的控制字决定.引脚说明RESET:复位输入线,当该输入端处于高电平时,所有内部寄存器(包括控制寄存器)均被清除,所有I/O口均被置成输入方式。
CS:芯片选择信号线,当这个输入引脚为低电平时,即CS=0时,表示芯片被选中,允许8255与CPU进行通讯;CS=1时,8255无法与CPU做数据传输。
RD:读信号线,当这个输入引脚为低电平时,即CS=0且RD=0时,允许8255通过数据总线向CPU发送数据或状态信息,即CPU从8255读取信息或数据。
WR:写入信号,当这个输入引脚为低电平时,即CS=0且WR=0时,允许CPU将数据或控制字写入8255。
51单片机最小系统电路图及实验
51单片机最小系统电路图及实验(含调试程序)--------------------------------------------------------------------------------51单片机最小系统电路图及实验一、任务开发单片机最小系统二、任务分析:该系统具有的功能:(1)具有2位LED数码管显示功能。
(2)具有八路发光二极管显示各种流水灯。
(3)可以完成各种奏乐,报警等发声音类实验。
(4)具有复位功能。
三、功能分析(1)两位LED数码管显示功能,我们可以利用单片机的P0口接两个数码管来现这个功能;(2)八路发光二极管显示可以利用P1口接八个发光二极管实现这个功能;(3)各种奏乐、报警等发声功能可以采用P2.0这个引脚接一蜂鸣器来实现。
(4)利用单片机的第9脚可以设计成复位系统,我们采用按键复位;利用单片机的18、19脚可以设计成时钟电路,我们利用单片机的内部振荡方式设计的。
四、设计框图五、最小系统电路图设计根据本系统的功能,和单片机的工作条件,我们设计出下面的电路图。
六、元器件件清单的确定:数码管:共阴极2只(分立)电解电容:10UF的一只30PF的电容2只220欧的电阻9只4.7K的电阻一只1.2K的电阻一只4.7K的排阻一只,12MHZ的晶振一只有源5V蜂名器一只AT89S51单片机一片常开按钮开关1只紧锁座一只(方便芯取下来的,绿色的)发光二极管(5MM红色)8只万能板电路版15*17CMS8550三极管一只4.5V电池盒一只,导线若干。
七、硬件电路的焊接按照原理图把上面的元件焊接好,详细步骤省略。
八、相关程序设计针对上面的电路原理图,设计出本系统的详细功能:(1)、第一个发光二极管点亮,同时数码管显示“1”。
(2)、第二个发光二极管点亮,同时数码管显示“2”。
(3)、依次类推到第八个发光二极管点亮,同时数码管显示“8”。
以上出现的是流水灯的效果(4)、所有的发光二极管灭了,同时数码管现实“0”。
51单片机外围电路
C y7 B A 0 y
/CE1 A12 A8 A7 8K×8 A0 /OE1 O0~O7
/CE7 A12 A8 A7 8K×8 A0 /OE1 O0~O7
MCS–51
74LS138
采用LS138译码器实现ROM扩展示意表
P2.7~P2.5
138 输出
静态LED数码显示电路(共阳极)
七段译码器
七段译码器
七段译码器
七段译码器
七段译码器
Vcc
BCD码 0000 0001 0010 0011 0100
返回
数码管(五)
由于静态显示占用的I/O 口线较多, CPU 的开销很大, 所以为了节省单片机的I/O 口线, 常采用动态扫描方式来作为LED 数码管的接口电路。 动态显示的接口电路是把所有LED的8 个笔划段a~g, dp 同名端连在一起, 而每一个显示器的公共极COM 端与各自独立的I/O 口连接。当CPU 向字段输出口送出字形码时, 所有显示器接收到相同的字形码, 但究竟是那个显示器亮, 则取决于COM 端, 而这一端是由I/O 口控制的, 所以我们就可以自行决定何时显示哪一位了。
MCS-51与32K ROM的连接
P2.7 : : : P2.0 P0.7 : : : P0.0 ALE /EA Psen
CE A14 : : A8 A7 O7 : : : : : : A0 O0 OE
返回
51单片机
程序存储器
数据存储器
数码管显示
键盘
电源模块
指示灯
AD转换
温度传感器
IIC总线
LCD液晶
最小系统板
指示灯电路(一)
一、电源指示灯 通常的指示灯电路是使用发光二极管,接法如下: 当电源正常工作时发光二极管就正常显示
51单片机数码管显示时钟程序
#include〈reg52.h〉//#include#include<intrins。
h〉#define uchar unsigned char#define uint unsigned intsbit dula=P2^6;sbit wela=P2^7;sbit key1=P3^4;sbit key2=P3^5;sbit key3=P3^6;sbit beep=P2^3;unsigned code table[]={0x3f ,0x06 ,0x5b , 0x4f ,0x66 ,0x6d ,0x7d ,0x07 ,0x7f ,0x6f ,0x77 ,0x7c,0x39 , 0x5e , 0x79 ,0x71};uchar num1,num2,s,s1,m,m1,f,f1,num,numf,nums,dingshi;uchar ns,ns1,nf,nf1,numns,numnf;void delay(uint z);void keyscan ();void keyscan1 ();void alram();void display(uchar m,uchar m1,uchar f,ucharf1,uchars,uchars1); void display0(uchar nf,uchar nf1,uchar ns,uchar ns1);void main(){TMOD=0x01;//设定定时器0工作方式1TH0=(65536—46080)/256 ;TL0=(65536—46080)%256 ;EA=1;//开总中断ET0=1;//开定时器0中断TR0=1;//启动定时器0中断numns=12;numnf=0;while(1){if(dingshi==0){keyscan ();display(m,m1,f,f1,s,s1);alram();}else{keyscan1 ();display0(nf,nf1,ns,ns1);}}}void keyscan (){if(key1==0){delay(10);if(key1==0)nums++;if (nums==24)nums=0;while(!key1);display(m,m1,f,f1,s,s1);}if(key2==0){delay(10);if(key2==0)numf++;if (numf==60)numf=0;while(!key2);display(m,m1,f,f1,s,s1);}if(key3==0){delay(10);if(key3==0){dingshi=~dingshi;while(!key3)display(m,m1,f,f1,s,s1);}}/*if(key4==0){delay(10);if(key4==0){flag=1;while(!key4);display(m,m1,f,f1,s,s1);}}*/}void keyscan1(){if(key1==0){delay(10);if(key1==0)numns++;if (numns==24)numns=0;while(!key1);// display(nf,nf1,ns,ns1);}if(key2==0){delay(10);if(key2==0)numnf++;if (numnf==60)numnf=0;while(!key2);// display(nf,nf1,ns,ns1);}if(key3==0){delay(10);if(key3==0){dingshi=0;while(!key3);// display(m,m1,f,f1,s,s1);}}}void alram(){if((numnf==numf)&&(numns==nums))beep=0;if(((numnf+1==numf)&&(numns==nums))&&(dingshi==0))//一分钟报时提示beep=1;}void display0(uchar nf,uchar nf1,uchar ns,uchar ns1)//闹钟显示函数{nf=numnf%10;nf1=numnf/10;ns=numns%10;ns1=numns/10;/*wela=1;P0=0xc0;//送位选数据wela=0;P0=0xff;*/dula=1;P0=table[ns1];dula=0;P0=0xff;wela=1;P0=0xfe;wela=0;delay(1);dula=1;P0=table[ns]|0x80;dula=0;wela=1;P0=0xfd;wela=0;delay(1);dula=1;P0=table[nf1];dula=0;P0=0xff;wela=1;P0=0xfb;wela=0;delay(1);dula=1;P0=table[nf];dula=0;P0=0xff;wela=1;P0=0xf7;wela=0;delay(1);}void display(uchar m,uchar m1,uchar f,ucharf1,uchars,uchars1) //时间显示{dula=1;P0=table[m1];//秒位第1位dula=0;P0=0xff;wela=1;P0=0xef;wela=0;delay(1);dula=1;P0=table[m];// 秒位第2位dula=0;P0=0xff;wela=1;wela=0;delay(1);dula=1;P0=table[s1]; //时位第一位dula=0;P0=0xff;wela=1;P0=0xfe;wela=0;delay(1);dula=1;P0=table[s]|0x80;dula=0;P0=0xff;wela=1;P0=0xfd;wela=0;delay(1);dula=1;P0=table[f1];//分位第一位dula=0;P0=0xff;wela=1;P0=0xfb;wela=0;delay(1);dula=1;P0=table[f]|0x80;dula=0;P0=0xff;wela=1;P0=0xf7;wela=0;delay(1);}void T0_timer() interrupt 1{TH0=(65536—46080)/256 ;TL0=(65536—46080)%256 ;num2++;if(num2==20){num++;num2=0;m=num%10;m1=num/10;f=numf%10;f1=numf/10;s=nums%10;s1=nums/10;if(num==59){num=0;numf++;if(numf==59){numf=0;nums++;}if (nums==24)nums=0;}}}void delay(uint z){uint x,y;for(x=110;x〉0;x—-)for(y=z;y>0;y—-);}。
矩阵式键盘实验报告
矩阵式键盘实验报告矩阵键盘设计实验报告南京林业大学实验报告基于AT89C51单片机4x4矩阵键盘接口电路设计课程院系班级学号姓名指导老师机电一体化设计基础机械电子工程学院杨雨图2013年9月26日一、实验目的1、掌握键盘接口的基本特点,了解独立键盘和矩阵键盘的应用方法。
2、掌握键盘接口的硬件设计方法,软件程序设计和贴士排错能力。
3、掌握利用Keil51软件对程序进行编译。
4、用Proteus软件绘制“矩阵键盘扫描”电路,并用测试程序进行仿真。
5、会根据实际功能,正确选择单片机功能接线,编制正确程序。
对实验结果能做出分析和解释,能写出符合规格的实验报告。
二、实验要求通过实训,学生应达到以下几方面的要求:素质要求1.以积极认真的态度对待本次实训,遵章守纪、团结协作。
2.善于发现数字电路中存在的问题、分析问题、解决问题,努力培养独立工作能力。
能力要求1.模拟电路的理论知识2.脉冲与数字电路的理念知识3.通过模拟、数字电路实验有一定的动手能力4.能熟练的编写8951单片机汇编程序5.能够熟练的运用仿真软件进行仿真三、实验工具1、软件:Proteus软件、keil51。
2、硬件:PC机,串口线,并口线,单片机开发板四、实验内容1、掌握并理解“矩阵键盘扫描”的原理及制作,了解各元器件的参数及格元器件的作用。
2、用keil51测试软件编写AT89C51单片机汇编程序3、用Proteus软件绘制“矩阵键盘扫描”电路原理图。
4、运用仿真软件对电路进行仿真。
五.实验基本步骤1、用Proteus绘制“矩阵键盘扫描”电路原理图。
2、编写程序使数码管显示当前闭合按键的键值。
3、利用Proteus软件的仿真功能对其进行仿真测试,观察数码管的显示状态和按键开关的对应关系。
4、用keil51软件编写程序,并生成HEX文件。
5、根据绘制“矩阵键盘扫描”电路原理图,搭建相关硬件电路。
6、用通用编程器或ISP下载HEX程序到MCU。
基于51单片机简易计算器课程设计
电气与电子信息工程学院单片机课程设计设计题目:简易电子计算器专业班级: 12级电信(1)班学号: *************名:**指导教师:章磊艾青设计时间:2014/06/03~2014/06/13 设计地点:K2—407课程设计任务书2013 ~2014 学年第2学期学生姓名:杨峥专业班级:电子信息工程技术(专)2012(1)班指导教师:艾青、章磊工作部门:电气学院电信教研室一、课程设计题目:单片机课程设计1. 出租车计价器系统设计2. 医院住院病人呼叫器的设计3. 作息时间控制器4. 数字温度计的设计5. 火灾报警器的设计6. 电子密码锁7. 电子计算器8.学生自选二、课程设计内容1. 以单片机为核心器件,构造系统;2. 熟悉、掌握各种外围接口电路芯片的工作原理和控制方法;3. 熟悉、掌握单片机汇编语言的软件设计方法;4. 熟悉、掌握印刷电路板的设计方法;5. 根据具体设计课题的技术指标和给定条件,能独立而正确地进行方案论证和电路设计,要求概念清楚、方案合理、方法正确、步骤完整;6. 学会查阅有关参考资料和手册,并能正确选择有关元器件和参数;7. 编写设计说明书,参考毕业设计论文格式撰写设计报告(5000字以上)。
三、进度安排2.执行要求智能电子产品设计制作共8个选题,每组不超过7人,为避免雷同,在设计中每个同学所采用的方案不能一样。
四、基本要求(1)进行方案论证并根据要求确定系统设计方案;(2)绘制系统框图和电气原理草图,程序流程图;(3)对相关电路进行电路参数计算和元器件选择;(4)进行软件汇编并调试;(5)利用Proteus和Keil uVision2对系统进行联调;(6)绘制系统原理总图,列出原器件明细表;(7)画出软件框图,列出程序清单;(8)写出使用说明书;(9)对设计进行全面总结,写出课程设计报告。
五、课程设计考核办法与成绩评定第1章方案的选择与概述1. 单片机概述当今时代,是一个新技术层出不穷的时代。
51单片机的矩阵按键扫描的设计C语言程序
51单片机的矩阵按键扫描的设计C语言程序以下为一个基于51单片机的矩阵按键扫描的设计C语言程序:```c#include <reg51.h>//定义端口连接到矩阵键盘sbit col1 = P2^0;sbit col2 = P2^1;sbit col3 = P2^2;sbit row1 = P2^3;sbit row2 = P2^4;sbit row3 = P2^5;sbit row4 = P2^6;//声明按键函数char read_keypad(;void maiwhile (1)char key = read_keypad(; // 读取按键值//根据按键值进行相应操作switch(key)case '1'://第一行第一列按键逻辑//在此处添加相应的代码break;case '2'://第一行第二列按键逻辑//在此处添加相应的代码break;//继续处理其他按键//...default://未识别到按键break;}}//按键扫描函数char read_keypacol1 = 0; col2 = 1; col3 = 1; // 激活第一列if (row1 == 0) { // 第一行第一列按键被按下while (row1 == 0); //等待按键释放return '1'; // 返回按键值}if (row2 == 0) { // 第二行第一列按键被按下while (row2 == 0); //等待按键释放return '4'; // 返回按键值}if (row3 == 0) { // 第三行第一列按键被按下while (row3 == 0); //等待按键释放return '7'; // 返回按键值}if (row4 == 0) { // 第四行第一列按键被按下while (row4 == 0); //等待按键释放return '*'; // 返回按键值}col1 = 1; col2 = 0; col3 = 1; // 激活第二列//处理第二列的按键逻辑//...col1 = 1; col2 = 1; col3 = 0; // 激活第三列//处理第三列的按键逻辑//...return '\0'; // 返回空字符表示未检测到按键```以上代码中,我们使用51单片机的P2端口连接到矩阵键盘的列和行,通过扫描不同的列和检测行的状态来判断按键是否被按下。
单片机结构(共46张PPT)
8051是MCS-51系列单片机的典型产品, 我们以这一代表性的机型进行系统的讲 解。
➢ 内部结构
➢ 外部引脚 ➢ 工作时序
➢ 实例分析
第1页,共46页。
典型单片机结构
T0 T1
时钟电路 ROM
内部总线 CPU
RAM
定时/计数器
并行接口
串行接口
中断系统
中央处理器 数据存储器(RAM)
输入输出引脚
P1.0
➢ P0:P0.1~P0.7
P1.1
➢ 漏极开路双向I/O
P1.2 P1.3
➢ 一般为数据总线口
P1.4
➢ P1:P1.1~P1.7
P1.5 P1.6
➢ 拟双向I/O通道
➢ P2:P2.1~P2.7
P1.7 RST
RXD/P3.0
➢ 拟双向I/O通道
TXD/P3.1 INT0/P3.2
P3口的第二功能表
I/O口
第二功能
注释
2个定时器T0、T1溢3,.0 然后从中间往两R头X逐D 个灭,周而复始 为1时:负边沿触发中断请求;
串行口数据接收端
分别由8位寄存器TH0、TL0 和 TH1、TL1组成。
else return(0);
28
14
27
15
26
16
25
17
24
18
23
19
22
20
21
第10页,共46页。
V CC P0.0/AD 0 P0.1/AD 1 P0.2/AD 2 P0.3/AD 3 P0.4/AD 4 P0.5/AD 5 P0.6/AD 6 P0.7/AD 7 EA/V PP ALE/PROG PSEN P2.7/A 15 P2.6/A 14 P2.5/A 13 P2.4/A 12 P2.3/A 11 P2.2/A 10 P2.1/A 9 P2.0/A 8
(完整版)基于51单片机的电子密码锁毕业设计论文
(完整版)基于51单⽚机的电⼦密码锁毕业设计论⽂⽬录第1章绪论 (1)1.1电⼦锁的发展状况 (1)1.2设计电⼦密码锁的意义及相关技术指标 (1)第2章总体设计及⽅案论证 (2)2.1单⽚机模块 (2)2.2输⼊键盘模块 (2)2.2.1独⽴式按键 (2)2.2.2矩阵式键盘 (3)2.3数码管显⽰模块 (3)2.3.1 LED静态显⽰⽅式 (3)2.3.2 LED动态显⽰⽅式 (3)2.4电源模块 (3)2.4.1蓄电池供电 (3)2.4.2双路电源供电 (3)2.5开锁电路模块 (4)2.6报警电路模块 (4)2.7最优⽅案 (4)第3章硬件电路设计 (4)3.1输⼊键盘 (4)3.2显⽰数码管 (5)3.3开锁电路 (6)3.4报警电路 (6)3.5电源电路 (7)3.6复位电路 (7)3.7振荡电路 (8)第4章软件设计 (9)4.1主程序流程图及程序 (9)4.2延时⼦程序 (11)4.3修改密码⼦程序 (11)4.4扫描键盘输⼊⼦程序 (11)4.5中断及报警⼦程序 (12)4.6显⽰⼦程序 (13)第5章设计总结 (15)参考⽂献 (16)附录Ⅰ (17)附录Ⅱ (18)第1章绪论1.1电⼦锁的发展状况随着科技的发展,传统的机械锁被破解的概率越来越⾼了,新型的盗贼也学会了与时俱进,通过各种技术⽅法和⼿段即会在短时间内开启结构复杂的机械锁,会不留痕迹的登堂⼊室,给失主和警⽅留下各种不易解惑的疑团。
由此我们想到,要是在机械锁的基础上再装上⼀把电⼦锁,就彻底杜绝了单⼀机械锁易被开启的弊端,从⽽极⼤提⾼门锁的安全防范性能。
当今世界,电⼦锁发展已经到了⾮常⾼的境界,由于电⼦元件特别是单⽚机应⽤在最近⼏年得到空前发展,电⼦锁⽆论是在功能还是在稳定性⽅⾯都有了较⼤的提⾼,在保密性⽅⾯已经做到了密码识别、指纹识别、⼈声识别等。
就整体形势⽽⾔,电⼦锁在国外发展⽐较早,所以应⽤也⽐较⼴泛,主要⽤于家庭门锁,银⾏公司等的财务保险柜锁和政府机关及⾼级宾馆等重要场合的智能控制门锁等。
51单片机 电机控制 输入速度 七段数码管显示 汇编程序
51单片机电机控制输入速度七段数码管
显示汇编程序
简介
本文档介绍了使用51单片机控制电机的方法,以及如何通过输入设置速度,并使用七段数码管显示相关信息的汇编程序。
电机控制
在使用51单片机控制电机之前,需要连接合适的电机驱动模块,并将其与单片机进行连接。
通过控制电机驱动模块的引脚,可以实现电机的正转、反转、停止等功能。
输入速度
可以通过外部的输入设备(如按键、旋钮等)来设置电机的速度。
通过读取输入设备的状态,可以在程序中动态地调整电机的速度。
七段数码管显示
可以通过七段数码管来显示相关信息,如电机的速度、转速等。
通过控制七段数码管的引脚,可以实现在数码管上显示相应的数字
或字符。
汇编程序
使用51汇编语言编写程序,通过设置相应的控制寄存器和引
脚状态,可以实现电机的控制和数码管的显示。
汇编程序需要包括
以下几个方面的功能:
- 初始化相关引脚和寄存器
- 读取输入设备的状态
- 根据输入设备的状态设置电机的速度
- 控制电机的正转、反转、停止等操作
- 更新七段数码管显示的内容
总结
本文档介绍了51单片机控制电机的方法,以及通过输入设备
设置速度和使用七段数码管显示信息的汇编程序。
通过合理地编写
汇编程序,可以实现电机的精确控制和相关信息的显示。
以上是本文档的大致内容,希望对您有所帮助。
基于-AT89C51单片机简易计算器的设计
《微机原理与单片机课程设计》课程设计报告基于51单片机的简易计算器设计一、设计目的单片机的出现是计算机制造技术高速发展的产物,它是嵌入式控制系统的核心,如今,它已广泛的应用到我们生活的各个领域,电子、科技、通信、汽车、工业等。
本设计是基于51系列单片机来进行的简单数字计算器设计,可以完成计算器的键盘输入,进行加、减、乘、除六位整数数范围内的基本四则运算,并在LED上显示相应的结果。
软件方面使用C语言编程,并用PROTUES仿真。
二、总体设计及功能介绍根据功能和指标要求,本系统选用MCS-51系列单片机为主控机,实现对计算器的设计。
具体设计及功能如下:(1)由于要设计的是简单的计算器,可以进行四则运算,为了得到较好的显示效果,采用LED 显示数据和结果。
(2)另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,故只需要16 个按键即可,设计中采用集成的计算键盘。
(3)执行过程:开机显示零,等待键入数值,当键入数字,通过LED显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在LED上输出运算结果。
(4)错误提示:当计算器执行过程中有错误时,会在LED上显示相应的提示,如:当输入的数值或计算得到的结果大于计算器的表示范围时,计算器会在LED上显示“CUO”,提示溢出。
三、系统模块组成框图:二、硬件设计(一)、总体硬件设计本设计选用AT89C51单片机为主控单元。
显示部分:采用LED动态显示。
按键部分:采用4*4集成计算键盘;总电路图:(1)4×4集成计算键盘集成计算键盘本质上是4×4矩阵键盘,矩阵键盘采用四条I/O 线作为行线,四条I/O 线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。
这样键盘上按键的个数就为4×4个。
这种行列式键盘结构能有效地提高单片机系统中I/O 口的利用率。
51单片机设计数字温度计(流程图+源码+实物图片)
DS18B20获取温度程序流程图DS18B20的读字节,写字节,获取温度的程序流程图如图所示。
DS18B20初始化程序流程图DS18B20读字节程序流程图DS18B20写字节程序流程图DS18B20获取温度程序流程图图3-4 DS18B20程序流程图显示程序设计显示电路是由四位一体的数码管来实现的。
由于单片机的I/O 口有限,所以数码管采用动态扫描的方式来进行显示。
程序流程图如图所示。
图显示程序流程图按键程序设计按键是用来设定上下限报警温度的。
具体的程序流程图如图所示。
N图按键程序流程图附1 源程序代码/********************************************************************* 程序名; 基于DS18B20的测温系统* 功能:实时测量温度,超过上下限报警,报警温度可手动调整。
K1是用来* 进入上下限调节模式的,当按一下K1进入上限调节模式,再按一下进入下限* 调节模式。
在正常模式下,按一下K2进入查看上限温度模式,显示1s左右自动* 退出;按一下K3进入查看下限温度模式,显示1s左右自动退出;按一下K4消除* 按键音,再按一下启动按键音。
在调节上下限温度模式下,K2是实现加1功能,* K1是实现减1功能,K3是用来设定上下限温度正负的。
* 编程者:ZPZ* 编程时间:2009/10/2*********************************************************************/#include<AT89X52.h> //将AT89X52.h头文件包含到主程序#include<intrins.h> //将intrins.h头文件包含到主程序(调用其中的_nop_()空操作函数延时)#define uint unsigned int //变量类型宏定义,用uint表示无符号整形(16位)#define uchar unsigned char //变量类型宏定义,用uchar表示无符号字符型(8位)uchar max=0x00,min=0x00; //max是上限报警温度,min是下限报警温度bit s=0; //s是调整上下限温度时温度闪烁的标志位,s=0不显示200ms,s=1显示1s左右bit s1=0; //s1标志位用于上下限查看时的显示void display1(uint z); //声明display1()函数#include"ds18b20.h" //将ds18b20.h头文件包含到主程序#include"keyscan.h" //将keyscan.h头文件包含到主程序#include"display.h" //将display.h头文件包含到主程序/***********************主函数************************/void main(){beer=1; //关闭蜂鸣器led=1; //关闭LED灯timer1_init(0); //初始化定时器1(未启动定时器1)get_temperature(1); //首次启动DS18B20获取温度(DS18B20上点后自动将EEPROM中的上下限温度复制到TH和TL寄存器)while(1) //主循环{keyscan(); //按键扫描函数get_temperature(0); //获取温度函数keyscan(); //按键扫描函数display(temp,temp_d*0.625);//显示函数alarm(); //报警函数keyscan(); //按键扫描函数}}/********************************************************************* 程序名; __ds18b20_h__* 功能:DS18B20的c51编程头文件* 编程者:ZPZ* 编程时间:2009/10/2* 说明:用到的全局变量是:无符号字符型变量temp(测得的温度整数部分),temp_d* (测得的温度小数部分),标志位f(测量温度的标志位‘0’表示“正温度”‘1’表* 示“负温度”),标志位f_max(上限温度的标志位‘0’表示“正温度”、‘1’表* 示“负温度”),标志位f_min(下限温度的标志位‘0’表示“正温度”、‘1’表* 示“负温度”),标志位w(报警标志位‘1’启动报警‘0’关闭报警)。
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单片机(四位数码管的显示)程序
51单片机(四位数码管的显示)程序基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管上显示“P_ _ _”4个字符;2)等待按键,如按了任何一个键,则将这4个字符清除,改为显示“0000”4个字符(为数字的0)。
最佳答案下面这个程序是4x4距阵键盘,LED数码管显示,一共可以到0-F显示,你可以稍微改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你!#include<at89x52.h>unsigned char codeDig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1 ,0x86,0x8e}; //gongyang数码管0-F 代码unsigned char k; //设置全局变量k 为键盘的键值/************************************键盘延时函数****************************/void key_delay(void) //延时函数{int t;for(t=0;t<500;t++);}/************************************键盘扫描函数******************************/void keyscan(void) //键盘扫描函数{unsigned char a;P2 = 0xf0; //键盘初始化if(P2!=0xf0) //有键按下?{key_delay(); //延时if(P2!=0xf0) //确认真的有键按下?{P2 = 0xfe; //使行线P2.4为低电平,其余行为高电平key_delay();a = P2; //a作为缓存switch (a) //开始执行行列扫描{case 0xee:k=15;break;case 0xde:k=11;break;case 0xbe:k=7;break;case 0x7e:k=3;break;default:P2 = 0xfd; //使行线P2.5为低电平,其余行为高电平a = P2;switch (a){case 0xed:k=14;break;case 0xdd:k=10;break;case 0xbd:k=6;break;case 0x7d:k=2;break;default:P2 = 0xfb; //使行线P2.6为低电平,其余行为高电平a = P2;switch (a){case 0xeb:k=13;break;case 0xdb:k=9;break;case 0xbb:k=5;break;case 0x7b:k=1;break;default:P2 = 0xf7; //使行线P2.7为低电平,其余行为高电平a = P2;switch (a){case 0xe7:k=12;break;case 0xd7:k=8;break;case 0xb7:k=4;break;case 0x77:k=0;break;default:break;}}}break;}}}}/****************************** ***主函数*************************************/ void main(void){while(1){keyscan(); //调用键盘扫描函数switch(k) //查找按键对应的数码管显示代码{case 0:P0=Dig[0];break;case 1:P0=Dig[1];break;case 2:P0=Dig[2];break;case 3:P0=Dig[3];break;case 4:P0=Dig[4];break;case 5:P0=Dig[5];break;case 6:P0=Dig[6];break;case 7:P0=Dig[7];break;case 8:P0=Dig[8];break;case 9:P0=Dig[9];break;case 10:P0=Dig[10];break;case 11:P0=Dig[11];break;case 12:P0=Dig[12];break;case 13:P0=Dig[13];break;case 14:P0=Dig[14];break;case 15:P0=Dig[15];break;default:break; //退出}}}/**********************************end***************************************/。
51单片机hc595控制一位数码管
/*用hc595控制数码管,显示键盘的值*/#include<reg52.h>#define unchar unsigned char#define unint unsigned intunchar temp,num;sbit scl=P3^6;sbit sda=P3^4;sbit rclk=P3^5; //寄存器时钟unchar code table[]={0x40,0xf9,0x24,0x30,0x99,0x12,0x02,0xf8,0x00,0x10,0xbf,0xb9,0xb6,0}; //数码管编码void delay1()//短延时{;;}void delay(int z) //长延时{int a,b;for(a=0;a<110;a++)for(b=0;b<z;b++);}void init()//初始化{scl=1;sda=1;rclk=0;}void start()//开始条件{scl=1;delay1();sda=1;delay1();sda=0;delay1();}void stop()//停止{scl=1;delay1();sda=0;delay1();sda=1;delay1();}void write(unsigned char temp)//写{int i;start();for(i=0;i<8;i++){scl=0;rclk=0;delay1();sda=(bit)(temp&0x80);delay1();scl=1;delay1();delay1();temp<<=1;} rclk=1;stop();}//键盘扫描unchar scan(){// unchar num,temp;// num=17;P2=0xfd;temp=P2;temp=temp&0xf0;while(temp!=0xf0){P2=0xfd;temp=P2;temp=temp&0xf0;delay(10);while(temp!=0xf0){temp=P2;temp=temp&0xf0;switch(temp){case 0xe0:num=1;break;case 0xd0:num=2;break;case 0xb0:num=3;break;case 0x70:num=4;break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}// display(num-1);}}P2=0xfb;temp=P2;temp=temp&0xf0;while(temp!=0xf0){P2=0xfb;temp=P2;temp=temp&0xf0;delay(10);while(temp!=0xf0){temp=P2;switch(temp){case 0xeb:num=5;break;case 0xdb:num=6;break;case 0xbb:num=7;break;case 0x7b:num=8;break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}//display(num-1);}}P2=0xf7;temp=P2;temp=temp&0xf0;while(temp!=0xf0){P2=0xf7;temp=P2;temp=temp&0xf0;delay(10);while(temp!=0xf0){temp=P2;switch(temp){case 0xe7:num=9;break;case 0xd7:num=10;break;case 0xb7:num=11;break;case 0x77:num=12;break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}// display(num-1);//delay(100);}}return num;}/*void display(unchar num) {P0=table[num-1];delay(10);} */void main()//主函数{init();delay1();while(1)//大循环{write(table[scan()]);}}。