万年历矩阵式键盘程序

万年历矩阵式键盘程序
万年历矩阵式键盘程序

////////////////////////////////////////////////////////////////////////////

// 给力者单片机开发学习系统,开发学习都给力!//

////////////////////////////////////////////////////////////////////////////

// 学习51单片机,其实可以很简单//

////////////////////////////////////////////////////////////////////////////

// 万年历程序//

////////////////////////////////////////////////////////////////////////////

// 日期:2015年06月18日// ////////////////////////////////////////////////////////////////////////////

#include //调用51单片机的头文件

//---------------------------------------

//1602液晶相关I/O设置

sbit E=P2^3; //1602液晶的E脚接在P2.3口上

sbit RW=P2^4; //1602液晶的RW脚接在P2.4口上

sbit RS=P2^5; //1602液晶的RS脚接在P2.5口上

//---------------------------------------

unsigned char i;

//---------------------------------------

//1602液晶寄存器设置

unsigned int second=0; //设置16位的unsigend int型寄存器用来暂存1602要显示的秒数

unsigned int minute=0; //设置16位的unsigend int型寄存器用来暂存1602要显示的分钟数

unsigned int hour=0; //设置16位的unsigend int型寄存器用来暂存1602要显示的小时数

unsigned int day=1; //设置16位的unsigend int型寄存器用来暂存1602要显示的日期unsigned int month=1; //设置16位的unsigend int型寄存器用来暂存1602要显示的月份

unsigned int year=0; //设置16位的unsigend int型寄存器用来暂存1602要显示的年份unsigned int x=0;

unsigned int y=0;

//---------------------------------------

//---------------------------------------

//8独立按键相关I/O设置

sbit P1key=P1^0; //按键P1接在P2.0口上

sbit P2key=P1^1; //按键P2接在P2.1口上

sbit P3key=P1^2; //按键P3接在P2.2口上

sbit P4key=P1^3; //按键P4接在P2.3口上

sbit P5key=P1^4; //按键P5接在P2.4口上

sbit P6key=P1^5; //按键P6接在P2.5口上

sbit P7key=P1^6; //按键P7接在P2.6口上

sbit P8key=P1^7; //按键P8接在P2.7口上

//---------------------------------------

//---------------------------------------

//按键部分用寄存器设置

unsigned char KEYbuf; //设置8位的寄存器用来暂存按键键值数据unsigned char KEYcon;

bit KEYbit;

bit enterbit;

//---------------------------------------

#define RIGHT P1^0;

#define LEFT P1^1;

#define UP P1^2;

#define DOWN P1^3;

#define ENTER P1^4;

#define ESC P1^5;

#define REST P1^6;

//---------------------------------------

//名称:定时器0中断服务程序

//适用:给力者GL9单片机开发学习系统

//公司:

//网址:

//日期:2015年06月18日

//---------------------------------------

void Timer0(void) interrupt 1

{ //定时25000微秒

TL0=0xFF; //重新给TL0赋初值

TH0=0x4B; //重新给TH0赋初值

//***此处用户自行添加定时器T0中断处理程序***

if(++i>39) //对中断计次,记到40次后,刚好1秒钟

{

i=0; //对计次用寄存器清零,以被下一个计次循环

//**给1602显示寄存器赋值(0-9999)**

if(++second>59)

{

second=0; //秒60进制

if(++minute>59)

{

minute=0; //分钟60进制

if(++hour>23)

{

hour=0; //小时24进制

if((month==1|month==3|month==5|month==7|month==8|month==10|month==12)&(++day> 31)|(month==4|

month==6|month==9|month==11)&(day>30)|((year%4!=0)&(month==2)&(day>28)|(year%4==0) &(month==2)&(day>29)))

//月份对应相应天数

{

day=1;

if(++month>12)

{

month=1; //月份12进制

if(++year>9999) year=0;

}

}

}

}

}

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

}

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

}

//---------------------------------------

//名称:1602液晶用延时函数

//适用:给力者GL9单片机开发学习系统

//公司:

//网址:

//日期:2015年06月18日

//---------------------------------------

void Delay1602(unsigned int t)

