《日历时钟单片机课程设计(共24页).doc》由会员分享,可在线阅读,更多相关《日历时钟单片机课程设计(共24页).doc(24页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上单片机课程设计 日历时钟与键盘显示程序设计姓名:管曌学号:班级:J通信0801指导老师:熊书明日历时钟与键盘显示程序设计一、 设计目的(1) 能在LED显示器上实现正常的时分秒计时(2)能通过键盘输入当前时间,并从该时间开始计时(3)有校时、校分功能(4)有报时功能,通过指示灯表示(5)有闹时功能,闹时时间可以设定,通过指示灯表示二、设计内容该课程设计是利用MCS-51单片机内部的定时计数器、中断系统、以及行列键盘和LED显示器等部件,设计一个单片机电子时钟。设计的电子时钟通过数码管显示,并能通过按键实现设置时间和暂停、启动控制等。三、MCS-51单片机系统简介 单片
2、机应用系统由硬件系统和软件系统两部分组成。硬件系统是指单片机以及扩展的存储器、IO接口、外围扩展的功能芯片以及接口电路。软件系统包括监控程序和各种应用程序。 在单片机应用系统中,单片机是整个系统的核心,对整个系统的信息输入、处理、信息输出进行控制。与单片机配套的有相应的复位电路、时钟电路以及扩展的存储器和IO接口,使单片机应用系统能够运行。 在一个单片机应用系统中,往往都会输入信息和显示信息,这就涉及键盘和显示器。在单片机应用系统中,一般都根据系统的要求配置相应的键盘和显示器。配置键盘和显示器一般都没有统一的规定,有的系统功能复杂,需输入的信息和显示的信息量大,配置的键盘和显示器功能相对强大,
3、而有些系统输入/输出的信息少,这时可能用几个按键和几个LED指示灯就可以进行处理了。在单片机应用系统在中配置的键盘可以是独立键盘,也可能是矩阵键盘。显示器可以是LED指示灯,也可以是LED数码管,也可以是LCD显示器,还可以使用CRT显示器。单片机应用系统中键盘一般用的比较多的是矩阵键盘,显示器用的比较多的是LED数码管还LCD显示器。四、设计方案通过键盘输入,设置当前时间存入S-3530A,然后从S-3530A读取实时时间并显示在七段码LED显示上,键盘和LED显示通过键盘专用芯片HD7279A进行控制,7279A也是I2C总线接口的芯片,系统中采用并行口线模拟I2C实现 C8051F020
4、和HD7279A的通信,用硬件实现S-3530A和HD7279A的连接。 用定时计数器T0,工作于定时,采用方式1,对系统时钟进行定时计数,初值设为23时59分50秒。定时时间为50ms。用片内RAM的7BH单元对50ms计数,计20次产生秒计数器78H单元加1,秒计数器加到60则分计数器79H单元加1,分计数器加到60则时计数器7AH单元加1,时计数器加到24则时计数器清0。然后把秒、分、时计数器分成十位和个位放到8个数码管的显示缓冲区,通过数码管显示出来。显示格式为小时十位、小时个位-分十位、分个位-秒十位、秒个位。在处理过程中加上了按键判断程序,能对按键处理,1是时加一,2是时减一,3是
5、分加一,4是分减一,5是秒清零,D是闹钟时间的设定,E是进行校时,F是暂停键。 五、系统软件设计流程:1.主程序流程如图所示:开始初始化显示初始时间调用显示子程序进入功能程序按下键否?否是2.时间设定程序流程如图所示:开始初始化读出数据放入RAM中调用显示子程序显示时间扫描按键进行时间设置读出数据并保存返回主菜单3.闹铃设定流程图如图所示:开始初始化选择闹铃读出数据放入RAM中显示闹铃扫描按键进行闹铃设置读出数据并保存返回主菜单六、程序#include c8051f020.h #include #include test7279.hunsigned char Count1ms,set,set1
6、,set2;/int count;static int time3=23,59,50;/current timestatic char disptime6=2,3,5,9,5,0;/显示时间int dertime3=00,00,01; int nowtime3=00,01,00;/闹钟时间void Delay1us(unsigned char us)while (us) _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); /占用一个指令周期 -us;void SYSCLK_Init (void) int i; OSCXCN = 0x67; for (i=0
7、; i 8; TL0 = -SYSCLK/1000; TR0 = 1; IE|= 0x2; char GetKeyValue(void)char KeyValue;if (CPT1CN&0x40) return -1;/无键按下 Send7279Byte(0x15);/发读键盘指令 0001 0101KeyValue=Receive7279Byte();NOSELECT7279; /置CS高电平 return KeyValue; void WaitKeyOff(void)while (!(CPT1CN&0x40);void inputnum(void) /i=5开始,输入数字显示 dispti
8、me5-i i=5-0 char j,KeyValue,i;i=5;while(1)KeyValue=GetKeyValue();WaitKeyOff();if(KeyValue%16)=0) & (KeyValue%16)=9) /i=5 4 3 2 1 0 disptime5-i=KeyValue;if(disptime0=1) | (disptime0=2) & (disptime14) & (disptime26) & (disptime46) ) Send7279Byte(0xC8+i); Send7279Byte(KeyValue); NOSELECT7279; i-; if(i0
9、) break; for (j=0;j3;j+) /int-char dertimej=disptime2*j*10+disptime2*j+1; if(set1) set1=!set1;/ 设置时间if(set2) set2=!set2;/ 设置时间void FlashLED(unsigned char No)char i;Send7279Byte(0x88);/发闪烁指令 i=0x1;while (No)i=i1;No-;Send7279Byte(i); /1闪烁NOSELECT7279; /置CS高电平 void main(void)char j,KeyValue; WDTCN = 0x
10、de;WDTCN = 0xad; /关看门狗SYSCLK_Init (); /初始化时钟Timer0_Init();/初始化定时器PORT_Init (); /初始化IO口SPI0_Init (); /初始化SPI0CPT1CN|=0x80;/使能比较器1REF0CN = 0x03; /使能片内参考电压DAC0CN |= 0x80;/使能DAC0DAC0H=0;DAC0L=0;EA=1;/开中断Delay1us(25000);/等待25ms复位时间 Send7279Byte(0xA4);/发复位指令 NOSELECT7279; DispLED(disptime,0); /显示初始时间while
11、(1) KeyValue=GetKeyValue(); WaitKeyOff(); if(KeyValue%16)=0x0f) set=!set; if(set) /起停* if(KeyValue%16)=0x0e)set1=!set1;/ 设置时间if(KeyValue%16)=0x0d)set2=!set2;/ 设置闹钟if(set1)/设置时间* DispLED(-,0);inputnum();for (j=0;j3;j+) /int-char timej=dertimej; if(set2)/ 设置闹钟* DispLED(-,0);inputnum();for (j=0;j10) &
12、(time0=nowtime0)FlashLED(8);if (time2=60) /分time2=0;time1=time1+1;if (time1=60) / 时 time1=0;time0=time0+1;if(time1=00) & (time2=00) FlashLED(8);if (time0=24) time0=0; if (set!=1) for (i=0;i3;i+) /int-char disptime2*i=timei/10; disptime2*i+1=timei%10; DispLED(disptime,0); /显示时间* test7279.h#include c8
13、051f020.h #include sbitHD7279_DAT=P17;sbitHD7279_CLK=P16;#define NOSELECT7279 P5 |= 0x80/SPICS4(P57)=1#define SELECT7279 P5 &= (0x80) /SPICS4(P57)=0;#define Set7279DAT HD7279_DAT=1#define Clr7279DAT HD7279_DAT=0#define Set7279CLK HD7279_CLK=1#define Clr7279CLK HD7279_CLK=0/ HD7279测试/演示程序 /I/O口初始化 vo
14、id Delay1ms(unsigned char T);void Delay1s(unsigned char T);void Delay1us(unsigned char T);void Send7279Byte(unsigned char ch)char i;SELECT7279; /置CS低电平 Delay1us(50);/延时50for (i=0;i8;i+)if (ch&0x80)/输出7位到HD7279A的DATA端 1000 0000Set7279DAT;elseClr7279DAT;Set7279CLK;/置CLK高电平 ch=ch1;/待发数据左移 Delay1us(8);/
15、延时8Clr7279CLK;/置CLK低电平 Delay1us(8);/延时50Clr7279DAT;/发送完毕,DATA端置低,返回 unsigned char Receive7279Byte(void)unsigned char i,ch;ch=0;Set7279DAT;/DATA端置为高电平,输入状态Delay1us(50);/延时50for (i=0;i8;i+)Set7279CLK;/置CLK高电平Delay1us(8);/延时8ch=ch1;/接收数据左移1位if (HD7279_DAT)ch+=1;/接收1位数据Clr7279CLK;/置CLK低电平Delay1us(8);/延时
16、8Clr7279DAT;/接收完毕,DATA端重新置成低电平(输出状态)return ch;void BlankLED(unsigned char ch)Send7279Byte(0x98);/发消隐指令 Send7279Byte(ch); /1-显示 0-消隐NOSELECT7279; /置CS高电平 unsigned char code BdSeg=0x7e,0x30,0x6d,0x79, / 0 1 2 3 0x33,0x5b,0x5f,0x70, / 4 5 6 7 0x7f,0x7b,0x77,0x1f, / 8 9 a b 0x4e,0x3d,0x4f,0x47, / c d e
17、f 0x00,0x01; /*; b6; -; b1| b0 |b5; - small; b2| b3 |b4; - .b7*/void DispLED(char *DispBuf,char ShowDot)/ShowDot 显示小数点位 char i,ch;ShowDot-;for (i=0;i=a) & (ch=A) & (ch=F) ch-=A;ch+=0xa;Send7279Byte(0x90+5-i);/不译码if (ch= )Send7279Byte(0x00); elseif (ch=-) Send7279Byte(0x01); else if (ShowDot=i)Send72
18、79Byte(0x80|BdSegch&0x0f); elseSend7279Byte(BdSegch&0x0f); NOSELECT7279; /置CS高电平 C8051F020.h#ifndef _C8051F020_#define _C8051F020_#defineSYSCLK/ 系统时钟取自外部晶体 /*-;Copyright (C) 2001 CYGNAL INTEGRATED PRODUCTS, INC.; All rights reserved.; FILE NAME : C8051F020.H ; TARGET MCUs: C8051F020, F021, F022, F02
19、3 ; DESCRIPTION: Register/bit definitions for the C8051F02x product family. ; REVISION 1.0 ;-*/* BYTE Registers */sfr P0 = 0x80;/* PORT 0 */sfr SP = 0x81;/* STACK POINTER */sfr DPL = 0x82;/* DATA POINTER - LOW BYTE */sfr DPH = 0x83;/* DATA POINTER - HIGH BYTE */sfr P4 = 0x84; /* PORT 4 */sfr P5 = 0x
20、85; /* PORT 5 */sfr P6 = 0x86; /* PORT 6 */sfr PCON = 0x87;/* POWER CONTROL */sfr TCON = 0x88;/* TIMER CONTROL */sfr TMOD = 0x89;/* TIMER MODE */sfr TL0 = 0x8A;/* TIMER 0 - LOW BYTE */sfr TL1 = 0x8B;/* TIMER 1 - LOW BYTE */sfr TH0 = 0x8C;/* TIMER 0 - HIGH BYTE */sfr TH1 = 0x8D;/* TIMER 1 - HIGH BYTE
21、 */sfr CKCON = 0x8E;/* CLOCK CONTROL */sfr PSCTL = 0x8F;/* PROGRAM STORE R/W CONTROL */sfr P1 = 0x90;/* PORT 1 */sfr TMR3CN = 0x91;/* TIMER 3 CONTROL */sfr TMR3RLL = 0x92;/* TIMER 3 RELOAD REGISTER - LOW BYTE */sfr TMR3RLH = 0x93;/* TIMER 3 RELOAD REGISTER - HIGH BYTE */sfr TMR3L = 0x94;/* TIMER 3 -
22、 LOW BYTE */sfr TMR3H = 0x95;/* TIMER 3 - HIGH BYTE */sfr P7 = 0x96; /* PORT 7 */sfr SCON0 = 0x98;/* SERIAL PORT 0 CONTROL */sfr SBUF0 = 0x99;/* SERIAL PORT 0 BUFFER */sfr SPI0CFG = 0x9A;/* SERIAL PERIPHERAL INTERFACE 0 CONFIGURATION */sfr SPI0DAT = 0x9B;/* SERIAL PERIPHERAL INTERFACE 0 DATA */sfr A
23、DC1 = 0x9C; /* ADC 1 DATA */sfr SPI0CKR = 0x9D;/* SERIAL PERIPHERAL INTERFACE 0 CLOCK RATE CONTROL */sfr CPT0CN = 0x9E;/* COMPARATOR 0 CONTROL */sfr CPT1CN = 0x9F;/* COMPARATOR 1 CONTROL */sfr P2 = 0xA0;/* PORT 2 */sfr EMI0TC = 0xA1; /* EMIF TIMING CONTROL */sfr EMI0CF = 0xA3; /* EXTERNAL MEMORY INT
24、ERFACE (EMIF) CONFIGURATION */sfr P0MDOUT = 0xA4;/* PORT 0 OUTPUT MODE CONFIGURATION */sfr P1MDOUT = 0xA5;/* PORT 1 OUTPUT MODE CONFIGURATION */sfr P2MDOUT = 0xA6;/* PORT 2 OUTPUT MODE CONFIGURATION */sfr P3MDOUT = 0xA7;/* PORT 3 OUTPUT MODE CONFIGURATION */sfr IE = 0xA8;/* INTERRUPT ENABLE */sfr SA
25、DDR0 = 0xA9; /* SERIAL PORT 0 SLAVE ADDRESS */sfr ADC1CN = 0xAA; /* ADC 1 CONTROL */sfr ADC1CF = 0xAB; /* ADC 1 ANALOG MUX CONFIGURATION */sfr AMX1SL = 0xAC; /* ADC 1 ANALOG MUX CHANNEL SELECT */sfr P3IF = 0xAD; /* PORT 3 EXTERNAL INTERRUPT FLAGS */sfr SADEN1 = 0xAE; /* SERIAL PORT 1 SLAVE ADDRESS M
26、ASK */sfr EMI0CN = 0xAF; /* EXTERNAL MEMORY INTERFACE CONTROL */sfr P3 = 0xB0;/* PORT 3 */sfr OSCXCN = 0xB1;/* EXTERNAL OSCILLATOR CONTROL */sfr OSCICN = 0xB2;/* INTERNAL OSCILLATOR CONTROL */sfr P74OUT = 0xB5; /* PORTS 4 - 7 OUTPUT MODE */sfr FLSCL = 0xB6;/* FLASH MEMORY TIMING PRESCALER */sfr FLAC
27、L = 0xB7;/* FLASH ACESS LIMIT */sfr IP = 0xB8;/* INTERRUPT PRIORITY */sfr SADEN0 = 0xB9; /* SERIAL PORT 0 SLAVE ADDRESS MASK */sfr AMX0CF = 0xBA;/* ADC 0 MUX CONFIGURATION */sfr AMX0SL = 0xBB;/* ADC 0 MUX CHANNEL SELECTION */sfr ADC0CF = 0xBC;/* ADC 0 CONFIGURATION */sfr P1MDIN = 0xBD; /* PORT 1 INPUT MODE */sfr ADC0L = 0xBE;/* ADC 0 DATA - LOW BYTE */sfr ADC0H = 0xBF;/* ADC 0 DATA - HIGH BYTE */sfr SMB0CN = 0xC0;/* SMBUS 0 CONTROL */sfr SMB0STA = 0xC1;/* SMBUS 0 STATUS
限制150内