您的位置 首页 芯闻

AT89S51单片机对数字电子钟的规划

AT89S51单片机对数字电子钟的设计-设计一个以AT89S51单片机为核心的数字电子钟控制器,实现电子钟的时间、日期交替显示、闹钟功能,并可通过按钮开关或键盘切换显示内容、调整参数、设置闹钟,在单片机实验板上模拟调试实现控制器的功能。

一、规划意图:

经过单片机使用产品的规划与调试进程,稳固课程所学理论知识,开端了解单片机使用体系规划与调试的办法。

二、规划要求:

规划一个以AT89S51单片机为中心的数字电子钟操控器,完成电子钟的时刻、日期替换显现、闹钟功用,并可经过按钮开关或键盘切换显现内容、调整参数、设置闹钟,在单片机试验板上模仿调试完成操控器的功用。详细规划要求如下:

1.开机自检,查看相关接口及数码管显现器指示灯蜂鸣器等外设是否正常。

2.8位数码管显现器平常以必定的时刻距离、适宜的格局显现时刻和日期信息,时刻显现时、分、秒;日期显现年(2000~2099)、月、日;设置闹钟功用时显现时、分、开/关状况。

3.可经过按键设定时刻、日期、闹钟等参数、手动切换显现。按键可用独立式按键或队伍式键盘完成。设定参数进程有适宜的办法指示当时可批改的内容。

4.对开关量输入进行软件消颤动处理,参数的设定有容错处理,如:小时不能超过23,日期中每月最大天数、闰年等。

5.用Protel规划可完成上述功用的操控器的原理图(最小使用体系)。

扩展功用(选做):

1.可设置屡次闹钟。

2.显现星期功用。

3.参数设定进程中,较长时刻无操作,则主动康复为正常显现办法。。

4.其它自选的扩展功用。

三、整体方案规划及阐明

整体功用框图:

硬件:

8个LED选用动态扫描以节省驱动本钱;

走时选用内部T0计时中止;

4×4矩阵键盘扫描选用线反转法,以中止扫描计数避免颤动;

……

软件:

选用C言语完成。

四、体系资源分配阐明(接口、存储器分配)

AT89S51单片机对数字电子钟的规划

1.接口:

89S51的P1口接8个LED小灯;

89S51的P3_2接蜂鸣器(低电平鸣响);

外扩一片8255:

89S51单片机的P0口是低8位地址与数据复用的,现在咱们用74HC373别离出地址,89S51高位地址的P2_0(A8)接8255的片选端(/CS), 低位地址Q1Q0(A1A0)与8255的A1A0衔接,数据位P0_7~P0_0别离接8255的D_7~D_0。 以此得到的8255端口的地址别离为:

PA:xxxxxxx0 xxxxxx00取0x0fefc; PB:xxxxxxx0 xxxxxx01取0x0fefd;

PC:xxxxxxx0 xxxxxx10取0x0fefd; CTL:xxxxxxx0 xxxxxx11取0x0feff;

8255的PA口操控LED数码管的8个显现段;PB口别离接8个LED数码管的共阳极;

PC口别离接4×4矩阵键盘的行线和列线。

2.存储分配:

struct{ //闹钟时、分、秒 ,共设6个闹钟(初始状况默许:00-00-F1)

uchar hour;

uchar minute;

uchar isON;

}alarm[6]={{0,0,0}};

uchar hour=12,minute=0,second=0;//时、分、秒

uchar temp_second; //用于当即切换显现时刻/日期

uint year=2011;// 年

uchar month=12;// 月

uchar day=1; // 日

uchar week=6;// 星期

uchar Mdays[]={0,31,28,31,30,31,30,31,31,30,31,30,31};//各月天数

uchar alarm_isON=1; //闹钟总开关

uchar alarm_staTIon=0; //闹钟状况

uchar ano; //闹钟号(当时时刻到的闹钟号)

uchar start_minute;//开端响铃的时刻(也便是所定闹钟的时刻)

uint count_ms25=0; //软件计数器(计数40个25毫秒达1s)

uchar show_model=0; // 显现形式:[0]切换显现时刻/日期 [1]切换显现日期/时刻

const uchar fixTIme=0x00;//时刻批改量

uchar key=0xff;//取得的当时键值

uchar last_key=0xff; //终究一次扫描到的按键(非0xff)

uchar key_count=0;//扫描到同一按键的次数

uchar Edown=0; //闹钟开关键是否按下