{

unsigned int k; //定义一个16位寄存器用来做延时用

for(k=0;k

}

//---------------------------------------

//名称:1602液晶忙检测函数

//适用:给力者GL9单片机开发学习系统

//公司:

//网址:

//日期:2015年06月18日

//---------------------------------------

void LCD1602_busy(void)

{

P0_7=1; //将P0.7置1,为读状态做准备

RS=0; //RS=0、RW=1、E=1时,忙信号输出到DB7,由P0.7读入RW=1; //RS=0、RW=1、E=1时,忙信号输出到DB7,由P0.7读入E=1; //RS=0、RW=1、E=1时,忙信号输出到DB7,由P0.7读入while(P0_7==1); //由P0.7读入1,表示1602液晶忙,需要等待

E=0; //读完以后,恢复E的电平

}

//---------------------------------------

//名称:1600写命令函数

//适用:给力者GL9单片机开发学习系统

//公司:

//网址:

//日期:2015年06月18日

//---------------------------------------

void LCD1602_Write_com(unsigned char combuf)

{

RS=0; //选择指令寄存器

RW=0; //选择写状态

P0=combuf; //将命令字通过P0口送至DB

E=1; //E高电平将命令字写入1602液晶

E=0; //写完以后,恢复E的电平

}

//---------------------------------------

//名称:1602写命令函数(带忙检测)

//适用:给力者GL9单片机开发学习系统

//公司:

//网址:

//日期:20150529

//---------------------------------------

void LCD1602_Write_com_busy(unsigned char combuf)

{

LCD1602_busy(); //调用忙检测函数

LCD1602_Write_com(combuf); //调用忙检测函数

}

//---------------------------------------

//名称:1602写数据函数(带忙检测)

//适用:给力者GL9单片机开发学习系统

//构 荆?

//网址:

//日期:2015年06月18日

//---------------------------------------

void LCD1602_Write_data_busy(unsigned char databuf)

{

LCD1602_busy(); //调用忙检测函数

RS=1; //选择数据寄存器

RW=0; //选择写状态

P0=databuf; //将命令字通过P0口送至DB

E=1; //E高电平将命令字写入1602液晶

E=0; //写完以后,恢复E的电平

}

//---------------------------------------

//名称:1602液晶显示地址写函数

//适用:给力者GL9单片机开发学习系统

//公司:

//网址:

//日期:2015年06月18日

//---------------------------------------

void LCD1602_Write_address(unsigned char x,unsigned char y)

{

x&=0x0f; //列地址限制在0-15间

y&=0x01; //行地址限制在0-1间

if(y==0) //如果是第一行

LCD1602_Write_com_busy(x|0x80); //将列地址写入else //如果是第二行

LCD1602_Write_com_busy((x+0x40)|0x80); //将列地址写入}

//---------------------------------------

//名称:1602液晶指定地址显示函数

//适用:给力者GL9单片机开发学习系统

//公司:

//网址:

//日期:2015年06月18日

//---------------------------------------

void LCD1602_Disp(unsigned int x,unsigned int y,unsigned char buf) {

LCD1602_Write_address(x,y); //先将地址信息写入

LCD1602_Write_data_busy(buf); //再写入要显示的数据

}

//---------------------------------------

//名称:1602液晶初始化函数

//适用:给力者GL9单片机开发学习系统

//公司:

//网址:

//日期:20150618

//---------------------------------------

void LCD1602_init(void)

{

Delay1602(1500); //调用延时函数

LCD1602_Write_com(0x38); //8位数据总线,两行显示模式,5*7点阵显示Delay1602(500); //调用延时函数

LCD1602_Write_com(0x38); //8位数据总线,两行显示模式,5*7点阵显示Delay1602(500); //调用延时函数

LCD1602_Write_com(0x38); //8位数据总线,两行显示模式,5*7点阵显示LCD1602_Write_com_busy(0x38); //8位数据总线,两行显示模式,5*7点阵显示LCD1602_Write_com_busy(0x08); //显示功能关,无光标

LCD1602_Write_com_busy(0x01); //清屏

LCD1602_Write_com_busy(0x06); //写入新的数据后,光标右移,显示屏不移动LCD1602_Write_com_busy(0x0C); //显示功能开,有光标,光标闪烁

}

//---------------------------------------

//名称: 按键扫描函数

//适用:给力者GL9单片机开发学习系统

//公司:宁波芯动电子有限公司

//网址:https://www.360docs.net/doc/6b10223864.html,

//日期:2015年06月18日

//---------------------------------------

unsigned char ScanKey(void)

{

//***4×4矩阵按键扫描部分***

//按K1-K16键,返回参数1-16

P1=0xFE; //将第一行置零,以扫描K1-K4是否被按下

if(P1_4==0) return 1; //如果K1键按下,返回1

else if(P1_5==0) return 2; //如果K2键按下,返回2

else if(P1_6==0) return 3; //如果K3键按下,返回3

else if(P1_7==0) return 4; //如果K4键按下,返回4

P1=0xFD; //将第二行置零,以扫描K5-K8是否被按下

if(P1_4==0) return 5; //如果K5键按下,返回5

else if(P1_5==0) return 6; //如果K6键按下,返回6

else if(P1_6==0) return 7; //如果K7键按下,返回7

else if(P1_7==0) return 8; //如果K8键按下,返回8

P1=0xFB; //将第三行置零,以扫描K9-K12是否被按下

if(P1_4==0) return 9; //如果K9键按下,返回9

else if(P1_5==0) return 10; //如果K10键按下,返回10

else if(P1_6==0) return 11; //如果K11键按下,返回11

else if(P1_7==0) return 12; //如果K12键按下,返回12

P1=0xF7; //将第四行置零,以扫描K13-K16是否被按下if(P1_4==0) return 13; //如果K13键按下,返回13

else if(P1_5==0) return 14; //如果K14键按下,返回14

else if(P1_6==0) return 15; //如果K15键按下,返回15

else if(P1_7==0) return 16; //如果K16键按下,返回16

return 0; //如果无按键按下,返回0

}

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

//名称:LCD1602液晶显示部分程序

//适用:给力者GL9单片机开发学习系统

//公司:

//网址:

//日期:2015年06月18日

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

void LCD1602_Disp_xy(void)

{

//分隔符显示

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

LCD1602_Disp(4,0,'-'); //在第1行的第5列显示-

LCD1602_Disp(7,0,'-'); //在第1行的第8列显示-

LCD1602_Disp(2,1,':'); //在第1行的第12列显示:

LCD1602_Disp(5,1,':'); //在第1行的第15列显示:

//**1602液晶显示0-9999年份**

LCD1602_Disp(0,0,year/1000+'0'); //在第1行的第1列显示千位

LCD1602_Disp(1,0,(year%1000)/100+'0'); //在第1行的第2列显示百位

LCD1602_Disp(2,0,(year%100)/10+'0'); //在第1行的第3列显示十位

LCD1602_Disp(3,0,year%10+'0'); //在第1行的第4列显示个位//**1602液晶显示0-12月**

LCD1602_Disp(5,0,(month%100)/10+'0'); //在第1行的第3列显示十位

LCD1602_Disp(6,0,month%10+'0'); //在第1行的第4列显示个位//**1602液晶显示0-31日**

LCD1602_Disp(8,0,(day%100)/10+'0'); //在第1行的第3列显示十位

LCD1602_Disp(9,0,day%10+'0'); //在第1行的第4列显示个位//**1602液晶显示0-24小时**

LCD1602_Disp(0,1,(hour%100)/10+'0'); //在第1行的第3列显示十位

LCD1602_Disp(1,1,hour%10+'0'); //在第1行的第4列显示个位//**1602液晶显示0-60分钟**

LCD1602_Disp(3,1,(minute%100)/10+'0'); //在第1行的第3列显示十位

LCD1602_Disp(4,1,minute%10+'0'); //在第1行的第4列显示个位//**1602液晶显示0-60秒**

LCD1602_Disp(6,1,(second%100)/10+'0'); //在第1行的第3列显示十位

LCD1602_Disp(7,1,second%10+'0'); //在第1行的第4列显示个位

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

}

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

//名称:日期加法执行程序

//适用:给力者GL9单片机开发学习系统

//公司:

//网址:

//日期:2015年06月18日

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

void date_plus(void)

{

if(y==0) //日期行显示

{

if(x==0)year=year+1000; //千位加1

if(x==1)year=year+100; //百位加1

if(x==2)year=year+10; //十位加1

if(x==3)year++; //个位加1

if(year>=10000)year=year-10000; //年满10000,减10000

if(x==5);

if(x==6)month++;

if(month>12)month=month-12; //月份满12,减12

if(x==8)day=day+10;

if(x==9)day++;

if(month==1|month==3|month==5|month==7|month==8|month==10|month==12)

// 31天的月份,满31天后为1日

{

if(day>31)day=1;

}

else if(month==4|month==6|month==9|month==11) // 30天的月份,满30天后为1日

{

if(day>30)day=1;

}

else if(month==2&year%4==0) // 闰年2月29天,满29天后为1日

{

if(day>29)day=1;

}

else if(month==2&year%4!=0) //闰年2月28天,满28天后为1日

{

if(day>28)day=1;

}

}

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

//名称:日期减法执行程序

//适用:给力者GL9单片机开发学习系统

//公司:

//网址:

//日期:2015年06月18日

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

void date_subtraction(void)

{

if(y==0) //日期行显示

{

if(year<1000&x==0|year<100&x==1|year<10&x==2|year==0&x==3)year=year+10000;

//年份数不够往最高位借位

if(x==0)year=year-1000;

if(x==1)year=year-100;

if(x==2)year=year-10;

if(x==3)year--;

if(x==5); //月份只能个位设置

if(month==1&x==6)month=12; //月份为一月时要减一,则见月份赋值为12月

else if(month>1&month<=12&x==6)month--; //月份减一

if((month==1|month==3|month==5|month==7|month==8|month==10|month==12)&x==8) {

// 当31天的月份,日期十位减一键按下

if(day<=1)day=day+30; //当日期为0或1时,日期加30

else if(day>1&day<=10)day=day+20; //当日期为2到10时,日期加20

else if(day>10&day<=31)day=day-10; //当日期为11到31时,天数减10

}

else

if((month==1|month==3|month==5|month==7|month==8|month==10|month==12)&x==9)

//当31天的月份,日期个位减一键按下

{

if(day==1)day=31; //当日期为1的时候,下一日

else if(day>1&day<=31)day--; //当日期为2到31日时,日期减一

}

else if((month==4|month==6|month==9|month==11)&x==8)

//当30天的月份,日期十位减一键按下

{

if(day==1)day=30; //当日期为1日时,下一日期为为30

else if(day>1&day<=10)day=day+20; //当日期为2到10日时,日期十位加2

else if(day>10&day<=30)day=day-10; //当日期为10到30日时,日期十位减1

}

else if((month==4|month==6|month==9|month==11)&x==9)

//30天的月份,个位按键减一键按下

{

if(day==1)day=30; //当日期为1时,下一日期为30

else if(day>1&day<=30)day--; //当日期为2到30时,下一日期减一

}

else if((month==2&year%4==0)&x==8)

//闰年时2月份,十位按键减一键按下

{

if(day>=1&day<10)day=day+20; //当日期为2到9时,日期十位加2

else if(day==10)day=29; //当日期为10时,下一日期为29

else if(day>10&day<=29)day=day-10; //当日期为11到29时,日期十位减1

}

else if((month==2&year%4==0)&x==9)

//当闰年2月份,按键减一键按下

{

if(day==1)day=29; //当日期为1日时,下一日期为29日

else if(day>1&day<=29)day--; //当日期为2到29日时,日期减一

}

else if((month==2&year%4!=0)&x==8)

//2月份平年,十位按键减一键按下

{

if(day>=1&day<=8)day=day+20; //当日期为1时,日期十位加一?

else if(day==9|day==10)day=28; //当日期为9或10时,日期下一位为28

else if(day>10&day<=28)day=day-10; //当日期为11到28时,日期十位减1

}

else if((month==2&year%4!=0)&x==9)

//当月份为平年2月份,按键个位减一键按下

{

if(day==1)day=28; //当日期为1时,下一日期为28日

else if(day>1&day<=28)day--; //当日期为2到28日,日期减一}

}

}

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

//名称:时间加法执行程序

//适用:给力者GL9单片机开发学习系统

//公司:

//网址:

//日期:2015年06月18日

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

void time_plus(void)

{

if(y==1) //时间行显示

{

if(x==0)hour=hour+10;

if(x==1)hour++;

if(hour>=24)hour=0; //满24小时,时间为0

if(x==3)minute=minute+10;

if(x==4)minute++;

if(minute>=60)minute=minute-60; //满60分钟,分钟数为0

if(x==6)second=second+10;

if(x==7)second++;

if(second>=60)second=second-60; //满60秒,秒数为0 }

}

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

//名称:时间减法执行程序

//适用:给力者GL9单片机开发学习系统

//公司:

//网址:

//日期:2015年06月18日

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

void time_subtraction(void)

{

if(y==1) //时间行显示

{

if(x==0) // 显示地址为(0,1)

{

if(hour<=4)hour=hour+20; //当小时数为小于4,小时数加20

else if(hour>4&hour<10)hour=hour+10; //当小时数为5到9时,小时数加10

else if(hour>=10&hour<=24)hour=hour-10; //当小时数为为10到24,小时数十位减1

}

if(x==1)

{

if(hour==0)hour=24;

hour--; //当小时数为0,借位24小时

}

if(x==3)

{

if(minute<10)minute=minute+50; //分钟数小于10,十位加5

else if(minute>=10&minute<60)minute=minute-10; //分钟数大于等于10小于60,分钟数十位减1

}

if(x==4)

{

if(minute==0)minute=60;

minute--; //当分钟数为0时,借位60分钟

}

if(x==6)

{

if(second<10)second=second+50; //秒数小于10,十位加5

else if(second>=10&second<60)second=second-10; //秒数大于等于10小于60,秒数十位减1

}

if(x==7)

{

if(second==0)second=60;

second--;

}

}

}

//---------------------------------------

//名称: 主函数

//适用:给力者GL9单片机开发学习系统

//公司:

//网址:

//日期:2015年06月18日

//---------------------------------------

void main(void) //主函数,单片机开机后就是从这个函数开始运行{

unsigned char k;

unsigned char k5con;

unsigned int keycon;

unsigned int enter_bit=0;

bit keybit;

/////***************************************************** LCD1602_init(); //调用1602液晶初始化函数

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

//***定时器Timer0初始化***

TMOD&=0xF0; //将TMOD的低4位定时器0控制部分清零TMOD|=0x01; //设置定时器0为方式1

TL0=0xFF; //设置定时器0初值低8位

TH0=0x4B; //设置定时器0初值高8位

TR0=1; //启动定时器0

ET0=1; //Timer0中断允许

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

//***开全局中断设置****

//定时器Timer0设置了中断允许,此处要开全局中断

EA=1; //开全局中断

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

while(1) //死循环,单片机初始化后,将一直运行这个死循环{

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

LCD1602_Disp_xy();

k=ScanKey();

if(enter_bit==0)

{

LCD1602_Disp(x,y,'0'-16); //光标闪烁位

}

LCD1602_Disp(9,1,k+'0'); //显示按键位

LCD1602_Disp(10,1,x+'0'); //显示x地址位

LCD1602_Disp(11,1,y+'0'); //显示y地址位

LCD1602_Disp(12,1,enter_bit+'0'); //显示enter键按下标志位

if(k==0) //如果无键按下

{

k5con=0;

if(keybit==0)

{

if(++keycon>50) //消除抖动参数,越大消抖效果越好,但是按键越不灵敏{

keycon=0;

keybit=1;

}

}

else

keycon=0;

}

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

switch(k)

{

case 1: //UP按键按下

Delay1602(50000);

if(keybit==1)keybit=0;

if(enter_bit==0) //确认件从未按下

{

x++;

if(x>9)x=0;

}

else if(enter_bit==1) //确认件曾经按下

{

date_plus();

time_plus();

}

break;

case 2: //DOWN按键按下

Delay1602(50000);

if(keybit==1)keybit=0;

if(enter_bit==0) //确认件从未按下

{

if(x<1)x=10;

x--;

}

else if(enter_bit==1) //确认件曾经按下

{

date_subtraction();

time_subtraction();

}

break;

case 3: //RIGHT按键按下

Delay1602(50000);

if(keybit==1)keybit=0;

if(enter_bit==0)y=0;

break;

case 4: //LEFT按键按下

Delay1602(50000);

if(keybit==1)keybit=0;

if(enter_bit==0)

y=1;

break;

case 5: //ENTER按键按下

Delay1602(50000);

if(keybit==1)keybit=0;

if(enter_bit==0)

enter_bit=1;

break;

case 6: //ESC键按下

Delay1602(50000);

if(keybit==1)keybit=0;

if(enter_bit==1)

enter_bit=0;

break;

case 7: //REST 键按下

Delay1602(50000);

if(keybit==1)keybit=0;

enter_bit=0;

x=0;

y=0;

break;

}

}

}

矩阵式键盘的输入实验

实验六、矩阵式键盘的输入实验 实验目的 学习矩阵式键盘工作原理 学习矩阵式键盘接口的电路设计和程序设计 实验设备 仿真器 单片机最小系统实验教学模块 矩阵式键盘实验模块 动态扫描数码管显示模块 实验要求 要求实现:在矩阵式键盘中的某个键被按下时,8位LED动态显示器上最低位显示该键对应的字符,以前的字符向高位推进一位 实验原理 矩阵式由行线和列线组成,按键位于行、列的交叉点。一个4*4 的行列结构可以构成一个16个按键的键盘。很明显,在按键数量较多的场合,矩阵式键盘与独立式键盘相比,要节省很多的I/O端口 矩阵式键盘工作原理 按键是设置在行列的交接点上,行列分别连接到按键开关的两端。行线通过上拉电阻接到+5V上。平时无按键按下时,行线处于高电平状态,而当有按键按下时,行线电平状态将由与此行线相连的列线电平决定。列线电平如果为低,则行线电平为低,列线电平如果为高,则行线电平则为高。这一点是识别矩阵式键盘是否被按下的关键所在。由于行列式键盘中行列线为多键共用,各按键均影响该键所在行和列的电平。因此,各按键彼此将相互发生影响,所以必须将行列线信号配合起来并作适当的出来,才能确定闭合键的位置。 键被按下时,与此键相连的行线电平将由与此相连的列线电平决定,而行线电平在物件按显示处于高电平状态。如果让所有列线出于高电平时没法识别出按键的,现在发过来,让所有列线处于低电平,很明显,按下的键所在行电平将也被置为低电平,根据此变化,便能判定该行一定又键被按下。但我们还不能确定是这一行的哪个键被按下。所以,为了进一步判定到底是哪一列的键被按下,可在某一时刻只让一列线处于低电平。而其余所有列线处于高电平。当第一列为低电平,其余各列为高电平时,因为键4被按下,所以死一行扔处于高电平状态;当第二列为低电平,其余各列为高电平时,同样哦我们会发现第一行仍处于高电平状态。知道让第四列为低电平,其余各列为高电平时,因为是4号键被按下,所以第一行的高电平状态转换到第四列所处的低电平,据此,我们确信第一行第四列交叉点处的按键即4号键被按下。 识别键盘有无键被按下的方法是:让所有列线均为低电平,检查各行线电平是否有低电

矩阵键盘的工作原理和扫描确认方式

9.3.1 矩阵键盘的工作原理和扫描确认方式 来源:《AVR单片机嵌入式系统原理与应用实践》M16华东师范大学电子系马潮 当键盘中按键数量较多时,为了减少对I/O 口的占用,通常将按键排列成矩阵形式,也称为行列键盘,这是一种常见的连接方式。矩阵式键盘接口见图9-7 所示,它由行线和列线组成,按键位于行、列的交叉点上。当键被按下时,其交点的行线和列线接通,相应的行线或列线上的电平发生变化,MCU 通过检测行或列线上的电平变化可以确定哪个按键被按下。 图9-7 为一个 4 x 3 的行列结构,可以构成12 个键的键盘。如果使用 4 x 4 的行列结构,就能组成一个16 键的键盘。很明显,在按键数量多的场合,矩阵键盘与独立式按键键盘相比可以节省很多的I/O 口线。 矩阵键盘不仅在连接上比单独式按键复杂,它的按键识别方法也比单独式按键复杂。在矩阵键盘的软件接口程序中,常使用的按键识别方法有行扫描法和线反转法。这两种方法的基本思路是采用循环查循的方法,反复查询按键的状态,因此会大量占用MCU 的时间,所以较好的方式也是采用状态机的方法来设计,尽量减少键盘查询过程对MCU 的占用时间。 下面以图9-7 为例,介绍采用行扫描法对矩阵键盘进行判别的思路。图9-7 中,PD0、PD1、PD2 为3 根列线,作为键盘的输入口(工作于输入方式)。PD3、PD4、PD5、PD6 为4根行线,工作于输出方式,由MCU(扫描)控制其输出的电平值。行扫描法也称为逐行扫描查询法,其按键识别的过程如下。 √将全部行线PD3-PD6 置低电平输出,然后读PD0-PD2 三根输入列线中有无低电平出现。只要有低电平出现,则说明有键按下(实际编程时,还要考虑按键的消抖)。如读到的都是高电平,则表示无键按下。 √在确认有键按下后,需要进入确定具体哪一个键闭合的过程。其思路是:依

北极星数码万年历使用说明书

北极星数码万年历 北极星数码万年历使用说明书 操作说明 1、按键说明:设置键、上调键、下调键、流水开关键。 2、时间调整在正常走时状态下,按“设置”键进入时间设置状态,同时年份“闪烁”,可按“上调”或“下调”键修改年份,修改好后按“设置”键将闪烁位移到公历“月”,按“上调”或“下调”键修改月份;用同样的方法可对日、时、分进行设置;12个公历节日及倒计天数、24个农历节气及倒计天数、12生肖、12星座、星期、农历月、日将自动跟随公历的变化。当分设定好后,再按“设置”键退出时间设置,回到正常时间状态。 3、节气灯花样转换在正常走时状态下,按住“设置”键3秒钟即可进入节气灯花样转换。 4、12/24小时制切换在正常走时状态下,按住“上调”键3秒钟,则可进行12小时制与24小时制的切换。上电复位时,可默认为24小时制或12小时制,由选项决定。 5、开/关整点报时在正常走时状态下,按住“下调”键3秒钟听到“嘀”一声,则可以打开或关闭整点报时功能。 6、天数倒计时或顺计时(由选项决定)在正常时间状态下,按“模式”键进入“天数计时状态”,在温度位显示“d1”,计时天数位若显示“――――”,表示计时“无效”;若显示具体数字表示有效,按“上调”键可以切换“有效”/“无效”,按“设置”键进入天数设定,且左边第一位(千位)闪烁,按“上调”或“下调”键修改内容,按“设置”键移动闪烁位置到第二位(百位),按“上调”或“下调”键修改闪烁位的内容,同样方法可设置十位与个位 7、闹钟 8组定闹(由按键选项决定),默认值无效,默认时间为――:――点,闹钟设定:在正常时间状态下(或天数计时状态),按“下调”键进入“定闹查询状态”,定闹指示灯点亮,在温度位显示“A1”,表示当前你看到的是“第1组定闹”的信息,在小时、分钟位显示“――∶――”,表示定闹“无效”;显示“XX∶XX”的具体时间,表示定闹“有效”,按“上调”键可以切换“有效”/“无效”,按“设置”键进入定闹时间设定,且小时位闪烁,按“上调”或“下调”键修改闪烁位的内容,按“设置”键移动闪烁位置到分钟位,按“上调”或“下调”键修改闪烁位的内容,再按“设置”键确认并退出定闹时间设定,再按“下调”键进入下一组闹铃状态,其设置与“第1组定闹”相同,依次类推即可设置所有定闹。 8、生日提醒①7组生日提醒,默认值无效。②生日提醒设定:在最后一组定闹状态,再按一次“下调”键则进入第一组生日提醒,生日提醒指示灯点亮,在温度位显示“b1”,在公历“月日位”显示有效“生日日期”或无效日期“――――”,则表示生日以“公历日期”为准,若在农历“月日位”显示则表示生日以农历日期为准;按“上调”键可“打开/关闭”该组生日提醒,按“设置”键进入“该组生日提醒日期”设置,按“上调”或“下调”键修改其内容,按“设置”键移动闪烁位置,再按“设置”键确认该组生日提醒设置,再按“下调”键进入下一组生日提醒,依次类推即可设置所有生日提醒,当在最后一组生日提醒时,按“下调”键则退到正常时间状态若闹铃中没有一组设置有效,则定闹指示灯熄灭,在任何闹铃时间到正在响闹 北极星数码万年历使用说明书第1页共2页

矩阵键盘设计实验报告

南京林业大学 实验报告 基于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、电路图

电子万年历设计

课程论文论文题目基于单片机的电子万年历设计 课程名称单片机原理及接口技术 专业年级 2014级自动化3班 学生姓名孙宏远贾腾飞 学号 2016年12 月3 日

摘要: 本文介绍了基于AT89C51单片机的多功能电子万年历的硬件结构和软硬件设计方法。系统以AT89C51单片机为控制器,以串行时钟日历芯片DS1302记录日历和时间,它可以对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能。万年历采用直观的数字显示,可以在LED上同时显示年、月、日、周日、时、分、秒,还具有时间校准等功能。此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,具有广阔的市场前景。。 关键词:AT89C51单片机,DS1602时钟芯片,LCD1602显示屏。串口通信。 一:引言 本设计的基于单片机控制的电子万年历,具有年、月、日、星期、时、分、秒的显示等功能,实现过程就是由主控制发送信息给DS1302时钟芯片再由时钟芯片反馈给单片机,再由主控制器传送给LCD1602显示屏显示信息。并且可以在键盘设置模块输入修改时间,当键盘设置时间、日期时,单片机主控制根据输入信息,通过串口通信传送给DS1302时钟芯片,DS1302芯片读取当前新信息产生反馈传送给单片机,然后单片机根据控制最后输送显示信息到LCD1602液晶显示屏模块上显示。 二:硬件设计: 2.0.硬件的设计总框图 2.1 DS1032时钟电路 DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。芯片如图。 DS1302的内部主要由移位寄存器、指令和控制逻辑、振荡分频电路、实时时钟以及RAM组成。每次操作时,必须首先把CE置为高电平。再把提供地址和命令信息的8位装入移位寄存器。数据在SCLK的上升沿串行输入。无论是读周期还是写周期发生,也无论传送方式是单字节还是多字节,开始8位将指定内部何处被进行访问。在开始 8个时钟周期把含有地址信息的命令字装入移位寄存器之后。紧随其后的时钟在读操作时输出数据。 2.2 LCD1602与AT89C52的引脚接线 LCD1602采用总线式与单片机相连,AT89c52的P1口直接与液晶模块的数据总线D0~D7相连;P2 口的0,1,2脚分别与液晶模块的RS、RW、E脚相连。滑动变阻器用于调整液晶显示的亮度。电路如图

单片机矩阵键盘设计方案

1、设计原理 (1)如图14.2所示,用单片机的并行口P3连接4×4矩阵键盘,并以单片机的P3.0-P3.3各管脚作输入线,以单片机的P3.4-P3.7各管脚作输出线,在数码管上显示每个按键“0-F”的序号。 (2)键盘中对应按键的序号排列如图14.1所示。 2、参考电路 图14.2 4×4矩阵式键盘识别电路原理图 3、电路硬件说明 (1)在“单片机系统”区域中,把单片机的P3.0-P3.7端口通过8联拨动拨码开关JP3连接到“4×4行列式键盘”区域中的M1-M4,N1-N4端口上。 (2)在“单片机系统”区域中,把单片机的P0.0-P0.7端口连接到“静态数码显示模块”区域中的任何一个a-h端口上;要求:P0.0对应着a,P0.1对应着b,……,P0.7对应着h。 4、程序设计内容 (1)4×4矩阵键盘识别处理。 (2)每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU通信。键盘的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么?还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地;另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。 5、程序流程图(如图14.3所示) 6、汇编源程序 ;;;;;;;;;;定义单元;;;;;;;;;; COUNT EQU 30H ;;;;;;;;;;入口地址;;;;;;;;;;

ORG 0000H LJMP START ORG 0003H RETI ORG 000BH RETI ORG 0013H RETI ORG 001BH RETI ORG 0023H RETI ORG 002BH RETI ;;;;;;;;;;主程序入口;;;;;;;;;; ORG 0100H START: LCALL CHUSHIHUA LCALL PANDUAN LCALL XIANSHI LJMP START ;;;;;;;;;;初始化程序;;;;;;;;;;

单片机AT89c52电子万年历设计(带程序)

目录 一、摘要 (2) 二、设计 (3) 三、设计任务. (2) 四、设计要求 (3) 五、系统方案设计 (3) 1、系统 (3) 1)原理构成框图 (3) 2)设计思路 (4) 2、主程序设计 (4) 3、中断程序设计 (5) 5、时间调整电路的设计 (7) 六、系统评价 (7) 七、c语言程序注释及说明 (8)

