dsp课程设计万年历设计.docx
《dsp课程设计万年历设计.docx》由会员分享,可在线阅读,更多相关《dsp课程设计万年历设计.docx(15页珍藏版)》请在冰豆网上搜索。
dsp课程设计万年历设计
1设计目的……………………………………………………………………………………1
2硬件设计…………………………………………………………………………………………1
2.1硬件方案设计…………………………………………………………………………………1
2.2单元电路设计…………………………………………………………………………………1
2.2.1控制部件………………………………………………………………………………2
2.2.2显示模块………………………………………………………………………………2
2.2.3读写时序………………………………………………………………………………4
2.2.4读写函数………………………………………………………………………………4
2.2.5地址显示………………………………………………………………………………5
2.2.6数据处理………………………………………………………………………………5
2.3硬件调试………………………………………………………………………………………6
3软件设计…………………………………………………………………………………………8
3.1系统分析……………………………………………………………………………………8
3.2软件调试………………………………………………………………………………………8
4课程设计体会总结………………………………………………………………………………9
5参考文献…………………………………………………………………………………………9
附录…………………………………………………………………………………………10
1设计目的
用TMS320F2812芯片为核心控制部件,设计一个能用LCD液晶显示屏显示当前年,月,日,时,分,秒的具有电子时钟功能的万年历,使用程序来控制时间的实时更新。
(1)熟悉CCS3.3软件的使用;
(2)学习并了解DSP板及教学实验箱的使用;
(3)学习DSP芯片的I/O端口的控制方法;
(4)熟悉Emulator方式下的程序调试规程,并最终能够熟练掌握在DSP软硬件环境下的程序开发流程;
(5)能够对现有器件进行简单地编程,实现各种简单地显示控制。
效果图展示如下:
2硬件设计
2.1硬件方案设计
本系统以TMS320F2812为核心控制部件,利用软件编程,通过CPU中断,使用12864LCD液晶显示器进行时钟显示,实现基本要求,尽量做到硬件电路简单稳定,减小电磁干扰和其他环境干扰,充分发挥软件编程的优点,减小因元器件精度不够引起的误差。
由于时间有限和本身知识水平的发挥,我们认为本系统还有需要改进和提高的地方,例如选用更高精度的元器件,硬件电路更加精确稳定,软件测量算法进一步的改进与完善等。
2.2单元电路设计
2.2.1控制部件TMS320F2812CUPTime结构及性能
本次课设所使用的TMS320F2812是DSP开发板,主要用到的是其中的CPU定时器功能,其整体思路如下:
1.初始化系统,为系统分配时钟,处理看门狗电路等等,
2.初始化CPU定时器0.
3.定时器0开始计数,等待周期中断,然后进入中断控制,对时分秒进行自加计数,并控制一个LED灯进行工作显示
程序部分如下:
intmyhour=12,mymin=32,mysec=20;
intmyyear=2017,mymon=06,myday=8;//预置时钟
interruptvoidTINT0_ISR(void)//CPU-Timer0中断函数
{
mysec++;
if((mysec%2)==0)
{
GpioDataRegs.GPADAT.bit.GPIOA0=1;//进入中断测试
}else
{
GpioDataRegs.GPADAT.bit.GPIOA0=0;
}
if(mysec==60)//时分秒自计数
{
mymin++;
mysec=0;
}
if(mymin==60)
{
myhour++;
mymin=0;
}
if(myhour==24)//年月日自计数
{
myday++;
myhour=0;
}
if(myday==30)
{
mymon++;
myday=1;
}
if(mymon==12)
{
myyear++;
mymon=1;
}
CpuTimer0Regs.TCR.bit.TIF=1;//清除定时器中断标志位
PieCtrl.PIEACK.bit.ACK1=1;//响应同组其他中断
EINT;//开全局中断
}
2.2.2显示模块LCD12864液晶显示
采用LCD12864液晶显示。
液晶显示器(LCD)具有功耗低、体积小、重量轻、超薄等许多其它显示器无法比拟的优点。
12864分左屏和右屏是由两块64*64的液晶组成,有CS1和CS2左右屏使能引脚。
64*64的共分8页,8行led液晶是一页,每行分别是由DB0_DB7控制,也就是从单片机中发64次8位的二进制数可以扫一页,发64(8页)次的二进制数可以扫一个半屏,再乘以二就可以扫全屏,当把二进制数全发完了,才可以控制液晶开始显示。
单片机可以通过数据总线与控制信号直接采用存储器访问形式、I/O设备访问形式控制该液晶显示模块。
液晶显示模块的访问、控制是由2812DSP对扩展扩展接口的操作完成。
2.2.3显示模块LCD12864液晶读写时序
数据传输过程(8位):
MCU写资料
MCU读资料
2.2.4显示模块LCD12864液晶读写函数
voidwr_lcd(uchardat_comm,uintcontent)
{
uinti,j;
sclk=0;
std=0;
delay
(1);
for(i=0;i<5;i++)
wr_byte1();
wr_byte0();
if(dat_comm)
wr_byte1();//data
else
wr_byte0();//command
wr_byte0();
for(j=0;j<2;j++)
{
for(i=0;i<4;i++)
{
if(content&0x80)
wr_byte1();
else
wr_byte0();
content=content<<1;
}
for(i=0;i<4;i++)
wr_byte0();
}
delay(3);
}
2.2.5显示模块LCD12864液晶按地址分行显示函数
为了使得程序可读性更加良好,我组编写了按地址分行显示函数,这个函数主要有两个参数,第一个参数为所需要在液晶屏上显示的字符,第二个参数为所需要显示的行数,因为12864液晶显示是按照地址显示的,其起始地址为0x80,第二行的地址为0x90,第三行为0x88,第四行为0x98,一行是8个地址,每个地址位可以显示一个汉字或者是两个字符,所以使用此函数可以简单明了的表示想要显示字符的位置。
显示函数如下:
voidchn_disp(uchar*chn,intm)
{
uchark;
wr_lcd(comm,0x30);
wr_lcd(comm,0x80);
if(m==1)
{
wr_lcd(comm,0x30);
wr_lcd(comm,0x80);
for(k=0;k<16;k++)
{
wr_lcd(datt,chn[k]);
}
}
if(m==2)
{
wr_lcd(comm,0x30);
wr_lcd(comm,0x90+1);
for(k=0;k<10;k++)
{
wr_lcd(datt,chn[k]);
}
}
if(m==3)
{
wr_lcd(comm,0x30);
wr_lcd(comm,0x88+1);
for(k=0;k<8;k++)
{
wr_lcd(datt,chn[k]);
}
}
if(m==4)
{
wr_lcd(comm,0x30);
wr_lcd(comm,0x98);
for(k=0;k<16;k++)
{
wr_lcd(datt,chn[k]);
}
}
}
2.2.6显示模块LCD12864液晶对各数据进行处理
使用extern函数对外部变量进行处理
voiddis_year()//年月日按位装入buff1
{
buff1[0]=myyear/1000+'0';
buff1[1]=(myyear/100%10)+'0';
buff1[2]=(myyear/10%10)+'0';
buff1[3]=myyear%10+'0';
buff1[4]='-';
buff1[5]=mymon/10+'0';
buff1[6]=mymon%10+'0';
buff1[7]='-';
buff1[8]=myday/10+'0';
buff1[9]=myday%10+'0';
}
voiddis_sec()//时分秒按位装入buff2
{
buff2[0]=myhour/10+'0';
buff2[1]=myhour%10+'0';
buff2[2]=':
';
buff2[3]=mymin/10+'0';
buff2[4]=mymin%10+'0';
buff2[5]=':
';
buff2[6]=mysec/10+'0';
buff2[7]=mysec%10+'0';
}
2.3硬件调试
硬件调试可分为静态调试与动态调试两步进行。
静态调试是在用户系统未工作时的一种硬件检测。
第一步:
目测。
检查外部的各种元件或者是电路是否有断点。
第二步:
用万用表测试。
先用万用表复核目测中有疑问的连接点,再检测各种电源线与地线之间是否有短路现象。
第三步:
加电检测。
给板加电,检测所有插座或是器件的电源端是否符合要求的值。
第四步:
联机检查。
因为只有用单片机开发系统才能完成对用户系统的调试。
动态调试是在用户系统工作的情况下发现和排除用户系统硬件中存在的器件内部故障、器件连接逻辑错误等的一种硬件检查。
动态调试的一般方法是由近及远、由分到合。
由分到合是指首先按逻辑功能将用户系统硬件电路分为若干块,当调试电路时,与该元件无关的器件全部从用户系统中去掉,这样可以将故障范围限定在某个局部的电路上。
当各块电路无故障后,将各电路逐块加入系统中,在对各块电路功能及各电路间可能存在的相互联系进行调试。
由分到合的调试既告完成。
由近及远是将信号流经的各器件按照距离单片机的逻辑距离进行由近及远的分层,然后分层调试。
调试时,仍采用去掉无关元件的方法,逐层调试下去,就会定位故障元件了。
3软件设计
3.1系统分析
根据本系统设计要求和硬件连接电路,软件实现主要包括两个主要部分:
液晶显示程序和主函数部分。
液晶显示部分,主要是利用通过字模提取软件计算出来的数组矩阵,选择要显示的汉字、数字或者字符。
显示每一个汉字、数字或字符时,应先设置起始页,起始列,然后将所对应的数组中的数据按序写入到LCD数据控制扩展接口中,其中写入左屏的数据地址为0x108003,写入右屏的数据地址为0x108004,依次分别写入年、月、日、星期、时、分、秒。
主程序的编写,首先要对2812DSP芯片的寄存器进行设置,选择输入输出方式。
设置完成,打开显示器,清除显示器显示内存,设置起始行,然后循环读取1302中指示的当前时间。
便可以在12864液晶显示屏上准确读出当前时刻。
3.2软件调试
软件调试是通过对程序的编译、连接、执行来发现程序中存在的语法错误与逻辑错误并加以排除纠正的过程。
最终实现了利用DSP芯片控制并用LCD液晶显示器进行实时显示当前秒、分、时、日、月和年。
4课程设计总结体会
通过这次课程的设计,万年历设计基本完成了所要求实现的功能。
这次的设计过程中主要是在LCD显示屏上显示出年、月、日、时、分、秒,主要是针对2812进行实现功能的代码编写。
2812集成了大部分的硬件,所以在硬件的操作上较为简单。
此次的课程设计,组内成员分工明确,各个环节紧密结合,才使得设计成功完成,让我们受益匪浅。
5参考文献
顾卫钢,《手把手教你学DSP》,北京航空航天大学出版社,2011.4;
附录
主函数部分:
/*----------------主函数-----------------*/
voidmain(void)
{
/*初始化系统*/
InitSysCtrl();
DINT;
IER=0x0000;//禁止CPU中断
IFR=0x0000;//清除CPU中断标志
/*初始化PIE*/
InitPieCtrl();
/*初始化PIE中断矢量表*/
InitPieVectTable();
InitGpio();
InitPeripherals();//初始化Cpu定时器模块
init_lcd();//初始化LCD
PieCtrl.PIEIER1.bit.INTx7=1;//使能PIE模块中的Cpu定时器0的中断
IER|=M_INT1;//开CPU中断
EINT;//使能全局中断
ERTM;//使能实时中断
ConfigCpuTimer(&CpuTimer0,150,150000);//Cpu定时器0的周期为1s
StartCpuTimer0();//启动Cpu定时器0
for(;;)
{
dis_year();//显示年月日
dis_sec();//显示时分秒
lat_disp(0x00,0x00);//清屏,作用等同于clrram();
clrram();//清屏
chn_disp(tab2,1);//分别按行显示万年历、年月日、时分秒、模式
chn_disp(buff1,2);
chn_disp(buff2,3);
chn_disp(mode,4);
delay(0xffff);//延时
lat_disp(0x00,0x00);//清屏,作用等同于clrram();
}
}