智能电子称.docx
- 文档编号:13964270
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:31
- 大小:317.43KB
智能电子称.docx
《智能电子称.docx》由会员分享,可在线阅读,更多相关《智能电子称.docx(31页珍藏版)》请在冰点文库上搜索。
智能电子称
前言
随时代的发展,生活节奏的加快,人们的时间观念愈来愈强;随自动化、智能化技术的发展,机电产品的智能度愈来愈高,用到时间提示、定时控制的地方也会愈来愈多,因此,设计开发数字时钟具有良好的应用前景。
由于单片机价格的低成本、高性能,在自动控制产品中得到了广泛的应用。
本设计利用Atmel公司的AT89S52单片机对电子时钟进行开发,设计了实现所需功能的硬件电路,应用汇编语言进行软件编程,并用实验板进行演示、验证。
在介绍本单片机的发展情况基础上,说明了本设计实现的功能,以及实验板硬件情况,并对各功能电路进行了分析。
主要工作放在软件编程上,用实验板实现时间、日期、定时及它们的设定功能,详细对软件编程流程以及调试进行了说明,并对计时误差进行了分析及校正,提出了定时音与显示相冲突问题及解决方案。
实验证明效果良好,可以投入使用。
关键词:
单片机AT89S52电子时钟汇编语言
单片机的应用介绍
在日常生活和工作中,我们常常用到定时控制,如扩印过程中的曝光定时等。
早期常用的一些时间控制单元都使用模拟电路设计制作的,其定时准确性和重复精度都不是很理想,现在基本上都是基于数字技术的新一代产品,随着单片机性价比的不断提高,新一代产品的应用也越来越广泛。
大则可以构成复杂的工业过程控制系统,完成复杂的控制功能;小则可以用于家电控制,甚至可以用于儿童电子玩具。
它功能强大、体积小、质量轻、灵活好用,配以适当的接口芯片,可以构成各种各样、功能各异的微电子产品。
随着电子技术的飞速发展,家用电器和办公电子设备逐渐增多,不同的设备都有自己的控制器,使用起来很不方便。
这些具有人们所需要的智能化特性的产品减轻了人的劳动,扩大了数字化的范围,为家庭数字化提供了可能。
根据这种实际情况,设计了一个单片机多功能时钟系统,它有基本的时间功能,还有定时功能,既可作为闹铃,也可扩展为定时对家电等电气产品的自动控制,可以避免多种控制器的混淆,利用一个控制器对多路电器进行控制;可增加温度传感器,进行实时温度显示,进一步扩展为利用不同的温度某些电气产品进行自动控制;也可增加湿度传感器,进行实时湿度显示,以便对湿度进行控制。
近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此特别适合于与控制有关的系统,越来越广泛地应用于自动控制,智能化仪器,仪表,数据采集,军工产品以及家用电器等各个领域,单片机往往是作为一个核心部件来使用,在根据具体硬件结构,以及针对具体应用对象特点的软件结合,以作完善。
数子时钟在日常生活中最常见,应用也最广泛。
本次设计以硬件软件化为指导思想,充分发挥单片机功能,大部分功能通过软件编程来实现,电路简单明了,系统稳定性高。
同时,该时钟系统还具有功耗小、成本低的特点,具有很强的实用性,而且系统具有一定的可扩展性。
第二章系统设计
2-1硬件设计
2-1-1所需设备
装有UNSPTMIDE仿真软件的PC机一台,UNSPTM十六位单片机实验箱一台8pin排线两根、短路块若干。
本程序用到的实验箱硬件模块为:
SPCE061A核心及实验箱中提供的4*4键盘模块和6位LED数码管显示模块。
SPE061A共提供两个16位通用的并行I/O口:
IOA0-IOA15IOB0-IOB15。
两个口的每一位都可以通过编程单独定义为输入或输出口,本实验采用IOA15—IOA8连接4*4键盘,IOA0—IOA7、IOA0—IOA15连接数码管。
总体接线:
2.1各键功能图
这部分的主要接线如下:
IOA8-15接液晶显示模块DB0-DB7
IOB4接液晶显示模块AO
IOB5接液晶显示模块的R/W
IOB6接液晶显示模块的EP
DB0-DB7为双向数据口,AO为数据/使命控制位,R/w为读/写信号,EP是全能端(低电平有效)
要这部分工作时Key接线与IOA低八位相连就可以了。
按键电路直接与IOA口连接。
其原理图如下:
本实验中,定义每个键的功能,包括数字键、功能键和一些保留键,其中标“0-9”为数字键,标“F2-F4”为保留键,标“F1”为重新设置时间键,标“ENT”为确认键,标“DEL”为删除键。
运行程序后,按常规的显示方法,从数码管的第一位开始显示,六位数码管一次显示时、分、秒的十位、个位。
设置错误按DEL键即可重新设置,设置完成按ENT键,重新设置按F1键。
2-2硬件连接
利用4*4键盘和6位LED数码管分别与SPCE061A单片机IOA口、IOB口的相关引脚相接,IOA0~IOA7连接和6位数码管的a~g、dp,IOA口的高八位IOA15~IOA8连接4x4键盘的L1~L4、C1~C4,IOB15~IOB12连接数码管的位信号1~4,IOB2~IOB1连接数码管的的位信号5~6,IOB0连接数码管的分隔符信号DD。
几把JP4、JP5的引脚全部用跳线短接起来,用一根排线连接J27和JP7。
时间的设置可以通过4*4键盘的数字键来完成,时间的显示通过6位数码管来完成,以实现计时的功能。
硬件连接图如下:
2.2硬件连接图
2-3软件设计
本系统软件设计程序主要分为主程序(其中包括键盘非法性检测、时钟数据处理、键值转换等子模块)、中断服务子程序、键盘子程序、数码管显示子程序及中断定义子程序。
主程序对程序框架进行设计在调用各个子程序实现系统时钟的设置及重置功能,下面分别详细介绍。
2-3-1主程序流程图及程序设计
YY
2.3主程序流程图
主程序设计程序(main.c)如下:
程序说明:
初始化I/O口,开128HZ中断扫描键盘,进入键值处理循环,如果数字键或删除键按下,先判断设置键是否按下,如果是则进行数字或删除处理。
如果确认键按下,开IRQ5_2HZ中断,设置标志置1,运行标志清0。
如果设置键按下,开IRQ5_2HZ中断,设置标志清0,运行标志置1。
调用时钟处理函数,显示始终时间,清看门狗。
主程序代码:
#include"Key.h"
#include"Dig.h"
#include"SPCE061A.h"
typedefunsignedcharuchar;
#defineKEY_DEL11
#defineKEY_ENT12
#defineKEY_F113
#defineYESCarryFlag1
#defineClearCarryFlag0
#defineYESIntFlag1
#defineClearIntFlag0
#definetrue1
#definefalse0
unsignedintINTflag;
unsignedintKeyVal;
unsignedintKeyDownTimes;//保存按键次数
unsignedintKeycodeLED[6];//保存显示的LED数字
unsignedintEnterFg;//按确认键标识、有确认键按下无确认键按下
unsignedintF1flag;//按设置键标识、有确认键按下无确认键按下
unsignedintsecFlag,minFlag,hourFlag;
voidclockPro(void);//时钟处理函数
unsignedintSetKeyValPro(void);//设置时钟值的合法性检测函数
unsignedintKeyDataChange(unsignedintKey_Data);//键值转换子程序,把4X4键盘的键值转换成程序所需要的
unsignedintg_Data[11]={0x003f,0x0006,0x005b,0x004f,0x0066,0x006d,0x007d,0x0007,0x007f,0x006f};
//0,1,2,3,4,5,6,7,8,9
intmain(){
unsignedinti;
KeyDownTimes=0;
INTflag=0;
EnterFg=0;
i=0;
Key_Init();//键盘扫描初始化,包括IRQ6的TMB2128Hz中断
DIG_Init();//显示初始化,初始端口以及IRQ4的KHz中断
while
(1)
{
KeyVal=Key_Get();//获取键值
KeyVal=KeyDataChange(KeyVal);//转换键值,无键按下或对于本程序无用的键按下时
switch(KeyVal)
{
caseKEY_F1:
INT_IRQ5();
if(KeyDownTimes>=6)KeyDownTimes=0;
F1flag=true;
EnterFg=false;
caseKEY_DEL:
//删除键处理
if(F1flag=true)
{
if(KeyDownTimes>0)
KeyDownTimes--;
}
break;
case0xff:
//无效的键值
break;
caseKEY_ENT:
//确认键处理
if(KeyDownTimes==6)
{
SP_INT_IRQ5();
F1flag=false;
EnterFg=true;
}
break;
default:
//数字键处理
if(F1flag==true)
{
if(KeyDownTimes<6)
{
KeycodeLED[KeyDownTimes]=KeyVal;
if(SetKeyValPro()==true)
{
KeyDownTimes++;
}
}
}
break;
}
for(i=0;i<6;i++)//显示所有键值即时钟
DIG_Set(i+1,g_Data[KeycodeLED[i]]);
clockPro();//时钟数据处理
F_ClearWatchdog();//清看门狗
}
}
2-3-2子模块程序流程图及程序设计
键盘非法性检测子程序:
2.4键盘非法性检测子程序流程图
程序说明:
数字键按下时,“时”的十位不能大于2;设置“时”的个位,当“时”的十位为“0”或者“1”时,“时”的个位可以是0—9,但是当“时”的十位为“2”时,“时”的个位只能是0—3;第三次或者第五次按下数字键时,“分”或者“秒”的十位只能是0—5;“分”或者“秒”的个位可以是0—9,所以需要进行非法性检测。
键盘非法性检测子程序代码:
//语法格式:
voidSetKeyValPro(void)
//实现功能:
设置时钟数据和发行检测函数名称
//返回值:
1-合法;
//0-不合法;
unsignedintSetKeyValPro(void)
{
ucharflag;
switch(KeyDownTimes){
case0:
if(KeycodeLED[KeyDownTimes]<3)
{flag=true;//小时高位}
elseflag=false;
break;
case1:
if(KeycodeLED[KeyDownTimes-1]==2)
{
if(KeycodeLED[KeyDownTimes]<5)//小时低位
flag=true;
else
flag=false;
}
else
flag=true;
break;
case2:
case4:
if(KeycodeLED[KeyDownTimes]<6)
{//秒和分的高位
flag=true;
}
elseflag=false;
break;
case3:
case5:
flag=true;
break;//秒和分的地位
default:
flag=false;
break;
}
return(flag);
}
主程序调用的中断程序设计:
文件名称:
system.asm
功能描述:
开中断函数
.INCLUDESPCE061A.inc
.RAM
.CODE
C格式:
voidSP_INT_IRQ5()
实现功能:
初始化中断为2HZ定时中断源
.PUBLIC_SP_INT_IRQ5;//初始化中断为2HZ定时中断源
_SP_INT_IRQ5:
.PROC
r1=[P_INT_Ctrl_New]
r1|=0x0004;
[P_INT_Ctrl]=r1;
INTIRQ;//开中断
RETF
.ENDP;
.PUBLIC_INT_IRQ5;//初始化中断为2HZ定时中断源
_INT_IRQ5:
.PROC
r1=[P_INT_Ctrl_New]
r1&=~0x0004;
[P_INT_Ctrl]=r1;
INTIRQ;//关中断
RETF
.ENDP;
.PUBLIC_F_ClearWatchdog;
_F_ClearWatchdog:
.PROC
r1=1;
[P_Watchdog_Clear]=r1;
RETF;
.ENDP
主程序编程说明:
主程序流程图及相关代码如上所示,初始化I/O口后,开128HZ中断扫键盘,进入键值处理循环,如果是F1键按下,关掉2HZ中断,然后对数码管显示数字重新进行设置;如果是数字键按下,先判断按了几次数字键,如果按数字键次数小于6,先进性键值的非法性检测,比如,当设置“时”的十位时,按键代表的键值不能大于2;如果是删除键按下,删除最新设置的一个数字,并且让按数字键次数减1;如果是按下确认键,开IRQ5_2HZ中断,显示时钟时间并对时钟时间进行处理;没有建按下或者保留键按下时不做任何操作。
2-3-3时钟数据处理子程序:
2.5时钟数据处理子程序流程图
程序说明:
时钟数据处理主要是针对时间“时”、“分”、“秒”进行处理,通过计数方式进行满六十秒进一,满六十分进一,满二十四小时清零,从而达到计时的功能。
时钟数据处理子程序代码:
voidclockPro(void)
{//秒处理
while(INTflag==1)
{
INTflag=ClearIntFlag;
if(KeycodeLED[4]==5&&KeycodeLED[5]==9)
{//判断秒是否需回零
KeycodeLED[4]=0;//如果为回零
KeycodeLED[5]=0;
secFlag=YESCarryFlag;//设置秒进位标识
}
else
{
if(KeycodeLED[5]==9)
{
KeycodeLED[5]=0;
KeycodeLED[4]++;
}
elseKeycodeLED[5]++;//否则秒加一
}
}//分处理
while(secFlag==1)
{
secFlag=ClearCarryFlag;
if(KeycodeLED[2]==5&&KeycodeLED[3]==9)
{//判断分是否需回零
KeycodeLED[2]=0;//如果为回零
KeycodeLED[3]=0;
minFlag=YESCarryFlag;//设置分进位标识
}
else
{
if(KeycodeLED[3]==9)
{
KeycodeLED[3]=0;
KeycodeLED[2]++;
}
elseKeycodeLED[3]++;//否则分加一
}
}//时处理
while(minFlag==1)
{
minFlag=ClearCarryFlag;
if(KeycodeLED[0]==2&&KeycodeLED[1]==3)
{//判断时是否需回零
KeycodeLED[0]=0;//如果为回零
KeycodeLED[1]=0;
hourFlag=YESCarryFlag;//设置时进位标识
}
else
{//否则时加一
if(KeycodeLED[1]==9)
{
KeycodeLED[1]=0;
KeycodeLED[0]++;
}
elseKeycodeLED[1]++;
}
}
}
2-3-4中断服务程序流程图及程序设计
2.6IRQ4中断服务程序流程图
2.7IRQ5中断服务程序流程图
2.8IRQ6中断服务程序流程图
程序说明:
在IRQ5_2HZ中断里定时1s的时间,在IRQ6_TMB2中断里调用键盘程序扫描键盘,而IRQ4的1KHZ中断当中,进行数码管显示的动态扫描。
中断服务程序代码:
isr.asm
.INCLUDESPCE061A.inc
.INCLUDEkey.inc
.INCLUDEDig.inc
.IRAM
.PUBLICsum;
.VARsum=0//进入中断的计数器
.TEXT
.PUBLIC_IRQ5;
.PUBLIC_IRQ6;
//.externalsum;
.external_INTflag;
.externalF_Key_Scan
.PUBLIC_IRQ4
_IRQ4:
pushr1,r5to[sp]
r1=C_IRQ4_1KHz
testr1,[P_INT_Ctrl]
jnz?
L_IRQ4_1KHz
r1=C_IRQ4_2KHz
testr1,[P_INT_Ctrl]
jnz?
L_IRQ4_2KHz
?
L_IRQ4_4KHz:
callF_DIG_Drive//数码管显示,F_DIG_Drive函数在Dig.asm中定义
r1=C_IRQ4_4KHz
[P_INT_Clear]=r1
popr1,r5from[sp]
reti
?
L_IRQ4_2KHz:
[P_INT_Clear]=r1
popr1,r5from[sp]
reti
?
L_IRQ4_1KHz:
[P_INT_Clear]=r1
popr1,r5from[sp]
reti
//////////////////////////////
_IRQ5:
//定时秒的中断程序
pushr1,r4to[sp];
r1=0x0008;
testr1,[P_INT_Ctrl];
jnzL_4Hz;//TimerAFIQentrence
r1=0x0004;
[P_INT_Clear]=r1;//清中断
r1=[sum]//取时基信号量
r1+=1;
cmpr1,2;
jeloop0;
[sum]=r1//保存时基信号量
popr1,r4from[sp];
reti;
loop0:
r1=0x0001;
[_INTflag]=r1;//设置中断标识
r1=0
[sum]=r1
popr1,r4from[sp];
reti;
L_4Hz:
r1=0x0008;
[P_INT_Clear]=r1;//清中断
popr1,r4from[sp];
reti;
//////////////////////////////
_IRQ6:
pushr1,r4to[sp];
r1=0x0001;
testr1,[P_INT_Ctrl];
jnz_IRQ6_TMB2;
r1=0x0002;
[P_INT_Clear]=r1;
popr1,r4from[sp];
reti;
_IRQ6_TMB2:
[P_INT_Clear]=r1;
callF_Key_Scan;//扫描键盘
popr1,r4from[sp];
reti;
2-3-6键值转换子程序:
2.9键值转换子程序流程图
程序说明:
程序所要处理的数值都是二进制数,所以我们要将我们看到的十进制数转换成二进制数,这样程序才能正常运行。
把“DEL”的键值转换成11,把“ENT”的键值转换成12,把“F1”的键值转换成13,其他键的键值或者其他情况下都认为键值为0xff。
键盘转换子程序代码:
unsignedintKeyDataChange(unsignedintKey_Data)
{
switch(Key_Data)
{
caseKEY_0:
Key_Data=7;break;
caseKEY_1:
Key_Data=8;break;
caseKEY_2:
Key_Data=9;break;
caseKEY_3:
Key_Data=13;break;
caseKEY_4:
Key_Data=4;break;
caseKEY_5:
Key_Data=5;break;
caseKEY_6:
Key_Data=6;break;
caseKEY_7:
Key_Data=0xff;break;
caseKEY_8:
Key_Data=1;break;
caseKEY_9:
Key_Data=2;break;
caseKEY_A:
Key_Data=3;break;
caseKEY_B:
Key_Data=0xff;break;
caseKEY_C:
Key_Data=11;break;
caseKEY_D:
Key_Data=0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 智能 电子称