实验四综合实验
一、实验目的: 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
#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;
相关推荐: