西安交大自动化嵌入式实验.docx
- 文档编号:12690131
- 上传时间:2023-04-21
- 格式:DOCX
- 页数:21
- 大小:705.82KB
西安交大自动化嵌入式实验.docx
《西安交大自动化嵌入式实验.docx》由会员分享,可在线阅读,更多相关《西安交大自动化嵌入式实验.docx(21页珍藏版)》请在冰豆网上搜索。
西安交大自动化嵌入式实验
一、实验目的:
通过本专题实验可以培养学生对嵌入式系统设计及应用的综合能力,使学生理论联系实际,提高实际动手能力和解决实际问题能力,并锻炼学生的合作精神。
二、实验内容:
实验一:
熟悉M16C/62P嵌入式系统实验箱及嵌入式C语言的基本编程方法
实验目的:
了解renesas嵌入式系统,掌握嵌入式C语言的编程方法。
基本要求:
学会使用M16C/62P嵌入式系统实验箱;熟悉嵌入式C语言的编程方法,了解嵌入式C语言和普通C语言的异同。
内容提要:
了解renesas嵌入式系统的组成结构,熟悉M16C/62P嵌入式系统实验箱。
嵌入式C语言的变量定义;程序结构设计;外围输入、输出设备的控制指令的使用等。
实验二:
M16C/62P嵌入式系统的集成编译环境和仿真调试环境实验
实验目的:
掌握M16C/62P的集成编译HEW和仿真调试环境KD30的使用方法。
基本要求:
能够熟练使用renesas嵌入式设备的集成编译环境HEW和仿真调试环境KD30。
内容提要:
熟悉renesas嵌入式设备的编程环境HEW和调试环境KD30。
能够根据实验要求在编程环境HEW下设计相应的工程项目,包括文件定义、变量定义、程序结构设计、算法实现等;在KD30环境下,掌握程序的调试步骤,如何排除程序中的错误等。
实验三:
基础模块设计实验
实验目的:
掌握各基础模块的使用和编程方法。
基本要求:
熟悉功能函数库library中的函数及示例程序。
内容提要:
完成7段LED模块、LCD16*2和LCD128*64显示模块、键盘的使用模块,定时器的使用、定时中断的使用、AD和DA等模块基本实验环节。
通过对各基础模块(如LCD、LED、键盘、定时器和中断等)的学习,了解其工作原理。
并编制相应的测试程序。
实验四:
综合实验设计及应用
实验目的:
全面掌握M16C/62P系列嵌入式微控制器的程序设计技术。
基本要求:
利用实验一~三的积累,完成特定功能的实验任务。
内容提要:
设计一个工程文件完成以下功能,要求尽可能多的使用实验箱中的各个模块(键盘、LCD、LED、开关、AD和DA、音频口等)
(1)设计程序完成某种数据排序功能。
查找一维数组的最大(小)值。
(2)设计程序完成典型工程数字滤波算法,包括:
中值滤波、(滑动)均值滤波、一阶惯性滤波等。
(3)实现具有人机界面的加、减、乘、除、开方和幂运算等功能的计算器;
(4)分别采用定时中断和定时器,设计秒表和倒计时表,并能显示日历或图片等信息。
(5)能尽量放一段优美的音乐。
(6)温度控制系统实验
a)搭建好硬件系统:
将实验箱上的AD、DA端口与温箱正确连接,构成完整的闭环系统。
b)设计控制界面:
控制界面上须有参数输入和控制结果显示及数据保存功能。
可分别在两个液晶屏上显示。
c)根据温箱的特点,设计适合的控制算法;
e)采用定时中断或定时器实现采样周期。
三、实验设备:
瑞萨电子M16C/62型嵌入式系统实验箱,台式计算机。
四、实验结果:
实验一,实验二,实验三,与单片机实验相似,值得注意的是,创建workspace时第二步选择startupfile时要用default,不能选择user,因为在user时编译器自动加进了intr0.a30和section.a30文件,这两个文件是用来引导系统启动和进行堆栈分配和中断向量定义的,所以对于特定的机型可能会有较小的差异,我们使用瑞萨官方的定制文件才能建立正常的工程。
实验四:
实现具有加减乘除并能进行混合和带括号的计算器
实验主函数代码如下:
/***********************************************************************/
/**/
/*FILE:
AudioMemo.c*/
/*DATE:
Wed,Oct23,2013*/
/*DESCRIPTION:
mainprogramfile.*/
/*CPUGROUP:
62P*/
/*ThisfileisgeneratedbyRenesasraoqiang(Ver.4.17).*/
/*******************************************************************/
#include"..\lib\audioutl.h"
#include"lcd1.h"
#include"lcd.h"
#include"interrupt_sw.h"
#include"timer.h"
#include"lcd12864.h"
#include"Stack.h"
#include"compch.h"
#include"led.h"
#include"sw.h"
#include
voidintAD1(void);//interruptprocessofAD1
#pragmaINTERRUPTintAD1()
voidint0proc(void);//interruptprocessofINT0
#pragmaINTERRUPTint0proc()vect=29
voidint1proc(void);//interruptprocessofINT0
#pragmaINTERRUPTint1proc()vect=30
voidTimerA0();
#pragmaINTERRUPTTimerA0
volatileunsignedintrotate=0;
volatileunsignedintrotateDA=0;
volatileunsignedcharAudioAD[1024];
volatileunsignedcharkeydown=0;
volatileunsignedcharmutex=0;
volatileunsignedcharStaDA=0;
inti=0;
charkeychar='0';
voidintAD1(void)
{
rotate++;
if(rotate==2000)
{
AudioAD[i++]=(unsignedchar)((ad1&0x3FF)>>2);/*打算用来录音的*/
rotate=0;
}
//sendAD1conversionresulttoDA0,theresultshouldbedividedby4whenAD1use10bits
//da0=(unsignedchar)((ad1&0x3FF)>>2);
adst=1;//ADconversionstarted
if(i==1024)
{adic=0;
adst=0;}
}
voidint0proc(void)
{
if(rm_sw9chat())//cancelchatteringofINT0
{
keydown=1;
}
}
voidint1proc(void)
{
if(rm_sw10chat())//cancelchatteringofINT1
{
//StaDA=1;
keydown=0;
}
}
voiddelayms(int);
voidgetnumeri(char*,double);
voidmain(void)
{
char*incre;
charstr1[50]={0};
charcount=0;
doubleresult=1;
charp[20]={0};
charstr2[50]={0};
charcla,f1=0,f2=0;
unsignedcharback;
init_lcd();//initializeLCD
InitInterruptSW();
Lcd12864_init_lcd();
InitKey();
InitLED();
//SetLED(0x01);
Lcd12864_init_lcd();//initializeLCD128*64
Lcd12864_light_on();//lightLCDbackground
Lcd12864_set_cursol(0,0);//setLCDcursol
//Lcd12864_write_lcd("ShanghaiJutone=");//displaystringonLCD128*64
//Lcd12864_clear_lcd();
//testaudio
InitAudioIn();//initializeAD1
InitAudioOut();//initializeDA0
init_TimerA0();
InitSW();
#pragmaASM
fsetI
#pragmaENDASM
while
(1)
{
//SetLED(0x01);
if(StaDA==1)
ta0s=1;
if(keydown==1)
{
InitLED();
SetLED(0x01);
p2=0x01;
set_cursol(0,1);
write_lcd("TestAUDIO");
Lcd12864_set_cursol(0,0);
Lcd12864_write_lcd_char('h');
}
while(keydown);
keydown=0;
SetLED(GetSW());
//p2=0x11;
//calculate
while(!
mutex)//此处用控制量来控制循环,所以可以用来扩展别的功能
{
count=0;
Lcd12864_set_cursol(0,0);
Lcd12864_write_lcd("inputexpress:
");
Lcd12864_set_cursol(0,1);
while(keychar!
='=')//没有输入等号怎可以一直输入字符,支持混合和带括号的运算
{
keychar=KeyGetNum();
if(keychar=='@')/*此处为键盘的‘@’扩展功能键,请参照key.c中的KeyNum1[]的定义,在第8个拨码开关打开时
参看KeyGetNum函数对p3_7的使用*/
{
count--;//表示删除前一个输入的字符
Lcd12864_set_cursol(count,1);
Lcd12864_write_lcd_char('');//用一个空格覆盖掉原来输入的字符
Lcd12864_set_cursol(count,1);
}
else
{
*(str1+(count++))=keychar;
Lcd12864_write_lcd_char(keychar);
Lcd12864_write_lcd_char('');/*由于还没弄清楚如何实现使得cursor一次只跳一个英文字符,所以只能插入空格用来实现能够
Lcd12864_set_cursol()函数只能设置一个汉语的字符位置,相当于两个英文字符,所以在输入每一个英语字符后插入一个空格
有利于删除一个字符的操作*/}
}
*(str1+count-1)='\0';
Change(str1,str2);
result=Compute(str2);/*computetheresult此处一个小小的函数Compute却是整个计算器的核心,此处不再详细说明不明白的看下逆波兰算法
本人也就是将逆波兰算法实现了,其中用到了Stack,关于stack的定义是*/
result*=100;/*保留2位小数*/
getnumeri(p,result);
incre=p;
/*result=Compute(q);
getnumeri(p,result);
incre=p;*/
Lcd12864_set_cursol(0,3);
Lcd12864_write_lcd(incre);
cla=KeyGetNum();
Lcd12864_clear_lcd();
delayms(5);
Lcd12864_clear_lcd();
delayms(5);
Lcd12864_clear_lcd();
delayms(5);
//Lcd12864_set_cursol(0,0);
//Lcd12864_write_lcd("inputexpress:
");
keychar=0;
}
}
}
voidTimerA0()
{
da0=(unsignedchar)((ad1&0x3FF)>>2);//DA转化的,本来要用来将录得声音发送出去
}
voiddelayms(intt)//延时函数,暂时没用到
{
inti,j;
for(i=0;i for(j=0;j<12000;j++); } voidgetnumeri(char*s,doublex)//将浮点数值转换为字符串 {inti=0,j=0; charflag=0,ch[40]; if(x<0) { x*=-1; flag=1; } while(x>0) { *(ch+(i++))=(unsignedint)x%10+'0'; x=(int)x/10; } if(flag==1) *(ch+(i++))='-';//支持负数运算 *(s+i)='\0'; for(j=i-1;j>=0;j--) *(s+j)=*(ch+i-1-j); *(s+i+1)='\0'; *(s+i)=*(s+i-1); *(s+i-1)=*(s+i-2); *(s+i-2)='.';//支持小数运算 } Compute函数代码: #include"compch.h" #include"Stack.h" #include"lcd12864.h" doubleCompute(char*str) { doublex,y; inti=0; StackSqS; InitStack(&S); while(str[i]) { if(str[i]==''){i++;continue;} switch(str[i]) { case'+': x=Pop(&S)+Pop(&S); i++;break; case'-': x=Pop(&S); x=Pop(&S)-x; i++;break; case'*': x=Pop(&S)*Pop(&S); i++;break; case'/': x=Pop(&S); if(x! =0.0) x=Pop(&S)/x; else exit (1); i++;break; default: x=0; while(str[i]>=48&&str[i]<=57) { x=x*10+str[i]-48;i++; } if(str[i]=='.') { doublej=10.0; i++; y=0; while(str[i]>=48&&str[i]<=57) { y=y+(str[i]-48)/j; i++;j*=10.0; } x+=y; } } Push(&S,x); } if(EmptyStack(&S)) { exit (1); Lcd12864_write_lcd("er"); } x=Pop(&S); if(EmptyStack(&S)) returnx; else //return-1; exit (1); } voidChange(char*s1,char*s2) { StackSq1R; inti=0,j=0; charch,w; InitStack1(&R); Push1(&R,'#'); ch=s1[i]; while(ch! ='\0') { if(ch=='') ch=s1[++i]; elseif(ch=='(') { Push1(&R,ch); ch=s1[++i]; } elseif(ch==')') { while(Peek1(&R)! ='(')s2[j++]=Pop1(&R); Pop1(&R); ch=s1[++i]; } elseif(ch=='+'||ch=='-'||ch=='*'||ch=='/') { w=Peek1(&R); while(Precedence(w)>=Precedence(ch)) { s2[j++]=w; Pop1(&R); w=Peek1(&R); } Push1(&R,ch); ch=s1[++i]; } else { if((ch<'0'||ch>'9')&&ch! ='.') { exit (1); } while((ch>='0'&&ch<='9')||ch=='.') { s2[j++]=ch; ch=s1[++i]; } s2[j++]=''; } } ch=Pop1(&R); while(ch! ='#') { if(ch=='(') { exit (1); Lcd12864_write_lcd("chengong"); } else { s2[j++]=ch; ch=Pop1(&R); } } //for(i=0;i //Lcd12864_write_lcd_char(s2[i]); s2[j++]='\0'; //Lcd12864_write_lcd("124333"); } intPrecedence(charname) { if(name=='('||name==')'||name=='#') { return0; } if(name=='! ') { return3; } if(name=='*'||name=='/') { return2; } if(name=='+'||name=='-') { return1; } else return4; } 五、实验结果分析 实验实现了加减乘除混合运算,并能够带括号运算 (注意此处计算出的值是表达式值的2/3次幂,自己可以验证,就是,就是想验证该编译器自带的math.c可以计算一个数的幂次) 输入表达式: 计算表达式的值: 带括号的混合运算: 六、实验总结 这次嵌入式实验由于时间比较紧张,我主要是以学习操作流程为主,练习操作了实验指导书上的几个程序,然后根据饶强同学写的代码编译下载操作了一下,感觉这个实验确实能对自己的能力提升很大,但是自己并没有做自己创新的那一步,提高有限,以后有时间一定会多做这方面的练习,提高自己的动手能力。 在此谢谢杨老师和刘老师的体谅。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 西安 交大 自动化 嵌入式 实验
![提示](https://static.bdocx.com/images/bang_tan.gif)