uchar led_buf[8]={24,24,24,24,24,24,24,24}; //时刻日期显现缓冲区

uchar code led_table1[]={0x0c0,0x0f9,0x0a4,0x0b0, 0x99,0x92,0x82,0x0f8,0x80,0x90,

0x88,0x83,0x0C6,0x0a1,0x86,0x8e,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,

0x08,0x03,0x46,0x21,0x06,0x0e,0x7f,0x0bf,0xff};//数码管段码

uchar code KBTable[] = {‘1’,‘2’,‘3’,‘F’,‘4’,‘5’,‘6’,‘E’,‘7’,‘8’,‘9’,‘C’,‘0’,‘A’,‘B’,‘D’};//键值(可有可无)

五、软件流程图及阐明

1.流程图:

AT89S51单片机对数字电子钟的规划

2.首要程序段阐明:

(1)显现:

void LED_show(uchar buf[])

{

uchar i,num,pLED=0x80;

for(i=0;i《8;i++)

{

num=buf[i];

PA=led_table1[num]; /*送字段码*/

PB=pLED; /*送字位码*/

pLED》》=1; /*右移一位*/

Delay(1); /*延时*/

}

}

(2)键盘(本次规划对下面两种扫描办法都进行了完成):

a.行扫描法:顺次从榜首至最末行线上宣布低电平信号, 假如该行线所衔接的键没有按下的话, 则列线所接的端口得到的是全“1”信号, 假如有键按下的话, 则得到非全“1”信号。

/*键盘扫描(行扫描法,延时消抖)********************************************************

uchar code KBTable[] = {

0xEE,‘1’,0xDE,‘4’,0xBE,‘7’,0x7E,‘0’,

0xED,‘2’,0xDD,‘5’,0xBD,‘8’,0x7D,‘A’,

0xEB,‘3’,0xDB,‘6’,0xBB,‘9’,0x7B,‘B’,

0xE7,‘F’,0xD7,‘E’,0xB7,‘C’,0x77,‘D’,

0x00,0xff};

uchar Get_key(void); // 获取终究键值

{ uchar i;

uchar line, row, k_value;

staTIc uchar lastkey=0xff;

CTL=0x88; //CH输入,CL输出 10001000

PC=PC & 0xf0; // PC0~PC3输出0 , 输入PC4~ PC7(默许1无键按下)

if ((PC & 0xf0) == 0xf0)

{

lastkey=0xff;

return 0xff; //无键按下

}

row = PC;

Delay(4); //延时,消除颤动

if (row != PC)

{

lastkey=0xff;

return 0xff; //判为颤动

}

line=0xFE;

for (i=0;i《4;i++)

{ PC = line; //输出扫描信号

row=PC; //读键盘口

if ((row & 0xf0) != 0xf0)

break;

line=(line《《1)+1;

}

if (i==4)

{ lastkey=0xff; return 0xff; }

k_value = (row & 0xf0) “ (line & 0x0f) ;

for (i=0; i《32; i+=2)

if (k_value == KBTable[i])

break;

if(lastkey==KBTable[i+1])

return 0xff;

lastkey=KBTable[i+1];

return KBTable[i+1];

}

b.线反转法:线反转法也是辨认闭合键的一种常用办法, 该法比行扫描速度快, 但在硬件上要求行线与列线外接上拉电阻。先将行线作为输出线, 列线作为输入线, 行线输出全“0”信号, 读入列线的值, 那么在闭合键地点的列线上的值必为0;然后从列线输出全“0”信号,再读取行线的输入值,闭合键地点的行线值必为 0。这样,当一个键被按下时, 必定可读到一对仅有的队伍值。再由这一对队伍值能够求出闭合键地点的方位。

//一次键盘扫描(线反转法,中止扫描计数去抖)*********************************************************

uchar code KBTable[] = {‘1’,‘2’,‘3’,‘F’,‘4’,‘5’,‘6’,‘E’,‘7’,‘8’,‘9’,‘C’,‘0’,‘A’,‘B’,‘D’};

//key_index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

uchar key_scan(void) //回来 ‘0’,‘1’,‘2’。..‘E’,‘F’,0xff

{ uchar key_index,temp=0;

CTL=0x88; //CH输入,CL输出 10001000

PC=PC & 0xf0; //将低四方位0

if(PC!=0xF0) //判别按键是否按下 假如按钮按下 会拉低CH其间的一个端口

{

temp=PC; //读PC口

temp=temp&0xf0; //屏蔽低四位

temp=~

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/xinwen/346769.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部