当前位置:文档之家› 51单片机键盘设置

51单片机键盘设置

51单片机键盘设置
51单片机键盘设置

\\\§8.3 键盘接口技术

一、键盘输入应解决的问题

键盘是一组按键的集合,它是最常用的单片机输入设备.

操作人员可以通过键盘输入数据或命令,实现简单的人机通讯。

键是一种常开型按钮开关,平时(常态)键的二个触点处于断开状态,按下键时它们才闭合(短路)。

键盘分编码键盘和非编码键盘。

键盘上闭合键的识别由专用的硬件译码器实现并产生编号或键值的称为编码键盘,

如:ASCⅡ码键盘、BCD码键盘等;

靠软件识别的称为非编码键盘。

在单片机组成的测控系统及智能化仪器中用得最多的是非编码键盘。

本节着重讨论非编码键盘的原理、接口技术和程序设计。

键盘中每个按键都是—个常开关电路,如图所示。

1.按键的确认:P1.7=1 无按键;

P1.7=0 有按键;

2.去抖动

去抖动的方法:

①硬件去抖动采用RS触发器:

优点: 速度快,实时,

缺点: 增加了硬件成本

②软件去抖动采用延时方法

延时5—10ms 延时5—10ms P1.7=0 确认P1.7=0 P1.7=1 (去前沿抖动) (去后沿抖动)

二、独立式键盘

每个I/O口连接一个按,S1 P1.0

S2 P1.1

……………………….

S8 P1.7

软件:

START:MOV P1,#0FFH ;置P1口为高电平

JNB P1.0, RS1 ; S1按下,程序去执行RS1

JNB P1.1, RS2 ; S2按下,程序去执行RS2

JNB P1.2, RS3 ; S3按下,程序去执行RS3

JNB P1.3, RS4 ; S4按下,程序去执行RS4

JNB P1.4, RS5 ; S5按下,程序去执行RS5

JNB P1.5, RS6 ; S6按下,程序去执行RS6

JNB P1.6, RS7 ; S7按下,程序去执行RS7

JNB P1.7, RS8 ; S8按下,程序去执行RS8

AJMP START ; 继续扫描按键

………….

RS1: AJMP PK1 ;

RS2: AJMP PK2 ;

RS3: AJMP PK3 ;

RS4: AJMP PK4 ;

RS5: AJMP PK5 ;

RS6: AJMP PK6 ;

RS7: AJMP PK7 ;

RS8: AJMP PK8 ;

AJMP START ; 无键按下,继续扫描…………………

PK1: ……….. ;按键S1功能处理程序

AJMP START ;处理S1按键后, 继续扫描PK2: ……….. ;按键S2功能处理程序

AJMP START

………………….

PK8: ………………;按键S8功能处理程序

AJMP START ; 处理S8按键后, 继续扫描优点: 连线简单,程序容易.

缺点: 太浪费资源

适用于按键较少、I/O口空闲的场合。

三、行列式非编码键盘接口方法

按键较多时,一般采用行列式键盘.

采用扫描方式,软件扫描方式有三种:

程序扫描方式: 当CPU空闲时,扫描键盘,判断有无键按下.

定时扫描方式: 利用CPU的定时器,每隔一定时间扫描一次键盘.

中断扫描方式: 在硬件上采用中断,有键按下时,产生中断,

由中断服务程序来处理.

下面是16个按键,构成的4×4键盘

行线: 四根,接P1.0---P1.3

列线: 四根,接P1.4---P1.7

程序扫描法原理:

①P1.0---P1.3输出低电平,读P1.4—P1.7,

若全为1,无键按下

若不全为1,有键按下

②在有键按下的情况下,进一步判断是那个键按下

使P1.0---P1.3依次输出低电平,读P1.4----P1.7

判断有无键按下子程序, 程序名: KAP键盘查询子程序

KAP: MOV P1,#0F0H ;行线输出低电平,列线输出高电平

MOV A,P1 ;P1口读入A

CPL A ;取反

ANL A,#0F0H ;取高四位,即P1.4---P1.7

RET

程序出口: A=0, 则无键按下.

A≠0 则有键按下.

去抖动-----------延时10ms子程序: 程序名D10MS

D10MS: MOV R6, #14H;

DL: MOV R7,#0FFH;

DJNZ R7,$

DJNZ R6,DL

RET

KINP: LCALL KAP ; 调键盘查询子程序,

JNZ KP1 ; A≠0,有键按下

SJMP END_KINP ; A=0,无键按下,退出按键查询程序

KP1: LCALL D10MS ;延时10MS,去抖动

LCALL KAP ;再次查询键盘,

JNZ KP2 ; A≠0,确认有键按下

SJMP END_KINP ; A=0,误操作,重新查询

KP2为取键值子程序

KP2: MOV R2, #0FEH ; R2为行扫描值

MOV R4, #00H ; R4初值为第0行行首键号

CLR F0 ; F0=0表示正在扫描键盘

KP4: MOV P1, R2 ; 扫描行为低

MOV A, P1 ;读P1

JB ACC.4, L1 ;第0列不为低,则检查第1列

MOV A, #00H ; 为低,则行首键值送入A

AJMP KP5 ; KP5

L1: JB ACC.5, L2 ; 检查第一列

MOV A, #04H ;第一列行首键值送入A

AJMP KP5

L2: JB ACC.6 , L3 ; 检查第二列

MOV A, #08H ;第二列行首键值送入A

AJMP KP5

L3: JB ACC.7 , NEXT ;检查第三列,若为1,则检查下一行

MOV A, #0CH ; 第三列行首键值送入A

KP5: ADD A , R4 ; A A+R4,键值调整PUSH A ;

KP3: LCALL D10MS ; 后沿去抖动

LCALL KAP ;查询按键是否释放

JNZ KP3 ; A≠0 未释放,继续查询

POP A ;键已释放,弹出键值

RET

NEXT: INC R4 ; 下一列,行键值加1

MOV A , R2 ; 取扫描值

JNB ACC.3, END_KINP ; 判断扫描是否结束?

RL A ; 下一个扫描值

MOV R2, A ;

AJMP KP4 ;

END_KINP: SETB F0

RET

51单片机电子日历(电子时钟)程序

2007-08-03 21:01:05| 分类:默认分类|字号订阅

程序代码:

/****************************************************************************/

/* 电子日历,有时间显示、闹铃、日期、秒表及键盘设置功能*/