一、摘要 单片机就是微控制器,是面向应用对象设计、突出控制功能的芯片。单片机接上晶振、复位电路和相应的接口电路,装载软件后就可以构成单片机应用系统。将它嵌入到形形色色的应用系统中,就构成了众多产品、设备的智能化核心。本设计是基于AVR单片机强大的控制功能制作而成的电子万年历,该电子万年历包括四大功能:实时显示年、月、日、时、分、秒、星期;人为的校正年、月、日、时、分、星期;第一次开机显示12-00-30。 二、设计目的 1、掌握C52程序用于实践并实现相应的功能; 2、掌握时钟程序的使用方法; 3、掌握时间函数的使用方法; 4、掌握键盘的程序使用方法; 三、设计任务 通过与单片机连接数码管动态显示年、月、日、时、分、秒、星期等功能,并能准确计算闰年闰月的显示,

七个按钮连接P0口可以精确调整每一个时间数值,通过对所设计的万年历时钟电路进行实验测试,达到了动态显示时间,随时调整时间等技术指标。 四、设计要求 (1)能够准确的计时,时间可在数码管上显示出来,默认显示为时、分、秒,每隔一分钟自动显示年、月、日及星期,也可通过按键控制显示,并可通过按键调节时间。 (2)第一次开机显示12-30-30。 (3)每半秒led彩灯闪烁一次 五、系统方案设计: 1、系统总体设计: 1) 原理构成框图 本设计用AT89C52作为核心控制部分,外接晶振电路与复位电路,以两个四位数码管作为显示部分,开关控制显示时间与日期,具体框图如图1所示,数码管框图如图2所示:

