DSP综合实验4.doc_第1页
DSP综合实验4.doc_第2页
DSP综合实验4.doc_第3页
DSP综合实验4.doc_第4页
DSP综合实验4.doc_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验四综合实验一、实验目的:1、熟悉CCS编程的整体结构;2、熟悉存储器的扩展;3、熟悉串口通信。二、实验内容:对给出的测试程序进行修改,以达到预期的要求。三、实验程序说明:1、所有子程序的函数都在init.c文件中测试程序的每一部分都做成了函数,只要调用子函数就能执行相应的程序,子程序包括:I/O口、步进电机、直流电机、蜂鸣器等。2、chkmem.asm文件为存储器测试程序的汇编文件,包括扩展的RAM和ROM,地址分别为0x8000、0x18000、0x28000,编写了完整的读写程序;3、还有一部分就的串口通信程序,主要是完成和51单片机的通信,因51单片机控制着键盘、8个数码管和液晶显示,和其通信主要是为了控制输入输出。四、实验内容:1、修改蜂鸣器测试部分程序,当测试蜂鸣器时使其响5声,若不响查看JP14是否为弹起状态,在init.c文件中的sp()中修改;2、修改存储器测试程序,使其读写次数改为32,在chkmem.asm中修改;3、修改液晶显示程序,修改结果为:程序运行后按2进入第二屏,修改这一屏的显示,修改后为:1.存储器,2. 步进电机,3.直流电机,4.交通灯,5. 喇叭,按相应的键进入相应的程序中执行;4、修改交通灯测试程序,使其符合生活中的十字路口交通灯;在init.c文件中的traffic_led()中修改,要巧妙运用Led_Traffic18、Led_Delay18,两个数组,只要修改这两个数组的数据就能实现结果。实验程序段:#include #include #include #include #define IMR_ADDR 0int s;char *b;#define UART_COUNTER 0x62#define KEYIN_COUNTER 0X61#define LCD_SIZE 23#define KEY_SIZE 6#define LED_SIZE 14ioport unsigned port8000; /* for CTRL word */ioport unsigned porte000; /* for DC MOTOR run */ioport unsigned portc000; /* for LEDs show */ioport unsigned portf000; /* for STEPMOTOR */unsigned int CtrlWord=0;char LCD_BufferLCD_SIZE= 0x55,0x66 ; /* LCD SHOWs buffer */char KEY_BufferKEY_SIZE; /* KEY INPUTs buffer */int Iskey=0; /* if Iskey!=0,then have KEY in */ /* its high 8 bits are key code ! */char LED_BufferLED_SIZE= 0x55,0x77; /* LED SHOWs buffer */ int NowLine=1,NowCol=0;int IsQuitKey=0,First_input=1; /* if = 1, quit key input */float Result,Input_number;char In_number10,Now_in=0; /* in calculater, input number save it */char Last_Cal,Lastbuf3= ; int Led_Traffic24=0x030c,0x28a,0x208,0x28a,0x208,0x28a,0x861, 0x0451,0x041,0x0451,0x041,0x0451,0x030c,0x28a,0x208,0x28a,0x208,0x28a,0x861, 0x0451,0x041,0x0451,0x041,0x0451; int Led_Delay24=60,5,5,5,5,5,60,5,5,5,5,5,60, 5,5,5,5,5,60,5,5,5,5,5; unsigned int TimerNum=0,TimerIndex=0;unsigned int chk_prog28000(void);unsigned int chk_data8000(void);void u_printf(char *buf,int size);void key_input(char *buf,int size);void pllx100();void pllx10();void speak(int length,int flag);int test() int i; i=0; return(i); void mydelay() /* when clkout=10MHz, about 0.2s */ int i,j; for(i=0;i500;i+) for(j=0;j1000;j+);void mydelay1() /* when clkout=10MHz, about 0.2s */ int j,i; for(i=0;i200;i+) for(j=0;j1000;j+);void error_sound(int error) if(error=1) speak(2000,1);mydelay(); else speak(7500,1);mydelay(); speak(7500,1);mydelay(); int is_getkey(void) int i; if( KEY_Buffer0 = E) & (KEY_Buffer5 = 0x0d) Iskey=(KEY_Buffer4 & 0xff) 8 ); Iskey |= (KEY_Buffer3 & 0xff); for(i=0;i6;i+) KEY_Bufferi=0; /* clear key buffer */ else Iskey=0; return(Iskey); /* return key code, low 8 bit is code */ int get_key(int iswait) volatile int *addr_counter; int i; Iskey=0; key_input(&KEY_Buffer0,6); if(iswait = 0) /* if iswait=1, then must wait for rev end, else return direct ! */ return(Iskey); /* return key code */ addr_counter = (int *)KEYIN_COUNTER; while( *addr_counter); /* wait for a key input. */ if( KEY_Buffer0 = E) & (KEY_Buffer5 = 0x0d) Iskey=(KEY_Buffer4 & 0xff) 8 ); Iskey |= (KEY_Buffer3 & 0xff); for(i=0;i6;i+) KEY_Bufferi=0; /* clear key buffer */ else for(i=0;i6;i+) KEY_Bufferi=0; /* clear key buffer */ mydelay(); return(Iskey); /* return key code, low 8 bit is code */ int lcd_printf(int ln, int col, char *buf, int iswait) volatile int *addr_counter; addr_counter = (int *)UART_COUNTER; LCD_Buffer2=ln; /* which LN will show the string */ LCD_Buffer3=col; /* which COL will show string */ LCD_Buffer4=strlen(buf)/2; /* how many chinese char(2 byte) will show */ memcpy(&LCD_Buffer5,buf, LCD_Buffer4*2); LCD_Buffer21=0x88; LCD_Buffer22=0x99; u_printf(&LCD_Buffer0,23); if(iswait = 1) /* if iswait=1, then must wait for send end, else return direct ! */ while( *addr_counter); return( *addr_counter); /* return number of left char will not send */ int led_printf(char *buf, int iswait) volatile int *addr_counter; int j; addr_counter = (int *)UART_COUNTER; /* if buf=, clr LED */ for(j=0;j8;j+) if(*buf = 0) LED_Buffer11-j=0xf; else if( *buf = ) LED_Buffer11-j=0xf; buf+; else if( *buf = 0) & (keycode = 10000.) sprintf(result,结果%6.5E,Result); else if(temp = 0.0001) sprintf(result,结果%10.8f,Result); else sprintf(result,结果%6.5E,Result); size=strlen(result); if(size % 2 != 0) resultsize+= ; resultsize=0; mydelay(); lcd_printf(4,0,result,0); Now_in=0; Last_Cal=; return(0); return(0); void lcd_clr(int iswait) volatile int *addr_counter; addr_counter = (int *)UART_COUNTER; LCD_Buffer2=0xff; LCD_Buffer3=0xff; LCD_Buffer4=0xff; LCD_Buffer21=0x88; LCD_Buffer22=0x99; u_printf(&LCD_Buffer0,23); if(iswait = 1) /* if iswait=1, then must wait for send end, else return direct ! */ while( *addr_counter); int test_mem(int allmem) int memok,test_ret; pllx100();/* change clk=100MHz */ switch(allmem) case 0: /* check all mem ! */ case 1: /* only check PROGRAM 18000h */ memok=chk_prog18000(); if(memok = 1) test_ret=1; /* prog 18000h is ok ! */ else test_ret=-1; /* prog 18000h maybe error */ break; case 2: /* only check PROGRAM 28000h */ memok=chk_prog28000(); if(memok = 1) test_ret=1; /* prog 28000h is ok ! */ else test_ret=-2; /* prog 28000h maybe error */ break; case 3: /* only check DATA SRAM 8000h */ memok=chk_data8000(); if(memok = 1) test_ret=1; /* data 8000h is ok ! */ else test_ret=-3; /* data 8000h maybe error */ break; default: test_ret=0; /* return 0, not check the mem ! */ pllx10(); return(test_ret); void test_DCmotor() int i,j,k; CtrlWord |= 0x1; /* make D0=1 */ port8000=CtrlWord; /* start DC MOTOR power */ i=lcd_printf(3,0,摆动,1); /* wait for send end ! */ for(i=0;i20;i+) /* right and left */ porte000=0; mydelay(); porte000=1; mydelay(); i=lcd_printf(3,2,正转,1); porte000=1; /* rotate + for 5s */ for(i=0;i25;i+) /* delay about 5s */ mydelay(); i=lcd_printf(3,4,反转,1); porte000=0; for(i=0;i25;i+) /* rotate - for 5s */ mydelay(); for(i=0;i4;i+) porte000=0; mydelay(); porte000=1; mydelay(); i=lcd_printf(3,6,慢转,1); for(k=0;k4;k+) /* rotate slowly */ for(i=0;i1000;i+) porte000=1; for(j=0;j6500;j+); porte000=0; for(j=0;j1000;j+); CtrlWord &= 0xfffe; /* make D0=0; */ port8000=CtrlWord; void test_stepmotor() int motor=0xf,i,j,k; i=lcd_printf(3,1,反转. ,1);/ portf000=1; motor=1; for(i=0;i5;i+) for(j=0;j4;j+) portf000=motor; /* send drive pluse to motor */ motor=motor1; for(k=0;k4;k+) /* delay */ mydelay(); if(motor = 0x10) motor=1; i=lcd_printf(3,5,正转. ,1); portf000=0; motor=0x8; for(i=0;i5;i+) for(j=0;j 1; for(k=0;k2;k+) /* delay */ mydelay(); if(motor = 0x0) motor=0x8; void traffic_led() int *imr_addr; lcd_clr(1); /* clear LCD display */ mydelay(); lcd_printf(1,0,正在演示交通灯.,1); /* wait for send end ! */ mydelay(); lcd_printf(4,2,(ESC键退出) ,1); /* wait for send end ! */ mydelay(); TimerIndex=0; Time

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论