SO8AW的断电保护课程设计.docx
《SO8AW的断电保护课程设计.docx》由会员分享,可在线阅读,更多相关《SO8AW的断电保护课程设计.docx(27页珍藏版)》请在冰豆网上搜索。
SO8AW的断电保护课程设计
课程名称
大作业
嵌入式微控制器S08AW原理与实践
大作业
题目基于S08AW的掉电不丢失密码锁设计
院系名称:
电气工程学院专业班级:
1002
学生姓名:
秦凯新学号:
201046820427
评语:
成绩:
任课教师:
时间:
设计题目
基于S08AW的掉电不丢失密码锁设计
设计内容和要求
密码锁的功能键设计:
S1---S10表示:
数字键0-9
S11---更改密码S12---更改密码完毕后确认
S13---重试密码、重新设定S14---关闭密码锁
初始密码:
000000密码位数:
6位
程序功能:
本程序结合了24C02存储器的存储功能,可以掉电保存密码。
1、开锁:
下载程序后,直接按六次S7(即代表数字1),锁被打开,输入密码时,
六位数码管依次显示小横杠。
2、更改密码:
首先按下更改密码键S11,然后设置相应密码,此时六位数码管会显示设置密码对应
的数字。
最后设置完六位后,按下S12确认密码更改,此后新密码即生效。
3、重试密码:
当输入密码时,密码输错后按下键S13,可重新输入六位密码。
当设置密码时,设置中途想更改密码,也可按下此键重新设置。
4、关闭密码锁:
按下S14即可将打开的密码锁关闭。
报告
主要
章节
一S08内部资源详解及功能
二IIC模块介绍
三程序流程图
四系统总原理图
五密码锁程序源码
六附录(参考文献)
一S08内部资源
1.1S08AW简介
S08AW系列是Freescale公司推出的新一代S08系列微控制器中的一款增强型8位微控制器,它不仅集成度高、片内资源丰富,接口模块包括SPI、SCI、IIC、A/D、PWM等,还具有很宽的工作温度范围:
-40℃~+125℃,它在汽车电子、工业控制、中高档机电产品等领域具有广泛的用途。
S08AW微控制器采用8位S08CPU,片内总线时钟最高可达20MHz;片内资源包括2KRAM、将近62KFlash、串行接口模块(SCI、SPI和IIC)、定时器模块(TPM)、可选择宽范围时钟频率,它还提供一个8位/10位精度的A/D转换器,并支持后台调试模式BDM。
本章以S08AW60为例,介绍S08AW系列的基本组成,包括S08AW的特性、结构、引脚、基本系统电路、系统时钟和运行模式等。
1.2S08资源介绍
S08AW是Freescale首个基于高性能S08CPU内核并支持2.7~5.5V电源的微控制器。
它包含众多有应用价值的特性:
将近62K的flash存储器、高达2K的RAM、灵活而无需外部元件的内部时钟发生器、低电压检测、高性能模/数转换器(ADC)和串行通信模块等。
S08AW系列具有极佳的电磁兼容性能(EMC)并提供了不同的引脚数(64,48或44)、封装选项(QFP,LQFP或QFN)及宽温度范围(-40℃~+125℃),可适应各类恶劣环境,因此该微控制器适用于高可靠的工业与汽车电子领域。
S08AW系列有4种芯片:
S08AW60/48/32/16,它们之间的区别主要是片上的程序存储器的容量不同且均有各种引脚及封装形式。
S08AW60的内部资源参见表2-1。
●中央处理器为S08CPU。
●最高可达40-MHzCPU时钟频率和20-MHz内部总线频率。
●约62KB片上在线可编程FLASH存储器,具有模块保护与安全选项功能。
●2KB片上RAM。
●时钟源选项:
晶体振荡器、陶瓷谐振器、外部时钟或内部时钟(具有高精度调整功能)。
系统保护:
●可选的看门狗(COP)复位。
●具有复位或中断功能的低压检测。
●具有复位功能的非法操作码检测。
●具有复位功能的非法地址检测(仅部分器件有非法地址检测)。
●一种等待节省模式和两种停止节省模式。
外设模块:
●具有自动比较功能的16通道、8位/10位精度的模数转换器ADC。
●具有两个可选的串行通信接口模块SCI。
●串行外设接口模块SPI。
●内部集成总线模块IIC,在最大总线负载情况下,其最高工作频率可达100kbps,且负载越少,波特率越高。
●2个定时器TPM模块:
共有(2+6)通道的16位定时器/脉宽调制器,每个通道上都具有可选的输入采集、输出比较及PWM功能。
●8个键盘中断模块KBI(可当作外部中断)可通过软件选择边沿方向或边沿/电平模式。
输入/输出:
●高达54个通用输入/输出(I/O)引脚
●引脚用作输入端时,可软件选择上拉电阻
●引脚用作输出端时,可软件选择强/弱驱动能力和压摆率(slewrate)
复位及其他:
●具有主复位引脚与上电复位(POR)功能
●可选RESET、IRQ与BKGD/MS引脚处的内部上拉
●单线后台调试模块BDM
●可支持多达32个中断/复位源
表1-1S08AW60系列的内部资源
1.3S08AW结构
S08AW系统结构如图2-1所示,大致可分为MCU核心和MCU外设部分,对应于图中的左侧和右侧。
1.MCU核心(HCS08CORE)部分
S08AW核心部分包括具有运行监视功能的增强型中央处理器S08CPU、后台调试控制(具有单线后台调试接口BDM)、系统控制(时钟监视、中断控制、低电压检测)等。
S08MCU有2种存储器FLASH\RAM;电压调整器,包括数字电路和模拟电路电源电压;程序存储器具有页面控制模式;具有内部时钟发生器(ICG)和低能耗晶体振荡器。
2.MCU外设部分
外设部分大致可分为六种外设:
数字输入;数字输出;10位二进制精度的模拟量/数字量转换器A/D(ADC1P0~P15);定时器/PWM(TPM1、TPM2);串行接口(SCI1、SCI2、SPI、IIC);许多微控制器中所没有的键盘中断输入(KBI1)。
图1-2S08AW系统结构图
注意:
引脚内部集成有上拉电阻,当引脚作为输入功能时,软件可为该引脚配置内部上拉电阻;引脚IRQ使能时,软件可配置该引脚上拉/下拉。
IRQ引脚内部没有接到VDD的钳位二极管,所以IRQ的输入电平不能超过VDD;PTD2、PTD3、PTD7、PTG4可软件配置其上拉/下拉功能。
1.3S08AW引脚介绍
S08AW系列MCU有四个型号:
S08AW60/48/32/16。
有64-引脚、48-引脚、44-引脚三种,封装形式有LQFP、QFP或QFN三种。
本书主要介绍64引脚的S08AW60,参见图1-3。
.
图1-3S08AW60引脚分布图
S08MCU的引脚大都采用功能复用技术,即“单引脚多功能”。
某个引脚可能具有双重或三重功能,即通用I/O功能和特殊接口功能,例如图2-2中第47引脚具有3种功能:
通用I/O功能(PTD3)、键盘中断输入(KBI1P6)和模拟量/数字量转换输入A/D(AD1P11),其控制逻辑完全集成在MCU内部,可以用软件设定该引脚具有何种功能。
由于S08MCU的许多引脚都具有2种或2种以上功能,使得它在体积、功耗、可靠性和应用的简单方便程度上与用户自行扩充的片外I/O口有着重要区别和显著的优势。
二IIC模块介绍
2.024C02的图示
图2.0
2.124C02的读写操作
I2C(Inter-IntegratedCircuit)总线是一种由Philips公司开发的两线式串行总线,用于连接微控制器及其外围设备。
I2C总线产生于在80年代,最初为音频和视频设备开发。
由于其简单性,如今方泛用于微控制器与各种功能模块的连接,可以说是学单片机的人,入门之后,必定要涉及到的。
I2C总线实际上已经成为一个国际标准在超过100种不同的IC上实现,而且得到超过50家公司的许可,正因为其简单和应用广泛,因此其功能也越来不满足人们的要求,其速度也从原来的100Kbit/S,增加了快速模式,其速度达400Kbit/S,再后来也增加了高速模式,其速度更达3.4Mbit/S。
二.功能和特点
I2C总线是一种用于IC器件之间连接的双向二线制总线,所谓总线它上面可以挂多少器件,并且通个两根线连接,占用空间非常的小,总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持4个组件。
它的另一优点是多主控,只要能够进行接收和发送的设备都可以成为主控制器,当然多个主控不能同一时间工作。
I2C总线有两根信号线,一根为SDA(数据线),一根为SCL(时钟线)。
任何时候时钟信号都是由主控器件产生。
I2C总线在传送数据的过程中,主要有三种控制信号:
起始信号,结不信号,应答信号
起始信号:
当SCL为高电平时,SDA由高电平转为低电平时,开始传送数据
结束信号:
当SCL为高电平时,SDA由低电平转为高电平时,结束数据传送
应答信号:
接收数据的器件在接收到8bit数据后,向发送数据的器件发出低电平信号,表示已收到数据。
这个信号可以是主控器件发出,也可以是从动器件发出。
总之由接收数据的器件发出。
这些信号中,起始信号是必需的,结束信号和应答信号,都可以不要。
下面我们以ATMEL公司的AT24C02来介绍I2C的基本操作
AT24C02是美国ATMEL公司的低功耗CMOS串行EEPROM,它是内含256×8bit存储空间,具有工作电压宽(2.5~5.5V)、擦写次数多(大于10000次)、写入速度快(小于10ms)等特点。
他在系统中始终为从动器件。
对AT24C02的操作主要有:
字节读,字节写,页面读,页面写
首先发送起始信号,如下图,起始信号后必须是控制字,
控制字格式如下,其中高四位为器件类型识别符(不同的芯片类型有不同的定义,EEPROM一般应为1010),接着三位为片选,也就是三个地址位,最后一位为读写控制位,当为1(Input)时为读操作,为0(Output)时为写操作。
控制字后就是相应的操作,读或写,一定不要结束,因为这个操作还没有完成,如果结束就等于放弃操作。
先来看写操作,写操作分为字节写和页面写两种操作,对于页面写根据芯片的一次装载的字节不同有所不同,AT24C02为8字节,每写一个字节后,地址自动加1。
关于页面写的地址、应答和数据传送的时序参见图3,字节写可以看成是只有一个字节的页面写,也就是写一个数据后停止。
注意:
写一次需要一定时间,一般为10ms,要等侍这个操作完成。
时序如下图:
说明:
对于AT24C02,在控制字后还必须写入地址,这个地址是以后读写的起始地址。
读操作有三种基本操作:
当前地址读、随机读和顺序读。
三种操作方法类似,只是读的数据个数不同,可连续读8个字节,图4给出的是顺序读的时序图,图中共读了四个数据,需要注意的是当前的地址,如果不是想要的,可以用写操作,重新写入地址。
非常重要的是,每读一个数据后,必须置低SDA,作为应答,否则,只能读一个数据,后面的数据,因为收到不应答信号,AT24C02就会认为出错,停止操作。
特别提醒的是,当SCL为低电平时,数据是可变的,因些只有SCL为高电平时,才能读数。
三程序流程图
图3.1程序流程图
程序执行时,首先进行键盘扫描,判断是否开锁,程序执行流程如上图所示:
1、开锁:
下载程序后,直接按六次S7(即代表数字1),8位LED亮,锁被打开,输入密码时,
六位数码管依次显示小横杠。
2、更改密码:
首先按下更改密码键S11,然后设置相应密码,此时六位数码管会显示设置密码对应
的数字。
最后设置完六位后,按下S12确认密码更改,此后新密码即生效。
3、重试密码:
当输入密码时,密码输错后按下键S13,可重新输入六位密码。
当设置密码时,设置中途想更改密码,也可按下此键重新设置。
4、关闭密码锁:
按下S14即可将打开的密码锁关闭。
四系统原理图
图4.1系统原理图
系统原理图包含了显示模块,矩阵键盘模块,以及24C02密码值存储模块,,其分模块就不再粘贴出来,因为都是上述模块的分解.另外关于键盘就是矩阵键盘,包含了0-9的键值,另外还有特殊功能键如下:
S11:
更改键S12:
确认键S13:
重试键S14:
关闭键
正是通过上述的特殊功能键来实现特殊的操作。
从而实现密码识别,键盘扫描,数密码,密码验证,和更改密码操作的。
五密码锁程序源码
#include
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharold1,old2,old3,old4,old5,old6;//原始密码000000
ucharnew1,new2,new3,new4,new5,new6;//每次MCU采集到的密码输入
uchara=16,b=16,c=16,d=16,e=16,f=16;//送入数码管显示的变量
ucharwei,key,temp;
charallow,genggai,ok,wanbi,retry,close;//各个状态位
#defineLEDDataPTBD;
#defineLEDcsPTDD;
unsignedcharcodetable[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};
/////////24C02读写驱动程序////////////////////
voiddelay1(unsignedintm)
{unsignedintn;
for(n=0;n}
voidinit()//24c02初始化子程序
{
IICIF=0X4B;//波特率50kb/s
IIC1C_IICEN=1;
IIC1C_TXAK=1;
IIC1C_MST=0;
}
////////从24c02的地址address中读取一个字节数据/////
unsignedcharread24c02(unsignedcharaddress)
{
unsignedchari;
IIC1C_TXAK=0;
IIC1C|=0X30;
IC1D=0XA0;//选择从设备地址
while(!
IIC1S_IIC1F);
IIC1S_IIC1F=1;
while(IIC_RXAK);
IIC1D=address;
while(!
IIC1S_IIC1F);
IIC1S_IIC1F=1;
while(IIC_RXAK);
IIC1C_RSTA=1;
IIC1D=0XA1;
while(!
IIC1S_IIC1F);
IIC1S_IIC1F=1;
while(IIC_RXAK);
IIC1C_TX=0;
IIC1C_TXAK=1;
//i=IIC1D;是否需要空读
while(!
IIC1S_IIC1F);
IIC1S_IIC1F=1;
IIC1C_MST=0;
i=IIC1D;
delay1(10);
return(i);
}
//////向24c02的address地址中写入一字节数据info/////
voidwrite24c02(unsignedcharaddress,unsignedchardat)
{
IIC1C_TXAK=0;
IIC1C|=0X30;
IC1D=0XA0;
while(!
IIC1S_IIC1F);
IIC1S_IIC1F=1;
while(IIC_RXAK);
IIC1D=address;
while(!
IIC1S_IIC1F);
IIC1S_IIC1F=1;
while(IIC_RXAK);
IIC1D=dat;
while(!
IIC1S_IIC1F);
IIC1S_IIC1F=1;
while(IIC_RXAK);
}
/****************************密码锁程序模块********************************************************/
voiddelay(unsignedchari)
{
ucharj,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
voidLED_display(ucharcs,ucharnum)
{
LEDcs=cs;
LEDData=LED_Table[num];
}
voiddisplay(uchara,ucharb,ucharc,uchard,uchare,ucharf)
{
PTBDD=0XFF;
PTDDD=0XFF;
LED_display(0x0e,a);
delay1(5);
LED_display(0x0d,b);
delay1(5);
LED_display(0x0b,c);
delay1(5);
LED_display(0x07,d);
delay1(5);
}
voidkeyscan()
{
PTEDD=0X0F;//高四位为输入,低四位为输出;
{
PTED=0xfe;//高四位上拉输入
temp=PTED;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
if(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xee:
key=0;
wei++;
break;
case0xde:
key=1;
wei++;
break;
case0xbe:
key=2;
wei++;
break;
case0x7e:
key=3;
wei++;
break;
}
while(temp!
=0xf0)
{
temp=PTED;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
PTED=0xfd;
temp=PTED;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
if(temp!
=0xf0)
{
temp=PTED;
switch(temp)
{
case0xed:
key=4;
wei++;
break;
case0xdd:
key=5;
wei++;
break;
case0xbd:
key=6;
wei++;
break;
case0x7d:
key=7;
wei++;
break;
}
while(temp!
=0xf0)
{
temp=PTED;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
PTED=0xfb;
temp=PTED;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
if(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xeb:
key=8;
wei++;
break;
case0xdb:
key=9;
wei++;
break;
case0xbb:
genggai=1;
wei=0;
break;
case0x7b:
if(allow)
ok=1;
break;
}
while(temp!
=0xf0)
{
temp=PTED;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
PTED=0xf7;
temp=PTED;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
if(temp!
=0xf0)
{
temp=PTED;
switch(temp)
{
case0xe7:
retry=1;
break;
case0xd7:
close=1;
break;
}
while(temp!
=0xf0)
{
temp=PTED;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
}
}
voidshumima()//对按键采集来的数据进行分配
{
if(!
wanbi)
{
switch(wei)
{
case1:
new1=key;
if(!
allow)a=17;
elsea=key;break;
case2:
new2=key;
if(a==17)b=17;
elseb=key;break;
case3:
new3=key;
if(a==17)c=17;
elsec=key;break;
case4:
new4=key;
if(a==17)d=17;
elsed=key;break;
case5:
new5=key;
if(a==17)e=17;
elsee=key;break;
case6:
new6=key;
if(a==17)f=17;
elsef=key;
wanbi=1;break;
}
}
}
voidyanzheng()//验证密码是否正确
{
if(wanbi)//只有当六位密码均输入完毕后方进行验证
{
if((new1==old1)&(new2==old2)&(new3==old3)&(new4==old4)&(new5==old5)&(new6==old6))
allow=1;//当输入的密码正确,会得到allowe置一
}
}
voidmain()
{
init();//初始化24C02
/*********下面的一小段程序的功能为格式化密码存储区。
************
******当24c02中这些存储区由于其他程序的运行而导致***************
*******所存数据发生了变化,或者密码遗忘时,********************
******可以删掉其前面的注释线,然后重新编译下载。
****************
******而将密码还原为000000后,请将下面的程序用**************