万年历

科名片 万年历(gregorian solar calendar and chinese lunar calendar)我国古代传说中最古老的一部太阳历。为纪念历法编撰者万年功绩,便将这部历法命名为“万年历”。而现在所使用的万年历,实际上就是记录一定时间范围内(比如100年或更多)的具体阳历或阴历的日期的年历,方便有需要的人查询使用,与原始历法并无直接联系 目录 由来 1. 第一个版本 2. 第二个版本 择日宜忌 阳历与阴历 在线万年历 干支年历歌诀 图书《万年历》(2009) 1. 基本信息 2. 内容简介 3. 图书目录 图书《万年历》(2008) 1. 基本信息 2. 内容简介 3. 目录 由来 1. 第一个版本 2. 第二个版本 择日宜忌 阳历与阴历 在线万年历 干支年历歌诀 图书《万年历》(2009) 1. 基本信息 2. 内容简介 3. 图书目录 图书《万年历》(2008) 1. 基本信息 2. 内容简介 3. 目录 展开 编辑本段由来 第一个版本 要想 ?? ?? 追寻万年历的由来,那故事得从远古时代的商朝说起……有名樵夫唤做万年,有一天他上山砍柴,砍罢了就坐在树下休息。他眼望著树影出神,心中想的,仍是如何将节令定准的事。

