stm32跑马灯实验
- 格式:pdf
- 大小:1.91 MB
- 文档页数:45
一、实验名称:跑马灯二、实验要求:编写程序控制跑马灯的亮灭:首先是全不亮,接着第1个灯亮,第2个灯亮,第3个灯亮,第4个灯亮,最后所有的灯一起亮,即按顺序亮,然后全亮,最后全灭,顺序循环。
最后蜂鸣器响,然后灯全部灭。
三、实验步骤1、点击WINDOWS 操作系统的开始-> 程序-> ARM Developer Suite v1.2 ->CodeWarrior forARM Developer Suite 启动ADS1.2 IDE 或双击CodeWarrior for ARMDeveloper Suite 快捷方式起动启。
2、打开原有的有关跑马灯实验的工程。
3、源程序代码:。
/******************************************************************** ********* File:LEDCON.C* 功能:LED闪烁控制。
对发光二极管LED4进行控制,采用软件延时方法。
* 使用I/O口直接控制LED,采用灌电流方式。
* 说明:将跳线器JP8_LED4短接。
********************************************************************* *******/#include "config.h"#define LEDCON4 0x00002000 /* P0.13引脚控制LED4,低电平点亮*/#define LEDCON1 0x00000400 /* P0.10引脚控制LED1,低电平点亮*/#define LEDCON2 0x00000800 /* P0.11引脚控制LED2,低电平点亮*/#define LENCON3 0x00001000 /* P0.12引脚控制LED3,低电平点亮*/#define BEEP 0x00000080 /* P0.7引脚控制蜂鸣器,低电平响*/#define ALL 0x00003C80#define LEDALL 0x00003C00/******************************************************************** ********* 名称:DelayNS()* 功能:长软件延时* 入口参数:dly 延时参数,值越大,延时越久* 出口参数:无********************************************************************* *******/void DelayNS(uint32 dly){ uint32 i;for(; dly>0; dly--)for(i=0; i<50000; i++);/******************************************************************** ********* 名称:main()* 功能:控制LED闪烁********************************************************************* *******/int main(void){ PINSEL0 = 0x00000000; // 设置所有管脚连接GPIOPINSEL1 = 0x00000000;IODIR = ALL; // 设置ALL控制口为输出while(1) //实现循环{IOSET =ALL;//初始化所有的灯灭IOSET =BEEP;// 蜂鸣器不响IOCLR = LEDCON1; //低电平灯亮DelayNS(100); //延迟时间IOSET = LEDCON1; //高电平灯灭DelayNS(100); //延迟时间IOCLR = LEDCON2;DelayNS(100);IOSET = LEDCON2;DelayNS(100);IOCLR = LEDCON3;DelayNS(100);IOSET = LEDCON3;DelayNS(100);IOCLR = LEDCON4;DelayNS(100);IOSET = LEDCON4;DelayNS(100);IOCLR =ALLLED;//所有的灯亮DelayNS(100);IOCLR =BEEP;//蜂鸣器响DelayNS(100);}return(0);4、调试程序观察实验结果。
单片机实验报告姓名: 学号:一、 实验实现功能:1:计数器功能2:流水灯二、 具体操作:1、计数器功能数码管的动态显示。
每按一次K2键计数器加1通过数码管显示出来,计数器可以实现从0计数到9999。
2、流水灯当在计数器模式下的时候按下K3键时程序进入跑马灯模式,8个小灯轮流点亮每次只点亮一个,间隔时间为50ms 。
三、 程序流程图开始 定时器T0 设置初值,启动定时器,打开中断复位 Key2按下 中断关闭 计数器模式 计数器加1 Key3按下 流水灯模式 数码管显示数字加1 跑马灯点亮间隔50ms Key1按下中断打开四、程序#include <reg51.h>typedef unsigned char uint8;typedef unsigned int uint16; //类型定义sbit P2_1 = P2^1;sbit P2_2 = P2^2;sbit P2_3 = P2^3;sbit P2_4 = P2^4; //位声明四个数码管开关sbit Key2 = P3^2;sbit Key3 = P3^3; //位声明2个按键K2和K3sbit Ledk = P2^0 ; //LED 开关void delay(uint16 i); //延时函数声明void refresh (); // 数码管刷新函数声明void liushuideng(); //流水灯函数声明uint8 number[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//数码管的真值表uint8 out[4] = {0}; // 数组变量uint16 counter=0; //用作计数器的变量uint16 Time_counter=0; //用作定时器的变量void main() //主函数{TMOD = 0x01; //定时器0,工作方式一TH0 = 0xFC;TL0 = 0x18; //定时器初值使每次循环为1msTR0 = 0; //定时器0开始作ET0 = 0; // 定时器中断关EA = 0; // 关中断while(1) //计数器模式{Ledk =1 ; //led开关关out[0]=number[counter%10]; //取个位out[1]=number[counter%100/10]; //十位out[2]=number[counter%1000/100]; //百位out[3]=number[counter/1000]; //千位if (!Key2) //计数器加1{++counter; //自加out[0]=number[counter%10]; //取个位out[1]=number[counter%100/10]; //十位out[2]=number[counter%1000/100]; //百位out[3]=number[counter/1000]; //千位while(!Key2) //等待键盘抬起refresh(); //刷新数码管}refresh(); //刷新数码管if (!Key3) // 进入跑马灯模式liushuideng();}} //主函数结束/*******************延时*************/void delay(uint16 i){uint8 j; // 定义局部变量for(i;i>0;i--) //循环i*240 次for(j=240;j>0;j--);}/************数码管刷新******************/void refresh (){uint8 j;for (j=0;j<4;j++) //四次循环刷新数码管{switch(j){case 0: P2_1=1;P2_2=1;P2_3=1;P2_4=0;break;case 1: P2_1=1;P2_2=1;P2_3=0;P2_4=1;break;case 2: P2_1=1;P2_2=0;P2_3=1;P2_4=1;break;case 3: P2_1=0;P2_2=1;P2_3=1;P2_4=1;break;//每次循环只选中一个数码管default:break;}P0 = out[j]; // 位选,给数码管送值delay (20); //延时消抖}}/*************定时器的中断服务函数**************/void Timer0_Overflow() interrupt 1 //定时器0溢出中断,这个语句1ms执行一次{TH0 = 0xFC;TL0 = 0x18; //每1ms重新赋定时器初值Time_counter++; //计数,看经过了几个1ms}/***********************流水灯子函数****************************/ void liushuideng(){uint8 j = 0 ; //定义局部变量P0 = 0xff; // 小灯全关TR0 = 1; //定时器1开始计时EA = 1; //中断开放ET0 = 1; //定时器0中断开while(1){Ledk = 0 ; //打开LED开关P2 = P2|0x1E; //关掉数码管if(50 == Time_counter) //50个毫秒{P0=~(1<<j++); //控制小灯Time_counter = 0; //清零开始下一次循环定时}if (8==j) //移完8次再重新移{j=0;}}}。
6.1 STM32 IO简介本章将要实现的是控制ALIENTEK战舰STM32开发板上的两个LED实现一个类似跑马灯的效果,该实验的关键在于如何控制STM32的IO口输出。
了解了STM32的IO口如何输出的,就可以实现跑马灯了。
通过这一章的学习,你将初步掌握STM32基本IO口的使用,而这是迈向STM32的第一步。
这一章节因为是第一个实验章节,所以我们在这一章将讲解一些知识为后面的实验做铺垫。
为了小节标号与后面实验章节一样,这里我们不另起一节来讲。
在讲解STM32的GPIO之前,首先打开我们光盘的第一个固件库版本实验工程跑马灯实验工程(光盘目录为:“4,程序源码\标准例程-V3.5库函数版本\实验1跑马灯/USER/LED.Uv2”),可以看到我们的实验工程目录:图6.1.1 跑马灯实验目录结构接下来我们逐一讲解一下我们的工程目录下面的组以及重要文件。
①组FWLib下面存放的是ST官方提供的固件库函数,里面的函数我们可以根据需要添加和删除,但是一定要注意在头文件stm32f10x_conf.h文件中注释掉删除的源文件对应的头文件,这里面的文件内容用户不需要修改。
②组CORE下面存放的是固件库必须的核心文件和启动文件。
这里面的文件用户不需要修改。
③组SYSTEM是ALIENTEK提供的共用代码,这些代码的作用和讲解在第五章都有讲解,大家可以翻过去看下。
④组HARDWARE下面存放的是每个实验的外设驱动代码,他的实现是通过调用FWLib下面的固件库文件实现的,比如led.c里面调用stm32f10x_gpio.c里面的函数对led进行初始化,这里面的函数是讲解的重点。
后面的实验中可以看到会引入多个源文件。
⑤组USER下面存放的主要是用户代码。
但是system_stm32f10x.c文件用户不需要修改,同时stm32f10x_it.c里面存放的是中断服务函数,这两个文件的作用在3.1节有讲解,大家可以翻过去看看。
一、实验目的1. 熟悉嵌入式系统硬件电路的搭建与调试;2. 掌握C语言编程,实现跑马灯功能;3. 理解并掌握GPIO口操作,学习定时器中断的使用。
二、实验环境1. 开发板:STM32F103C8T6开发板2. 编译器:Keil uVision53. 软件库:STM32标准外设库三、实验原理跑马灯实验是通过控制LED灯的亮灭,实现LED灯依次点亮的效果。
实验原理如下:1. GPIO口控制:将LED灯连接到开发板的GPIO口,通过控制GPIO口的输出电平,实现LED灯的点亮与熄灭;2. 定时器中断:定时器产生中断,实现LED灯点亮与熄灭的时间间隔;3. 循环控制:通过循环控制LED灯的点亮顺序,实现跑马灯效果。
四、实验步骤1. 硬件电路搭建(1)将LED灯的正极连接到开发板的GPIO口,负极接地;(2)将开发板的电源和地线连接到电源模块。
2. 软件编程(1)在Keil uVision5中创建项目,并导入STM32标准外设库;(2)编写程序,实现以下功能:a. 初始化GPIO口,将LED灯连接的GPIO口配置为输出模式;b. 初始化定时器,设置定时器中断周期,使LED灯点亮与熄灭的时间间隔为1ms;c. 编写定时器中断服务程序,控制LED灯的点亮与熄灭;d. 编写主函数,实现LED灯依次点亮的效果。
3. 编译与下载(1)编译程序,生成可执行文件;(2)将开发板连接到计算机,通过串口下载程序到开发板。
4. 实验调试(1)打开串口调试助手,观察LED灯的点亮与熄灭效果;(2)调整程序参数,优化跑马灯效果。
五、实验结果与分析1. 实验结果(1)LED灯依次点亮,实现跑马灯效果;(2)LED灯点亮与熄灭的时间间隔可调。
2. 实验分析(1)通过控制GPIO口的输出电平,实现LED灯的点亮与熄灭;(2)定时器中断实现LED灯点亮与熄灭的时间间隔控制;(3)循环控制实现LED灯依次点亮的效果。
六、实验总结本次实验成功实现了跑马灯功能,加深了对嵌入式系统硬件电路、C语言编程和GPIO口操作的理解。
嵌⼊式02STM32实验04跑马灯开学STM32跑马灯的实验主要就是了解GPIO⼝的配置及使⽤,我这⾥是使⽤库函数进⾏编程,主要需要设置以下两⽅⾯: 1、使能需要使⽤的IO⼝的时钟,⼀共有A、B、C、D、E、F、G七组IO⼝ 2、初始化IO⼝(设置IO⼝的端⼝号(有GPIO_Pin_0 ~ GPIO_Pin_15,共16个IO端⼝)、设置IO⼝的输出速度、设置IO⼝的⼯作模式)代码如下1//端⼝初始化2 #include "led.h"3 #include "stm32f10x.h"45void LED_Init(void)6 {7 GPIO_InitTypeDef GPIO_KST;8910 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE); //使能端⼝B和E1112 GPIO_KST.GPIO_Mode = GPIO_Mode_Out_PP; //设置端⼝模式为推挽输出13 GPIO_KST.GPIO_Pin = GPIO_Pin_5; //选择端⼝514 GPIO_KST.GPIO_Speed = GPIO_Speed_2MHz; //IO⼝的速度设置为2MHz15 GPIO_Init(GPIOB, &GPIO_KST); //初始化GPIOB.5161718 GPIO_KST.GPIO_Mode = GPIO_Mode_Out_PP; //设置端⼝模式为推挽输出19 GPIO_KST.GPIO_Pin = GPIO_Pin_5; //选择端⼝520 GPIO_KST.GPIO_Speed = GPIO_Speed_2MHz; //IO⼝的速度设置为2MHz21 GPIO_Init(GPIOE, &GPIO_KST); //初始化GPIOE.522 }主程序1//主程序2 #include "sys.h"3 #include "delay.h"4 #include "led.h"56int main(void)7 {8 delay_init(); //延时初始化9 LED_Init(); //LED初始化10while(1)11 {12 GPIO_ResetBits(GPIOE, GPIO_Pin_5); //关闭PE5端⼝的LED13 GPIO_SetBits(GPIOB, GPIO_Pin_5); //关闭PB5端⼝的LED14 delay_ms(500); //延时100ms15 GPIO_SetBits(GPIOE, GPIO_Pin_5);16 GPIO_ResetBits(GPIOB, GPIO_Pin_5); //打开PB5端⼝的LED17 delay_ms(500); //延时100ms18 }1920 }。
可编辑修改精选全文完整版实验一跑马灯实验一、实验内容1、基本的流水灯根据图1电路,编写一段程序,使8个发光二极管D1、D2、D3、D4、D5、D6、D7、D8顺序(正序)点亮:先点亮D1,再点亮D2、D3……D8、D1……,循环点亮。
每点亮一个LED,采用软件延时一段时间。
2、简单键控的流水灯不按键,按正序点亮流水灯;按下K1不松手,按倒序点亮流水灯,即先点亮D8,再顺序点亮D7、D6……D1、D8……。
松手后,又按正序点亮流水灯。
3、键控的流水灯上电,不点亮LED,按一下K1键,按正序点亮流水灯。
按一下K2键,按倒序点亮流水灯,按一下K3键,全部关闭LED。
二、实验方案1、总体方案设计考虑到K4键未被使用,所以将实验内容中的三项合并到一个主函数中:K4键代替实验内容第二项中的K1键;单片机一开机即执行实验内容第一项;K1、K2、K3键实现实验内容第三项。
所用硬件:AT89C52、BUTTON、LED-BLUE、电源输入:P2.0-K1;P2.1-K2;P2.2-K3;P2.3-K4。
低电平有效输出:P0.0~P0.7-D0~D7。
LED组连线采用共阳极,低电平有效软件设计:软件延时采用延时函数delay(t),可调整延迟时间:void delay(uint t){uint i;while(t--)for(i=0;i<1000;i++){if(P2!=oldK&&P2!=K[0])break;//按下了其他键退出循环}}由于涉及到按键变化所以要设置一个变量oldK保留按键键值,要在延时程序中检测是否按键,当按键后立即设置oldK的值。
按键判断采用在while循环中利用条件语句判断P2的值然后执行该键对应的代码段,达到相应的响应。
为了让K4键的效果优化,即状态变化从当前已亮灯开始顺序点亮或逆序点亮,利用全局变量n来记录灯号,利用算法即可实现。
主要算法:1、全局变量的定义:uchar D[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0X7f};//单个LED亮uchar AllOff=0xff;//LED全灭uchar AllOn=0x00;//LED全亮uchar K[]={0xff,0xfe,0xfd,0xfb,0xf7};//按键开关uchar oldK;//记录已按键int n;2、顺序、逆序点亮流水灯:void forward(){for(n=0;n<=7;n++){out=D[n];delay(15);if(P2!=oldK&&P2!=K[0])break;}out=AllOff;}void backward(){for(n=7;n>=0;n--){out=D[n];delay(15);if(P2!=oldK&&P2!=K[0])break;}out=AllOff;}3、实验内容第二项流水灯灯亮顺序变换:void hold(){n=8;while(1){if(P2==K[4]){//一直按着K4键,逆序点亮跑马灯oldK=K[4];if(n==-1)n=7; //D0灯亮后点亮D7while(n>=0){out=D[n];n--;if(delay4(15))break;}}if(P2==K[0]){//未按下K4键,一直正序点亮跑马灯oldK=K[0];if(n==8)n=0;//D7灯亮后点亮D0while(n<=7){out=D[n];n++;if(delay4(15))break;}}if(P2!=K[4]&&P2!=K[0]){//按下了其他键,退出hold函数break;}}}4、对应实验内容第一项,开机顺序点亮流水灯:while(1){//开机即正序点亮流水灯forward();if(P2!=K[0]){break;}}2、实验原理图图2-1 实验原理图3、程序流程图图2-2 程序流程图三、源程序#include"reg51.h"#define uchar unsigned char#define uint unsigned int#define out P0uchar D[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0X7f};//单个LED亮uchar AllOff=0xff;//LED全灭uchar AllOn=0x00;//LED全亮uchar K[]={0xff,0xfe,0xfd,0xfb,0xf7};//按键开关uchar oldK;//记录已按键int n;//记录当前亮的灯号void delay(uint t){uint i;while(t--)for(i=0;i<1000;i++){if(P2!=oldK&&P2!=K[0])break;//按下了其他键退出循环}}void delay10ms(){uint i;for(i=0;i<10000;i++);}void forward(){for(n=0;n<=7;n++){out=D[n];delay(15);if(P2!=oldK&&P2!=K[0])break;}out=AllOff;}void backward(){for(n=7;n>=0;n--){out=D[n];delay(15);if(P2!=oldK&&P2!=K[0])break;}out=AllOff;}int delay4(uint t){uint i;while(t--)for(i=0;i<1000;i++){if(P2!=oldK){ //按键变化退出循环return 1;}}return 0;}void hold(){n=8;while(1){if(P2==K[4]){//一直按着K4键,逆序点亮跑马灯oldK=K[4];if(n==-1)n=7; //D0灯亮后点亮D7while(n>=0){n--;if(delay4(15))break;}}if(P2==K[0]){//未按下K4键,一直正序点亮跑马灯oldK=K[0];if(n==8)n=0;//D7灯亮后点亮D0while(n<=7){out=D[n];n++;if(delay4(15))break;}}if(P2!=K[4]&&P2!=K[0]){//按下了其他键,退出hold函数break;}}}void main(){oldK=K[0];while(1){//开机即正序点亮流水灯forward();if(P2!=K[0]){break;}}while(1){out=AllOff;if((P2&0x0f)!=0x0f){//检测有键按下delay10ms();//延时10ms再去检测//P2.0_K1键按下正序点亮流水灯if(P2==K[1]){oldK=K[1];while(1){forward();if(P2!=K[1]&&P2!=K[0]){//按下了其他键,退出break;}}}//P2.1_K2键按下逆序点亮流水灯if(P2==K[2]){while(1){backward();if(P2!=K[2]&&P2!=K[0]){//按下了其他键,退出break;}}}//P2.2_K3键按下关闭全部LEDif(P2==K[3]){oldK=K[3];out=AllOff;}//P2.3_K4键按下长按逆序点亮流水灯,不按正序点亮流水灯,直到其他键按下停止if(P2==K[4]){hold();}}}}四、实验结果1、基本的流水灯:开机后即重复顺序点亮流水灯,等待其他按键。
微控制器综合设计与实训实验名称:实验三跑马灯实验实验三:跑马灯实验1 实训任务(1) 编写程序,实现对LED1~LED8的轮流点亮;(2) 仿真调试,调整延时时间,利用仿真示波器观察延时时间长短;(3) 下载程序,观察跑马灯运行状况。
1.1 实验说明本实验将要实现的是控制实训平台上的8个LED灯实现一个类似跑马灯的效果,LED通过控制IO口的高低电平工作,因此实验的关键在于如何控制STM32的IO口输出。
1.2 实验步骤(1) 在实训平台上将IO口与LED(LED1~LED8)连接;(2) 复制工程模板文件夹,新建led.c和led.h文件,并将新建文件加入工程中;(3) 编写led.h文件,声明void LED_Init(void)初始化函数,宏定义LED1~LED8;(4) 编写led.c文件,建立void LED_Init(void)初始化函数,实现对LED灯用到的IO端口的配置,配置为推挽输出,速度为50MHZ;(5) 编写main()函数,实现对LED1~LED8的轮流点亮;(6) 软件仿真,调整延时时间,利用仿真示波器观察延时时间长短;(7) 下载程序,观察跑马灯的运行状况。
2 程序设计2.1 通过数组实现流水灯:2.2 通过宏定义实现流水灯:2.3 通过函数实现流水灯:2.4 通过SYSTICK中断实现流水灯:3硬件原理图设计4 总结通过数组实现流水灯:通过宏定义实现流水灯:通过函数实现流水灯:通过SYSTICK中断实现流水灯:实验心得:本次实验通过四种方法来实现流水灯,分别是通过数组实现流水灯,通过宏定义实现流水灯,通过函数实现流水灯,通过SYSTICK中断实现流水灯。
让我体会到单片机代码的多样性及强大的拓展功能。
MCU通过控制IO口的高低电平来直接控制LED的亮灭,所以本实验的关键是如何控制STM32的IO口输出,来达到我们想要的效果。
就比如灯光秀。
实验三跑马灯实验实验目的:通过一个经典的跑马灯程序,了解STM32F1 的IO 口作为输出使用的方法。
通过代码控制ALIENTEK 战舰STM32 开发板上的两个LED:DS0 和DS1 交替闪烁,实现类似跑马灯的效果内容要点:1.硬件设计本章用到的硬件只有LED(DS0 和DS1)。
其电路在ALIENTEK 战舰STM32F103开发板上默认是已经连接好了的。
DS0 接PB5,DS1 接PE5。
所以在硬件上不需要动任何东西。
其连接原理图如图:2.软件设计跑马灯实验我们主要用到的固件库文件是:stm32f10x_gpio.c /stm32f10x_gpio.hstm32f10x_rcc.c/stm32f10x_rcc.hmisc.c/ misc.hstm32f10x_usart /stm32f10x_usart.h其中stm32f10x_rcc.h 头文件在每个实验中都要引入,因为系统时钟配置函数以及相关的外设时钟使能函数都在这个其源文件stm32f10x_rcc.c 中。
stm32f10x_usart.h 和misc.h 头文件在我们SYSTEM 文件夹中都需要使用到,所以每个实验都会引用。
首先,找到之前新建的Template 工程,在该文件夹下面新建一个HARDWARE的文件夹,用来存储以后与硬件相关的代码,然后在HARDWARE 文件夹下新建一个LED 文件夹,用来存放与LED 相关的代码。
新建led.h和led.c文件,一个外设对应一个.h和.c文件。
在Manage Components 管理里面新建一个HARDWARE 的组,并把led.c 加入到这个组里面,将led.h 头文件的路径加入到工程里面一般的头文件有固定的格式,多个地方调用头文件会重复引用,为了避免头文件内容重复引用,一般通过预编译的方式来写头文件。
一般的格式如下:#ifndef __LED_H#define __LED_H……#endif第一次调用时会将#define下面这一节全部定义,重复调用时,下面的东西就不会被引用。
GPIO原理与配置(跑马灯,蜂鸣器,按键) ⼀。
STM32 GPIO固件库函数配置⽅法 1. 根据需要在项⽬中删掉⼀些不⽤的固件库⽂件,保留有⽤的固件库⽂件 2. 在stm32f10x_conf.h中注释掉这些不⽤的头⽂件 3. STM32的IO⼝可以由软件配置成如下8种模式(4种输⼊模式,4种输出模式) 分别在CRL寄存器和CRH寄存器中配置,配置每⼀个IO⼝需要4位来配置 2位MODE位----配置是输⼊模式还是输出模式 2位CNF位---根据MODE位的配置来确定是哪种输⼊模式或输出模式 a。
输⼊浮空 b。
输⼊上拉 c。
输⼊下拉 d。
模拟输⼊ e。
开漏输出 f。
推挽输出 g。
推挽式复⽤功能 h。
开漏复⽤功能 配置函数 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); 4。
GPIO输⼊值的读取 IDR是⼀个端⼝输⼊数据寄存器,只⽤了低16位。
操作IDR寄存器读取IO端⼝数据是通过GPIO_ReadInputDataBit函数实现的: uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); ⽐如我要读 GPIOA.5 的电平状态,那么⽅法是: GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5); uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx); 5. 往某个IO⼝输出数据 ODR 是⼀个端⼝输出数据寄存器,也只⽤了低 16 位。
该寄存器为可读写,从该寄存器读出来的数据可以⽤于判断当前 IO ⼝的输出状态。
⽽向该寄存器写数据,则可以控制某个 IO ⼝的输出电平。
在固件库中设置 ODR 寄存器的值来控制 IO ⼝的输出状态是通过函数 GPIO_Write 来实现的: void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal); 该函数⼀般⽤来往⼀次性⼀个 GPIO 的多个端⼝设值。
实用文档LED跑马灯实验修改记录版本号. 作者描述修改日期0.1 徐珊First Draft 2011-9-14审核记录职务签字日期标题文档编号版本页文档名 1.0 2 of 29LED跑马灯1.1实验介绍GPIO即通用可编程输入输出口,在此我们通过GPIO编程实现一个跑马灯的实验。
该跑马灯实验是最简单,也是一般最先开始的一个实验,它可以搭建一个最小的工程项目,之后,所有的实验都可以建立在该项目之上,从而节省了在搭建过程中所消耗的时间和精力。
所有的 GPIO 操作都是以跑马灯为基础进行的。
1.2实验目标1. 理解固件库的结构2. 分析和学习固件库3. 灵活运用 GPIO1.3实验时间60分钟1.4预备知识熟悉C语言知识,熟练MDK的使用1.5实验步骤1.解压stm32f10x_stdperiph_lib.zip可以从ST官方免费下载。
本教程使用的标准库版本为 3.1.22.创建一个GPIO文件夹标题文档编号版本页文档名 1.0 3 of 292.1 新建子文件夹User,用于存放用户源程序2.2 新建子文件夹Project,用户KEIL工程文件2.3 在Project下依次创建Obj和List子文件夹,存放编译过程中产生的中间文件。
3. 复制源代码到GPIO文件夹3.1 将stm32f10x_stdperiph_lib\STM32F10x_StdPeriph_Lib_V3.1.2\Libraries文件夹和Utilities文件夹整体复制到GPIO文件夹下。
这就是ST的标准库,是以源代码形式提供的。
3.2 将库中的演示代码\GPIO\labsolutions\4GPIO_fuction\User中的文件复制到GPIO\User 文件夹.4. 新建Keil MDK工程标题文档编号版本页文档名 1.0 4 of 29标题文档编号 版本 页文档名1.0 5 of 294.1 启动Keil MDK ,点击菜单 New uVision Project ,新建一个工程,命名为GPIO4.2 选择CPU类型为 STM32F107VC (这是MDV-STM32-107开发板采用的CPU类型)4.3 当提示是否复制启动代码时,请选择否。
单片机跑马灯输入引脚对8盏灯的控制1. 简介单片机跑马灯是一种常见的电子设计,通过程序控制多个灯的亮灭顺序,实现灯光闪烁的效果。
在这个设计中,我们将着重讨论单片机跑马灯中输入引脚对8盏灯的控制方法。
2. 单片机跑马灯的原理单片机跑马灯的设计原理是通过单片机的输出引脚控制LED灯的亮灭。
通过程序控制输出引脚的电平变化,可以控制LED灯的亮度,从而实现不同的灯光效果。
3. 输入引脚对8盏灯的控制方法在单片机跑马灯中,一般使用输入引脚来控制灯光的亮灭顺序。
对于8盏灯的控制,我们可以通过以下方法实现:3.1 使用二进制控制可以通过单片机的IO口输出8位二进制数,然后通过这个二进制数的变化来控制8盏灯的亮灭顺序。
可以通过循环移位的方法来实现灯光的顺序变化,从而实现跑马灯的效果。
3.2 使用计数器可以通过单片机上的定时器或者计数器来控制灯光的亮灭顺序。
通过定时器的中断生成,可以实现灯光的循环控制,从而实现跑马灯的效果。
3.3 使用外部输入还可以通过外部的输入引脚来控制灯光的亮灭顺序。
可以通过按键或者其他传感器来控制灯光的变化,从而实现跑马灯的效果。
4. 实际案例以下是一个使用输入引脚对8盏灯进行控制的实际案例:4.1 案例描述我们使用STM32单片机来设计一个跑马灯程序,通过外部引脚控制8盏LED灯的亮灭顺序。
我们设计了一个简单的电路,将8盏LED灯连接到单片机的8个引脚上,然后通过外部的输入引脚来控制LED灯的亮灭。
4.2 实现方法我们首先编写了一个简单的程序,通过外部输入引脚来控制LED灯的亮灭顺序。
我们使用定时器的中断功能,以固定的时间间隔来控制LED灯的亮灭,从而实现跑马灯的效果。
4.3 测试结果经过测试,我们成功实现了通过外部输入引脚控制8盏LED灯的跑马灯效果。
我们可以通过外部的按键来控制LED灯的亮灭顺序,从而实现不同的灯光效果。
5. 结论通过上述案例,我们可以看到,通过输入引脚控制8盏LED灯的跑马灯效果是可行的。
一、实训目的1. 熟悉单片机的硬件结构和基本工作原理;2. 掌握单片机编程方法,实现跑马灯功能;3. 提高实际操作能力和问题解决能力。
二、实训内容1. 跑马灯电路设计;2. 单片机编程实现跑马灯功能;3. 跑马灯功能测试与调试。
三、实训原理跑马灯是一种常见的电子玩具,主要由单片机、LED灯、按键等组成。
通过单片机控制LED灯的亮灭,实现跑马灯效果。
本实训采用AT89C51单片机作为核心控制单元,通过编程实现跑马灯功能。
四、实训步骤1. 跑马灯电路设计(1)硬件选型:选用AT89C51单片机作为核心控制单元,8个LED灯作为显示单元,2个按键作为控制单元。
(2)电路连接:将AT89C51单片机的P1口与LED灯的正极相连,LED灯的负极通过限流电阻连接到地。
将两个按键分别连接到单片机的P3.0和P3.1口。
2. 单片机编程实现跑马灯功能(1)初始化:设置P1口为输出端口,P3.0和P3.1口为输入端口。
(2)跑马灯程序编写:```c#include <reg51.h>#define LED P1void delay(unsigned int t) {unsigned int i, j;for (i = 0; i < t; i++)for (j = 0; j < 1275; j++); }void main() {unsigned char i = 0;while (1) {LED = 0x01; // 点亮LED1delay(500);LED = 0x02; // 点亮LED2delay(500);LED = 0x04; // 点亮LED3delay(500);LED = 0x08; // 点亮LED4delay(500);LED = 0x10; // 点亮LED5delay(500);LED = 0x20; // 点亮LED6delay(500);LED = 0x40; // 点亮LED7delay(500);LED = 0x80; // 点亮LED8delay(500);for (i = 0; i < 8; i++) {LED = ~(0x01 << i); // 倒序点亮LEDdelay(500);}}}```3. 跑马灯功能测试与调试(1)测试:将编写好的程序烧录到AT89C51单片机中,观察LED灯的跑马灯效果。
stm32跑马灯实验报告STM32跑马灯实验报告引言:STM32是一款广泛应用于嵌入式系统开发的微控制器,具有高性能、低功耗和丰富的外设接口。
跑马灯实验是入门级的STM32实验项目,通过控制LED灯的亮灭顺序实现跑马灯效果。
本实验报告将详细介绍实验的目的、原理、实施步骤以及实验结果。
一、实验目的跑马灯实验旨在通过STM32的GPIO控制LED灯的亮灭,实现灯光在多个LED之间依次点亮和熄灭的效果。
通过这个实验,我们可以了解STM32的GPIO口的操作方式,掌握基本的STM32编程技巧。
二、实验原理STM32的GPIO口可以设置为输出模式,通过控制GPIO口的电平(高电平或低电平)来控制LED灯的亮灭。
跑马灯实验中,我们将多个LED连接到STM32的不同GPIO口上,通过依次改变GPIO口的电平状态,实现灯光在不同LED之间依次传递的效果。
三、实施步骤1. 准备材料:STM32开发板、杜邦线、若干个LED灯。
2. 连接电路:将多个LED分别连接到STM32的不同GPIO口上,确保极性正确。
3. 创建工程:使用Keil等开发环境创建STM32工程,并配置好相应的引脚。
4. 编写代码:在main函数中编写代码,通过设置GPIO口的电平状态实现跑马灯效果。
5. 编译烧录:编译代码生成可执行文件,并将其烧录到STM32开发板上。
6. 运行实验:将STM32开发板上电,观察LED灯的亮灭顺序是否符合预期。
四、实验结果经过实验,我们成功实现了跑马灯效果。
LED灯在不同的GPIO口之间依次点亮和熄灭,形成了流动的灯光效果。
通过调整代码中GPIO口的顺序和时间延迟,我们还可以改变灯光的流动速度和方向。
实验结果与预期一致,验证了我们的设计和实施的正确性。
五、实验总结通过这个实验,我们对STM32的GPIO控制和编程有了更深入的了解。
我们学会了如何通过改变GPIO口的电平状态来控制外部设备,掌握了基本的STM32编程技巧。
stm32实训心得体会篇一:STM32 实验2报告实验2MINI STM32按键控制LED灯实验一、实验目的1、掌握嵌入式程序设计流程。
2、熟悉STM32固件库的基本使用。
二、实验内容1、编程使用I/O口作为输入,控制板载的两个LED 灯。
2、使用固件库编程。
三、实验设备硬件: PC机一台MINI STM32开发板一套软件: RVMDK 一套Windows XP 一套四、实验步骤1、设计工程,使用固件库来编程设置。
、在这里我们建立一个文件夹为: STM32-Projects.点击Keil 的菜单:Project –>New Uvision Project ,然后将目录定位到刚才建立的文件夹STM32-Projecst 之下,在这个目录下面建立子文件夹shiyan1, 然后定位到 shiyan1目录下面,我们的工程文件就都保存到shiyan1 文件夹下面。
工程命名为shiyan1, 点击保存.是这个型号。
、这里我们定位到STMicroelectronics 下面的STM32F103RB ,然后点击Add ,然后Close.、用同样的方法,将 Groups 定位到CORE 和USER 下面,添加需要的文件。
这里我们的CORE 下面需要添加的文件为core_ ,startup_stm32f10x_ ,USER 目录下面需要添加的文件为,stm32f10x_,system_ 这样我们需要添加的文件已经添加到我们的工程中去了,最后点击 OK,回到工程主界面、下面我们要告诉 MDK,在哪些路径之下搜索相应的文件。
回到工程主菜单,点击魔术棒,出来一个菜单,然后点击 c/c++ 选项. 然后点击 Include Paths 右边的按钮。
弹出一个添加path 的对话框,然后我们将图上面的 3 个目录添加进去。
记住,keil 只会在一级目录查找,所以如果你的目录下面还有子目录,记得path 一定要定位到最后一级子目录。
目录实验一跑马灯实验 (1)实验二按键输入实验 (3)实验三串口实验 (5)实验四外部中断实验 (8)实验五独立看门狗实验 (11)实验七定时器中断实验 (13)实验十三ADC实验 (15)实验十五DMA实验 (17)实验十六I2C 实验 (21)实验十七SPI 实验 (24)实验二十一红外遥控实验 (27)实验二十二DS18B20实验 (30)1 / 32'.实验一跑马灯实验一.实验简介我的第一个实验,跑马灯实验。
二.实验目的掌握STM32 开发环境,掌握从无到有的构建工程。
三.实验内容熟悉MDK KEIL 开发环境,构建基于固件库的工程,编写代码实现跑马灯工程。
通过ISP 下载代码到实验板,查看运行结果。
使用JLINK 下载代码到目标板,查看运行结果,使用JLINK 在线调试。
四.实验设备硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK。
软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件。
五.实验步骤1.熟悉MDK KEIL 开发环境2.熟悉串口编程软件ISP3.查看固件库结构和文件4.建立工程目录,复制库文件5.建立和配置工程6. 编写代码7. 编译代码8.使用ISP下载到实验板9.测试运行结果10.使用JLINK 下载到实验板11.单步调试12. 记录实验过程,撰写实验报告六.实验结果及测试源代码:int main(void}<5tm32_Clock_IniC (9); /,耒红对甘去置delay^init (72 >; "延吋初始<tLED Tnit:C>;"初维花与LED连接的硬伴接口while tl){匚EDO=O;匸ED1=1;de .lay ms (300 J ;LEDO=1;LEDL-0;delay ms(3"0^;两个灯LEDO与LED1实现交替闪烁的类跑马灯效果,每300ms闪烁一次。
目录实验一跑马灯实验 (1)实验二按键输入实验 (3)实验三串口实验 (5)实验四外部中断实验 (8)实验五独立看门狗实验 (11)实验七定时器中断实验 (13)实验十三 ADC实验 (15)实验十五 DMA实验 (17)实验十六 I2C实验 (21)实验十七 SPI实验 (24)实验二十一红外遥控实验 (27)实验二十二 DS18B20实验 (30)实验一跑马灯实验一.实验简介我的第一个实验,跑马灯实验。
二.实验目的掌握STM32开发环境,掌握从无到有的构建工程。
三.实验内容熟悉MDK KEIL开发环境,构建基于固件库的工程,编写代码实现跑马灯工程。
通过ISP 下载代码到实验板,查看运行结果。
使用JLINK下载代码到目标板,查看运行结果,使用JLINK在线调试。
四.实验设备硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK。
软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件。
五.实验步骤1.熟悉MDK KEIL开发环境2.熟悉串口编程软件ISP3.查看固件库结构和文件4.建立工程目录,复制库文件5.建立和配置工程6.编写代码7.编译代码8.使用ISP下载到实验板9.测试运行结果10.使用JLINK下载到实验板11.单步调试12.记录实验过程,撰写实验报告六.实验结果及测试源代码:两个灯LED0与LED1实现交替闪烁的类跑马灯效果,每300ms闪烁一次。
七.实验总结通过本次次实验我了解了STM32开发板的基本使用,初次接触这个开发板和MDK KEILC 软件,对软件操作不太了解,通过这次实验了解并熟练地使用MDK KEIL软件,用这个软件来编程和完成一些功能的实现。
作为STM32 的入门第一个例子,详细介绍了STM32 的IO口操作,同时巩固了前面的学习,并进一步介绍了MDK的软件仿真功能。
实验二按键输入实验一.实验简介在实验一的基础上,使用按键控制流水灯速度,及使用按键控制流水灯流水方向。