/* 功能键A: 设置位数字+1 闹钟模式下为闹钟开关秒表模式下为记时开关*/ /* 功能键B: 设置位数字-1 闹钟模式下为闹钟开关*/

/* 功能键C:设置模式及设置位选择秒表模式下为清零

键*/

/* 功能键D:在四种工作模式下切换设置闹钟开关*/

/****************************************************************************/

#include

#include

/***************这里设置程序初始化时显示的时间****************/

#define SET_HOUR 12 /*设置初始化小时*/

#define SET_MINUTE 00 /*设置初始化分钟*/

#define SET_SECOND 00 /*设置初始化秒数*/

/*************************系统地址****************************/

#define BASE_PORT 0x8000 /*选通基地址*/

#define KEY_LINE BASE_PORT+1 /*键盘行线地址*/

#define KEY_COLUMN BASE_PORT+2 /*键盘列线地址*/

#define LED_SEG BASE_PORT+4 /*数码管段选地址*/

#define LED_BIT BASE_PORT+2 /*数码管位选地址*/

#define LED_ON(x) XBYTE[LED_BIT]=(0x01< #define LED_OFF XBYTE[LED_SEG]=0x00 /*LED显示空*/

/**************在设置模式下对秒分时的宏定义*****************/

#define SECOND 0 /*对应数码管右边两位*/

#define MINUTE 1 /*对应数码管中间两位*/

#define HOUR 2 /*对应数码管左边两位*/

/********************定义四种工作模式***********************/

#define CLOCK clockstr /*时钟模式*/

#define ALART alartstr /*闹钟模式*/

#define DATE datestr /*日期模式*/

#define TIMER timerstr /*秒表模式*/

/****************以下是所有子函数的声明*********************/

void sys_init(void); /*系统的初始化程序*/

void display(void); /*动态刷新一次数码管子程序*/

void clockplus(void); /*时间加1S的子程序*/

void update_clockstr(void); /*更新时间显示编码*/

void update_alartstr(void); /*更新闹钟时间的显示编码*/

void update_datestr(void); /*更新日期显示编码*/

void update_timerstr(void); /*更新秒表时间的显示编码*/

void deley(int); /*延时子程序*/

void update_dispbuf(unsigned char *); /*更新显示缓冲区*/

unsigned char getkeycode(void); /*获取键值子程序*/

void keyprocess(unsigned char); /*键值处理子程序*/

unsigned char getmonthdays(unsigned int,unsigned char);/*计算某月的天数子程序*/ /*功能键功能子函数*/

void Akey(void); /*当前设置位+1 开关闹钟开关秒表*/

void Bkey(void); /*当前设置位-1 开关闹钟*/

void Ckey(void); /*设置位选择秒表清零*/

void Dkey(void); /*切换四种工作模式*/

/**********************全局变量声明部分*********************/

unsigned char led[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};/*从0~9的LED编码*/

unsigned char ledchar[3]={0x5c,0x54,0x71};/*o n f*/

//unsigned char key[24]={ /* 键值代码数组对应键位:*/

// 0x70,0x71,0x72,0x73,0x74,0x75, /* 7 8 9 A TRACE RESET*/

// 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5, /* 4 5 6 B STEP MON */

// 0xd0,0xd1,0xd2,0xd3,0xd4,0xd5, /* 1 2 3 C HERE LAST */

// 0xe0,0xe1,0xe2,0xe3,0xe4,0xe5}; /* 0 F E D EXEC NEXT */

struct{ /*时间结构体变量*/

unsigned char s;

unsigned char m;

unsigned char h;

}clock={SET_SECOND,SET_MINUTE,SET_HOUR};

struct{ /*闹铃时间结构体变量*/

unsigned char m;

unsigned char h;

}alart={SET_MINUTE,SET_HOUR};

struct{ /*日期结构体变量*/

unsigned int year;

unsigned char month;

unsigned char day;

}date={6,1,1};

struct{ /*秒表时间结构体变量*/

unsigned char ms;

unsigned char s;

unsigned char m;

}timer={0,0,0};

unsigned char dispbuf[6]; /*显示缓冲区数组*/

unsigned char clockstr[6]; /*时间显示的数码管编码数组*/

unsigned char alartstr[6]; /*闹钟显示的数码管编码数组*/

unsigned char datestr[6]; /*日期显示的数码管编码数组*/

unsigned char timerstr[6]; /*秒表显示的数码管编码数组*/

unsigned int itime=0,idot; /*定时器0中断计数*/

unsigned char itime1=0; /*定时器1中断计数*/

sbit P3_1=P3^1; /*外接蜂鸣器的管脚*/

bdata bit IsSet=0; /*设置模式标志位0:正常走时1:设置模式*/

bdata bit Alart_EN=0; /*闹铃功能允许位0:禁止闹铃1:允许闹铃*/

bdata bit IsBeep=0; /*响铃标志位0:未响铃1:正在响铃*/

unsigned char SetSelect=0; /*在设置模式IsSet=1时,正在被设置的位,对应上面的宏*/

unsigned char *CurrentMode; /*标志当前正设置的功能,如CurrentMode=CLOCK或CurrentMode=ALART等*/

void timerplus(void);

/**************************函数部分*************************/

void main(void)

{

sys_init();

while(1)

{

XBYTE[KEY_COLUMN,0x00]; /*给键盘列线赋全零扫描码,判断是否有键按下*/

while((XBYTE[KEY_LINE]&0x0f)==0x0f) /*检测是否有键按下,无则一直进行LED 的刷新显示*/

{

if(Alart_EN&&(clock.h==alart.h)&&(clock.m==alart.m)) {IsBeep=1;}

else

{ IsBeep=0;

P3_1=0;}

display();

}

keyprocess(getkeycode()); /*有键按下时得到键值,并送入键值处理程序*/

display(); /*可要可不要*/

}

}

void sys_init(void)

{

TMOD=0x22; /*定时器0和1都设置为工作方式2,基准定时250×2=500us=0.5ms*/

TH0=6; /*定时器0中断服务用来产生1秒时钟定时及闹钟蜂鸣器蜂鸣脉冲*/

TL0=6; /*定时器1中断服务留给秒表使用,产生1/100秒定时*/

TH1=6;

TL1=6;

ET0=1;

ET1=1;

EA=1;

TR0=1;

update_clockstr(); /*初始化时钟显示编码数组*/

update_alartstr(); /*初始化闹钟显示编码数组*/

update_datestr(); /*初始化日期显示编码数组*/

update_timerstr(); /*初始化秒表显示编码数组*/

update_dispbuf(clockstr);/*初始化显示缓冲数组*/

CurrentMode=CLOCK; /*默认的显示摸式为时钟*/

P3_1=0; /*蜂鸣器接线引脚复位*/

}

