基于cortexM3和步进电机的数字钟控制及其语音播报系统设计.docx
《基于cortexM3和步进电机的数字钟控制及其语音播报系统设计.docx》由会员分享,可在线阅读,更多相关《基于cortexM3和步进电机的数字钟控制及其语音播报系统设计.docx(19页珍藏版)》请在冰豆网上搜索。
基于cortexM3和步进电机的数字钟控制及其语音播报系统设计
论文格式
***********************************************************
注意:
此为封面格式
***********************************************************
2011-2012德州仪器C2000及MCU创新设计大赛
项目报告
题目:
基于cortexM3和步进电机的数字钟控制及其语音播报系统设计
学校:
鲁东大学
组别:
本科组
应用类别:
控制系统类
平台:
Cortex-M3
基于cortexM3和步进电机的数字钟控制及其语音播报系统设计
摘要(中英文)
利用cortexM3单片机,通过串口连接上位机PC,由上位机PC对单片机内的参数进行修改,并实时监控系统的运行状态。
单片机控制系统在整点时间(指定时间)到时,控制单片机进行语音播报以及灯光照明等。
1.引言
ARMCortex™-M3处理器是行业领先的32位处理器,适用于具有高确定性的实时应用,已专门开发为允许合作伙伴为范围广泛的设备(包括微控制器、汽车车体系统、工业控制系统以及无线网络和传感器)开发高性能低成本的平台。
该处理器提供出色的计算性能和对事件的卓越系统响应,同时可以应对低动态和静态功率限制的挑战。
该处理器是高度可配置的,可以支持范围广泛的实现(从那些需要内存保护和强大跟踪技术的实现到那些需要极小面积的对成本非常敏感的设备)。
2.系统方案
利用cortexM3单片机,通过串口连接上位机PC,由上位机PC对单片机内的参数进行修改,并实时监控系统的运行状态。
单片机控制系统在整点时间(指定时间)到时,控制单片机进行语音播报以及灯光照明等。
3.系统硬件设计
原理图及PCB图见附件一
*********************************************************************
项目简介
项目名称:
基于cortexM3和步进电机的数字钟控制及其语音播报系统设计
芯片型号:
_____LM3S811_________________
一、设计概要
利用cortexM3单片机,通过串口连接上位机PC,由上位机PC对单片机内的参数进行修改,并实时监控系统的运行状态。
单片机控制系统在整点时间(指定时间)到时,控制单片机进行语音播报以及灯光照明等。
数字钟控制及其语音播报系统的主要功能:
1、cortexM3单片机通过串口读写GPS模块,利用收到的GPS信息中的时间信息作为当前时间,单片机进行校对,步进电机驱动指针式数字钟进行快速调整,显示正确时间。
2、读写SD卡,对SD卡内的MP3文件进行解码和语音输出,用于整点语音播报。
3、夜间根据光线亮暗与时间的双重控制,驱动LED灯光照明,便于夜间观看数字钟时间。
4、系统能够在PC机不存在的情况下照常运行。
并且能够利用按键进行时间调整,反馈给单片机。
进一步驱动步进电机进行指针式数字钟快速调整,显示设定的时间。
5、步进电机驱动指针式钟控制系统,具有反馈功能—即在指针指到12整点时,反馈信息给单片机,以便于对时。
6、利用单片机进行外部周围环境实时温度检测,将外部环境温度信息反馈给上位机显示。
7、采用4相8拍双极性步进电机驱动。
8、利用DS12C887作为备用时钟。
每隔一段时间GPS与DS12C887进行时间比对,并随时调整DS12C887的时间。
当单片机检测到GPS功能异常时,切断GPS与DS12C887的时间比对。
同时启用DS12C887进行时间读取,便于数字钟正常运行。
9、利用lcd显示年月日以及温度信息,隔一段时间从sd卡读取广告信息输出在lcd显示。
10、自带后备蓄电池,断电自动切换电池供电,并切换到节能模式。
二、程序设计
主函数
intmain(void)
{
//配置系统时钟
SysCtlClockSet(SYSCTL_SYSDIV_1|SYSCTL_USE_OSC|SYSCTL_OSC_MAIN|SYSCTL_XTAL_6MHZ);
//启用GPIOB、C、D和E
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB|SYSCTL_PERIPH_GPIOC|SYSCTL_PERIPH_GPIOD|SYSCTL_PERIPH_GPIOE);
//配置系统最小时间中断
SysTickPeriodSet(SysCtlClockGet()/20);
//启用最小时间中断
SysTickIntEnable();
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);//配置PB0、PB1为输出
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);//使能外设Timer0
TimerConfigure(TIMER0_BASE,TIMER_CFG_32_BIT_PER);//配置Timer0为32位的定时器
TimerLoadSet(TIMER0_BASE,TIMER_A,SysCtlClockGet());//配置Timer0的时间为1秒
//启用Timer0/SysTick
//Setuptheinterruptsforthetimertimeouts.
IntEnable(INT_TIMER0A);
//使能定时器中断;
TimerIntEnable(TIMER0_BASE,TIMER_TIMA_TIMEOUT);
SysTickEnable();
//开启定时器0;
TimerEnable(TIMER0_BASE,TIMER_A);
ch451_int();
SetTime_ds();
while
(1)
{
ch451_write1(CH451_DIG2|0);
ch451_write1(CH451_DIG3|2);
//年
nian=read_ds(9);
nianshi=nian&0xf0;
nianshi>>=4;
niange=nian&0x0f;
ch451_write1(CH451_DIG0|niange);
ch451_write1(CH451_DIG1|nianshi);
//月
yue=read_ds(8);
yueshi=yue&0xf0;
yueshi>>=4;
yuege=yue&0x0f;
ch451_write1(CH451_DIG4|yuege);
ch451_write1(CH451_DIG5|yueshi);
//日
ri=read_ds(7);
rishi=ri&0xf0;
rishi>>=4;
rige=ri&0x0f;
ch451_write1(CH451_DIG6|rige);
ch451_write1(CH451_DIG7|rishi);
//星期
xingqi=read_ds(6);
xingqige=xingqi&0x0f;
ch451_write2(CH451_DIG0|xingqige);
//时
xiaoshi=read_ds(4);
xiaoshishi=xiaoshi&0xf0;
xiaoshishi>>=4;
xiaoshige=xiaoshi&0x0f;
ch451_write2(CH451_DIG1|xiaoshige);
ch451_write2(CH451_DIG2|xiaoshishi);
//分
fen=read_ds
(2);
fenshi=fen&0xf0;
fenshi>>=4;
fenge=fen&0x0f;
ch451_write2(CH451_DIG3|fenge);
ch451_write2(CH451_DIG4|fenshi);
//秒
miao=read_ds(0);
miaoshi=miao&0xf0;
miaoshi>>=4;
miaoge=miao&0x0f;
ch451_write2(CH451_DIG5|miaoge);
ch451_write2(CH451_DIG6|miaoshi);
}
}
子函数
//延迟函数
voiddelay(uinta)
{
uinti,j;
for(i=256;i>0;i--)
for(j=256;j>0;j--)
while(a>0)
a--;
}
voidch451_write1(unsignedintcommand)
{
unsignedchari,j;
Lod1_L;//命令开始LOAD
for(i=0;i<12;i++)
{
j=command&0X01;
if(j==0x01)
j=(~0);
GPIOPinWrite(PB,DIN,j);//送入12位数据,低位在前
CLK_L;
CLK_H;//上升沿有效DCLOCK
command>>=1;
}
Lod1_H;//命令结束LOAD
}
voidch451_write2(unsignedintcommand)
{
unsignedchari,j;
Lod2_L;//命令开始LOAD
for(i=0;i<12;i++)
{
j=command&0X01;
if(j==0x01)
j=(~0);
GPIOPinWrite(PB,DIN,j);//送入12位数据,低位在前
CLK_L;
CLK_H;//上升沿有效DCLOCK
command>>=1;
}
Lod2_H;//命令结束LOAD
}
voidch451_int(void)
{
DIN_L;
DIN_H;
ch451_write1(CH451_RESET);//ch451复位
ch451_write1(CH451_SYSON2);//开CH451显示,键盘
ch451_write1(CH451_TWINKLE);
ch451_write1(CH451_BCD);//以bcd码方式显示
ch451_write2(CH451_RESET);//ch451复位
ch451_write2(CH451_SYSON2);//开CH451显示,键盘
ch451_write2(CH451_TWINKLE);
ch451_write2(CH451_BCD);//以bcd码方式显示
}
voidGPIO_IN(void)
{
GPIOPinTypeGPIOInput(GPIO_PORTD_BASE,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);//配置PB0、PB1为输出
}
voidGPIO_OUT(void)
{
GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);//配置PB0、PB1为输出
}
voidwrite_ds(ucharadd,uchardate)
{
GPIO_OUT();
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_3,0);//PB6管脚为低//dscs=0
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_2,~0);//PB6管脚为高
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_0,~0);//PB6管脚为高
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_1,~0);//PB6管脚为高
GPIOPinWrite(GPIO_PORTD_BASE,(GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7),add);//PC=add;
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_2,0);
GPIOPinWrite(GPIO_PORTD_BASE,(GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7),date);//PC=add;
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_1,0);
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_1,~0);
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_3,~0);
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_2,~0);
}
intread_ds(ucharadd)
{
GPIO_OUT();
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_3,0);//dscsPB3管脚为低//dscs=0
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_0,~0);//dsdsPB0管脚为高
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_1,~0);///dsrwPB1管脚为高
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_2,~0);//dsasPB2管脚为高
GPIOPinWrite(GPIO_PORTD_BASE,(GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7),add);//PC=add;
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_2,0);
GPIO_IN();
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_0,0);//dsds=0dsrw为高dsds为低将数据读出
ds_date=GPIOPinRead(GPIO_PORTD_BASE,(GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7));//ds_date=PC;
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_0,~0);
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_3,~0);
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_2,~0);
return(ds_date);
}
voidSetTime_ds()
{write_ds(0X0B,0X03);
write_ds(0X09,0X12);//年
write_ds(0X08,0X02);//月
write_ds(0X07,0X24);//日
write_ds(0X06,0X05);//星期
write_ds(0X04,0X14);//时
write_ds(0X02,0X30);//分
}
voidTimer0IntHandler(void)
{
//清除Timer中断
TimerIntClear(TIMER0_BASE,TIMER_TIMA_TIMEOUT);
a++;
}
voidSysTickIntHandler(void)
{
if(GPIOPinRead(GPIO_PORTC_BASE,GPIO_PIN_4)==0x00)//检测USER键是否被按下
TIME=0;//将控制LED状态的标志归零
}