不知不觉过了大半个时辰,他才发现地上的树影已悄悄地移动了方位。万年灵机一动,心想,何不利用日影的长短来计算时间呢?回到家后,万年就设计了一个“日晷仪”。可是,一遇上阴雨天,日晷仪又失去效用了。 有一天,万年在泉边喝水,看见崖上的水很有节奏的往下滴,规律的滴水声又启发了他的灵感。回家後,万年就动手做了一个五层的漏壶,利用漏水的方法来计时。这么一来,不管天气阴晴,都可以正确地掌握时间了。有了计时的工具,万年更加用心的观察天时节令的变化。经过长期的归纳,他发现,每隔三百六十多天,天时的长短就会重覆一次。只要搞清楚日月运行的规律,就不用担心节令不准了。万年就带著自制的日晷仪及水漏壶去觐见天子祖乙,说明节令不准与天神毫不相干。祖乙觉得万年说的很有道理,就把万年留下,在天坛前盖起日晷台、漏壶亭,又派了十二个童子供万年差遣。从此以后,万年得以专心致志的研究时令。过了一段日子,祖乙派阿衡去了解万年制历的情况。万年拿出自己推算出的初步成果,说:日出日落三百六,周而复始从头来。草木荣枯分四时,一岁月有十二圆。 阿衡听後,非常忐忑不安,他担心制出准确的历法,得到天子重用,直接的威胁到他的地位。於是阿衡就以重金收买了一名刺客,准备行刺万年。无奈万年全心研究时令,几乎从不离开所住的日月阁。刺客只好趁夜深人静之时,挽起了箭射杀万年。只听得嗖的一声,一箭射中了万年的胳膊,万年应声倒下。童子们高喊抓拿刺客,守卫的兵士及时抓住了刺客,将他扭送天子。祖乙问明了是阿衡的诡计,就下令将阿衡收押,亲自到日月阁来探望万年。万年就把自己最新的研究成果报告给祖乙:现在申星追上了百星蚕百星,星象复原,子时夜交,旧岁已完,时又始春,希望天子定个节名吧!祖乙说:春为岁首,就叫春节吧。当时祖乙见万年为了制历,日夜劳瘁又受了箭伤,心中不忍,就请他入宫调养身体,万年答道:“多谢天子厚爱,只是目前的太阳历还是草历,不够准确,要把岁末尾时也闰进去。否则,久而久之,又会造成节令失常。为了不负众望,我必须留下来,继续把太阳历定准。”又经过了数十个寒暑,万年精心制定的太阳历终于完成了。当他把太阳历献给祖乙时,已是个白发苍苍的老人了。祖乙深受感动,就把太阳历定名为万年历,并封万年为日月寿星,以上就是万年历名称的由来。 第二个版本 相传,在很久以前,有个名叫万年的青年,看到当时节令很乱,想把节令定准。一天,他上山砍柴,坐在树阴下休息,树影的移动启发了他,他设计了一个测日影计天时的晷仪。可是,天阴雨雾,影响测量。后来,山崖上的滴泉引起了他的兴趣,他又动手做了一个五层漏壶。天长日久,他发现每隔三百六十多天,天时的长短就会重复一遍。当时的国君叫祖乙,天气风云的不测,使他很苦恼。 一个名叫阿衡的大臣,为讨好皇上,奏称要设天台敬祭天神。祖乙认为有理,便带领百官去祭天,却无济于事。万年知道后,忍不住就带着日晷和漏壶去见皇上,对祖乙讲清了日月运行的道理。祖乙听后龙颜大悦,感到有道理。于是把万年留下,在天坛前修建日月阁,筑起日晷台和漏壶亭。并派了十二个童子服侍万年。祖乙对万年说:"希望你能测准日月规律,推算出准确的晨夕时间,创建历法,为天下的黎民百姓造福。"有一次,祖乙传旨要阿衡去了解万年测试历法的进展情况。当他登上日月坛时,看见天坛边的石壁上刻着:日出日落三百六周而复始从头来。草木枯荣分四时,一岁月有十二圆。阿衡见此,知道万年的历法已研究成功,心中忐忑不安。他万分惧怕万年因创建历法而得宠,国君会怪罪自己提出祭祀天神的主意。于是,他阴谋策划,派了一个刺客去除掉万年。刺客攀上日月阁,见万年正在阁上观察星斗,便张弓搭箭,准备射死他。谁知,刺客被卫士发现,被当场缉拿。祖乙知后,惩处了阿衡,亲自登上日月阁看望万年。万年指着天象,对祖乙说:"现在正是十二个月满,旧岁已完,新春复始,祈请国君定个节吧。"祖乙说:"春为岁首,就叫春节吧。"冬去春来,年复一年。后来,万年经过长期观察,精心推算,制定出了准确的太阳历。当他把太阳历呈奉给

