第一篇:嵌入式实验1 流水灯实验
河南机电高等专科学校
《嵌入式系统开发》课程实验报告
系部: 电子通信工程系
班级: 电信####
姓名: ######
学号:
## 实验一搭建实验环境
一.实验简介
搭建嵌入式系统开发环境,建立第一个工程,流水灯实验
二.实验目的
掌握STM32开发环境,掌握从无到有的构建工程。
三.实验内容
熟悉MDK KEIL开发环境,构建基于固件库的工程,编写代码实现流水灯工程。通过ISP下载代码到实验板,查看运行结果。下载代码到目标板,查看运行结果。
四.实验设备
硬件部分:PC计算机(宿主机)、STM32实验板。
软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件。
五.实验步骤
1.熟悉MDK KEIL开发环境 2.熟悉串口编程软件ISP 3.查看固件库结构和文件
4.建立工程目录,复制库文件 5.建立和配置工程 6.编写代码 7.编译代码
8.使用ISP下载到实验板 9.测试运行结果
10.记录实验过程,撰写实验报告
六.实验结果及测试
程序代码主要有两部分,第一部分是GPIO端口的配置,打开端口时钟,配置为推挽输出模式,并使能端口。代码如下:
void LED_GPIO_Config(void){
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_SetBits(GPIOB, GPIO_Pin_0);
GPIO_SetBits(GPIOC, GPIO_Pin_4|GPIO_Pin_3);
} 第二部分是主函数,主要实现LED灯的亮灭的功能。要在主函数中调用GPIO端口的初始化
int main(void){
LED_GPIO_Config();
while(1){
LED1(ON);
Delay(0x0FFFFF);
LED1(OFF);
LED2(ON);
Delay(0x0FFFFF);
LED2(OFF);
LED3(ON);
Delay(0x0FFFFF);
LED3(OFF);
} } 七.实验总结
这次实验让我们受益匪浅,学会了利用软件编程,完成教学任务,学得了知识,而且提高了实践能力,动手能力。使我学到了不少实用的知识,更重要的是,做实验的过程,思考问题的方法,这与做其他的实验是通用的,真正使我们受益匪浅。
第二篇:嵌入式系统 流水灯、按键、定时器实验报告
嵌入式系统应用
实验报告
姓
名: 学
号: 学
院: 专
业: 班
级: 指导教师:
实验
1、流水灯实验
1.1实验要求
编程控制实验板上LED灯轮流点亮、熄灭,中间间隔一定时间。
1.2原理分析
实验主要考察对STM32F10X系列单片机GPIO的输出操作。
参阅数据手册可知,通过软件编程,GPIO可以配置成以下几种模式: ◇输入浮空 ◇输入上拉 ◇输入下拉 ◇模拟输入 ◇开漏输出 ◇推挽式输出
◇推挽式复用功能 ◇开漏式复用功能
根据实验要求,应该首先将GPIO配置为推挽输出模式。
由原理图可知,单片机GPIO输出信号经过74HC244缓冲器,连接LED灯。由于74HC244的OE1和OE2都接地,为相同电平,故A端电平与Y端电平相同且LED灯共阳,所以,如果要点亮LED,GPIO应输出低电平。反之,LED灯熄灭。
1.3程序分析
软件方面,在程序启动时,调用SystemInit()函数(见附录1),对系统时钟等关键部分进行初始化,然后再对GPIO进行配置。
GPIO配置函数为SZ_STM32_LEDInit()(见附录2),函数中首先使能GPIO时钟:
RCC_APB2PeriphClockCmd(GPIO_CLK[Led], ENABLE);然后配置GPIO输入输出模式:
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 再配置GPIO端口翻转速度: GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 最后将配置好的参数写入寄存器,初始化完成: GPIO_Init(GPIO_PORT[Led], &GPIO_InitStructure)。
初始化完成后,程序循环点亮一个LED并熄灭其他LED,中间通过Delay()函数进行延时,达到流水灯的效果(程序完整代码见附录3)。
实验程序流程图如下:
硬件方面,根据实验指南,将实验板做如下连接:
1.3实验结果
实验
二、按键实验
2.1实验要求
利用STM32读取外部按键状态,按键按下一次产生一次外部中断在中断处理函数中使按键所对应的灯亮起。
2.2原理分析
实验主要考察对STM32F10X系列单片机GPIO外部中断功能的使用。
STM32F107VCT一共有5组GPIO,分别是PA[15:0]、PB[15:0]、PC[15:0]、PD[15:0]、PE[15:0]。STM32的所有GPIO都可以作为中断输入源,单片机通过复用的方式使其对处理器来说来自 GPIO 的一共有 16 个中断Px[15:0]。具体实现是PA[0]、PB[0]、PC[0]、PD[0]和PE[0]共享一个GPIO中断;PA[1]、PB[1]、PC[1]、PD[1]和PE[1]共享一个GPIO中断;……PA[15]、PB[15]、PC[15]、PD[15]和PE[15]共享一个GPIO中断。以下图片为以EXTI0为例的外部中断/事件线路映像:
要产生中断,必须先配置好并使能中断线。根据需要的边沿检测设置2个触发寄存器,同时在中断屏蔽寄存器的相应位写‘1’允许中断请求。当外部中断线上发生了期待的边沿时,将产生一个中断请求,对应的挂起位也随之被置‘1’。在挂起寄存器的对应位写’1’,将清除该中断请求。
要把IO口作为外部中断输入,有以下几个步骤:
(1)初始化 IO 口为输入。这一步设置要作为外部中断输入的IO口的状态,可以设置为上拉/下拉输入,也可以设置为浮空输入,但浮空的时候外部一定要带上拉,或者下拉电阻。否则可能导致中断不停的触发。在干扰较大的地方,就算使用了上拉/下拉,也建议使用外部上拉/下拉电阻,这样可以一定程度防止外部干扰带来的影响。
(2)开启IO口复用时钟,设置IO口与中断线的映射关系。STM32的IO口与中断线的对应关系需要配置外部中断配置寄存器EXTICR,这样我们要先开启复用时钟,然后配置IO口与中断线的对应关系。才能把外部中断与中断线连接起来。
(3)开启与该IO口相对的线上中断/事件,设置触发条件。这一步,我们要配置中断产生的条件,STM32可以配置成上升沿触发,下降沿触发,或者任意电平变化触发,但是不能配置成高电平触发和低电平触发。这里根据自己的实际情况来配置。同时要开启中断线上的中断,这里需要注意的是:如果使用外部中断,并设置该中断的EMR位的话,会引起软件仿真不能跳到中断,而硬件上是可以的。而不设置EMR,软件仿真就可以进入中断服务函数,并且硬件上也是可以的。建议不要配置EMR位。
(4)配置中断分组(NVIC),并使能中断。这一步,我们就是配置中断的分组以及使能,对STM32的中断来说,只有配置了 NVIC 的设置,并开启才能被执行,否则是不会执行到中断服务函数里面去的。
(5)编写中断服务函数。这是中断设置的最后一步,中断服务函数,是必不可少的,如果在代码里面开启了中断,但是没编写中断服务函数,就可能引起硬件错误,从而导致程序崩溃。所以在开启了某个中断后,应为该中断编写服务函数。在中断服务函数里面编写要执行的中断后的操作,并很据情况判断是否要对中断产生的标志位进行清零。
由原理图可知,按键未按下时,GPIO读到的为高电平,按键按下后,IO口接地,产生一个电平跳变,所以外部中断触发方式应该设置为下降沿触发。
2.3程序分析
LED灯的点亮与实验一中相同,不过多赘述。程序首先对按键进行初始化,初始化函数为GPIO_KEY_Config()(见附录4),配置过程与实验一中GPIO配置基本一致。由于此处GPIO需要采集外界按键信号,故GPIO模式应该为调整为内部上拉电阻输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU。
然后执行GPIO中断初始化函数KEY_EXIT_Init()(见附录5),首先将连接按键的IO口与EXTI线链接到一起:
GPIO_EXTILineConfig(GPIO_KEY1_EXTI_PORT_SOURCE,GPIO_KEY1_EXTI_PIN_SOURCE);
然后将触发方式设置为下降沿触发并写入中断配置寄存器,并使能中断: EXTI_InitStructure.EXTI_Line = GPIO_KEY1_EXTI_LINE;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure)。
之后进行中断分组配置及中断优先级配置,函数为InterruptConfig()(见附录6)。配置过程较为复杂,涉及到抢占优先级和响应优先级的概念。程序首先将所有外部中断归为NVIC_PriorityGroup_2,即2位抢占优先级和2位响应优先级:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
然后将所有外部中断信号的抢占优先级规定为0、1、2,使其可以相互区别,并将配置好的参数写入对应寄存器中,完成配置:
NVIC_InitStructure.NVIC_IRQChannel = GPIO_KEY1_EXTI_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = GPIO_KEY2_EXTI_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = GPIO_KEY3_EXTI_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;NVIC_Init(&NVIC_InitStructure)。
初始化完成后,程序进入等待按键中断触发状态,一旦按键按下,则进入中断服务函数EXTI9_5_IRQHandler()(见附录7)中。在函数中对LED灯进行点亮、熄灭操作,并重置中断产生标志位。
实验流程图如下(主函数代码见附录8):
硬件连接方式如下图所示:
2.3实验结果
实验
三、定时器实验
3.1实验要求
利用STM32的通用定时器 TIM5 产生一个1S的中断,在中断函数中实现 LED1、LED2、LED3、LED4同时翻转的效果。
3.2原理分析
实验主要考察对STM32F10X系列单片机定时器的使用。
实验中使用的STM32F107单片机有多达10个定时器,包括:
◇多达4个16位定时器,每个定时器有多达4个用于输入捕获/输出比较/PWM 或脉冲计数的通道和增量编码器输入
◇1个16位带死区控制和紧急刹车,用于电机控制的 PWM 高级控制定时器
◇2个独立的看门狗定时器(独立的和窗口型的)
◇系统时间定时器:24 位自减型计数器
◇2个 16 位基本定时器用于驱动DAC
根据时钟树可知,系统时钟经过分频之后,进入TIM5的时钟模块入口,在经过预分频处理,才供给TIM5作时钟使用。预分频器的系数为:TIMx_PSC,当TIMx_PSC = 0时表示不分频,则TIM5定时器的时钟
用CK_CNT =模块入口时钟72MHz;当TIMx_PSC = 1时表示不分频,则TIM5定时器的时钟用CK_CNT=模块入口时钟36MHz;以此类推。公式为:CK_CNT =fCK_PSC/(PSC[15:0]+1),其中PSC最大为65535。
其次是TIM5计数器计数值的设置,TIM5计数器以CK_CNT为时钟计数,向下计数到0或向上计数到设定值(TIMx_ARR)则产生中断。以向上计数为例,从 0 开始计数到设定值TIMx_ARR 时产生中断。要产生一秒一次中断则要使计数器的值乘以预分频的值=系统时钟72MHz,其中计数器的值和预分频值都必须小于65535。我们使预分频值为7200,计数器值为10000,则7200 * 10000 = 72,000,000即72M。其中拆分方法很多35000*2000 = 72,000,000,只要注意计数器的值和预分频值都必须小于65535即可。当计数值溢出后,会改变计数溢出标志位,并产生定时器中断,实验中使用其产生中断来进行LED灯翻转。
3.3程序分析
LED初始化部分与实验一相同,完成初始化后,点亮所有LED灯。定时器配置函数为TIM5_Init()(见附录6)。配置函数首先使能计数器时钟:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); 然后自动装载计数值,计数从0开始:
TIM_TimeBaseStructure.TIM_Period =(1001); 并将计数器设置为向上计数:
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 最后写入计时器配置寄存器,完成配置:
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure)。
配置完成后,还要对计数器溢出标志位进行清零,并打开溢出中断,使能计数器以开始计数。
TIM_ClearITPendingBit(TIM5, TIM_IT_Update);TIM_ITConfig(TIM5, TIM_IT_Update, ENABLE);TIM_Cmd(TIM5, ENABLE)。
定时器配置完成并使能后,计数器开始工作,当到达预设的计数值之后,产生中断信号。系统在进行相关配置后可以响应定时器产生的中断,中断配置函数为NVIC_Configuration()(见附录7)。函数首先将中断向量表首地址置于0x08000000:
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0000); 然后使能TIM5中断:
NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;最后将配置参数写入中断控制寄存器,完成配置: NVIC_Init(&NVIC_InitStructure)。
一旦中断产生,系统会对中断产生响应,暂停所有正在执行的低优先级任务且将任务信息和数据压入对应对战区,并进入中断服务函数TIM5_IRQHandler()(见附录8)中进行处理。
在中断服务函数中判断并清除了中断标志位,以便定时器下一次计数中断产生。函数中调用了LED_Spark()函数(见附录9),实现了LED的闪烁。
程序流程图如下:
硬件连接方式如下图所示:
实验
四、按键中断控制LED灯定时闪烁
4.1实验要求
综合实验一、二、三,利用STM32读取外部按键状态,按键按下一次产生一次外部中断在中断处理函数中使按键所对应的灯闪烁,闪烁间隔通过定时器定时控制。其中,SKEY1控制LED1以1S为间隔,闪烁3次,SKEY2控制LED2以2S为间隔闪烁3次,SKEY3控制LED3以3S为间隔,闪烁3次。
4.2原理分析
实验需要用到STM32的GPIO输入输出操作,GPIO外部中断和内部定时器中断。在以上三个实验中,对各个部分都已经进行过详尽的解释,这里不再赘述。此实验需要将以上实验做综合,并对时序进行调整。难点为,对GPIO外部中断和定时器内部中断的处理,即如何确定两种不同中断的优先级。
这里的使用的方法是,将所有按键外部中断置于中断分组2,即NVIC_PriorityGroup_2中。将所有按键中断抢占优先级置为0,即最高级别中断,响应优先级置分别置为1、2、3,相互区别。将定时器中断抢占优先级置为1,相应优先级社会中低于按键中断,使其可以被按键信号中断计时,并刷新LED闪烁状态。
4.3程序分析
这在程序初始化阶段,分别对LED、按键外部中断和定时器中断进行初始化。主函数如下:
int main(void){ /* LED初始化 */ LED_config();/* LED闪烁¸ */ Led_Turn_on_all();Delay(3000000);Led_Turn_off_all();Delay(3000000);Led_Turn_on_all();Delay(3000000);Led_Turn_off_all();Delay(3000000);Led_Turn_on_all();Delay(3000000);Led_Turn_off_all();/* 按键初始化 */ GPIO_KEY_Config();/* 按键外部中断初始化 */ KEY_EXIT_Init();/* 外部中断向量初始化 */ InterruptConfig();/* 定时器5初始化 */ TIM5_Init();/* 定时器中断初始化 */ NVIC_Configuration();/* 等待中断触发 */ while(1){ } } 初始化完成后,等待中断触发。一旦按键按下,触发外部中断,则进入外部中断服务函数,函数中将判断哪一个按键被按下,记录按下的按键,然后给定时器清零并开始计数,且清零外部中断标志位。
第三篇:流水灯实验报告
单片机流水灯实验
一、任务
让8个LED灯轮流亮起来,实现流水灯的功能。
二、思路
让接在P0.0口的LED灯亮起来,那么只要把P0.0口的电平变为低电平就可以了;相反,如果要接在P0.0口的LED灯熄灭,就要把P0.0口的电平变为高电平就可以了。要实现流水灯功能,只要将8个LED灯依次点亮、熄灭,8只LED灯便会一亮一暗的做流水灯了。
我们应该注意一点,由于单片机执行每条指令的时间很短,我们在控制二极管亮灭的时候应该延时一段时间,否则我们就看不到“流水”效果了。
三、步骤
1、用proteus画电路图。如下图:
2、用keil建工程。
1)运行keil C51软件,点击Project菜单新建项目,选择为AT89C52的单片机型号。然后单击File选择New新建程序文件,保存成.c 文件,右击Source Group1添加入程序文件。2)用C语言编写程序代码如下:
#include
void main(void){ unsigned char i;while(1){ for(i=0;i<8;i++){
P0=tmpled[i];
delay(50);} } }
void delay(unsigned char tmp){ unsigned char i,j;i=tmp;while(i){ i--;j=255;{
j--;} } } 3)右击Target 1打开设置,Output菜单下勾选上create hex file。
4)调试运行程序后,在proteus中双击单片机,添加hex文件,运行看到流水的的效果。
四、实验中遇到的问题。
1、用proteus仿真时候,发现错误:
error variable not found parsing property resistance of RN1-Rnvalue expected for RN1-R(n=1~8)而且led灯亮度十分微弱。可能是接入的电阻太大了。
检查电路图发现排阻的值为RX8,修改为220(自己选择)后。错误便没有了,同时,led灯的亮度也增强了。
2、关于延时函数。
延时的时间计算不太明白。
3、P0=0xfe;是对单片机P0口的8个I/O口同时进行操作,0x后的数使用十六进制表示,fe转换为二进制是1111 1110,则P0.0为低电平,对应的led灯亮,其他7个led灯灭。
第四篇:流水灯实验报告(范文)
单片机流水灯试验
一、实验目的:
1、进一步熟悉Keil C51集成开发环境调试功能的使用
2、学会自己编写程序,进行编译、仿真调试
3、学会使用单片机的P0口作为I/O口去控制外围电路,实现LED灯以固定的频率进行闪烁。
二、实验设备:
1、PC机
2、SW-51PROC单片机综合实验平台
三、实验内容:
1、编写一段程序,用单片机P0口的8个输出去控制8个LED灯,实现如下功能:
先使8个LED灯轮流点亮,从左向右移动,时间间隔0.5s。以上过程循环实现。
四、实验步骤:
1、实验原理:
单片机流水的实质是单片机各引脚在规定的时间逐个上电,使LED灯能逐个亮起来但过了该引脚通电的时间后便灭灯的过程,实验中使用了单片机的P2端口,对8个LED灯进行控制,要实现逐个亮灯即将P2的各端口逐一置零,中间使用时间间隔隔开各灯的亮灭。使用rl或rr a实现位的转换。A寄存器的位经过rr a之后转换如下所示:
A0A1A2A3A4A5A6A7 然后将A寄存器转换一次便送给P2即MOV P2,A便将转换后的数送到了P2口,不断循环下去,便实现了逐位置一操作。
2、实验电路图 +5v1234123412340a1a2a3a4a1a2a3a4a1a2a3a4GND0Vcc1P2.0P2.1P2.2P2.3P2.4P2.5P2.6P2.7b1b2b3b***C51
3通过仿真实验正确性
代码如下:ORG 0 MOV A,#00000001B LOOP:MOV P2,A RL A ACALL DELAY SJMP LOOP
DELAY:MOV R1,#255 DEL2:MOV R2,#250 DEL1:DJNZ R2,DEL1
DJNZ R1,DEL2 RET End ORG 0000H LJMP MAIN
4、实验程序 :
ORG 0050H MAIN:MOV R0,#14
MOV DPTR,#TABLE L0:
MOV A,#0 L1:
MOVC A,@DPTR+A
MOV P0,A
ACALL DELAY1
INC A41 DJNZ R0,L1 SJMP L0 DELAY1:
MOV R1,#250 LOOP1:
MOV R2,#250 LOOP2:
NOP
NOP
NOP
NOP
NOP
DJNZ R0,LOOP2
DJNZ R1,LOOP1
RET TABLE: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH END
5、实验结果:
五、实验总结
这次试验我通过Proteus仿真实现对流水灯功能的实现。受益匪浅,对80c51的功能和结构有了深层次的了解,我深刻的明白,要想完全了解c51还有一定距离,但我会一如既往的同困难作斗争。在实验中,我遇到了不少困难,比如不知道怎么将程序写进单片机中,写好程序的却总出错,不知道什么原因,原来没有生成hex文件。这些错误令我明白以后在试验中要步步细心,避免出错。
第五篇:嵌入式实验总结
如今,嵌入式系统已经在众多电气电子产品上应用,有人预测今后5年发展形势看好。嵌入式是典型的交叉学科,电信、电子、电气、计算机、通信等等都有涉及。
嵌入式理论、实践要求多、门槛高,只有理论、实践同步才能在积累中更好的渐次掌握,这学期我们针对嵌入式入门做了一些实验,通过自己动手和实验箱、实验软件打交道,对嵌入式编程形成初步了解,为今后进一步发展打基础。
实验环境:
武汉创维特公司JXARM9-2410开发板、PC;
Linux、windows操作平台;
DNW、VMwareWorkstation应用软件;
《ARM9嵌入式技术及Linux高级实践教程》、实验参考资料等;
实验内容及目标:
阅读样例程序,进行:
1.熟悉JXARM9-2410开发板、相关应用软件的使用,能成功运行示例实验程序(demo-led);
2.使用VMware,修改demo-led源程序,使开发板上数码管按照demo-led显示方式显示;
3.使用VMware、DNW,修改相关源程序,实现开发板键盘输入的字符在DNW中显示;
4.使用VMware、DNW,修改相关源程序,实现对直流电机转动状态的控制;
观看教学视频,进行交叉编译:
1.加载linux内核;
2.配置、编译linux内核;
3.Windows、linux跨平台文件共享;
4.编译、运行linux程序(helloworld)
5.Linux下编译数码管显示驱动程序;
6.Linux下编译摄像头、GPRS驱动程序;
学习嵌入式是一个漫长的过程,学好它还是需要一番的功夫。通过嵌入式实验由浅入深的动手实践,我渐渐对嵌入式有了具体概念,也逐渐对其产生了兴致和好奇心。
对于初学者,还有一点小建议,不要好高骛远,要脚踏实地.