void timer0(void) interrupt 1 using 1 /*定时器0中断服务器,用来产生1秒定时*/

{

itime++;

if(itime==1000)

{

if(IsSet) /*在设置模式下,对正在设置的位闪烁显示*/

{

dispbuf[SetSelect*2]=0; /*对正在设置的位所对应的显示缓冲区元素赋0,使LED灭*/

dispbuf[SetSelect*2+1]=0;

}

if(IsBeep) P3_1=!P3_1; /*闹钟模式时,产生峰鸣器响脉冲*/

if(CurrentMode==CLOCK)

{

dispbuf[2]=dispbuf[2]&0x7f;

dispbuf[4]=dispbuf[4]&0x7f;

}

}

if(itime==2000) /*两千次计数为1S 2000×0.5ms=1s*/

{

itime=0; /*定时1s时间到,软计数清零*/

clockplus(); /*时间结构体变量秒数加1 */

update_clockstr(); /* 更新时间显示编码数组*/

if(CurrentMode!=TIMER) update_dispbuf(CurrentMode); /* 用时间编码数组更新显示缓冲区*/

}

}

void timer1(void) interrupt 3 using 2 /*定时器1中断服务器,用来产生1/100秒定时*/

{

idot++;

if(++itime1==20) /*20*0.5ms=10ms*/

{

itime1=0;

timerplus();

update_timerstr();

if(CurrentMode==TIMER)

{

update_dispbuf(timerstr);

dispbuf[2]=dispbuf[2]&0x7f; /*关闭小数点的显示*/

dispbuf[4]=dispbuf[4]&0x7f;

if(idot<1000) /*闪烁显示小数点*/

{

dispbuf[2]=dispbuf[2]|0x80;

dispbuf[4]=dispbuf[4]|0x80;

}else{

dispbuf[2]=dispbuf[2]&0x7f;

dispbuf[4]=dispbuf[4]&0x7f;

}

}

}

if(idot==2000) idot=0;

}

/*功能模块子函数*/

void clockplus(void) /*时间加1s判断分,时子函数*/

{

if(++clock.s==60) /*秒位判断*/

{

clock.s=0;

if(++clock.m==60) /*分位判断*/

{

clock.m=0;

if(++clock.h==24) /*时位判断*/

{

clock.h=0;

if(++date.day==(getmonthdays(date.year,date.month)+1))

{

date.day=1;

if(++date.month==13) date.month=1;

}

}

}

}

}

void timerplus() /*秒表1/100秒位加1,判断秒、分子程序*/ {

if(++timer.ms==100)

{

timer.ms=0;

if(++timer.s==60)

{

timer.s=0;

if(++timer.m==60)

{

timer.m=0;

}

}

}

}

void update_clockstr(void) /*更新时钟显示代码数组clockstr*/

{

clockstr[0]=led[clock.s%10]; /*给元素0赋相应数码管显示编码,编码序号是秒数的个位*/

clockstr[1]=led[(int)(clock.s/10)]; /*给元素1赋相应数码管显示编码,编码序号是秒数的十位*/

clockstr[2]=led[clock.m%10]; /*以下类推*/

clockstr[3]=led[(int)(clock.m/10)];

clockstr[4]=led[clock.h%10];

clockstr[5]=led[(int)(clock.h/10)];

}

void update_alartstr(void) /*更新闹钟显示代码数组alartstr*/

{ /*右边两位显示on:闹钟开启of:闹钟关闭*/

if(Alart_EN) alartstr[0]=ledchar[1];/*显示字母n*/

else alartstr[0]=ledchar[2]; /*显示字母f*/

alartstr[1]=ledchar[0]; /*显示字母o*/

alartstr[2]=led[alart.m%10];

alartstr[3]=led[(int)(alart.m/10)];

alartstr[4]=led[alart.h%10];

alartstr[5]=led[(int)(alart.h/10)];

}

void update_datestr(void) /*更新日期显示代码数组datestr*/

{

datestr[0]=led[date.day%10];

datestr[1]=led[(int)(date.day/10)];

datestr[2]=led[date.month%10];

datestr[3]=led[(int)(date.month/10)];

datestr[4]=led[date.year%10];

datestr[5]=led[(int)(date.year/10)];

}

void update_timerstr(void) /*更新秒表显示代码数组timerstr*/

{

timerstr[0]=led[timer.ms%10];

timerstr[1]=led[(int)(timer.ms/10)];

timerstr[2]=led[timer.s%10];

timerstr[3]=led[(int)(timer.s/10)];

timerstr[4]=led[timer.m%10];

timerstr[5]=led[(int)(timer.m/10)];

}

void display(void) /*刷新显示六位LED一次*/

{

unsigned char i;

for(i=0;i<6;i++)

{

LED_ON(i); /*选通相应位*/

XBYTE[LED_SEG]=dispbuf[i]; /*写显示段码*/

deley(50); /*延时显示*/

LED_OFF; /*写LED全灭段码*/

}

}

void update_dispbuf(unsigned char *str) /*更新显示缓冲区子函数,参数为要用来更新缓冲区的源字符数组的首地址*/

{

dispbuf[0]=str[0]; /*将要更新的源字符数组内容COPY至dispbuf数组,用作显示缓冲区*/

dispbuf[1]=str[1];

dispbuf[2]=str[2]|0x80; /*默认把时位和分位后面的小数点显示出来,根据需要再取舍*/

dispbuf[3]=str[3];

dispbuf[4]=str[4]|0x80;

dispbuf[5]=str[5];

}

void deley(int i) /*延时子函数*/

{

while(i--);

}

unsigned char getkeycode(void) /*键盘扫描子程序,返回获得的键码*/