2×2矩阵式键盘

2×2矩阵式键盘 摘要:本设计主要是用来学习键盘扫描程序的设计,数码管的动态显示程序设计。设计中,将单片机8051的并行口P1的P1.0,P1.1接键盘的行,将P1.2,P1.3接键盘的列,将并行口P2的P2.7~P2.0分别接数码管的数据段g,f,a,b,d,h,e,c. 以及将P3.6,P3.7分别接数码管的偏选端,当按下第0行0列时数码管就显示00,按下第0行1列时数码管就显示01,第1行0列时数码管就显示02,第1行1列时数码管就显示03。本设计一共四个按键,用双数码管动态显示。 关键字:单片机,数码管动态显示,行列式键盘,共阴数码管 一、矩阵式键盘工作原理 如下图1,I/O接口线组成行、列结构,按键设置在行、列的交点上。行线通过上拉电阻接+5V。 第一步是CPU检测键盘上是否有按键。具体过程如下:P1.2, P1.3输出0,即将列P1.2, P1.3置成低电平,然后将行线P1.0,P1.1电平状态读入累加器A中。如果有键按下,总有一根行线电平被拉至低电平,从而使行输入状态不全为“1”。 第二步是识别是哪一个键按下。具体过程如下:先将P1.2输出为0,即将列P1.2置成低电平。然后读入行线P1.0,P1.1电平状态,如果全为“1”,则按下的键不在此列;如果不全为“1”,则按下的键必在此列;而且是该列与“0”电平线相交的交点上的那个键。再将P1.3输出为0,即将列P1.3置成低电平。做法如上。 二、数码管动态显示原理 A.数码管原理:在单片机应用系统中,经常用到LED数码管作为显示输出设备。LED数码管虽然显示信息简单,但它具有显示清晰、亮度高、使用电压低、寿命长、与单片机接口方便等特点,所以在应用中经常使用它。 LED数码管显示器是由发光二极管按一定的结构组合起来的显示器件。在单片机应用系统中通常使用的是8段式LED数码管显示器,他有公阳极和共阴极两种。如图1—1所示。其中共阳极8段发光二极管的阳极端连接在一起,阴极端分开控制,使用时公共端接电源,要使哪根数码管亮,则对应的阴极接低电平。而共阴极8段发光二极管的阴极端连接在一,阳极端分开控制,使用时公共端接地,要使哪根数码管亮,则对应的阳极接高电平即可。从a~g引脚输入不同的8位二进制编码,可显示不同的数字或字符。h为小数点位。 图1—1 在此我们着重介绍下本次实验中用到的共阴极结构的数码管。在共阴极结构中,各段发光二极管的阴极连在一起,将此公共点接地,某一段发光二极管的阴极为高电平时,该段发光。共阴极字段码:LED显示0~9某个字符时,则要求在a~dp送固定的字段码,如要使LED 显示“0”,则要求a、b、c、d、f各引脚为高电平,g和dp为低电平,字段码为“3fh” 。dp g f e d c b a对应为0 0 1 1 1 1 1 1 。共阴极字符0~9七段码如下: 字符:0 1 2 3 4 5 6 7 8 9

电子万年历

河北科技师范学院课程设计说明书 题目: 学院(系): 年级专业: 学号: 学生姓名: 指导教师:

