DSP综合实验4 联系客服

发布时间 : 星期日 文章DSP综合实验4更新完毕开始阅读

实验四综合实验

一、实验目的: 1、熟悉CCS编程的整体结构; 2、熟悉存储器的扩展; 3、熟悉串口通信。 二、实验内容:

对给出的测试程序进行修改,以达到预期的要求。 三、实验程序说明:

1、所有子程序的函数都在init.c文件中测试程序的每一部分都做成了函数,只要调用子2、chkmem.asm文件为存储器测试程序的汇编文件,包括扩展的RAM和ROM,地址函数就能执行相应的程序,子程序包括:I/O口、步进电机、直流电机、蜂鸣器等。 分别为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_Traffic[18]、Led_Delay[18],两个数组,只要修改这两个数组的数据就能实现结果。 实验程序段: #include #include #include #include

#define IMR_ADDR 0

int s; char *b;

#define UART_COUNTER 0x62 #define KEYIN_COUNTER 0X61 #define LCD_SIZE 23 #define KEY_SIZE 6 #define LED_SIZE 14

ioport 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_Buffer[LCD_SIZE]=

{0x55,0x66} ; /* LCD SHOW's buffer */ char KEY_Buffer[KEY_SIZE]; /* KEY INPUT's buffer */ int Iskey=0; /* if Iskey!=0,then have KEY in */ /* its high 8 bits are key code ! */ char LED_Buffer[LED_SIZE]=

{0x55,0x77}; /* LED SHOW's buffer */ int NowLine=1,NowCol=0;

int IsQuitKey=0,First_input=1; /* if == 1, quit key input */

float Result,Input_number;

char In_number[10],Now_in=0;

/* in calculater, input number save it */

char Last_Cal,Lastbuf[3]={\ \

int Led_Traffic[24]={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_Delay[24]={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;i<500;i++) for(j=0;j<1000;j++); }

void mydelay1()

{ /* when clkout=10MHz, about 0.2s */ int j,i;

for(i=0;i<200;i++) for(j=0;j<1000;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_Buffer[0] == 'E') && (KEY_Buffer[5] == 0x0d)) { Iskey=((KEY_Buffer[4] & 0xff) << 8 ); Iskey |= (KEY_Buffer[3] & 0xff);

for(i=0;i<6;i++)

KEY_Buffer[i]=0; /* clear key buffer */ } else

Iskey=0;

}

int get_key(int iswait)

return(Iskey); /* return key code, low 8 bit is code */

{ volatile int *addr_counter; int i;

Iskey=0;

key_input(&KEY_Buffer[0],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_Buffer[0] == 'E') && (KEY_Buffer[5] == 0x0d)) { Iskey=((KEY_Buffer[4] & 0xff) << 8 ); Iskey |= (KEY_Buffer[3] & 0xff); for(i=0;i<6;i++)

KEY_Buffer[i]=0; /* clear key buffer */ } else {

for(i=0;i<6;i++)

KEY_Buffer[i]=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_Buffer[2]=ln; /* which LN will show the string */ LCD_Buffer[3]=col; /* which COL will show string */

LCD_Buffer[4]=strlen(buf)/2; /* how many chinese char(2 byte) will show */

memcpy(&LCD_Buffer[5],buf, LCD_Buffer[4]*2);

LCD_Buffer[21]=0x88; LCD_Buffer[22]=0x99;