{

unsigned char keycode; /*键码变量,一开始存行码*/

unsigned char scancode=0x20; /*列扫描码*/

unsigned char icolumn=0; /*键的列号*/

display(); /*用刷新数码管显示的时间去抖*/

XBYTE[KEY_COLUMN]=0x00;

keycode=XBYTE[KEY_LINE]&0x0f; /*从行端口读入四位行码*/

while((scancode&0x3f)!=0) /*取scancode的低六位,只要没变为全0,则执行循环*/

{

XBYTE[KEY_COLUMN]=(~scancode)&0x3f; /*给列赋扫描码,第一次为011111*/ if((XBYTE[KEY_LINE]&0x0f)==keycode) break; /*检测按键所在的列跳出循环*/ scancode=scancode>>1; /*列扫描码右移一位*/

icolumn++; /*列号加1*/

}

keycode=keycode<<4; /*把行码移到高四位*/

基于51单片机的USB键盘设计与实现

三江学院 本科生毕业设计(论文)题目基于51单片机的USB键盘设计与实现高职院院(系)电气工程及其自动化专业 学生姓名梁邱一学号 G105071013 指导教师孙传峰职称讲师 指导教师工作单位三江学院 起讫日期 2013年12月10日至2014年4月12日

摘要 随着计算机技术的不断更新和多媒体技术的快速发展,传统的计算机外设接口因为存在许多缺点已经不能适应计算机的发展需要。比起传统的AT,PS/2,串口,通用串行总线USB,具有速度快,使用方便灵活,易于扩展,支持即插即用,成本低廉等一系列优点,得到了广泛的应用。 本论文阐述了51系列单片机和USB的相关内容,详细介绍了系统的一些功能设计,包括硬件设计和软件设计。在程序调试期间用简单的串口通信电路,通过串口调试助手掌握了USB指令的传输过程,这对整个方案的设计起到了很大的指导作用。论文以单片机最小系统配合模拟键盘组成的USB键盘硬件系统,通过对D12芯片的学习与探索,在其基本命令接口的支持下,结合硬件进行相应的固件程序设计,使其在USB协议下,实现USB模块与PC的数据通信,完成USB键盘的功能模拟。 总结论文研究工作有阐述USB总线的原理、对本设计的系统要求作出了分析、根据要求选定元件和具体编程方案、针对系统所要实现的功能对相关芯片作了详细介绍以及在硬件部分设计了原理图。 关键词:USB;D12;PC

Abstract With the rapid development of computer technology and multimedia technology constantly updated, traditional computer peripheral interface because there are many shortcomings have been unable to meet the development needs of the https://www.doczj.com/doc/3e938434.html,pared to traditional AT, PS / 2, serial, Universal Serial Bus USB, with fast, flexible and easy to use, easy to expand, support Plug and Play, a series of advantages, such as low cost, has been widely used. This paper describes the 51 series and USB related content, detailing some of the features of the system design, including hardware and software design.During debugging a simple serial communication circuit, through the serial port debugging assistant master USB transfer instructions, which designed the entire program has played a significant role in guiding.Thesis smallest single-chip system consisting of analog keyboard with a USB keyboard hardware system, by learning and exploration D12 chips, with the support of its basic command interface, in conjunction with the corresponding hardware firmware design, making it in the USB protocol, USB module data communication with the PC, the USB keyboard to complete the functional simulation. This paper summarizes research work has elaborated the principle of the USB bus, the system is designed to require the analysis, components and solutions based on the specific requirements of the selected programming for the system to achieve the function of the relevant chips are described in detail in the hardware part of the design as well as the principle of Figure. Keywords:USB;D12;PC

C51单片机和电脑串口通信电路图

C51单片机和电脑串口通信电路图与源码 51单片机有一个全双工的串行通讯口,所以单片机和电脑之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如电脑的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。我们采用了三线制连接串口,也就是说和电脑的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。 串口通讯的硬件电路如上图所示 在制作电路前我们先来看看要用的MAX232,这里我们不去具体讨论它,只要知道它是TTL和RS232电平相互转换的芯片和基本的引脚接线功能就行了。通常我会用两个小功率晶体管加少量的电路去替换MAX232,可以省一点,效果也不错,下图就是MAX232的基本接线图。

按图7-3加上MAX232就可以了。这大热天的拿烙铁焊焊,还真的是热气迫人来呀:P串口座用DB9的母头,这样就可以用买来的PC串口延长线进行和电脑相连接,也可以直接接到电脑com口上。

为了能够在电脑端看到单片机发出的数据,我们必须借助一个WINDOWS软件进行观察,这里我们利用一个免费的电脑串口调试软件。本串口软件在本网站https://www.doczj.com/doc/3e938434.html,可以找到 软件界面如上图,我们先要设置一下串口通讯的参数,将波特率调整为4800,勾选十六进制显示。串口选择为COM1,当然将网站提供的51单片机实验板的串口也要和电脑的COM1连接,将烧写有以下程序的单片机插入单片机实验板的万能插座中,并接通51单片机实验板的电源。

矩阵键盘设计实验报告

南京林业大学 实验报告 基于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。 7、检查验证结果。 六、实验具体内容 使用单片机的P1口与矩阵式键盘连接时,可以将P1口低4位的4条端口线定义为行线,P1口高4位的4条端口线定义为列线,形成4*4键盘,可以配置16个按键,将单片机P2口与七段数码管连接,当按下矩阵键盘任意键时,数码管显示该键所在的键号。 1、电路图

单片机电路图详解

单片机:交通灯课程设计(一) 目录 摘要--------------------------------------------------------- 1 1.概述 -------------------------------------------------------- 2 2.硬件设计----------------------------------------------------- 3 2.1单片机及其外围--------------------------------------------3 2.1.1单片机的选择-----------------------------------------3 2.1.2单片机的特点及其应用范围----------------------------- 3 2.1.3存储器的扩展----------------------------------------- 4 2.1.4内存的扩展------------------------------------------- 6 2.1.5MCS-52的I/O接口扩展--------------------------------- 8 2.2电路部分--------------------------------------------------11 2.2.1元器件选用-------------------------------------------11 2.2.2电路完成功能-----------------------------------------13 3.软件设计------------------------------------------------------15 3.1软件概述-------------------------------------------------15 3.2汇编语言指令说明-----------------------------------------16 3.3定时/计数器的原理----------------------------------------16 3.3.1定时/计数器的概述-----------------------------------16 3.3.2 8255A片选及各端口地址-------------------------------18 3.3.3信号控制码------------------------------------------18 3.3.4工作方式寄存器--------------------------------------19 3.3.5定时/计数器初值及定时器T0的工作方式----------------20

基于51单片机的PS2键盘的单片机编程

PS2键盘的单片机编程 在单片机系统中,经常使用的键盘都是专用键盘.此类键盘为单独设计制作的,成本高、使用硬件连接线多,且可靠性不高,这一状况在那些要求键盘按键较多的应用系统中更为突出.与此相比,在PC系统中广泛使用PS/2键盘具有价格低、通用可靠,且使用连接线少(仅使用2根信号线)的特点,并可满足多种系统的要求.因此在单片机系统中应用PS/2键盘是一种很好的选择. 文中在介绍PS/2协议和PS/2键盘工作原理与特点的基础上,给出了一个在单片机上实现对PS/2键盘支持的硬件连接与驱动程序设计实现.该设计实现了在单 片机系统中对PS/2标准104键盘按键输入的支持.使用Keil C51开发的驱动程序接口和库函数可以方便地移植到其他单片机或嵌入式系统中.所有程序在 Keil uVision2上编译通过,在单片机AT89C51上测试通过. 1 PS/2协议 目前,PC机广泛采用的PS/2接口为mini-DIN 6pin的连接器,如图1所示. PS/2设备有主从之分,主设备采用Female插座,从设备采用Male插头.现在广泛使用的PS/2键盘鼠标均在从设备方式下工作.PS/2接口的时钟 与数据线都是集电极开路结构,必须外接上拉电阻(一般上拉电阻设置在主设备中).主从设备之间数据通信采用双向同步串行方式传输,时钟信号由从设备产生. 1.1 从设备到主设备的通信 当从设备向主设备发送数据时,首先检查时钟线,以确认时钟线是否为高电平.如果是高电平,从设备就可以开始传输数据;反之,从设备要等待获得总线的控制权,才能开始传输数据.传输的每一帧由11位组成,发送时序及每一位的含义如图2 所示. 每一帧数据中开始位总是为0,数据校验采用奇校验方式,停止位始终为1.从设 备到主设备通信时,从设备总是在时钟线为高时改变数据线状态,主设备在时钟 下降沿读人数据线状态.

51单片机独立按键程序查询法和外部中断两种

//以下程序都是在VC++6.0 上调试运行过的程序,没有错误,没有警告。 //单片机是STC89C52RC,但是在所有的51 52单片机上都是通用的。51只是一个学习的基础平台,你懂得。 //程序在关键的位置添加了注释。 //用//11111111111111111代表第一个程序。//2222222222222222222222222代表第二个程序,以此类推 //1111111111111111111111111111111111111111111111111111111111111111111 //1111111111111111111111111111111111111111111111111111111111111111111 /****************************************************************************** * * 实验名: 左右流水灯实验 * 使用的IO : LED使用P2,键盘使用P3.1 * 实验效果: 按下K1键, * 注意: ******************************************************************************* / #include #include #define GPIO_LED P2 sbit K1=P3^1; void Delay10ms( ); //延时10ms /****************************************************************************** * * 函数名: main * 函数功能: 主函数 * 输入: 无 * 输出: 无 ******************************************************************************* / void main(void) { unsigned int i,j; j=0xfe; //1111_1110 while(1) { GPIO_LED=j; if(K1==0) //检测按键K1是否按下 { Delay10ms(); //消除抖动 if(K1==0) {

51单片机矩阵键盘设计

湖南工业大学 课程设计 资料袋 电气与信息工程学院(系、部)2009--2010 学年第 1 学期课程名称单片机应用系统指导教师贺正芸 学生姓名专业班级电子信息科学与技术学号 题目4*4矩阵键盘 成绩起止日期2009 年11 月23 日~2009 年12 月04 日 目录清单 序号材料名称资料数量备注 1 课程设计任务书 2 课程设计说明书 3 课程设计图纸张 4 5 6

湖南工业大学 课程设计任务书 2009 —2010 学年第 1 学期 电气与信息工程学院(系、部)电子信息科学与技术专业班级 课程名称:单片机应用系统 设计题目:4*4矩阵键盘 完成期限:自2009 年11 月9 日至2009 年11 月20 日共 2 周 内容及任务 由P1.0—P1.3(列)和P1.4—P1.7(行)组成4*4矩阵键盘,P0口接LED静态显示电路。由于P0口内部无上拉电阻,因此必须外部接上上拉电阻,其阻值的选择可以根据LED 数码管发光电流及其亮度来决定,参考值为560欧姆。编写4*4键盘的驱动程序。 编写主程序,当按键按下时,能够在数码管显示器与按键的键值对应的数字。 进度安排 起止日期工作内容2009.11.23-2009.11.24 设计内容及基本原理 2009.11.25-2009.11.27 进行系统的软件设计,2009.11.28-2009.12.04 进行系统的硬件设计 主 要 参 考 资 料 [1] 欧伟明.单片机原理与应用. 电子工业出版社,2009年 指导教师(签字):年月日系(教研室)主任(签字):年月日

单片机应用系统 4*4矩阵键盘设计说明书 学生姓名 班级电科072 学号 成绩 指导教师(签字) 起止日期:2009 年11 月23 日至2009 年12 月4 日 电气与信息工程学院(部)

51单片机AD89电路设计程序+原理图

AD0809在51单片机中的应用 我们在做一个单片机系统时,常常会遇到这样那样的数据采集,在这些被采集的数据中,大部分可以通过我们的I/O口扩展接口电路直接得到,由于51单片机大部分不带AD转换器,所以模拟量的采集就必须靠A/D或V/F实现。下现我们就来了解一下AD0809与51单片机的接口及其程序设计。 1、AD0809的逻辑结构 ADC0809是8位逐次逼近型A/D转换器。它由一个8路模拟开关、一个地址锁存译码器、一个A/D转换器和一个三态输出锁存器组成(见图1)。多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。三态输出锁器用于锁存A/D转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据。

2、AD0809的工作原理 IN0-IN7:8条模拟量输入通道 ADC0809对输入模拟量要求:信号单极性,电压围是0-5V,若信号太小,必须进行放大;输入的模拟量在转换过程中应该保持不变,如若模拟量变化太快,则需在输入前增加采样保持电路。 地址输入和控制线:4条 ALE为地址锁存允许输入线,高电平有效。当ALE线为高电平时,地址锁存与译码器将A,B,C三条地址线的地址信号进行锁存,经译码后被选中的通道

的模拟量进转换器进行转换。A,B和C为地址输入线,用于选通IN0-IN7上的一路模拟量输入。通道选择表如下表所示。 C B A 选择的通道 0 0 0 IN0 0 0 1 IN1 0 1 0 IN2 0 1 1 IN3 1 0 0 IN4 1 0 1 IN5 1 1 0 IN6 1 1 1 IN7 数字量输出及控制线:11条 ST为转换启动信号。当ST上跳沿时,所有部寄存器清零;下跳沿时,开始进行A/D转换;在转换期间,ST应保持低电平。EOC为转换结束信号。当EOC为高电平时,表明转换结束;否则,表明正在进行A/D转换。OE为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。OE=1,输出转换得到的数据;OE=0,输出数据线呈高阻状态。D7-D0为数字量输出线。 CLK为时钟输入信号线。因ADC0809的部没有时钟电路,所需时钟信号必须由外界提供,通常使用频率为500KHZ, VREF(+),VREF(-)为参考电压输入。

单片机设计矩阵键盘电子琴

课程设计任务书 课程名称单片机原理及应用课程设计 1.课程设计应达到的目的 本课程是继《单片机原理及应用B》课程之后,训练学生综合运用上述课程知识,进行单片机软件、硬件系统设计与调试,使学生加深对单片机结构、工作原理的理解,提高学生综合应用知识的能力、分析解决问题的能力和单片机最小应用系统的设计技能。通过课程设计,达到理论与实际应用相结合,增强学生对综合电子系统设计的理解,掌握单片机原理就应用的设计方法以及C51编程的能力,并能够在这个基础上进行实际项目的程序设计及软硬件调试,增强学生的工程实践能力。 2.课程设计题目及要求

带存储播放功能的简易电子琴设计 要求:利用行列式键盘和数码管,来控制并显示和产生不同频率的声音。其他扩展功能学生可自己添加,功能不限定与此。 3.课程设计任务及工作量的要求〔包括课程设计计算说明书、图纸、实物样品等要求〕(1)了解相关理论知识,掌握基本的原理,理解相关特殊功能寄存器的设置。 (2)完成电路板的组装 (3)完成硬件电路的测试、以及软件的编程 (4)最终完成具体的课设任务。 4.主要参考文献 1.张洪润等.单片机应用设计200例.北京:北京航空航天大学出版社,2006 2. 胡汉才.单片机原理及其接口技术. 北京:清华大学出版社,2010 3.夏继强等.单片机实验与实践教程.北京:北京航空航天大学出版社,2006 4. 倪晓军等.单片机原理与接口技术教程.北京:清华大学出版社,2007 5(1)硬件方面:单片机。4*4行列式键盘,蜂鸣器,独立数码管,独立建。硬件部分采用逐列扫描,16个键位对应16个音,不断检测16键位,当某个键位被按下,先检测哪一列再检测哪个按键被按下,同时设置四个功能键,p1.0,p1.1播放歌曲,p1.2暂停,p1.3复位,可控制歌曲的播放。 插入图片 (2)音乐频率 一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。单片机12MHZ晶振,高中低音符与单片机计数T0相关的计数值如下表所示: 音符频率简码值(T值) 低3 M 330 64021 低4 FA 349 64103 低5 SO 392 64260 低6 LA 440 64400 低7 SI 494 64524 中 1 DO 523 64580 中 2 RE 587 64684 中 3 M 659 64777 中 4 FA 698 64820 中 5 SO 784 64898 中 6 LA 880 64968

51单片机的若干电路原理图

51单片机的若干电路原理图 单片机 2007-10-23 20:36:31 阅读198 评论0 字号:大中小订阅 利用下面这些原理图,就可以自己动手做个简单的实验板啦~~~~ 1 外接电源供电电路及电源指示灯 在单片机实训板上为系统设计了一个外接电源供电电路,这个电源电路具备两种电源供电方式:一种是直接采用PC的USB接口5V直流电源给实训板供电,然后在电源电路中加入一个500mA电流限制的自恢复保险丝给PC的USB电源提供了保护的作用;另一种是采用小型直流稳压电源供电,输出的9V直流电源加入到电源电路中,通过LM7805稳压芯片的降压作用,给实训板提供工作所需的5V电源。 如图2.4所示为采用LM7805稳压芯片进行降压供电的电源电路。 图2.4 外接电源供电电路 同时,为了显示外接电源给实训板提供了电源,在系统中增加了电源指示灯电路,如图2.5。 发光二极管工作在正常工作状态时,流过LED的电流只需要5~10mA左右就行,在电路中采用白发红高亮LED,所以可以取5mA左右

的电流值,通过计算,可知:连接LED的限流电阻的阻值可以采用680Ω。 图2.5 电源指示灯电路 2 系统复位电路 复位是单片机的初始化操作,只要给RESET引脚加上2个机器周期以上的高电平信号,即可使单片机复位。除了进入系统的正常初始化之外,当程序运行出错或是操作错误使系统处于死锁状态时,为了摆脱死锁状态,也需要按复位键重新复位。 在系统中,为了实现上述的两项功能,采用常用的按键电平复位电路,如图2.6所示。 2.6 按键电平复位电路 从途中可以看出,当系统得到工作电压的时候,复位电路工作在上电自动复位状态,通过外部复位电路的电容充电来实现,只要Vcc

51单片机键盘设置

\\\§8.3 键盘接口技术 一、键盘输入应解决的问题 键盘是一组按键的集合,它是最常用的单片机输入设备. 操作人员可以通过键盘输入数据或命令,实现简单的人机通讯。 键是一种常开型按钮开关,平时(常态)键的二个触点处于断开状态,按下键时它们才闭合(短路)。 键盘分编码键盘和非编码键盘。 键盘上闭合键的识别由专用的硬件译码器实现并产生编号或键值的称为编码键盘, 如:ASCⅡ码键盘、BCD码键盘等; 靠软件识别的称为非编码键盘。 在单片机组成的测控系统及智能化仪器中用得最多的是非编码键盘。 本节着重讨论非编码键盘的原理、接口技术和程序设计。 键盘中每个按键都是—个常开关电路,如图所示。

1.按键的确认:P1.7=1 无按键; P1.7=0 有按键; 2.去抖动 去抖动的方法: ①硬件去抖动采用RS触发器: 优点: 速度快,实时, 缺点: 增加了硬件成本 ②软件去抖动采用延时方法 延时5—10ms 延时5—10ms P1.7=0 确认P1.7=0 P1.7=1 (去前沿抖动) (去后沿抖动) 二、独立式键盘

每个I/O口连接一个按,S1 P1.0 S2 P1.1 ………………………. S8 P1.7 软件: START:MOV P1,#0FFH ;置P1口为高电平 JNB P1.0, RS1 ; S1按下,程序去执行RS1 JNB P1.1, RS2 ; S2按下,程序去执行RS2

JNB P1.2, RS3 ; S3按下,程序去执行RS3 JNB P1.3, RS4 ; S4按下,程序去执行RS4 JNB P1.4, RS5 ; S5按下,程序去执行RS5 JNB P1.5, RS6 ; S6按下,程序去执行RS6 JNB P1.6, RS7 ; S7按下,程序去执行RS7 JNB P1.7, RS8 ; S8按下,程序去执行RS8 AJMP START ; 继续扫描按键 …………. RS1: AJMP PK1 ; RS2: AJMP PK2 ; RS3: AJMP PK3 ; RS4: AJMP PK4 ; RS5: AJMP PK5 ; RS6: AJMP PK6 ; RS7: AJMP PK7 ; RS8: AJMP PK8 ; AJMP START ; 无键按下,继续扫描………………… PK1: ……….. ;按键S1功能处理程序 AJMP START ;处理S1按键后, 继续扫描PK2: ……….. ;按键S2功能处理程序

矩阵键盘程序c程序,51单片机.

/*编译环境:Keil 7.50A c51 */ /*******************************************************/ /*********************************包含头文件********************************/ #include /*********************************数码管表格********************************/ unsigned char table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x 8E}; /**************************************************************************** 函数功能:延时子程序 入口参数: 出口参数: ****************************************************************************/ void delay(void) { unsigned char i,j; for(i=0;i<20;i++) for(j=0;j<250;j++); } /**************************************************************************** 函数功能:LED显示子程序 入口参数:i 出口参数: ****************************************************************************/ void display(unsigned char i) { P2=0xfe; P0=table[i]; } /**************************************************************************** 函数功能:键盘扫描子程序 入口参数: 出口参数: ****************************************************************************/ void keyscan(void) { unsigned char n; //扫描第一行 P1=0xfe;

第13讲51单片机按键电路

标题:键盘接口电路 教学目标与要求: 1.键盘去抖动和连接、控制方式 2.独立式按键及其接口电路 3.矩阵式键盘及其接口电路 授课时数:2 教学重点:.矩阵式键盘及其接口电路 教学内容及过程: 一、键盘接口概述 1、按键开关去抖动问题 机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后其触点才稳定下来。其抖动过程如图9-11所示,抖动时间的长短与开关的机械特性有关,一般为5 10 ms 在触点抖动期间检测按键的通与断状态,可能导致判断出错,即按键一次按下或释放被错误地认为是多次操作,这种情况是不允许出现的。为了克服按键触点机械抖动所致的检测误判,必须采取去抖动措施。这一点可从硬件、软件两方面予以考虑。在键数较少时,可采用硬件去抖,而当键数较多时,采用软件去抖。在硬件上可采用在键输出端加R-S触发器(双稳态触发器)或单稳态触发器构成去抖动电路。图9-12是一种由R-S触发器构成的去抖动电路,当触发器一旦翻转,触点抖动不会对其产生任何影响。 软件上采取的措施是:在检测到有按键按下时,执行一个10 ms左右(具体时间应视所使用的按键进行调整)的延时程序后,再确认该键电平是否仍保持闭合状态电平,若仍保持闭合状态电平,则确认该键处于闭合状态。同理,在检测到该键释放后,也应采用相同的步 骤进行确认,从而可消除抖动的影响。

2.编制键盘程序 一个完善的键盘控制程序应具备以下功能: (1) 检测有无按键按下,并采取硬件或软件措施,消除键盘按键机械触点抖动的影响。 (2) 有可靠的逻辑处理办法。每次只处理一个按键,其间对任何按键的操作对系统不产生影响,且无论一次按键时间有多长,系统仅执行一次按键功能程序。 (3) 准确输出按键值(或键号),以满足跳转指令要求。 二、独立式按键 单片机控制系统中,往往只需要几个功能键,此时,可采用独立式按键结构。 1. 独立式按键结构 独立式按键是直接用I/O口线构成的单个按键电路,其特点是每个按键单独占用一根I/O口线,每个按键的工作不会影响其它I/O口线的状态。独立式按键的典型应用如图7.4所示。 独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一根I/O口线,因此,在按键较多时,I/O口线浪费较大,不宜采用。 2.矩阵式键盘 I/O端线分为行线和列线,按键跨接在行线和列线上,按键按下时,行线与列线发生短路。特点: ①占用I/O端线较少; ②软件结构教复杂。 适用于按键较多的场合。 3.键盘扫描控制方式 ⑴程序控制扫描方式 键处理程序固定在主程序的某个程序段。 特点:对CPU工作影响小,但应考虑键盘处理程序的运行间隔周期不能太长,否则会影响对键输入响应的及时性。 ⑵定时控制扫描方式 利用定时/计数器每隔一段时间产生定时中断,CPU响应中断后对键盘进行扫描。 特点:与程序控制扫描方式的区别是,在扫描间隔时间内,前者用CPU工作程序填充,后者用定时/计数器定时控制。定时控制扫描方式也应考虑定时时间不能太长,否则会影响对键输入响应的及时性。 ⑶中断控制方式 中断控制方式是利用外部中断源,响应键输入信号。 特点:克服了前两种控制方式可能产生的空扫描和不能及时响应键输入的缺点,既能及时处理键输入,又能提高CPU运行效率,但要占用一个宝贵的中断资源。 三、独立式按键及其接口电路 1、按键直接与I/O口连接

51单片机矩阵键盘程序

/*风清云扬*/ # include #define uchar unsigned char #define uint unsigned int void delay(uint i) { uchar x,j; for(j=0;j

} else if(temp0==0x0b) { switch (temp1) { case 0xe0: num=12;break; case 0xd0: num=11;break; case 0xb0: num=10;break; case 0x70: num=9;break; default:num=0;break; } } else if(temp0==0x07) { switch (temp1) { case 0xe0: num=16;break; case 0xd0: num=15;break; case 0xb0: num=14;break; case 0x70: num=13;break; default:num=0;break; } } } } return num; } void main() { char num; while(1) { num=key_scan(); P2=num/10; P3=num%10; } }