摘要 本设计是电子万年历。具备三个功能:能显示:年、月、日、时、分、秒及星期信息,并具有可调整日期和时间功能。 我选用的是单片机8052来实现电子万年历的功能。该电子万年历能够成功实现时钟运行,调整,显示年月日时分秒及星期,温度等信息。 该电子万年历使用12MHZ晶振与单片机8052相连接,通过软件编程的方法实现了以24小时为一个周期,同时显示小时、分钟和秒的要求。利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据。同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。 电子万年历设计与制作可采用数字电路实现,也可以采用单片机来完成。若用数字电路完成,所设计的电路相当复杂,大概需要十几片数字集成块,其功能也主要依赖于数字电路的各功能模块的组合来实现,焊接的过程比较复杂,成本也非常高。若用单片机来设计制作完成,由于其功能的实现主要通过软件编程来完成,这样一来就降低了硬件电路的复杂性,从而使得其成本降低,更适合我们大学生自主研发。所以在该设计与制作中我选用了单片机8052,它是低功耗、高性能的CMOS型8位单片机。片内带有4KB的Flash存储器,且允许在系统内改写或用编程器编程。另外, 单片机8052的指令系统和引脚与8051完全兼容,片内有128B 的RAM、32条I/O口线、2个16位定时计数器、5个中断源、一个全双工串行口等。 因此,采用单片机8052原理制作的电子万年历,不仅仅在原理上能够成功实现计时等功能,也更经济,更适用,更符合我们实际生活的需要,对我们大学生来说也更加有用。

单片机课程设计4X4矩阵键盘显示

长沙学院 《单片机原理及应用》 课程设计说明书 题目液晶显示4*4矩阵键盘按键号 程序设计 系(部)电子与通信工程系 专业(班级)电气1班 姓名龙程 学号09 指导教师刘辉、谢明华、王新辉、马凌 云 起止日期— 长沙学院课程设计鉴定表

《单片机技术及应用》课程设计任务书系(部):电子与电气工程系专业:11级电子一班指导教师:谢明华、刘辉

目录 前言 .......................................................................................................................................... 错误!未定义书签。 一、课程设计目的 .................................................................................................................... 错误!未定义书签。 二、设计内容及原理 ................................................................................................................ 错误!未定义书签。 单片机控制系统原理 ...................................................................................................... 错误!未定义书签。 阵键盘识别显示系统概述 ................................................................................................ 错误!未定义书签。 键盘电路 ............................................................................................................................ 错误!未定义书签。 12864显示器 ................................................................................................................... 错误!未定义书签。 整体电路图 ........................................................................................................................ 错误!未定义书签。 仿真结果 ............................................................................................................................ 错误!未定义书签。 三、实验心得与体会 ................................................................................................................ 错误!未定义书签。 四、实验程序 ............................................................................................................................ 错误!未定义书签。参考文献 .................................................................................................................................... 错误!未定义书签。

单片机电子万年历含程序

CHANGZHOU INSTITUTE OF TECHNOLOGY 科研实践 项目名称:电子万年历设计 二级学院:电子信息与电气工程学院 专业:电气工程及其自动化班级: 10 电二 学生姓名:祝学东学号: 指导教师:庄志红职称:副教授 起止时间: 2013年12月9日—2013年12月20日 摘要 本设计是电子万年历。具备三个功能:能显示:年、月、日、时、分、秒、星期,并具有可调整日期和时间功能。 该电子万年历使用12MHZ晶振与单片机AT89C52相连接,通过软件编程的方法实现了以24小时为一个周期,同时显示小时、分钟和秒的要求。利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据。同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。 电子万年历设计与制作可采用数字电路实现,也可以采用单片机来完成。若用数字电路完成,所设计的电路相当复杂,大概需要十几片数字集成块,其功能也主要依赖于数字电路的各功能模块的组合来实现,焊接的过程比较复杂,成本也非常高。若用单片机来设计制作完成,由于其功能的实现主要通过软件编程来完成,这样一来就降低了硬件电路的复杂性,从而使得其成本降低,更适合我们大学生自主研发。 AT89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用。

实验二 矩阵键盘实验

实验二矩阵键盘实验 一、实验目的 (1)掌握矩阵键盘行列设计方法; (2)掌握矩阵键盘识别方法; (3)掌握矩阵键盘去抖原理; (4)掌握矩阵键盘控制LED或数码管的设计方法; 二、实验原理 电路图参考实验板电路。 1、MCS51系列单片机的P0~P3口作为输入端口使用时必须先向端口写入“1”。 2、用查询方式检测按键时,要加入延时(通常采用软件延时10~20mS)以消除抖动。 3、识别键的闭合,通常采用行扫描法和行反转法。行扫描法是使键盘上某一行线为低电平,而其余行接高电平,然后读取列值,如读列值中某位为低电平,表明有键按下,否则扫描下一行,直到扫完所有行。 行反转法识别闭合键时,要将行线接一并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作于输入方式,程序使CPU通过输出端口在各行线上全部送低电平,然后读入列线值,如此时有某键被按下,则必定会使某一列线值为0。然后,程序对两个并行端口进行方式设置,使行线工作于输入方式,列线工作于输出方式,并将刚才读得的列线值从列线所接的并行端口输出,再读取行线上输入值,那么,在闭合键所在行线上的值必定为0。这样,当一个键被接下时,必定可以读得一对唯一的行线值和列线值。 由于51单片机的并口能够动态地改变输入输出方式,因此,矩阵键盘采用行反转法识别最为简便。 行反转法识别按键的过程是:首先,将4个行线作为输出,将其全部置0,4个列线作为输入,将其全部置1,也就是向P1口写入0xF0;假如此时没有人按键,从P1口读出的值应仍为0xF0;假如此时1、4、7、0四个键中有一个键被按下,则P1.6被拉低,从P1口读出的值为0xB0;为了确定是这四个键中哪一个被按下,可将刚才从P1口读出的数的低四位置1后再写入P1口,即将0xBF写入P1口,使P1.6为低,其余均为高,若此时被按下的键是“4”,则P1.1被拉低,从P1口读出的值为0xBE;这样,当只有一个键被按下时,每一个键只有唯一的反转码,事先为12个键的反转码建一个表,通过查表就可知道是哪个键被按下了。 三、实验内容 1.编写程序,做到在键盘上每按一个数字键(0-F)用LED数码管将该代码显示出来。按其它键退出。 2.利用Proteus,设计4*4矩阵键盘硬件电路,并仿真实现。

简易万年历的设计说明

目录 第一部分设计任务 1.1 设计题目及要求 (1) 1.2.1 方案一 (1) 1.2.2 方案二 (1) 第二部分系统硬件平台的设计 2.1 总体设计方案说明 (2) 2.2 单片机最小系统 (2) 2.2.1 STC89C52单片机介绍 (2) 2.2.2 时钟电路 (4) 2.2.3 复位电路 (4) 2.3 1602液晶模块 (5) 2.4 时钟芯片DS1302 (6) 第三部分系统软件的设计与实现 3.1 主程序 (8) 3.2.1 Protues 仿真软件介绍 (8) 3.2.2 仿真电路图 (9) 第四部分安装调试 4.1 系统软、硬件调试 (10) 4.1.1 调试步骤 (11) 4.1.2 故障及处理 (11) 课程设计总结 (12) 参考文献 (12)

