基于51单片机的自动打铃系统
更新时间:2024-01-26 21:42:01 阅读量: 教育文库 文档下载
大连民族学院2007级电子信息工程专业单片机系统课程设计报告
机电信息工程学院
单片机系统课程设计报告
完成日期:2010年5月31日
系: 专 业: 班 级: 设计题目: 学生姓名: 指导教师:
电子信息工程系 电子信息工程
072班 自动打铃系统设计 张锡斌 仇龙佳 刘忠富 于为民
大连民族学院2007级电子信息工程专业单片机系统课程设计报告
目 录
一、设计任务和性能指标 ........................................ 2
1.1设计任务 ................................................................................................................................ 2 1.2性能指标 ................................................................................................................................ 2
二、设计方案 ......................................................... 2 三、系统硬件设置 ................................................. 3
3.1、单片机最小系统 ................................................................................................................. 3 3.2时钟电路DS1302 .................................................................................................................. 4 3.3、显示电路的设计 ................................................................................................................. 5 3.4、键盘接口的设计 ................................................................................................................. 5 3.5打铃电路的设计 .................................................................................................................... 6
四、系统软件设计 ................................................. 7
4.1程序流程图 ............................................................................................................................ 7 4.2主程序设计 .......................................................................................................................... 10 4.3显示子程序的设计 .............................................................................................................. 11
五、调试及性能分析 ........................................... 12
5.1调试步骤 .............................................................................................................................. 12 5.2性能分析 .............................................................................................................................. 12
六、心得体会 ....................................................... 12 参考文献 ............................................................... 13 附录1 系统硬件电路图 ...................................... 14 附录2 程序清单 ................................................ 15
大连民族学院2007级电子信息工程专业单片机系统课程设计报告
一、设计任务和性能指标
1.1设计任务
用单片机器件为主体,设计一台自动打铃系统。 (一)基本要求
1、基本计时和显示功能(用12小时制显示)。包括上下午标志,时、分的数
字显示,秒信号指示。
2、能设置当前时间(含上、下午,时,分)。
3、能实现基本打铃功能,规定:上午6:00起床铃:打铃5秒、停2秒、再打铃5秒。下午10:30熄灯铃:打铃5秒、停2秒、再打铃5秒。铃声可用小喇叭播放,凡是用到铃声功能的均按此处理。 (二)发挥部分
1、增加整点报时功能,整点时响铃5秒,要求有控制启动和关闭功能。 2、增加调整起床铃、熄灯铃时间的功能。
3、增设上午4节课的上下课打铃功能,规定如下: 7.30 上课,8.20下课:8.30上课,9.20下课;9.40 上课,10.30下课;10.40上课,11.30下课;每次铃声5秒。 4、特色和创新自选。 1.2性能指标
1. 时钟:上下午(1位)、时(2位) 、分(2位)
2. 校对键:确认键/设置键 、右移键/灭铃键、加键、减键 3. 响铃:蜂鸣器二.设计方案
二、设计方案
按照系统设计的功能的要求,初步确定设计系统由主控模块、时钟模块、显示模块、键扫描接口电路共四个模块组成,电路系统构成框图如图1.1所示通过内部定时产生中断,从而驱动电铃打铃。电路系统构成框图如图1.1所示。主控芯片使用51系列AT89C52单片机,采用高性能的静态80C51设计,由先进工艺制造,并带有非易失性Flash程序存储器。它是一种高性能、低功耗的8位COMS微处理芯片,市场应用最多。
时钟芯片使用美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片DS1302。采用DS1302作为主要计时芯片、可以做到计时准确。更重要的是,DS1302可以在很小的电流的后备电源(2.5~5.5V电源,在2.5V时耗电小于300nA)下继续计时,并可编程选择多种充电电流对后备电源进行慢速
充电,可以保证后备电源基本不耗电。采用串行数据传输,与单片机硬件连接简单,如果使用时钟芯片DS12887,将采用并行数据传输,占用更多的硬件资源。因此为节省单片机端口,时钟芯片采用DS1302。
2
大连民族学院2007级电子信息工程专业单片机系统课程设计报告
时钟电路 AT89C51 CPU 键盘电路 电源 驱动电路 显示电路 电铃 1.1 硬件电路设计
设定51单片机工作在定时器工作方式1,每100ms产生一次中断,利用软件将基准100ms单元进行累加,当定时器产生10次中断就产生1S信号,这时秒单元加1。同理,对分单元时单元和上下午单元计数,从而产生秒,分,时,上下午的值,通过五位七段显示器进行显示。由于动态显示法需要数据锁存等硬件,接口较复杂,考虑显示只有五位,且系统没有其他复杂的处理任务,所以采用动态扫描实现LED的显示。
本系统采用四个按键,1键为功能键,另外三个做控制键。按一下1键进入时间设置,接着按2键选择需要调整的位,然后按3和4键进行时调整,按3键进行加数,按4键进行减数,按两下1键调整结束时钟继续走动。当时钟时间与设置时间一致时,驱动电路动作进行打铃,按时间点不同打铃规则不同,此时按2键强制灭铃。
三、系统硬件设置
3.1单片机最小系统
单片机最小应用系统的设计电路原理图,如图3.1所示。
本次设计我们选用了AT89C52单片机。该单片机要求电源电压为+5V,所以40号引脚接+5V电源,20号脚接地。因为AT89C52单片机的片内ROM为4KB,128位RAM,根据初步分析,本设计程序应该小于4KB,故无须外扩的ROM,所以单片机应直接访问片内程序存储器,单片机的31号脚接高电平。 AT89C52单片机是一种时序逻辑电路,必须有脉冲信号才能正常工作,而时钟脉冲是由振荡电路提供的,时钟可以由内部方式或外部方式产生,内部振荡方式,只要接上两个微调电容和一个晶振即可,其中微调电容选用33pF其作用是稳定振荡频率,快速起振。本次毕业设计我们采用内部振荡方式,外接晶振为11.0592MHz,振荡周期=1/11.0592μs, 时钟周期=2/11.0592μs,机器周期=12/11.0592μs,指令周期=1~4μs。
AT89C52在开机时需复位,以便CPU及其它功能部件都处于确定的初始状态,有利于进行下一步操作。MCS-51系列单片机的有效复位信号两个机器周期以上的高电平。其复位的实现通常可以采用开机上电复位和外部手动复位两种方
3
大连民族学院2007级电子信息工程专业单片机系统课程设计报告
式。图中采用的是开机上电复位,复位电路由10μF的电解电容和8.2K电阻组成,其时间常数为T=RC,T=10μf×8.2k,T=82ms大于10ms,所以单片机能够有效复位,单片机只要保持82ms以上的高电平就能使单片机有效复位
图3.1 单片机最小应用系统
3.2时钟电路DS1302 (1)性能特性
实时时钟可对秒,分,时等进行计数,存在高速数据暂存的31*8位RAM,最少引脚的串行I/O口;2.5~~5.5V电压工作范围;2.5V耗电小于300nA;用于时钟或RAM数据读/写的单字节或多字节数据传送方式;简单的3线接口;可选的慢速充电的能力。
DS1302时钟芯片包括实时时钟和31字节的静态RAM,它经过一个简单的串行接口与微处理器通信,实时时钟提供秒,分,时等信息,时钟运行可以采用24H,或带AM/PM的12H格式,采用三线接口与CPU进行同眇通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302有主电源/后备电源双电源引脚; (2)工作原理
DS1302在任何数据传送时必须先初始化,把RST引脚置为高电平,然后把8位地址和命令装入移位寄存器,数据在SCLK的上升沿被输入,无论是读周期还是写周期开始8位指定40个寄存器中哪个将被访问到,在开始8个时钟周期,把命令字节装入揿位寄存器之后,另外的时钟周期在闱时操作时输出数据,在写操作时写入数据,时钟脉冲的个数在单位字节下为8加8,在多字节方式下为8加字节数,最大可达248字节数。
为了提高对32个地址的寻址能力,可以把时钟或RAM寄存器规定为多字节方式,在多字节方式中,读或写从地址0的位0开始,必须管按数据传送的次
4
大连民族学院2007级电子信息工程专业单片机系统课程设计报告
序电先的8个寄存器。但是当以多个字节写RAM时,为了传送数据不必写所有31字节,不管是否写了全部31字节,所写的每个字节都将传送至RAM。
时钟暂停:秒寄存器的位7定义位时钟暂停位,当它为1时,DS1302停止振荡,进入低功耗的备份方式,通常在对DS1302进行写操作时,停止振荡,当它为0时时钟将开始启动。
8051通过串口向DS1302写数据的程序框图如图3.2,其中,Px可以是8051单片机的任何一位I/O口,注意因为DS1302的数据发送或接收时序和8051的串行口不完全一致,因此,需要在TXD的输出端加反相器,另外,接收数据时,不能以串行口的接收方式接收,必须将串行口当作普通I/O口进行数据接收.
DS1302的晶振选用32.768KHZ,电容推荐值为6PF,因为振荡频率较低,也可以不接电容, 对计时精度影响不大。
8051 PX TXD RXD Vcc1 Vcc2 DS1302 RST SCLK I/O X2
图3.2 DS1302写数据的程序框图 3.3显示电路的设计
显示部分采用普通的共阳数码管显示,采用动态扫描,以减少硬件电路,数码管分别为上下午,十时,时,十分,分显示,显示时采用串行口输出控制数码管,其中P2.2~P2.4口控制数码管的位选,低电平数码管显示,动态扫描显示中单片机P0口输出数码管的段码。 3.4键盘接口的设计
图3.4 键盘电路
5
大连民族学院2007级电子信息工程专业单片机系统课程设计报告
本次设计的控制电路是由4个按键组成的,用以实现时钟信息的调整。其电路图如图3.4所示,按键与P1口的P1.0到P1.3相连。由于P1口内有上拉电阻,所以该图中上拉电阻可以省去。四个按键中,S1为数据+1键,S2为数据-1键,S3为数据选择键,S4为强制打铃或者强制关闭键。 3.5打铃电路的设计 本次设计打铃电路如图3.5所示,单片机通过P3.7控制蜂鸣器是否发出声响。当时间与预定打铃时间相同时,单片机通过P3.7输出为1KHz的方波,使得蜂鸣器发出声响。图中PNP三极管作用是电流放大,以保证蜂鸣器能正常发出声音。
图3.5 打铃电路
6
大连民族学院2007级电子信息工程专业单片机系统课程设计报告
四、系统软件设计
4.1程序流程图
开始 初始化参数设置 调用键盘子程序 调用显示子程序 调用控制子程序
主程序流程图
7
大连民族学院2007级电子信息工程专业单片机系统课程设计报告
开始 保护现场 100ms单元加1 N 100ms单元=0? 100ms单元清零,秒单元加1 N 秒单元=60? 秒单元清零,分单元加1 N 分单元=60? 分单元清零,时单元加1 N 时单元=24? 时单元清零 N 退出 定时中断程序流程图
8
大连民族学院2007级电子信息工程专业单片机系统课程设计报告
开始 向缓冲区放数 指向缓冲区首地址 关显示 指向A口查段码,送段码 指向B口送出码 延时1ms 指向指向下一个缓冲单元 显示下一位 六位显示完 返回
显示程序流程图
9
大连民族学院2007级电子信息工程专业单片机系统课程设计报告
4.2主程序设计 void main() {
uchar NowKey;
uchar BeforKey=0xff; uchar KeyCount=0; uchar i=0;
AlarmSingal=0; RayFlag=1; RayFlag2=1;
TMOD=0x10;//设置T1 EA=1; ET1=1; TH1=0x3c; TL1=0xb0; TR1=1; while(1) {
D_Scan(TimeData,0);//动态扫描 //按键控制
if(KeyCount==2) {
KeyCount=0;
NowKey=GetKey(); if(NowKey!=BeforKey) {
switch (NowKey) {
case 1:
TimeSet(); break; case 2:
AlarmSingal=0; break; default:
break; } }
BeforKey=NowKey; }
else KeyCount++; } }
10
大连民族学院2007级电子信息工程专业单片机系统课程设计报告
4.3显示子程序的设计
void D_Scan(uchar *ShowAddress,uchar FlagBit) {
uchar ShowBit; uchar Show;
for(ShowBit=0;ShowBit<5;ShowBit++) {
if(FlagBit!=5) {
switch(ShowBit) {
case 0:Show=BCD_to_Text((*ShowAddress));break; case 1:Show=BCD_to_Text((*ShowAddress)/10);break;
case 2:Show=BCD_to_Text((*(ShowAddress+1)));break; case 3:Show=BCD_to_Text((*(ShowAddress+1))/10);break; case 4:Show=BCD_to_Text((*(ShowAddress+2)));break; } }
P2=0xff;
switch(FlagBit) {
case 0:P0=Show;break; case 1://设分闪动
if(RayFlag2 && (ShowBit==0||ShowBit==1))P0=0x40; else P0=Show; break; case 2://设时闪动
if(RayFlag2 && (ShowBit==2||ShowBit==3))P0=0x40; else P0=Show; break;
case 3://设上下午闪动
if(RayFlag2 && ShowBit==4)P0=0x40; else P0=Show; break; }
P2=GetClockBit(ShowBit); Delay(1); } }
11
大连民族学院2007级电子信息工程专业单片机系统课程设计报告
五、调试及性能分析
5.1调试步骤
进入调试状态后应该在关键的地方设置断点然后按步运行,同时观察参数的变化,通过变化来判断程序运行的过程即可找出程序中混乱的部分,进行改正,这需要对软件熟练的掌握和对语言程序的很好的理解,实验板搭建成功后,我们就进入了程序的设计和调试阶段,开始编写程序时很顺利,但是后来在调试过程中出现了很多的错误,比如定时器准确度的设置,子程序的调用问题,最困难的就是对没步程序执行顺序的分析,由于程序中一些语句的错误理解和执行顺序的判断失误,让我掉进了误区,耽误了很长时间,最后在同学的帮助下终于找到了错误的关键点,更正成功了。看来对程序的调试能力我还需要加强,程序的调试需要耐心,而且需要熟练掌握软件的跟部分功能。
5.2性能分析
自动打铃系统在学校很工厂和日常生活中应用广泛,原理主要是通过单片机的计数器进行计时,同时通过定时器中断扫描定时时间点来判断是否到了打铃时间,到了打铃,同时可以手动灭铃,主要功能即计时和打铃,相当于闹钟,通过计时器DS1302的使用使电路在断电后依然有后备电源进行计数,设计很人性化。还可以通过按键来设置时间,如果想深入设计,也可以通过键盘来设置闹钟时间,使系统更加方便。
六、心得体会
本系统被子广泛用企事业单位,设计比较简单。经过一学期的学习,使我对单片机有了初步的认识,了解了一些软件编程的技巧。 经过这次的课程设计,使我学会了课堂上学不到的知识,颇有一番感受,对于单片机更加的了解了,对各种器件的使用方法更加熟悉,学会了电路的基本设计思路和原理,掌握单片机设计步骤,知道这门课程在工作中的重要性,因为需要大量的资料,所以我和我的合作者到图书馆查阅了大量的资料,也利用了互联网查找大量的资料,经过一番努力,第一周我们完成了电路图的设计,第二周我们领取了所需的元器件,开始了电路的装调,经过几天的努力,终于把电路装好了,但电路调试过程并不是那么的容易,但经过调试我们发现了电路的一些问题,但在老师和同学们的同共努力下都得到解决,最终看到了成果.我感谢老师,课程设计加深了学生对所学课程理论的理解,扩展了教学中的实验内容和要求,积累了实践体验和经验,让我们提前感受到毕业设计的大致过程,进而能顺利进入毕业设计,提高毕业设计质量和学生实际应用能力。
12
大连民族学院2007级电子信息工程专业单片机系统课程设计报告
参考文献
〔1〕严仲兴,王熔熔:《单片机原理与应用》,中国计划出版社,2001 .7 〔2〕江力:《单片机原理与应用技术》,清华大学出版社,2006.5 〔3〕徐爱钧,彭秀华:《单片机高级语言C51windows环境编程与应用》,北京电子工业出版社,2001.7 〔4〕求是科技:《单片机典型模块设计实例导航》,北京人民邮电出版社,2004.5 〔5〕康华光:《电子技术基础:模拟部分》,北京高等教育出版社,1999.6 〔6〕江太辉:《MCS-51系列单片机原理与应用》.广州:华南理工大学出版社,2004.6
(7)刘海宽 单片机实验与实践教程 东南大学出版社 2009年1月出版 (8)杨易德 模拟电路 重庆大学出版社 2006年10月出版
(9)廖先芸 电子技术实践与训练 高等教育出版社 2005年6月出版 (10)郭勇 EDA技术基础 机械工业出版社 2009年1月出版
13
大连民族学院2007级电子信息工程专业单片机系统课程设计报告
附录1 系统硬件电路图
14
大连民族学院2007级电子信息工程专业单片机系统课程设计报告
附录2 程序清单
#include
#define uint unsigned int #define uchar unsigned char
uchar TimeData[]={0,0,0};//时钟数据 uchar sec;//秒 uchar i;
uchar counter=0; //时钟变量 uchar RayFlag1=0;//秒闪标志1 sbit RayFlag=P3^3;//秒闪
sbit RayFlag2=P3^2;//秒闪标志2 sbit AlarmSingal=P3^7;//闹铃信号
uchar code BellData[]={ 0,0,0,0,0,0,0,0,0,1 };//上下午标志
uchar code BellDataH[]={ 6,7,8,8,9,9,10,10,11,10 };//时
uchar code BellDataL[]={ 0,30,20,30,20,40,30,40,30,30 };//分
uchar BCD_to_Text(uchar Data); uchar GetClockBit(uchar ShowBit); void Delay(uint count);
void D_Scan(uchar *ShowAddress,uchar FlagBit); uchar GetKey(); void TimeSet();
//----------------------主程序----------------------------------------------- void main() {
uchar NowKey;
uchar BeforKey=0xff; uchar KeyCount=0; uchar i=0;
AlarmSingal=0; RayFlag=1;
15
大连民族学院2007级电子信息工程专业单片机系统课程设计报告
RayFlag2=1;
TMOD=0x10;//设置T1 EA=1; ET1=1; TH1=0x3c; TL1=0xb0; TR1=1; while(1) {
D_Scan(TimeData,0);//动态扫描 //按键控制
if(KeyCount==2) {
KeyCount=0;
NowKey=GetKey(); if(NowKey!=BeforKey) {
switch (NowKey) {
case 1:
TimeSet(); break; case 2:
AlarmSingal=0; break; default:
break; } }
BeforKey=NowKey; }
else KeyCount++; } }
//---------------------DS1302-------------------------------
#ifndef _DS1302_H_ #define _DS1302_H_
#define Time_12_Hour 0x00 //24时制控制 #define Time_Start 0x00 //开始走时 #define Time_Stop 0x80 //停止走时
16
大连民族学院2007级电子信息工程专业单片机系统课程设计报告
#define DS1302_SECOND 0x80 //DS1302各寄存器操作命令定义 #define DS1302_MINUTE 0x82 #define DS1302_HOUR 0x84 #define DS1302_WEEK 0x8A #define DS1302_DAY 0x86 #define DS1302_MONTH 0x88 #define DS1302_YEAR 0x8C #define DS1302_WRITE 0x8E #define DS1302_POWER 0x90
#define BCD2DEC(X) (((X&0x70)>>4)*10 + (X&0x0F)) //用于将BCD码转成十进制的宏
#define DEC2BCD(X) ((X/10)<<4 | (X)) //用于将十进制转成BCD码的宏
sbit DS1302_CLK = P1^5; //实时时钟时钟线引脚 sbit DS1302_IO = P1^6; //实时时钟数据线引脚 sbit DS1302_RST = P1^4; //实时时钟复位线引脚 sbit ACC0 = ACC^0; sbit ACC7 = ACC^7;
typedef struct __SYSTEMTIME__ //定义的时间类型结构体,全部数为十进制 {
unsigned char Second; unsigned char Minute; unsigned char Hour; unsigned char Week; unsigned char Day; unsigned char Month; unsigned char Year; }SYSTEMTIME;
//实时时钟写入一字节(内部函数)
void DS1302InputByte(unsigned char d) {
unsigned char i; ACC = d;
for(i=8; i>0; i--) {
DS1302_IO = ACC0; //相当于汇编中的 RRC DS1302_CLK = 1; DS1302_CLK = 0; ACC = ACC >> 1;
17
大连民族学院2007级电子信息工程专业单片机系统课程设计报告
} }
//实时时钟读取一字节(内部函数)
unsigned char DS1302OutputByte(void) {
unsigned char i; for(i=8; i>0; i--) {
ACC = ACC >>1; //相当于汇编中的 RRC ACC7 = DS1302_IO; DS1302_CLK = 1; DS1302_CLK = 0; }
return(ACC); }
//写DS1302,ucAddr: DS1302地址, ucData: 要写的数据 void Write1302(unsigned char ucAddr, unsigned char ucDa) {
DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1;
DS1302InputByte(ucAddr); // 地址,命令 DS1302InputByte(ucDa); // 写1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; }
//读取DS1302某地址的数据
unsigned char Read1302(unsigned char ucAddr) {
unsigned char ucData; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1;
DS1302InputByte(ucAddr|0x01); // 地址,命令 ucData = DS1302OutputByte(); // 读1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; return(ucData); }
//读取时间函数
18
大连民族学院2007级电子信息工程专业单片机系统课程设计报告
void DS1302_GetTime(SYSTEMTIME *Time) {
unsigned char ReadValue;
ReadValue = Read1302(DS1302_SECOND); Time->Second = BCD2DEC(ReadValue&0x7F); ReadValue = Read1302(DS1302_MINUTE); Time->Minute = BCD2DEC(ReadValue); ReadValue = Read1302(DS1302_HOUR); Time->Hour = BCD2DEC(ReadValue&0x7F); ReadValue = Read1302(DS1302_DAY); Time->Day = BCD2DEC(ReadValue); ReadValue = Read1302(DS1302_WEEK); Time->Week = BCD2DEC(ReadValue);
ReadValue = BCD2DEC(DS1302_MONTH); Time->Month = BCD2DEC(ReadValue); ReadValue = Read1302(DS1302_YEAR); Time->Year = BCD2DEC(ReadValue); }
//设置时间函数
void DS1302_SetTime(SYSTEMTIME *Time) {
Write1302(DS1302_WRITE,0x00); //关闭写保护
Write1302(DS1302_YEAR,DEC2BCD(Time->Year)); Write1302(DS1302_MONTH,DEC2BCD(Time->Month)); Write1302(DS1302_WEEK,DEC2BCD(Time->Week)); Write1302(DS1302_DAY,DEC2BCD(Time->Day));
Write1302(DS1302_HOUR,DEC2BCD(Time->Hour)|Time_12_Hour); Write1302(DS1302_MINUTE,DEC2BCD(Time->Minute));
Write1302(DS1302_SECOND,DEC2BCD(Time->Second)|Time_Start);
Write1302(DS1302_WRITE,0x80); //打开写保护 }
//初始化DS1302
void DS1302_Initial(void) {
Write1302(DS1302_WRITE,0x00); //关闭写保护 Write1302(DS1302_SECOND,Time_Stop);//停止计时 Write1302(DS1302_HOUR,Time_12_Hour);//24时制 Write1302(DS1302_POWER,0xA6); //单二极管,4K电阻充电 Write1302(DS1302_WRITE,0x80); //打开写保护 }
19
大连民族学院2007级电子信息工程专业单片机系统课程设计报告
#endif
//---------------------T1中断,产生时钟------------------------------- void Timer1(void)interrupt 3 using 1 {
TH1=0x3c; TL1=0xb0;
if(counter==0) {
RayFlag2=~RayFlag2; if(RayFlag1)RayFlag=0; else RayFlag=~RayFlag; }
if(counter==20) {
counter=0; if(sec==59) {
sec=0;
if(TimeData[0]==59) {
TimeData[0]=0;
if(TimeData[1]==11) {
TimeData[1]=0; if(TimeData[2]==1) { TimeData[2]=0; } else TimeData[2]++;//上下午 }
else TimeData[1]++;//时 }
else TimeData[0]++;//分 }
else sec++;//秒 for(i=0;i<10;i++) {
if((BellData[i]==TimeData[2])&&(BellDataH[i]==TimeData[1]) (BellDataL[i]==TimeData[0])) { if(i==0||i==9) { if(sec==0)
20
&& 大连民族学院2007级电子信息工程专业单片机系统课程设计报告
{ AlarmSingal=0; } if(sec==5) { AlarmSingal=1; } if(sec==7) { AlarmSingal=0; } if(sec==12) { AlarmSingal=1; } } else { AlarmSingal=0; if(sec==5) { AlarmSingal=1; } } break; }
else AlarmSingal=1; } }
else counter++; }
//------------------BCD码转换成字形码的程序----------------------------- uchar BCD_to_Text(uchar Data) {
switch(Data) {
case 0:return 0xC0; case 1:return 0xF9; case 2:return 0xA4; case 3:return 0xB0; case 4:return 0x99; case 5:return 0x92; case 6:return 0x82; case 7:return 0xF8;
21
大连民族学院2007级电子信息工程专业单片机系统课程设计报告
case 8:return 0x80; case 9:return 0x90; } }
//-----------------------------得到位地址的程序------------------------- uchar GetClockBit(uchar ShowBit) {
switch(ShowBit) {
case 0:return 0xfe; case 1:return 0xfd; case 2:return 0xfb; case 3:return 0xf7; case 4:return 0xef; } }
//---------------------延时count个ms的程序------------------------- void Delay(uint count) {
uint i,j;
for(i=count;i>0;i--) for(j=100;j>0;j--); }
//-----------------------动态扫描的程序------------------------------- void D_Scan(uchar *ShowAddress,uchar FlagBit) {
uchar ShowBit; uchar Show;
for(ShowBit=0;ShowBit<5;ShowBit++) {
if(FlagBit!=5) {
switch(ShowBit) {
case 0:Show=BCD_to_Text((*ShowAddress));break; case 1:Show=BCD_to_Text((*ShowAddress)/10);break;
case 2:Show=BCD_to_Text((*(ShowAddress+1)));break; case 3:Show=BCD_to_Text((*(ShowAddress+1))/10);break; case 4:Show=BCD_to_Text((*(ShowAddress+2)));break; } }
P2=0xff;
22
大连民族学院2007级电子信息工程专业单片机系统课程设计报告
switch(FlagBit) {
case 0:P0=Show;break; case 1://设分闪动
if(RayFlag2 && (ShowBit==0||ShowBit==1))P0=0x40; else P0=Show; break; case 2://设时闪动
if(RayFlag2 && (ShowBit==2||ShowBit==3))P0=0x40; else P0=Show; break;
case 3://设上下午闪动
if(RayFlag2 && ShowBit==4)P0=0x40; else P0=Show; break; }
P2=GetClockBit(ShowBit); Delay(1); } }
//----------------得到键盘值的程序---------------------------------- uchar GetKey() {
uchar p; p=P1&0x0f; switch(p) {
case 0x0f:return 0; case 0x0e:return 1; case 0x0d:return 2; case 0x0b:return 3; case 0x07:return 4; } }
//-------------时间设置的程序-------------------------------------------- void TimeSet() {
uchar S_Flag=1; uchar M_Flag=1; uchar H_Flag=1;
uchar count1=0x40;//无操作时的时间控制 uchar count2=0xff;//无操作时的时间控制
23
大连民族学院2007级电子信息工程专业单片机系统课程设计报告
uchar NowKey=0xff; uchar BeforKey=0xff; uchar KeyCount=0; uchar FlagBit=1;
uchar LS_TimeData[3]; uint a=0;
LS_TimeData[2]=TimeData[2]; LS_TimeData[1]=TimeData[1]; LS_TimeData[0]=TimeData[0]; while(1) {
if(S_Flag)LS_TimeData[0]=TimeData[0]; if(M_Flag)LS_TimeData[1]=TimeData[1]; if(H_Flag)LS_TimeData[2]=TimeData[2];
D_Scan(LS_TimeData,FlagBit);//动态扫描显示 if(KeyCount==2) {
KeyCount=0;
NowKey=GetKey(); if(NowKey!=BeforKey) {
count1=0x40; count2=0xff; switch(GetKey()) {
case 1://确定 a++; if(a==2) { a=0; TimeData[2]=LS_TimeData[2]; TimeData[1]=LS_TimeData[1]; TimeData[0]=LS_TimeData[0]; goto L1; } else break; case 2://向左移动
if(FlagBit==3)FlagBit=1; else FlagBit++; break; case 3://增加
switch(FlagBit) {
24
大连民族学院2007级电子信息工程专业单片机系统课程设计报告
case 1://分增加
if(LS_TimeData[0]==59) LS_TimeData[0]=0; else LS_TimeData[0]++; S_Flag=0; break; case 2://时增加
if(LS_TimeData[1]==23) LS_TimeData[1]=0; else LS_TimeData[1]++; M_Flag=0; break; case 3://上下午增加
if(LS_TimeData[2]==1) LS_TimeData[2]=0; else LS_TimeData[2]++; H_Flag=0; break; }
break; case 4://减小
switch(FlagBit) {
case 1://秒减小
if(LS_TimeData[0]==0) LS_TimeData[0]=59; else LS_TimeData[0]--; S_Flag=0; break; case 2://分减小
if(LS_TimeData[1]==0) LS_TimeData[1]=23; else LS_TimeData[1]--; M_Flag=0; break; case 3://时减小
if(LS_TimeData[2]==0) LS_TimeData[2]=1; else LS_TimeData[2]--; H_Flag=0; break; }
break; }
25
大连民族学院2007级电子信息工程专业单片机系统课程设计报告
}
BeforKey=NowKey; count2--; if(count2==0) {
count2=0x40; count1--; if(count1==0) goto L1; } }
else KeyCount++; }
L1:RayFlag1=0; }
26
正在阅读:
基于51单片机的自动打铃系统01-26
浙江省优秀教研员名单(共202人)11-12
小学生三年级我最喜欢的礼物作文300字06-13
《交往与空间》书评12-02
《榜样3》观后感12-11
品质部门年度工作计划与售后服务部年终工作总结报告合集04-15
PLC全自动洗衣机开题报告09-05
2015年1-12月时事政治04-14
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 打铃
- 单片机
- 基于
- 自动
- 系统