基于某51单片机地键盘盘可调万年历

开放性实验报告 题目: 基于80C51的万年历设计_ 院系:

专业班级: 学号: 姓名: 指导老师:________________________ 时间:2014年9月8号 摘要 电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。它可以对年、月、日、周、时、分、秒进行计时,还具有闰年补偿等多种功能。本系统选用DALLAS 公司生产的日历时钟芯片DS1302来作为实时时数字万年历采用直观数字显示,可以同时显示年、月、日、周、时、分、秒等信息,还具有键盘时间校准等功能。该电路采用AT89C52单片机作为核心,用以5V电压供电。 本系统硬件部分由AT89C52单片机、DS1302时钟芯片、LCD1602液晶显示环境下以C51语言编写,包括时间设置、时间显示、时间修正等功能。在仿真的时候,以Proteus 与Keil uVision4软件为基础,编写了MCS-51单片机对LCD1602显示控制的软件,绘制其原理图,并使用Proteus软件与Keil uVision4软件建立联合仿真。本设计主要论述了原理图各个模块的作用,以及控制软件的各个模块的编程。

关键词:时钟芯片DS1302;单片机AT89C52;液晶显示1602;独立键盘等

目录 第1章绪论 (1) 1.1实时万年历的简介 (1) 1.2系统所实现的功能 (3) 第2章开发工具软件简介 (4) 2.1K EIL U V ISION4软件简介 (4) 2.2P ROTEUS软件简介 (4)