第一部分设计任务 1.1 设计题目及要求 设计一个基于单片机的简易万年历。 (1)可以在LCD液晶上显示秒、分、时、星期、日、月、年; (2)能够判断平年、润年; (3)秒、分、时、星期、日、月、年可调; (4)具有单片机断电记忆功能,在单片机掉电后无需重新设置。 1.2 备选方案设计与比较 1.2.1 方案一 直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数,并用程序判断平年和闰年,用数码管显示时、分、秒、年、月、日、星期。由于需要显示的数字比较多,则需要的数码管个数比较多,采用数码管显示显得太浪费,并且多的数码管焊接时也比较复杂,此种方案虽然减少芯片的使用,节约成本,但是,实现的时间误差较大,最主要的问题是些方法在单片机主电源断电后,计时将恢复初始值。所以不采用此种方法作为显示。 1.2.2 方案二 采用DS1302时钟芯片实现时钟,用1602LCD液晶显示屏显示时、分、秒、年、月、日、星期。DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,不需要在程序中采用定时,而且精度高,工作电压2.5V~5.5V围,2.5V时耗电小于300nA,此芯片最主要的特点是具有备用电源引脚,在单片机主电源掉电后,备用电源供电,使得DS1302继续工作,时钟继续运行,即具备掉电记忆功能,符合课程设计要求,液晶显示屏的显示功能强大,可显示大量数字和英文字母,以及一些特殊字符,并且显示多样,清晰可见,且价格适中,固采用此方案。

4×4矩阵式键盘的课程设计

“电子创新设计与实践”课程期中 课题设计报告 姓名:张思源,学:20102121026,年级:2010,专业:电信

报告内容 设计一个4*4矩阵键盘,并编写相关程序 摘要 1.4×4矩阵式键盘程序识别原理。 2.4×4矩阵式键盘按键的设计方法。 报告正文: 一、设计原理 (1)如图14.2所示,用单片机的并行口P3连接4×4矩阵键盘,并以单片机的P3.0-P3.3各管脚作输入线,以单片机的P3.4-P3.7各管脚作输出线,在数码管上显示每个按键“0-F”的序号。 (2)键盘中对应按键的序号排列如图14.1所示。 二、参考电路

图14.2 4×4矩阵式键盘识别电路原理图 图14.1 4×4键盘0-F显示

图14.3 4×4矩阵式键盘识别程序流程图 三、电路硬件说明 (1)在“单片机系统”区域中,把单片机的P3.0-P3.7端口通过8联拨动拨码开关JP3连接到“4×4行列式键盘”区域中的M1-M4,N1-N4端口上。 (2)在“单片机系统”区域中,把单片机的P0.0-P0.7端口连接到“静态数码显示模块”区域中的任何一个a-h端口上;要求:P0.0对应着a,P0.1对应着b,……,P0.7对应着h。 四、程序设计内容

(1)4×4矩阵键盘识别处理。 (2)每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU通信。键盘的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么?还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地;另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。 五、程序流程图(如图14.3所示) 六、汇编源程序 ;;;;;;;;;;定义单元;;;;;;;;;; COUNT EQU 30H ;;;;;;;;;;入口地址;;;;;;;;;; ORG 0000H LJMP START ORG 0003H RETI ORG 000BH RETI ORG 0013H RETI ORG 001BH RETI

电子万年历设计(基于AT89C51单片机和DS1302时钟芯片)1

随着人们生活水平的提高和生活节奏的加快,对时间的要求越来越高,精准数字计时的消费需求也是越来越多。 二十一世纪的今天,最具代表性的计时产品就是电子万年历,它是近代世界钟表业界的第三次革命。第一次是摆和摆轮游丝的发明,相对稳定的机械振荡频率源使钟表的走时差从分级缩小到秒级,代表性的产品就是带有摆或摆轮游丝的机械钟或表。第二次革命是石英晶体振荡器的应用,发明了走时精度更高的石英电子钟表,使钟表的走时月差从分级缩小到秒级。第三次革命就是单片机数码计时技术的应用(电子万年历),使计时产品的走时日差从分级缩小到1/600万秒,从原有传统指针计时的方式发展为人们日常更为熟悉的夜光数字显示方式,直观明了,并增加了全自动日期、星期、温度以及其他日常附属信息的显示功能,它更符合消费者的生活需求!因此,电子万年历的出现带来了钟表计时业界跨跃性的进步…… 我国生产的电子万年历有很多种,总体上来说以研究多功能电子万年历为主,使万年历除了原有的显示时间,日期等基本功能外,还具有闹铃,报警等功能。商家生产的电子万年历更从质量,价格,实用上考虑,不断的改进电子万年历的设计,使其更加的具有市场。 本设计为软件,硬件相结合的一组设计。在软件设计过程中,应对硬件部分有相关了解,这样有助于对设计题目的更深了解,有助于软件设计。基本的要了解一些主要器件的基本功能和作用。 除了采用集成化的时钟芯片外,还有采用MCU的方案,利用AT89系列单片微机制成万年历电路,采用软件和硬件结合的方法,控制LED数码管输出,分别用来显示年、月、日、时、分、秒,其最大特点是:硬件电路简单,安装方便易于实现,软件设计独特,可靠。AT89C51是由ATMEL 公司推出的一种小型单片机。95年出现在中国市场。其主要特点为采用Flash存贮器技术,降低了制造成本,其软件、硬件与MCS-51完全兼容,可以很快被中国广大用户接受。 本文介绍了基于AT89C51单片机设计的电子万年历。 首先我们在绪论中简单介绍了单片机的发展与其在中低端领域中的优

电子万年历设计报告

电子万年历设计报告专业电气工程及其自动化 班级电气(2)班 姓名马志欣 学号 小组第22组 指导教师王松林 电子万年历 概述 电子万年历是一种应用非常广泛的日常计时工具,数字显示的日历钟已经越来越流行,特别是适合在家庭居室、办公室、大厅、议室、车站和广场等使用,壁挂式LED数码管显示的日历钟逐渐受到人们的欢迎。LED数字显示的日历钟显示清晰直观、走时准确、可以进行夜视,二十一世纪的今天,最具代表性的计时产品就是电子万年历,它是近代世界钟表业界的第三次革命。第一次是摆和摆轮游丝的发明,相对稳定的机械振荡频率源使钟表的走时差从分级缩小到秒级,代表性的产品就是带有摆或摆轮游丝的机械钟或表。第二次革命是石英晶体振荡器的应用,发明了走时精度更高的石英电子钟表,使钟表的走时月差从分级缩小到

秒级。第三次革命就是单片机数码计时技术的应用(电子万年历),使计时产品的走时日差从分级缩小到1/600万秒,从原有传统指针计时的方式发展为人们日常更为熟悉的夜光数字显示方式,直观明了,并增加了全自动日期、星期、温度以及其他日常附属信息的显示功能,它更符合消费者的生活需求!因此,电子万年历的出现带来了钟表计时业界跨跃性的进步。随着科学技术的快速发展,不断研究创新,对于电子万年历采用直观的数字显示,可以同时显示年,月,日,时,分,温度等信息,还具有时间校准等功能,该电路采用AT89C51单片机作为核心,电压可选用3-5V电压供电。 一、内容摘要 本设计利用数量较少的芯片制作了一个运用简单的电子万年历。以单片机作为本设计的核心,实现时钟日历的显示:用八段LED数码管分别显示年、月、日、星期、时、分、秒,用DS1302作为该设计的实时时钟芯片,用74LS164寄存器来驱动数码管的各段码,用三极管来驱动数码管的各位码。并且通过AT89C51单片机读取数字温度芯片的内部数据,进行处理后送到数码管显示其温度功能,通过按键实现调试功能。 二、设计要求 (1)设计电子万年历,实现时钟日历的显示,或显示年、月、日或时、分、秒,用DS1302作为设计的实时时钟芯片。 (2)温度记录仪电路设计:

相关文档
最新文档