可编程作息时间控制器设计.docx
- 文档编号:5200667
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:43
- 大小:866.40KB
可编程作息时间控制器设计.docx
《可编程作息时间控制器设计.docx》由会员分享,可在线阅读,更多相关《可编程作息时间控制器设计.docx(43页珍藏版)》请在冰豆网上搜索。
可编程作息时间控制器设计
武汉工程大学
单片机课程设计可编程作息时间控制器设计
姓
学
学
专
班
名:
号:
院:
业:
级:
陈文斌
1004030105电气信息学院电子信息工程电信一班
指导老师:
赵振华
2012年12月27日
可编程作息时间控制器程序设计
摘要:
本次课题是应用AT89C51为核心控制器件的作息时间控制钟,由键盘、声音输出
模块、电源转换模块和存储模块四部分组成。
它利用AT89C51的定时/计数器来计算时间,并用存储器记录数据,保证了系统的可靠性。
AT89C51单片机是整个设计的核心控制器件,根据从键盘接受的数据控制整个系统的工作流程。
整体性好,人性化强、可靠性高,实现了对时间控制的智能化,摆脱了传统由人来控制时间的长短的不便,可对一些以24小时为周期的开关量进行自动控制。
如上下课打铃及扩音设备的开与关。
采用AT89C51单片机来实现对上述开关量的控制,利用24C02芯片来存储数据,设有六位数码管、可以实时显示时间、系统还设有输入键盘,用以修改实时时钟,体现了系统简单、工作稳定可靠、价廉、控制时间精确及系统体积小等优点。
关键词:
AT89C51单片机
1.概述
1.1设计目的:
动态扫描
仿真设计时钟电路
通过本次课程设计,我们就所学习的MCS-51单片机进行一次实践上的设计与仿真,对以前我们所学习的理论知识进行进一步的巩固和深化,更重要的是学习以MCU为控制核心的应用的实际设计流程及基本的实践能力。
通过课程设计,培养我们独立工作能力,为将来毕业设计打好基础。
1.2设计要求:
(1)用汇编语言或C语音编写作息时间控制程序
(2)按照给定的时间模拟控制,实现广播、上下课打铃、灯光控制(屏幕显示)(3)具备日期和时钟显示
1.3扩充功能:
(1)给定的时间可修改
(2)可模拟手动控制
(3)用扬声器模拟打铃给定的时间可修改;可模拟手动控制;用扬声器模拟打铃
2.系统总体方案及硬件设计
2.1电路设计方案图
根据设计要求画出系统框图,如图2.1所示:
图2.1系统总体框图
该系统是由微处理器、存储器、数码显示部分以及键盘输入部分所组成。
该控制系统用LED数码管显示时、分、秒时间,可以显示实时时钟,显示闹铃时间,尽量减少时间积累误差,具有秒闪功能。
显示电路采用了7407芯片来完成驱的功能,利用上拉电阻共同驱动数码管显示时间。
系统采用AT89C51作为处理器,利用24C02芯片作为数据存储器,打铃时间点数据存储于非易失存储器存储24C02中,防止掉电丢失数据;能逐个检查、修改、删除已设置的打铃时间点和增加打铃时间点。
系统还设有输入键盘,用以校正实时时钟,设定闹铃时间,键盘设计简单、易于操作。
2.2控制钟硬件设计
按系统框图分五个部分设计如下图2.2:
图2.2硬件系统框图
系统以单片机为基本核心,利用24C02芯片可以记录40个闹铃时间,并且可以长时间记录时间,不会造成时间混乱,可以满足正常的作息时间设置,简单实用,可以满足正常的生活。
2.3系统整体电路图
系统的整体的电路图如下图所示:
图2.3作息时间控制系统整体电路图
3.作息时间控制钟软件设计
软件设计以定时器T1、T2定时、内存读取、时钟显示、键盘扫描、报警程序为主程序。
在设计中利用单片机时钟计时集成电路完成计时的任务,并500ms向单片机发一个中断,中断子程序有时钟显示及时间比较,如相等,作息时间已到,发出指令控制电铃开、关操作。
3.1系统主程序
根据控制钟的设计要求,设计的程序的主流程图如图所示:
开始
T1、T2
序
序
不相等
比较键值是否相等
不等
图3.1
3.2系统数据读写子程序
比较键值
主程序流程图流程图
系统中利用24C02存储系统数据,该芯片为单电源供电,工作电压范围为1.8-5.5V,低功耗CMOS技术,自定时写周期,页面写周期的典型值为2ms,具有硬件写保护。
通过串行I2C总线扩展技术对数据进行读写操作,节省了接口引脚数,只利用两根传输总线就可以实现全双工同步数据传送。
其程序流程图如下:
开始
读开始
错误
刷新24C02
数据读取结束
读取结束
未读完
图3.2
是否读完
结束
数据读写子程序流程图
3.3显示子程序
对多位LED显示器的动态显示,通常都是采用动态扫描的方法进行显示,即逐个循环点亮各位显示器。
这样虽然在任一时刻只有一位显示器被点亮,但是由于间隔时间较短,且人眼具有视觉残留效应,看起来与全部显示器持续点亮一样。
为了实现LED显示器的动态扫描,除了要给显示器提供的输入之外,还要对显示器加位选择控制,这就是通常所说的段控和位控。
因此多位LED显示器接口电路需要有两个输出口,其中一个用于输出8位信号;另一个用于输出段控制信号。
其显示模式有五种:
0:
正常显示数据;1:
显示调试模式(0,1位闪烁);2:
显示调试模式(2,3位闪烁);3:
显示调试模式(4,5位闪烁);4:
显示特殊字符模式。
其程序流程图如下
:
开始
A=0A=0
未完全显示
数码管
序
结束
图3.3
显示子程序流程图
3.4报警扫描子程序
通过扫描时钟与定时时间是否相同来控制电铃,其程序流程图如下:
开始
未到时间
比较
图3.4
结束报警扫描子程序流程图
3.5
键盘扫描子程序
系统利用独立式键盘,作为系统的输入设备,可以实现对时钟的调整,以
及对响铃报警时间的设置,具有设计简单,方便,使用的特点。
其流程图如下:
开始
键值相等
与键值1比较
与键值2比较
与键值3比较
与键值4比较
与键值5比较
与键值6比较
与键值7比较
与键值8比较
图3.5
结束
键盘扫描子程序流程图
3.6设置时钟子程序:
利用键盘设置,通过模式左移右移来实现对时间的修改设置以及保存。
其程序流程图如下:
开始
键值相等
比较键值
图3.6
3.7T1定时器中断子程序
结束
设置时钟子程序流程图
主程序利用T1定时器的中断来修改时间值,同时修改秒闪状态、数码管的闪烁,同时修改响铃的状态,当响铃经过20S后断电。
其流程图如下:
开始
A=1
判断数码管标志
未达到
判断是否达到满分满秒
结束
图3.7T1定时器中断子程序流程图
4.软件仿真及系统调试
各电路功能模块的逐级测试,包括对:
键盘操作功能调试,声音输出功能调试,指示灯功能调试等。
本系统的软件系统很大,全部用汇编语言来编写,选当确认程序没问题时,通过proteus软件,把程序写入单片机来调试。
主要任务是检验实现的功能及其效果并校正数值。
根据实测数据,逐步校正数据,使测量结果更准确。
最终完成本次设计。
1.仿真开始显示时间12:
00:
00
2按下时钟设置/添加键进行时钟调节,按下左移/右移对应时——分——秒各位位,增加/减小进行时间调节。
3.按下闹钟设置/删除键进入闹钟设置,本设计可以记录40个闹铃时间,实现作息时间控制。
4.当达到闹铃时间时,扬声器发出声音,且提示灯亮。
5按键说明:
Ring_SetP1^0//时间设置
Time_SetP1^1//闹铃设置
Left_MoveP1^2//向左移动
AddP1^3//数据增加
SubP1^4//数据减小
Right_MoveP1^5//向右移动
ESCP1^6//取消
EnterP1^7//确定
5附录
5.1参考文献
[1].《增强型51单片机与仿真技术》肖金球、冯翼编著清华大学出版社2011.10
[2].《单片机应用技术》谭浩强主编清华大学出版社2011.2
[3].《单片机C语言程序设计实例100例》彭伟编著电子工业出版社2011.2
[4].《快速学通—51单片机C语言程序设计》李静、程安宇、陈卓编著人民邮电出版社2010.8
5.2主要元件列表
单片机AT89C52芯片
1片
存储器24C02芯片
1片
七段数码管7SEG-MPX2-CC
3个
NPN三极管2N2222A
1个
驱动器7407
7个
直流-交流转换模块
1个
按键BUTTON
8个
发光二极管LED-RED
4个
继电器RELAY
1个
电阻R
5个
二极管1N4004
1个
上拉电阻RESPACK-7
1个
5.3源程序
#include"AT89X52.H"
#include"intrins.h"
#defineucharunsignedchar
#defineAddressWrite24C020xa0//24C02写
地址
#defineAddressRead24C020xa1//24C02读
地址
ucharClockData[]={0,0,12};//时钟数据ucharRingDataH[40];//40个闹铃(时)
ucharRingDataL[40];//40个闹铃(分)
ucharRingCount=0;//闹铃总数
ucharcounter=0;
ucharI2cStartByte=0xaa;//I2c开始标志字ucharI2cEndByte=0x55;//I2c结束标志字ucharS_Ray_Flag=0;//秒闪标志1
sbitS_Ray=P3^1;//秒闪
sbits_ray=P3^0;//秒闪标志2
sbitAlarm=P3^4;//闹铃信号
sbitSDA=P3^2;//I2CBUS数据
sbitSCL=P3^3;//I2CBUS时钟
//------------T1中断,产生时钟------------voidTimer1(void)interrupt3using1
{
TH1=0x3c;
TL1=0xb0;
if(counter%10==0)
{
s_ray=~s_ray;
if(S_Ray_Flag)S_Ray=0;
elseS_Ray=~S_Ray;
}
if(counter==20)
{
counter=1;
if(ClockData[0]==59)
{
ClockData[0]=0;
if(ClockData[1]==59)
{
ClockData[1]=0;
if(ClockData[2]==23)
{
ClockData[2]=0;
}
elseClockData[2]++;//时
}
elseClockData[1]++;//分
}
elseClockData[0]++;//秒
}
elsecounter++;
}
//---------BCD码转换成字形码的程序----------
ucharBCD_to_Grapheme(ucharData)
{
switch(Data)
{
case0:
return0x3f;
case1:
return0x06;
case2:
return0x5b;
case3:
return0x4f;
case4:
return0xe6;
case5:
return0xed;
case6:
return0xfd;
case7:
return0x07;
case8:
return0xff;
case9:
return0xef;
}
}
//-----------得到位地址的程序---------
ucharGetClockBit(ucharShowBit)
{
switch(ShowBit)
{
case0:
return0xdf;
case1:
return0xef;
case2:
return0xf7;
case3:
return0xfb;
case4:
return0xfd;
case5:
return0xfe;
}
}
//-------延时count个ms的程序--------
voidDelay(ucharcount)
{
uchari;
while(count--)
{
for(i=0;i<123;i++)
;
}
}
//----------动态扫描的程序-----------
voidDisplay(uchar*ShowAddress,uchar
FlagBit)
{
ucharShowBit;
ucharShow;
for(ShowBit=0;ShowBit<6;ShowBit++)
{
if(FlagBit!
=5)
{
switch(ShowBit)
{
case
0:
Show=BCD_to_Grapheme((*ShowAddress)%1
0);break;
case
1:
Show=BCD_to_Grapheme((*ShowAddress)
/10);break;
case
2:
Show=BCD_to_Grapheme((*(ShowAddress
+1))%10);break;
case
3:
Show=BCD_to_Grapheme((*(ShowAddress
+1))/10);break;
case
4:
Show=BCD_to_Grapheme((*(ShowAddress
+2))%10);break;
case
5:
Show=BCD_to_Grapheme((*(ShowAddress
+2))/10);break;
}
}
P2=0xff;
switch(FlagBit)
{
case0:
P0=Show;break;
case1:
//设秒闪动
if(s_ray&&
(ShowBit==0||ShowBit==1))P0=0x40;
elseP0=Show;
break;
case2:
//设分闪动
if(s_ray&&
(ShowBit==2||ShowBit==3))P0=0x40;
elseP0=Show;
break;
case3:
//设时闪动
if(s_ray&&
(ShowBit==4||ShowBit==5))P0=0x40;
elseP0=Show;
break;
case4:
//调闹铃时的闪动
if(s_ray)P0=0x40;
elseP0=Show;
break;
case5:
//调闹铃时的显示
P0=*(ShowAddress+ShowBit);
break;
}
P2=GetClockBit(ShowBit);
Delay
(1);
}
}
//-------得到键盘值的程序-------
ucharGetKey()
{
switch(P1)
{
case0xff:
return0;
case0xfe:
return1;
case0xfd:
return2;
case0xfb:
return3;
case0xf7:
return4;
case0xef:
return5;
case0xdf:
return6;
case0xbf:
return7;
case0x7f:
return8;
}
}
//--------定义I2C接口子程序---------
/*
I2C特殊字节定义
*/
voidI2cWait()//等待
{
_nop_();
_nop_();
}
voidI2cStart()//开始
{
SDA=1;
SCL=1;
I2cWait();
SDA=0;
I2cWait();
SCL=0;
}
voidI2cStop()//停止
{
SDA=0;
I2cWait();
SCL=1;
I2cWait();
SDA=1;
}
voidI2cSendByte(ucharByteData)//发送{
uchari;
for(i=0;i<8;i++)
{
if(ByteData&0x80)
SDA=1;
else
SDA=0;
ByteData<<=1;
I2cWait();
SCL=1;
I2cWait();
SCL=0;
I2cWait();
}
SDA=1;
I2cWait();
SCL=1;
I2cWait();
SCL=0;
I2cWait();
}
ucharI2cReceiveByte()//接收
{
uchari;
ucharByteData=0;
for(i=0;i<8;i++)
{
SCL=1;
I2cWait();
ByteData<<=1;
if(SDA)ByteData++;
SCL=0;
I2cWait();
}
SDA=1;
I2cWait();
SCL=1;
I2cWait();
SCL=0;
I2cWait();
returnByteData;
}
//-------声明AT24C02的读写子程序------voidI2cWrite24C02(uchar
I2c24C02Addr,ucharI2c24C02Data)//写
{
I2cStart();
I2cSendByte(AddressWrite24C02);
I2cSendByte(I2c24C02Addr);
I2cSendByte(I2c24C02Data);
I2cStop();
}
ucharI2cRead24C02(ucharI2c24C02Addr)//
读
{
ucharData;
I2cStart();
I2cSendByte(AddressWrite24C02);
I2cSendByte(I2c24C02Addr);
I2cStart();
I2cSendByte(AddressRead24C02);
Data=I2cReceiveByte();
I2cStop();
returnData;
}
//----------初始化24C02---------
voidInitializtion(void)
{
uchari,j;
ucharStartByte=I2cRead24C02(0);
j=1;
if(StartByte==I2cStartByte)
for(i=0;i<40;i++)
{
if(I2cRead24C02(j)==I2cEndByte)break;
RingDataH[i]=I2cRead24C02(j++);
RingDataL[i]=I2cRead24C02(j++);
RingCount++;
}
else
{
I2cWrite24C02(0,I2cStartByte);
I2cWrite24C02(1,I2cEndByte);
}
}
//---------排序的程序----------
voidTaxis(void)
{
uchari,j,t;
for(i=0;i for(j=0;j { if(RingDataH[j]>RingDataH[j+1]) { t=RingDataH[j]; RingDataH[j]=RingDataH[j+1]; RingDataH[j+1]=t; t=RingDataL[j]; RingDataL[j]=RingDataL[j+1]; RingDataL[j+1]=t; } elseif(RingDataH[j]==RingDataH[j+1]) if(RingDataL[j]>RingDataL[j+1]) { t=RingDataL[j]; RingDataL[j]=RingDataL[j+1]; RingDataL[j+1]=t; } } } //---------闹铃设置-------- voidControl_Ring_Set_Key(void) { uchar Null[]={0x00,0x38,0x38,0x3e,0x37,0x00};//"Null"的字形码 ucharShowRing[3]; ucharNowKey; uchari,j=1; ucharBeforKey=0xff; ucharKeyCount=0; ucharFlagBit=3; ucharShowRingCount=0; ucharcount1=0x40;//无操作时的时间控制 ucharcount2=0xff;//无操作时的时间控制 S_Ray_Flag=1; ShowRing[0]=RingDataL[ShowRingCou nt]; ShowRing[1]=RingDataH[ShowRingCou nt]; ShowRing[2]=ShowRingCount; while (1) { if(RingCount==0) Display(Null,5); else Display(ShowRing,FlagBit); if(KeyCount==2) { KeyCount=0; NowKey=GetKey(); if(NowKey! =BeforKey) { count1=0x40; count2=0xff; switch(NowKey) { case1: //增加一个闹 铃 if(RingCount! =40&&FlagBit==4) { RingDataH[RingCount]=RingDataL[Rin gCount]=0; ShowRingCount=RingCount++; } if(RingCount==0) { RingDataH[0]=RingDataL[0]=0; RingCount++; } ShowRing[0]=RingDataL[ShowRingCou nt]; ShowRing[1]=RingDataH[ShowRingCou nt]; ShowRing[2]=ShowRingCount; break; case2: //删除一个闹 铃 if(RingCount! =0&&FlagBit==4) { if(RingCount==1) { RingDataH[0]=RingDataL[0]=0; } else { for(i=ShowRingCount;i { RingDataH[i]=RingDataH[i+1]; RingDataL[i]=RingDataL[i+1]; } RingDataH[i]=RingDataL[i]=0; } RingCount--; if(RingCount==ShowRingCount) ShowR
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 可编程 作息 时间 控制器 设计