2.3K EIL U V ISION4与P ROTEUS软件联合仿真 (5) 第3章LCD1602显示控制技术 (6) 3.11602字符型LCD简介 (6) 3.2LCD1602功能 (7) 3.3 LCD1602的指令说明及时序 (8) 3.4LCD1602的RAM地址映射及标准字库表 (7) 3.5 LCD1602的一般初始化(复位)过程 (8) 第4章系统硬件概况 (13) 4.1系统概况 (13) 4.2 MCS-51单片机最小系统模块 (14) 4.3 DS1302时钟芯片控制与键盘设置时间模块 (15) 4.4 LCD1602显示模块 (16) 第5章软件控制系统概况 (18) 5.1程序流程概况 (18) 5.2 流程图 (18) 5.3 源程序代码 (19) 参考文献 (25)

单片机矩阵键盘毕业设计

单片机矩阵键盘毕业设计 摘要 矩阵式键盘乃是目前使用较为广泛的一种键盘模式,该系统以N个端口连接控制N*N个按键,即时在LED数码管上。单片机控制的据这是键盘显示系统,该系统可以对不同的按键进行实时显示,其核心是单片机和键盘矩阵电路部分,主要对按键与显示电路的关系、矩阵式技术及设备系统的硬件、软件等各个部分进行实现。4*4矩阵式键盘采用89C51单片机为核心,主要由矩阵式键盘电路、译码电路、显示电路等组成,软件选用C语言编程,单片机将检测到的按键信号转换成数字量,显示于数码管显示器,系统灵活性强,易于操作,可靠性能好。单片机简介及主系统电路 单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换444器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域的广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的32位300M的高速单片机。单片机在工业控制领域广泛应用,它由芯片内仅有CPU的专用处理器发展而来。最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中,本次课程设计我们采用的是AT89C51型号的单片机。 AT89C51单片机是51系列单片机的一个成员,是8051单片机的简化版。内部自带2K字节可编程FLASH存储器的低电压、高性能COMS八位微处理器,与Intel MCS-51系列单片机的指令和输出管脚相兼容。由于将多功能八位CPU和闪速存储器结合在单个芯片中,因此,AT89C2051构成的单片机系统是具有结构最简单、造价最低廉、效率最高的微控制系统,省去了外部的RAM、ROM和接口器件,减少了硬件开销,提高了系统的性价比。其最小系统电路图如下:

