“嵌入式微控制器技术”实验任务书(电气、自动化)一、实验目的与要求:1、熟练掌握基于SST89E554RC微控制器的Keil C51集成开发工具的操作及调试程序的方法(包括:仿真调试与脱机运行间的切换方法);掌握其他相关微控制器集成开发工具的使用及调试方法;2、熟练掌握基于SST89E554RC单片机核心板及I/O扩展实验系统的电路结构原理、设计与应用;掌握其他相关微控制器最小系统设计与应用;3、熟练掌握在Keil C51与Proteus仿真软件虚拟联机环境下的基于51单片机控制器数字接口电路的硬件、软件设计方法与功能调试;4、完成本实验课程所要求的全部实验容,并写出实验报告。
二、微机原理与接口技术综合实验室资源简介实验室为以下实验活动提供条件:1、基于唐都实验系统的微机原理与接口技术实验(包括汇编语言、C语言/C++语言软件编程实验和16位/32位微机接口电路应用实验);2、基于SST89E554RC微控制器技术软/硬件实验(提供支持汇编语言、C语言编程的Keil C51集成开发工具、最小核心板+唐都实验系统箱);3、基于DSP2407、DSP2812、DSP28335微控制器技术软件/硬件实验(提供支持C语言编程的TI公司的CCS集成开发工具、DSP系列学习开发板、直流电机、步进电机、液晶);4、基于Freescale的16位MC9S12XS128微控制器技术应用实验(提供支持C语言编程的CodeWarrier 5.0 For S12集成开发工具、HF-MC9S12XS128EVB-A 核心板);5、基于ARM的16/32位ARM7LPC2103TDMI-S微控制器技术基础实验(提供支持C、C++语言编程的ARM公司推出的ARM微控制器ADS 1.2集成开发工具、EasyARM2103开发板);6、基于ARM Cortex™-M3先进核的LM3S1138微控制器技术基础实验(提供支持C语言编程的IAR5.11集成开发工具、EasyARM1138开发板);7、基于LabVIEW虚拟仪器技术的NI ELVIS II+实验仪器,提供信号与系统实验、单级倒立摆控制实验、基于面包板DIV设计三、嵌入式微控制器技术实验容及要求本课程实验学时为16学时(8次实验),实验将以开放实验方式进行,实验容包括SST89E554RC微控制器实验和DSP2812微控制器实验,鼓励学生自主学习,在完成相关实验容后,及时提交给指导老师进行检查验收并自主进行相关微控制器技术应用学习与实验。
实验一系统认识实验(基于SST89E554RC)基本部分:按照实验指导书之“2.1 系统认识实验”(P17~P23页)容要求,熟悉实验环境及方法,完成基于汇编语言程序例的实验调试与验证。
提高部分:完成实验指导书之“2.2 数码转换实验”。
题目一:汇编语言实现BCD码整数转换二进制整数(验证性)题目二:汇编语言实现二进制整数转换十进制整数的设计(设计性)实验二数据传送与排序程序设计实验(基于SST89E554RC)基本部分:按照实验指导书之“2.5 数据排序实验”(P33页)容要求完成调试与验证。
提高部分:汇编语言编程实现把(R2,R3)源RAM区首址的(R6,R7)个字节数据,传送到(R4,R5)目的RAM区,完成目的区数据升序排列。
实验三数字量输入输出实验(基于SST89E554RC)基本部分:按照实验指导书之“3.1 数字量输入输出实验”基本实验项目要求,完成汇编语言和C语言基本程序功能调试与验证。
提高部分:(任选一题)题目一:LED交通灯控制(使用8255接口芯片)要求:使用汇编语言和C语言编程。
功能为:通过开关实现LED灯工作方式即时控制,完成LED交通灯的开关控制显示功能和LED交通灯自动循环显示功能。
题目二:LED灯控制(使用8255接口芯片)要求:使用汇编语言、C语言编程。
功能为:通过KK1实现LED灯工作方式即时控制,完成LED开关控制显示和LED灯左循环、右循环、间隔闪烁功能。
ORG 0000HLJMP MAINORG 0003HLJMP INT00ORG 0030HMAIN:MOV SP,#70HSETB IT0SETB EASETB EX0CLR PX0MOV DPTR,#0FF7FHMOV A,#80HMOVX DPTR,AMOV R0,#0MOV DPTR,#0FF7CHLOOP:CJNE R0,#0,L1MOV A,#0FFHMOVX DPTR,AW0: CJNE R0,#0,LOOPAJMP W0L1: CJNE R0,#1,L2 MOV A,#00HMOVX DPTR,AW1: CJNE R0,#1,LOOP AJMP W1L2: CJNE R0,#2,L3 MOV A,#0FEH; MOV R1,#8W2: MOVX DPTR,A LCALL DELAYRL ACJNE R0,#2,LOOP SJMP W2;DJNZ R1,W2;LJMP LOOPL3: CJNE R0,#3,L4 MOV A,#7FHW3: MOVX DPTR,A LCALL DELAYRR ACJNE R0,#3,LOOP SJMP W3L4:MOV A,#0FEHW4: MOVX DPTR,A LCALL DELAYRL ARL ACJNE R0,#4,LOOP SJMP W4DELAY:MOV R7,#255D1: MOV R6,#255 DJNZ R6,$DJNZ R7,D1RETORG 0FFHINT00:PUSH ACCPUSH PSWINC R0CJNE R0,#5,LLMOV R0,#0LL: POP PSWPOP ACCRETIEND实验四中断系统实验(基于SST89E554RC)基本部分:按照实验指导书之“3.2 中断系统实验”中相关实验项目要求,完成汇编语言和C语言基本程序功能调试与验证。
提高部分:(要求:Proteus环境下,任选一题完成)在完成交通灯基本功能基础上,当有急救车到达时,两向交通信号为全红,以便让急救车通过。
假定急救车通过路口时间为10秒,急救车通过后,交通灯恢复中断前状态。
本实验题以按键为中断申请,表示有急救车通过。
ORG 0000HLJMP MAINORG 0003HLJMP INT00ORG 0030HMAIN:MOV SP,#70HSETB IT0SETB EASETB EX0CLR PX0MOV DPTR,#0FF7FHMOV A,#80HMOVX DPTR,AMOV DPTR,#0FF7CH LOOP:MOV A,#1EHMOVX DPTR,ALCALL DELAY2MOV R1,#3LH2:MOV A,#1DHMOVX DPTR,ALCALL DELAYMOV A,#1FHMOVX DPTR,ALCALL DELAYDJNZ R1,LH2MOV A,#33HMOVX DPTR,ALCALL DELAY2MOV R1,#3LH3:MOV A,#2BHMOVX DPTR,ALCALL DELAYMOV A,#3BHMOVX DPTR,ALCALL DELAYDJNZ R1,LH3LJMP LOOPDELAY2:MOV R0,#8LH1:LCALL DELAYDJNZ R0,LH1RETDELAY:MOV R4,#25MOV R5,#100MOV R6,#100D2:DJNZ R6,D2MOV R6,#100DJNZ R5,D2MOV R5,#100DJNZ R4,D2RETINT00:PUSH ACCPUSH PSWMOV A,#1BHMOVX DPTR,A ; MOV R0,#5 LH: LCALL DELAY ; DJNZ R0,LHPOP PSWPOP ACCRETIEND实验五定时器/计数器实验(基于SST89E554RC)基本部分:按照实验指导书之“3.3 定时/计数器实验”基本实验项目要求、完成汇编语言和C语言程序功能调试与验证。
提高部分:(要求:Proteus环境下,任选一题完成)题目一:定时器控制LED灯要求:由单片机部定时器1,按方式1工作,即作为16位定时器使用每0.05秒钟T1溢出中断一次。
P1口的P1.0-P1.7分别接八个发光二极管。
编写程序模拟时序控制装置。
开机后第一秒钟L1,L3亮,第二秒钟L2,L4亮,第三秒钟L5,L7亮,第四秒钟L6,L8亮,第五秒钟L1,L3,L5,L7亮,第六秒钟L2,L4,L6,L8亮,第七秒钟八个LED灯全亮,第八秒钟全灭,以后又从头开始,L1,L3亮,然后L2,L4亮……一直循环下去。
题目二:计数器实验要求:单片机部定时计数器,按计数器模式和方式1工作,对P3.4(T0)引脚进行计数。
使用T1作定时器,50ms中断一次,看T0每0.50来了多少脉冲,将其数值按二进制在LED灯上显示出来,5秒后再次测试。
ORG 0000HLJMP MAINORG 000BHLJMP INTT0ORG 0030HMAIN: MOV SP,#60HMOV TH0,#3CHMOV TL0,#0B0HMOV TMOD,#1MOV IE,#82HMOV R0,#20MOV R1,#1MOV A,#0FAHSETB TR0HERE: MOV P1,AAJMP HEREINTT0:PUSH PSWDJNZ R0,GHMOV R0,#20CJNE R1,#1,L1MOV A,#0FAHSJMP EDL1: CJNE R1,#2,L2RL ASJMP EDL2: CJNE R1,#3,L3 MOV A,#0AFHSJMP EDL3: CJNE R1,#4,L4RL ASJMP EDL4: CJNE R1,#5,L5MOV A,#0AAHSJMP EDL5: CJNE R1,#6,L6RL ASJMP EDL6: CJNE R1,#7,L7MOV A,#00HSJMP EDL7: MOV A,#0FFHMOV R1,#0ED: INC R1GH: POP PSWRETIEND实验六A/D、D/A转换实验(基于SST89E554RC)基本部分:按照实验指导书之“4.3 A/D转换实验”项目要求和“4.4 D/A 转换实验”项目要求,完成汇编语言和C语言程序功能调试与验证。
提高部分:(要求:Proteus环境下完成)小键盘(或开关量)给定(并显示工作状态),选择信号源输出波形类型(D/A转换方式),经过A/D采样后,将采样数据用LED灯显示当前模拟信号值大小及变化状态。
#include<reg51.h>#include<math.h>#include<intrins.h>#define uchar unsigned charsbit S1=P2^0;sbit S2=P2^1;sbit S3=P2^2;sbit S4=P2^3;sbit DA_DIN=P2^4;sbit DA_CLK=P2^5;sbit DA_CS=P2^6;sbit cs=P3^0;sbit clk=P3^1;sbit dat=P3^2;sbit P3_3 = P3^3;bdata uchar addata;sbit adin0=addata^0;unsigned char cishu;void quyan(void);void delay_s(unsigned char n){unsigned char i;for(i=0;i<n;i++);}uchar tlc549ad(void){uchar i;clk=0;cs=0;_nop_();for(i=0;i<8;i++){ //dat=1;clk=1;delay_s(20);adin0=dat;addata=addata<<1;clk=0;}cs=1;return addata;}void TLC5615_DA_conver(unsigned int DA_data) //TLC5615DA转换程序{unsigned char i;DA_data=DA_data<<2;DA_CS=1;DA_CLK=0;DA_DIN=0;DA_CS=0;for(i=0;i<16;i++){DA_data=DA_data<<1;DA_DIN=CY;DA_CLK=1;delay_s(0x02);DA_CLK=0;delay_s(0x02);}DA_CS=1;for(i=0;i<13;i++)delay_s(0xff);//P1=tlc549ad();delay_s(0xff);}void sin_fun(unsigned char APx){float x,y;unsigned int DA;quyan();while(1){for(x=0;x<(2*3.1415);x+=0.1){y=sin(x);DA=APx+y*APx;TLC5615_DA_conver(DA);}if(((S1==0)||(S2==0)||(S3==0))||((S1==1)&&(S2==1)&&(S3==1)&&(S4==1))) {TR0=0;break;}}}void sanjiao(unsigned int APx,unsigned char step){unsigned int x;quyan();while(1){for(x=0;x<2*APx;x+=step)TLC5615_DA_conver(x);for(x=2*APx;x>1;x-=step)TLC5615_DA_conver(x);if(((S1==0)||(S2==0)||(S4==0))||((S1==1)&&(S2==1)&&(S3==1)&&(S4==1))) {TR0=0;break;}}}void fangb(unsigned char APx,unsigned int num){unsigned int x;quyan();while(1){for(x=0;x<num;x++)TLC5615_DA_conver(2*APx);for(x=0;x<num;x++)TLC5615_DA_conver(0);if(((S4==0)||(S2==0)||(S3==0))||((S1==1)&&(S2==1)&&(S3==1)&&(S4==1))) {TR0=0;break;}}}void jvcb(unsigned char APx,unsigned int wide){unsigned int x,Y;quyan();while(1){for(x=0;x<wide;x+=1){Y=APx-10*x;TLC5615_DA_conver(Y);}if(((S1==0)||(S3==0)||(S4==0))||((S1==1)&&(S2==1)&&(S3==1)&&(S4==1))) {TR0=0;break;}}}void quyan(void){ cishu=10;TH0=0x3c;TL0=0xb0;TMOD=0x01;IE=0x82;TR0=1;}time0 () interrupt 1 using 1{TH0=0x3c;TL0=0xb0;cishu--;if(cishu==0){P1=tlc549ad();cishu=10;}}void main(void){while(1){P0=0xc0;P1=0x00;TLC5615_DA_conver(0);if((S1==0)&&(S2==1)&&(S3==1)&&(S4==1)){P0=0xf9;fangb(255,50);}else if((S1==1)&&(S2==0)&&(S3==1)&&(S4==1)){P0=0xa4;jvcb(250,25);}else if((S1==1)&&(S2==1)&&(S3==0)&&(S4==1)){P0=0xb0;sanjiao(250,25);}else if((S1==1)&&(S2==1)&&(S3==1)&&(S4==0)){P0=0x99;sin_fun(250);}}}实验七步进电机控制实验基本部分:1、按照实验指导书之“5.1步进电机实验”项目要求,完成基于SST89E554RC微控制器的C语言程序功能调试与验证;2、按照DSP2812开发板使用说明书之“实验二十二步进电机实验(四相单四拍)”项目要求,完成基于DSP2812微控制器的C语言程序功能调试与验证;提高部分:(任选一题完成)1、在分析掌握基于SST89E554RC微控制器实现步进电机控制原理基础上,实现步进电机速度可调和方向可调;2、在分析掌握基于DSP2812微控制器实现步进电机控制原理基础上,实现步进电机速度可调和方向可调#include <reg51.h>sbit p30=P3^0;sbit p32=P3^2;sbit p31=P3^1;unsigned char L_value[2][8] = {0x0E0, 0x0C0, 0x0D0, 0x090, 0x0B0, 0x030, 0x070, 0x060,0x060, 0x070, 0x030, 0x0B0, 0x090, 0x0D0, 0x0C0,0x0E0};//步进电机正反转表unsigned char a[4] = {0xff,0x08, 0xfc,0xfe };unsigned char speed=3;void delay(unsigned int time){unsigned int i;for(i=0; i<time; i++);}void main(){ unsigned char m;IT0=1;EA=1;EX0=1;PX0=0;p30=1;p31=1;while(1){while(~p30){P2=a[speed];for(m=0; m<8; m++){P1 = L_value[~p31][m];delay(4000*speed);}}if(p30)for(;p30==1;) P2=a[0];}}void extern0()interrupt 0{speed--;if(speed==0)speed=3;P2=a[speed];}实验八直流电机开环控制实验基本部分:1、按照实验指导书之“5.2直流电机PWM调速实验”项目要求,完成基于SST89E554RC微控制器的C语言程序功能调试与验证;2、按照DSP2812开发板使用说明书之“实验二十一直流电机实验”项目要求,完成基于DSP2812微控制器的C语言程序功能调试与验证;提高部分:(任选一题完成)3、在分析掌握基于SST89E554RC微控制器实现直流电机控制电路原理基础上,实现电机速度可调;4、在分析掌握基于DSP2812微控制器实现直流电机控制原理基础上,实现电机速度波段式可调#include <reg51.h>#define T_value (unsigned char)0xf0 // T 周期值#define TH0_value (unsigned char)0xFE // 定时器 T0 计数值(高)#define TL0_value (unsigned char)0x00 // 定时器 T0 计数值(低)unsigned char a[4] = {~0xfe,~0xfc,~0x08,~0xff};unsigned char speed[3] = {0xb0,0x80,0x40};sbit DRV = P1^7;sbit KG = P1^0;unsigned char T_Count; // 延时次数unsigned char T1_value=0xb0; // T 周期中高电平周期 T1 值unsigned char Tx;unsigned char j=0;void int_tim0() interrupt 1{TH0 = TH0_value;TL0 = TL0_value;T_Count--;}void intern0() interrupt 0{j++;TR0=0;if(j==3){j=0;}T1_value=speed[j];Tx = T1_value;T_Count=0;DRV=1;TR0=1;P2=a[j];}void main(){TMOD = 0x01; // 定时器0初始化,定时基数TH0 = TH0_value;TL0 = TL0_value;TR0 = 1;ET0 = 1;IT0=1; //外中断0EX0=1;PX0=1;DRV =1; //P17电平T_Count = T1_value;Tx = speed[0];while(1){if(KG)for(;KG==1;){P2=a[3];DRV =1;EA=0;j=0;}Tx=speed[j];T_Count =0;while(~KG){EA = 1;P2=a[j];if(T_Count == 0){DRV = ~DRV;Tx = T_value - Tx;T_Count = Tx;}}}}四、实验报告基本容要求1、实验题设计容、目的和要求;2、软件、硬件环境要求;3、给出硬件电路原理图并分析;4、程序设计框图及程序清单; 5 、实验调试步骤及结果分析;6、结论。