4×4矩阵键盘51单片机识别实验与程序

4×4矩阵键盘51单片机识别实验与程序 1.实验任务 如图4.14.2所示,用AT89S51的并行口P1接4×4矩阵键盘,以P1.0-P1.3作输入线,以P1.4-P1.7作输出线;在数码管上显示每个按键的“0-F”序号。对应的按键的序号排列如图4.14.1所示 图4.14.1 2.硬件电路原理图

图4.14.2 3.系统板上硬件连线 (1.把“单片机系统“区域中的P3.0-P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4 R1-R4端口上; (2.把“单片机系统”区域中的P0.0/AD0-P0.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求:P0.0/AD0对应着a,P0.1/AD1对应着b,……,P0.7/AD7对应着h。 4.程序设计内容 (1.4×4矩阵键盘识别处理 (2.每个按键有它的行值和列值,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU通信。每个按键 的状态同样需变成数字量“0”和“1”,开关的一端(列线)通过电 阻接VCC,而接地是通过程序输出数字“0”实现的。键盘处理程序的 任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还 要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码, 使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回 馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。 5.程序框图

图4.14.3 C语言源程序 #include unsigned char code table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; unsigned char temp; unsigned char key; unsigned char i,j; void main(void) { while(1)

单片机电路图详解

单片机:交通灯课程设计(一)(2007-04-21 13:28:54) 目录 摘要--------------------------------------------------------- 1 1.概述 -------------------------------------------------------- 2 2.硬件设计----------------------------------------------------- 3 2.1单片机及其外围--------------------------------------------3 2.1.1单片机的选择-----------------------------------------3 2.1.2单片机的特点及其应用范围----------------------------- 3 2.1.3存储器的扩展----------------------------------------- 4 2.1.4内存的扩展------------------------------------------- 6 2.1.5MCS-52的I/O接口扩展--------------------------------- 8 2.2电路部分--------------------------------------------------11 2.2.1元器件选用-------------------------------------------11 2.2.2电路完成功能-----------------------------------------13 3.软件设计------------------------------------------------------15 3.1软件概述-------------------------------------------------15 3.2汇编语言指令说明-----------------------------------------16 3.3定时/计数器的原理----------------------------------------16 3.3.1定时/计数器的概述-----------------------------------16 3.3.2 8255A片选及各端口地址-------------------------------18 3.3.3信号控制码------------------------------------------18 3.3.4工作方式寄存器--------------------------------------19 3.3.5定时/计数器初值及定时器T0的工作方式----------------20

相关主题
文本预览
相关文档 最新文档