用arm7设计流水灯
ARM课程设计报告GPIO—流水灯
};
int main (void)
{
uint8 i;
//PINSEL1 = 0x00000000;//设置管脚连接GPIO
PINSEL2 = PINSEL2 & (~0x08);// P1[25:16]连接GPIO
图2
流水灯程序:
/
#include "config.h"
/* LED8~LED1 8个LED分别由P1.25~P1.18控制*/
const uint32 LEDS8 = (0xFF << 18);// P1[25:18]控制LED8~LED1,低电平点亮
/*
*********************************************************************************************************
SSPCR1 = (0x00 << 3) | // SOD从机输出禁能,1=禁止,0=允许
(0x00 << 2) | // MS主从选择,0=主机,1=从机
(0x01 << 1) | // SSE SSP使能,1=允许SSP与其它设备通信
(0x00 << 0); // LBM回写模式
SSPCPSR = 0x52; // PCLK分频值
一、设计目的………………………………………………3
二、设计原理
1、GPIO—流水灯……………………………………3
2、SPI…………………………………………………7
用单片机设计流水灯的方法和程序编写
用单片机设计流水灯的方法和程序编写-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIANS51增强型单片机实验板上有8个高亮度发光二极管(见图1所示),可以用来做单片机流水灯、跑马灯。
等实验,电路原理图见下图3。
图3单片机流水灯设计方法从原理图可以看出,如果我们想让接在口的LED1亮起来,那么我们只要把口的电平变为低电平就可以了;相反,如果要接在口的LED1熄灭,就要把口的电平变为高电平就可以;同理,接在~口的其他7个LED的点亮和熄灭方法方法同LED1。
因此,要实现流水灯功能,我们只要将LED2~LED8依次点亮、熄灭,依始类推,8只LED变会一亮一暗的做流水灯了。
实现8个LED流水灯程序用中文表示为:低、延时、高、低、延时、高、低、延时、高、低、延时、高、低、延时、高、低、延时、高、低、延时、高、低、延时、高、返回到开始、程序结束。
从上面中文表示看来实现单片机流水灯很简单,但是我们不能说你变低,它就变低了。
因为单片机听不懂我们的汉语的,只能接受二进制的“1、0......”机器代码。
我们又怎样来使单片机按我们的意思去工作呢为了让单片机工作,只能将程序写为二进制代码交给其执行;早期单片机开发人员就是使用人工编写的二进制代码交给单片机去工作的。
今天,我们不必用烦人的二进制去编写程序,完全可以将我们容易理解的“程序语言”通过“翻译”软件“翻译”成单片机所需的二进制代码,然后交给单片机去执行。
这里的“程序语言”目前主要有汇编语言和C语言两种;在这里我们所说的“翻译”软件,同行们都叫它为“编译器”,将“程序语言”通过编译器产生单片机的二进制代码的过程叫编译。
前面说到,要想使LED1变亮,只需将对应的单片机引脚电平变为低电平就可以了。
现在让我们将上面提到的8只LED流水灯实验写为汇编语言程序。
在上面主程序中用到了五条汇编语言指令:CLR、ACALL、SETB、LJMP、EN D。
CLR:是将其后面指定的位清为0,程序中使对应端口输出低电平ACALL:是子程序调用指令,程序中调用了DELAY延时子程序SETB:是将其后面指定的位置成1,程序中使对应端口输出高电平AJMP:是无条件跳转指令,意思是:跳转到指定的标号处继续运行END:是程序结束的伪指令,意思是告诉编译器,程序到此结束。
ARM7流水灯课程设计
ARM7流水灯课程设计一、课程目标知识目标:1. 学生理解ARM7处理器的基本结构和工作原理,掌握流水灯程序设计所需的基础知识。
2. 学生掌握C语言编程的基本语法和流程控制,能运用所学知识编写ARM7流水灯程序。
3. 学生了解嵌入式系统开发流程,熟悉Keil MDK集成开发环境和调试方法。
技能目标:1. 学生能独立设计并实现基于ARM7处理器的流水灯程序,具备一定的编程实践能力。
2. 学生通过课程学习,培养解决问题的能力,提高逻辑思维和动手实践能力。
3. 学生能够运用所学知识,对实际嵌入式项目进行需求分析和方案设计。
情感态度价值观目标:1. 培养学生对嵌入式系统开发的兴趣,激发学习热情,树立正确的学习态度。
2. 通过团队合作,培养学生的沟通与协作能力,提高团队意识。
3. 引导学生关注我国嵌入式技术的发展,增强民族自豪感,培养爱国主义情怀。
课程性质:本课程为实践性较强的课程,旨在让学生通过动手实践,掌握嵌入式系统编程和开发方法。
学生特点:学生已具备一定的C语言基础和硬件知识,具有较强的学习能力和动手能力。
教学要求:结合课程性质和学生特点,注重理论与实践相结合,强调动手实践,提高学生的编程能力和实际操作技能。
将课程目标分解为具体的学习成果,以便进行教学设计和评估。
二、教学内容1. ARM7处理器基本原理:介绍ARM7处理器的内部结构、工作原理,重点讲解其指令集和编程模型。
相关教材章节:第1章 ARM处理器概述,第2章 ARM7处理器架构。
2. C语言编程基础:复习C语言基本语法,强调与ARM7编程相关的重要语法点和编程规范。
相关教材章节:第3章 C语言基础,第4章 C语言控制语句。
3. 嵌入式系统开发环境:介绍Keil MDK集成开发环境的使用方法,包括工程创建、代码编写、编译、下载和调试等。
相关教材章节:第5章 嵌入式系统开发工具。
4. 流水灯程序设计:讲解流水灯程序的原理和设计方法,引导学生通过实践掌握嵌入式系统编程。
arm实验报告——流水灯
实验六 ARM环境下汇编语言与C语言实验一、实验目的1 掌握基本的ARM汇编语言和C语言编程方法2 掌握ADS下C语言和汇编语言互相调用的方法3 深入理解ARM开发环境的体系结构4 初步掌握S3C2410的I/O口德操作方法5 巩固使用AXD和Multi-ICE调试的方法二、实验内容1 单独使用ARM汇编语言编写一个程序,在AXD下调试,观察结果。
2 采用内嵌汇编和C完成一个工程在AXD下调试,观察结果。
3 用C语言实现跑马灯功能。
三、实验设备1 硬件:DM2410B+实验系统PC机JTAG仿真器串口线2 软件:PC机操作系统ARM Developer Suiter v1.2Multi-ICE v2.2.5(Build1319)DNW2410(或超级终端)四、实验说明汇编语言程序实验程序程序代码如下:#include <string.h>#include "2410addr.h"#include "2410lib.h"//================================ //名称:Led_Test//功能:LED循环显示//参数: void//返回值: void//================================ void Led_Test(){unsigned long LED;Uart_Printf("Led_Test.\n");//GPBCON GPB10 [21:20] = 01 : Output//GPBCON GPB10 [19:18] = 01 : Output//GPBCON GPB10 [17:16] = 01 : Output//GPBCON GPB10 [15:14] = 01 : OutputrGPBCON &= (~(0x3<<20));rGPBCON |= ((0x1<<20));rGPBCON &= (~(0x3<<18));rGPBCON |= ((0x1<<18));rGPBCON &= (~(0x3<<16));rGPBCON |= ((0x1<<16));rGPBCON &= (~(0x3<<14));rGPBCON |= ((0x1<<14));//GPBDAT GPB[10:0] [10:0] : Output DatarGPBDAT = 0xf7f;Delay(100);Uart_Printf("PRESS ANY KEY TO STOP.");while (!Uart_GetKey()){LED = rGPBDAT;LED = (LED<<1); //下一个灯亮rGPBDAT = LED;Delay(200);if(!(rGPBDAT & 0x400)) //保证第四个LED点亮后重新点亮第一个LED;rGPBDAT=0xf7f;Delay(200);}Uart_Printf("\nTEST FINISHED.");}//============================//名称:delay//功能:延迟指定时间//参数: x//返回值: void//============================void delay(unsigned int x){unsigned int i,j,k;for(i=0;i<=x;i++)for(j=0;j<0xff;j++)for(k=0;k<0xff;k++);}六实验步骤第一大部分(目标机的连接):把开发板电源接口、Muilti-ICE Embeded接口连接好,如下图,然后打开开发板电源。
基于ARM的流水灯嵌入式系统设计
基于S3C2410的流水灯控制系统设计学号:班级:姓名:组别:第三组指导教师:课程名称:《ARM嵌入式系统设计实训》提交日期:2013年12月27前言本实训项目是以嵌入式系统为目标的一次平台操作。
所谓嵌入式系统就是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,实用于应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。
ARM嵌入式芯片是一种高性能、低功耗的RISC芯片,世界上几乎所有的主要半导体生产商都生产基于ARM体系机构的通用芯片,且基于ARM内核的嵌入式处理器已经成为市场主流。
而且Linux是免费发行的、快速高效的操作系统,在过去的几年中,基于开源组织的Linux嵌入式操作系统得到了长远的发展。
嵌入式Linux是按照嵌入式操作系统的要求设计的一种小型操作系统。
由一个内核以及一些根据需要进行定制的系统模块组成。
其内核很小,一般只有几百KB,即使加上其他必要的模块和应用程序,所需的存储空间也很小。
非常适合于移植到嵌入式系统中去,同时它还具有多任务多进程的系统特征。
在此基础上,我们综合应用ARM嵌入式系统设计的相关专业知识,搭建了一个基于S3C2410的硬件平台,在平台上编写出一个完整的流水灯控制功能的软件。
并通过这个典型的嵌入式系统项目的设计与开发,学习嵌入式系统的设计与开发流程。
在小组中,硬件电路部分我和朱徐银负责对整体电路的细致规划以及总体把握;在程序设计部分我主要负责和眭栋芳、陆佳丽一起完成对汇编部分的编写,与此同时作为组长的我,也努力履行着对小组应尽的责任。
目录前言 (1)第一章ARM介绍1.1 ARM的发展历史 (3)1.2 ARM的特点 (4)第二章 S3C2410介绍2. 1 S3C2410处理器简介 (5)2. 2 S3C2410处理器功能 (5)第三章 ARM 集成环境介绍3.1 ADS 集成环境简介 (6)3.2 ADS 集成环境的使用 (6)3.3 DNW 集成环境的使用 (10)第四章方案论证与系统总体设计4.1 方案认证与电路设计 (13)第五章程序流程图及代码设计5.1 C程序流程图 (18)5.2 C程序程序代码: (19)5.2.1 C程序GPIO端口配置模块 (19)5.2.2 C程序LED灯状态配置模块 (19)5.2.3 C程序键值读取模块 (20)5.2.4 C程序工作模式模块 (20)5.3 汇编流程图 (22)5.4 汇编程序代码 (23)5.4.1 汇编程序GPIO端口配置模块 (23)5.4.2 汇编程序LED灯状态配置模块 (23)结论 (25)致谢 (26)参考文献 (27)第一章ARM介绍1.1ARM的发展历史随着计算机业的发展,ARM体系结构目前被公认为是业界领先的32位嵌入式RISC微处理器结构,ARM体系结构为满足ARM合作者以及设计领域的一般需求正稳步发展。
嵌入式系统 实验报告
使能 IRQ 中断。
4 装载并使能外中断;
5 选用 DebugInExram 生成目标,然后编译连接工程。
6 选择【Project】->【Debug】,启动 AXD 进行 JTAG 仿真调试。
7 全速运行程序,LED 闪烁;
8 每一次按键 Key,蜂鸣器就会转换静音或鸣响状态。
四.测试数据及运行结果
1
五.总结
1.实验过程中遇到的问题及解决办法;
由于本次实验较简单,且我们之前学习的微机原理课程也进行了流水灯的设
计实验,所以对于本次实验,我完成地很顺利,在实验中没有遇到问题。
2.对设计及调试过程的心得体会。
本次实验是本学期该课程我们进行的第一次实验,总的来说,实验不是很难,
设计过程也相对简单,其主要目的是让我们熟悉一下实验环境,并且能在实验环
6
五.总结 1.实验过程中遇到的问题及解决办法;
实验第一次运行时,蜂鸣器一直处于鸣响状态,及时按了按键,蜂鸣器还是 一直鸣叫,不产生外中断。后来仔细检查了程序,发现原来是忘记使能 EINT0 中 断了,加上 VICIntEnable = 1<<0x0e 代码,程序就能正常运行了。 2. 对设计及调试过程的心得体会。
境下进行简单的实验操作,为之后的实验打下坚实的基础。
六.附录:源代码(电子版)
#include "config.h"
const uint32 LEDS8 = 0xFF << 18;//P1[25:18]控制 LED1~LED8,低电平点亮
const uint32 KEY = 1 << 16;
//P0.16 连接 KEY1
三.方案设计
① 启动 ADS1.2IDE 集成开发环境,选择 ARM Executable Image for lpc2131
单片机课程设计报告流水灯(WORD档)
XX工程学院单片机课程设计报告题目:流水灯学生姓名:学号:系部名称:职业技术学院班级:机电一体化Z11-1 指导教师:目录摘要 (3)一、课程设计题目 (4)二、设计任务及要求 (4)三、实验方案 (4)四、流程图 (4)五、硬件电路 (6)六、软件设计 (6)1 主体程序 (6)2 键扫描子程序 (6)3 闪烁控制程序 (6)4 延时子程序 (6)5 源程序设计 (7)七、功能调试 (12)八、设计总结 (12)九、参考文献 (13)【摘要】单片机课程设计主要是为了让我们增进对单片机芯片电路的感性认识,加深对理论方面的理解。
了解软硬件的有关知识,并掌握软件设计过程、方法及实现,为以后设计和实现应用系统打下良好基础。
另外,通过简单课题的设计练习,使我们了解必须提交的各项工程文件,达到巩固、充实和综合运用所学知识解决实际问题的目的。
一、课程设计题目:流水灯二、设计任务及要求:任务:完成对接在P1,P3口的发光二极管闪亮控制程序的设计1.用程序延时方法让P1的一个LED小灯每隔1S交替闪亮2.用程序延时方法让P1的8个LED小灯循环(每个亮50MS)闪亮3.用程序延时方法让P1的8个LED小灯追逐闪亮(50MS间隔变化)4.用程序延时方法让P1、P3的16个LED小灯循环(每个亮50MS)闪亮要求:1. 根据硬件电路原理,画出接线2. 设计出相应的软件程序三、实验方案:方案:单片机采用40脚的89C52标准双列直插系列,有4个标准输入/输出端口共32位控制端口。
本次设计采用并行口低电平(吸电流)直接驱动LED发光管发光形式,选择了P1和P3口的16个端口进行模拟LED小灯控制,如要多些小灯单元可再将P2口、P0口及其他空余端口用LED小灯驱动控制。
因系统功能要求能控制灯亮的方式,在P0.0—P0.3端口接了4个按键小开关,每个小开关可控制一种亮灯方式。
在端口较紧张的情况下,LED小灯驱动也可用串入/并出移位寄存器(如74HC595),单片机用并行移位方式进行驱动。
嵌入式实验流水灯
一、实验目的:
1.了解基于ARM7核的LPC2106的管脚功能和特点,掌握I/O控制寄存器的设置方法; 2.掌握ARM7应用系统编程开发方法,能用C语言编写应用程序;
3.熟练掌握ADS1.2软件的使用以及PROTEUS仿真调试的方法;
二、具体任务: 1.采用PROTEUS完成流水灯控制的硬件电路设计,要求单片机选型为飞 利浦公司的LPC2106; 2.用ADS1.2编写C语言应用程序,完成流水灯控制显示; 3.采用PROTEUS将应用程序装载在LPC2106中,进行仿真验证
实验三 计数器(向量中断)
一、实验目的: 1.掌握外部中断寄存器与向量中断寄存器的设置方法; 2.掌握ARM7应用系统编程开发方法,能用C语言编写应用程序; 3.熟练掌握ADS1.2软件的使用以及PROTEUS仿真调试的方法;
二、具体任务: 1.采用PROTEUS完成外部中断的硬件电路设计(按下按键1数码管加1;按下按 键2数码管清零;按下按键3数码管减1 ); 2.用ADS1.2编写C语言应用程序,完成控制; 3.采用PROTEUS将应用程序装载在LPC2106中,进行仿真验证
void delay(uint32 n) {n--;}
int main(void) { uint32 i; while(1){ PINSEL0=0x00000000; PINSEL1=0x00000000; IODIR=0x000003ff; for(i=0;i<11;i++) { IOCLR=0x000003ff; IOSET=1<<i; delay(500000000); delay(500000000); } } return(0); }
计数器电路图
流水灯实验电路图
流水灯电路图和程序
流水灯电路图和程序#include <reg52.h>#include<instrins.h>#define uchar unsigned char#define uint unsigned intuchar code led[]={0xfe,0xfb,0xfd ,0xf7,0xef,0xbf,0xdf,0x7f};delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}main( ){uint i;while(1){P2=led[];delay(500);_crol_(led,1);}}用arm7做一个流水灯的设计。
悬赏分:100 - 解决时间:2009-9-3 20:03试设计一个闪烁流水灯控制器,该控制器可以控制8个灯顺序亮灭,当按钮K按下1次后,每次顺序点亮一个灯。
而且每个点亮的灯在闪烁3次后,才能灭,周而复始,直到按钮K 二次按下。
(用状态机设计)要用PROTEL99画好电路图。
还要写好程序。
画图的也只能发到我的邮箱里面吧。
邮箱:。
谢谢各位。
提问者:woxinruozai - 五级最佳答案从原理图可以看出,如果我们想让接在P1.0口的LED1亮起来,那么我们只要把P1.0口的电平变为低电平就可以了;相反,如果要接在P1.0口的LED1熄灭,就要把P1.0口的电平变为高电平就可以;同理,接在P1.1~P1.7口的其他7个LED的点亮和熄灭方法方法同LED1。
因此,要实现流水灯功能,我们只要将LED2~LED8依次点亮、熄灭,依始类推,8只LED变会一亮一暗的做流水灯了。
实现8个LED流水灯程序用中文表示为:P1.0低、延时、P1.0高、P1.1低、延时、P1.1高、P1.2低、延时、P1.2高、P1.3低、延时、P1.3高、P1.4低、延时、P1.4高、P1.5低、延时、P1.5高、P1.6低、延时、P1.6高、P1.7低、延时、P1.7高、返回到开始、程序结束。
基于单片机的LED流水彩灯设计
第1章概述近几年来,彩灯对于美化、亮化城市有着不可轻视的重要工作。
因此作为城市装饰的彩灯需求量越来越大,对与彩灯的技术和花样也越来越高。
但传统的彩灯控制电路一般是由数字电路组成,这种彩灯控制器电路结构复杂、成本较高、功率损耗大,此外从功能效果上看,彩灯模式少而且样式单调,缺乏用户可操作性,影响亮灯效果。
因此有必要对现有的彩灯控制器进行改进。
然而单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。
LED彩灯具有成本低、发光纯度高、发光热量小、耗电量低、超长寿命的特点。
所以利用单片机作LED彩灯控制,不仅是使控制花样、路数大大增加,成本也很低,而且对环境能源没有污染,有着很大的发展前景。
本方案是一种基于AT-89C51单片机的彩灯控制方案,实现对LED彩灯的控制。
主要以AT-89C51单片机作为主控核心与发光二极管、晶振、复位、电源等组成电路,利用软件编辑实现彩灯流水灯的效果。
第2章方案设计2.1设计任务(1)共有红、绿、蓝3色彩灯各8个,要求按一定顺序和时间关系运行:红色发光二极管由弱到强—>绿色发光二极管由弱到强—>蓝色发光二极管由弱到强。
(2)利用三基色原理,控制每次点亮红色发光二极管,绿色发光二极管,蓝色发光二极管的数目,实现黄色,紫色,青色。
(3)控制不同颜色发光二极管的数目,实现花样彩灯。
(4)编写程序代码。
(5)程序分析与调试。
2.2工程方案按照设计任务要求,红,绿,蓝光由弱到强,每个颜色用8个发光二极管,在程序控制下,先亮一个,再亮两个,再亮三个,慢慢的直到最后全亮,就能看到由弱到强的现象。
如果同一颜色使用更多的发光二极管,显示效果会更柔和。
要实现黄色,紫色,青色光,只能根据三基色原理进行合成。
所谓三基色是指红,绿,蓝三色,人眼对红,绿,蓝最为敏感,大多数可以通过红,绿,蓝3种颜色按照不同的比例合成产生。
同时,绝大多数单色光也可以分解成红绿蓝三种光。
单片机流水灯实验报告
单片机流水灯实验报告引言单片机是一种集成电路,可以通过编程来控制不同的功能。
其中,流水灯是一个最简单的单片机实验项目,也是学习单片机的第一步。
本篇实验报告将详细介绍如何通过使用 AVR 单片机来实现一个流水灯的控制器。
实验原理流水灯的原理很简单,就是通过一个方向控制信号,以及一定的时间延时控制来逐步点亮和熄灭多个 LED 灯。
在本次实验中,我们将使用 AVR ATmega328P 单片机,它可以通过编程来实现流水灯的控制功能。
实验步骤1. 硬件准备将 ATmega328P 单片机插入到开发板中,并使用杜邦线将单片机的引脚连接到各个 LED 灯。
我们需要将一个引脚连接到方向控制信号,用于控制灯的点亮方向。
同时,我们还需要连接一个电位器,用于调节流水灯的速度。
2. 程序设计使用 Arduino 开发环境来编写 AVR 单片机的程序。
首先需要包含头文件 avr/io.h 和 util/delay.h,并定义输入输出引脚。
然后,我们需要定义一个名为“led” 的一个数组,来存储各个 LED 灯的输出状态。
同时,还需要定义一个变量“dir”,来表示流水灯的方向。
在程序主循环中,我们使用 for 循环来遍历各个 LED 灯。
同时,根据“dir”变量的不同,我们可以实现流水灯的正向和反向控制。
另外,我们还需要使用“_delay_ms()”函数来延时一定的时间,实现流水灯的闪烁效果。
3. 程序烧录使用 AVR ISP 编程器将编写好的程序烧录到单片机中。
在烧录过程中需要设置正确的程序和芯片类型,并选择正确的口线连接方式。
实验结果经过实际测试,我们成功地实现了一个流水灯控制器。
在调节电位器之后,灯的闪烁速度可以得到不同的调整。
同时,也可以通过改变方向控制信号来改变流水灯的运动方向。
结论通过本次实验可以学习到如何使用 AVR 单片机来实现一个简单的流水灯控制器。
通过编写程序、烧录编译等过程,可以加深对单片机的基础知识和理解。
ARM报告PWM和SPI流水灯
龙岩学院实验报告班级07电本一班学号2007050326 姓名刘桂银同组人 ____________________ 实验日期2010.5.12 室温___________________ 大气压 _________ 成绩______实验题目:PWM 音乐输出、数码显示和LED 显示一、实验目的1、复习GPI0的管脚功能及蜂鸣器电路蜂鸣的工作原理。
2、复习SPI引脚、结构和工作原理3、熟悉7段数码管真值表的由来。
4、掌握PWM模块的基本原理及应用。
5、了解简谱和频率的关系6、锻炼学生自己的设计、创造和综合性。
二、实验仪器微型电子计算机(含软件H-JTAG V0.3.1和ADSv1_2)、Easy ARM2131开发板、UART0接口线、USB接口电源线和JTAG接口线以及部分跳线。
三、实验原理1、(1)蜂鸣器控制电路在EasyARM2131开发板上,接有一个蜂鸣器,由P0.7控制,通过跳线JP11选择连接。
蜂鸣器控制电路如图一所示。
图一蜂鸣器控制电路电路说明:如果跳线JP11选择蜂鸣器,当P0.7输出低电平时,蜂鸣器鸣叫,当P0.7输出高电平则停止鸣叫。
实验利用P0.7的输出功能,控制蜂鸣器鸣叫。
程序设置PINSEL0使P0.7连接GPIO,并通过IOODIR 将其设置为输出状态,然后通过IOOCLR和IOOSET清零和置位P0.7 口,控制蜂鸣器。
LPC2131中,具有I2C总线功能的I/O 口(P0.2 —SCL、P0.3 —SDA0 P0.11 —SCL1 P0.14 —SDA1)为开漏输出,在用作I2C 总线以及其它功能时,需要加1K〜10KQ的上拉电阻。
则此电路图在JP11前,力口R22=10K的上拉电阻。
(2)七段数码管在显示方面,EasyARM2131开发板采用了一片74HC595驱动一位静态共阳LED数码管,如图(a)所示,其时钟(SCK八数据(SI)分别接到LPC2131的SP接口的SCLK0、MOSI0 ,这样就可以发送数据到74HC595 ;片选(RCK , 即74HC595输出触发端)与P0.29 口连接,由P0.29控制74HC595数据锁存输出;而最高位输出(SQH)连接到LPC2131的SPI接口的MISO0 ,可用来读回数据。
单片机设计—流水灯
单片机设计—流水灯
流水灯是电子技术领域里最常见的发光元件,它的排列有许多模式,它的动态效果也会令人惊叹。
通常,它都是使用LED闪烁和循环表现出来,而且动态效果相当好,令人喜欢。
实现流水灯效果也可以使用单片机,使用单片机在模式比较简单,也可以实现很好的流水灯效果。
首先,我们需要用到单片机,一般可以选用51系列、增强型单片机,硬件环境的搭建包括单片机、晶振、外部存储器(如ROM、常数RAM)、I/O端口、看门狗、周边外设包括显示、AD、电源供电等等。
总的来说实现流水灯的工作的要点有:(1)将控制信号输入芯片;(2)编写程序给芯片,并调试主板电路;(3)控制LED闪烁,LED只能在程序中配置;(4)程序来驱动LED,按照要求实现流水灯特效。
在程序实现流水灯特效时,首先可以设置一个标量,即灯泡显示模式,该标量决定控制灯泡亮暗,以及显示延时。
接着,可以使用for循环结构语句来使LED闪烁,将用户自定义的标量赋给灯泡的控制位,将其输出到特定的端口,以实现要求的流水灯特效,以达到实现流水灯特效的目的。
流水灯的模式要根据使用场景设计,通过单片机控制LED,可以实现各种形式的流水灯,并且可以自行调整控制灯泡的频率、强度等参数,从而达到所需要的形式和效果。
通过使用单片机,我们可以更好地控制各种发光元件,实现各种美观的流水灯特效。
单片机-流水灯的程序
#include<reg51.h> sbit led1=P2^0; sbit led2=P2^1; sbit led3=P2^2; sbit led4=P2^3; sbit led5=P2^4; sbit led6=P2^5; sbit led7=P2^6; sbit led8=P2^7; void delay (unsigned char x);
其中void表示这 个函数执行完后 不返回任何数据。 ()内无任何东西, 所以这是个无参 数的函数。 Delayms是函数名。
1
2
3
4
5
6
2)带参数函数的用位定义实现流水灯(8位二极管循环点亮)
编程思路: a) 先点亮第一盏灯,延时点亮第二盏, 依次延时8盏灯全部点亮。 b) 当8盏灯全部点亮时,熄灭8盏灯。 c) 进入循环。
循环移动
循环左移 最高位移入最低位,其它依次向左移动一位。C语言中 没有专门的指令,通过移位指令和简单逻辑运算来实现循环左移,或直接利用C51库中自带的函数-crol-实现。
循环右移 最低位移入最高位,其它位依次向右移一位,C语言中没有专门的指令,通过移位指令与简单的逻辑运算可以实现循环右移,或专门利用C51库中自带函数-cror-实现
方法二:利用总线控制实现流水灯(8位二极管循环点亮)
相关知识 二进制和十六进制之间的相互转换
二进制
十六进制
二进制
十六进制
0000
0
0100
4
0001
1
0101
5
0010
2
0110
6
0011
3
0111
7
二进制
十六进制
二进制
ARM7 嵌入ucos做流水灯练习
#include "config.h"#define TASK_STK_SIZE 100#define LedFlowSpeed 5OS_STK TaskStartStk[TASK_STK_SIZE];OS_STK TaskKeyScanStk[TASK_STK_SIZE];OS_EVENT *LedFlowMbox;#define Led1 (1<<22)#define Led2 (1<<23)#define Led3 (1<<24)#define Led4 (1<<25)#define KEY1 (1<<16)#define KEY2 (1<<17)#define KEY3 (1<<18)#define KEY4 (1<<19)#define KEY5 (1<<20)#define KEY6 (1<<21)void TaskStart(void *pdata);void TaskKeyScan(void *pdata);void DelayNms(INT32U dly);int main(){OSInit();OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE-1], 0); OSStart();return 0;}void TaskStart(void *pdata){uint8 *KeyValue;uint8 err;pdata = pdata;LedFlowMbox = OSMboxCreate(NULL);if(LedFlowMbox == NULL){while(1);}TargetInit();IO0DIR &= (~KEY1)|(~KEY2)|(~KEY3)|(~KEY4)|(~KEY5)|(~KEY6);IO0DIR |= Led1|Led2|Led3|Led4;IO0SET = Led1|Led2|Led3|Led4;PINSEL0 = (PINSEL0&0x00000000) | 0x05;PINSEL1 = (PINSEL1&0x00000000);OSTaskCreate(TaskKeyScan, (void *)0, &TaskKeyScanStk[TASK_STK_SIZE-1],8);for(;;){KeyValue = (uint8 *)OSMboxPend(LedFlowMbox, 0 , &err);if(*KeyValue==1){IO0CLR = Led1;//DelayNms(200);OSTimeDly(OS_TICKS_PER_SEC/LedFlowSpeed);IO0SET = Led1;OSTimeDly(OS_TICKS_PER_SEC/LedFlowSpeed);//DelayNms(200);IO0CLR = Led1;//DelayNms(200);OSTimeDly(OS_TICKS_PER_SEC/LedFlowSpeed);IO0SET = Led1;} else if(*KeyValue ==2){IO0CLR = Led2;//DelayNms(200);OSTimeDly(OS_TICKS_PER_SEC/LedFlowSpeed);IO0SET = Led2;//DelayNms(200);OSTimeDly(OS_TICKS_PER_SEC/LedFlowSpeed);IO0CLR = Led2;//DelayNms(200);OSTimeDly(OS_TICKS_PER_SEC/LedFlowSpeed);IO0SET = Led2;}else if(*KeyValue ==3){IO0CLR = Led3;OSTimeDly(OS_TICKS_PER_SEC/LedFlowSpeed);//DelayNms(200);IO0SET = Led3;OSTimeDly(OS_TICKS_PER_SEC/LedFlowSpeed);//DelayNms(200);IO0CLR = Led3;//DelayNms(200);OSTimeDly(OS_TICKS_PER_SEC/LedFlowSpeed);IO0SET = Led3;}else if(*KeyValue==4){IO0CLR = Led4;//DelayNms(200);OSTimeDly(OS_TICKS_PER_SEC/LedFlowSpeed);IO0SET = Led4;//DelayNms(200);OSTimeDly(OS_TICKS_PER_SEC/LedFlowSpeed);IO0CLR = Led4;//DelayNms(200);OSTimeDly(OS_TICKS_PER_SEC/LedFlowSpeed);IO0SET = Led4;}}}void TaskKeyScan(void *pdata){uint8 KeyValue;pdata = pdata;KeyValue = 1;for(;;){while(((IO0PIN&KEY1)!=0) && ((IO0PIN&KEY2)!=0) && ((IO0PIN&KEY3)!=0) && ((IO0PIN&KEY4)!=0) );{OSTimeDly(OS_TICKS_PER_SEC/50);}if((IO0PIN&KEY1)==0){OSTimeDly(OS_TICKS_PER_SEC/50);if((IO0PIN&KEY1)!=0) continue;KeyValue = 1;while((IO0PIN&KEY1)==0){OSTimeDly(OS_TICKS_PER_SEC/50);}}else if((IO0PIN&KEY2)==0){OSTimeDly(OS_TICKS_PER_SEC/50);if((IO0PIN&KEY2)!=0) continue;KeyValue = 2;while((IO0PIN&KEY2)==0){OSTimeDly(OS_TICKS_PER_SEC/50);}}else if((IO0PIN&KEY3)==0){OSTimeDly(OS_TICKS_PER_SEC/50); if((IO0PIN&KEY3)!=0) continue;KeyValue = 3;while((IO0PIN&KEY3)==0){OSTimeDly(OS_TICKS_PER_SEC/50);}}else if((IO0PIN&KEY4)==0){OSTimeDly(OS_TICKS_PER_SEC/50); if((IO0PIN&KEY4)!=0) continue;KeyValue = 4;while((IO0PIN&KEY4)==0){OSTimeDly(OS_TICKS_PER_SEC/50); }}OSMboxPost(LedFlowMbox,&KeyValue);OSTimeDly(OS_TICKS_PER_SEC/10);}}void DelayNms(INT32U dly){ INT32U i;for(; dly>0; dly--)for(i=0; i<7142; i++); }。
关于多功能ARM7实验箱LED流水灯资源的详解
for(i=0;i<5000;i++);
}
}
现象:LED灯依次宝店铺:http://cepark.taobao
作者:eeskill
时间:2017.07.01
******************************************************/
#define IN_MAIN
#include "config.h"
p022_gpio;
p023_gpio;
p024_gpio;
p025_gpio;
p026_gpio;
//p019-p026设置为输出
gpio_out(p019|p020|p021|p022|p023|p024|p025|p026);
delay(1);
while(1)
{
for(i=0;i0;dly--)
0x40,0x20,0x10,0x08,0x04,0x02,
};
uint32 i;
void IRQ_Exception(void)
{
}
//**********************函数定义************************
void delay(uint32 dly);
//**********************主函数**************************
#include "SSP.h"
#include "Time.h"
#include "UART.h"
#include "WatchDog.h"
#include "ISR.h"
一、LPC2103实现流水灯
)仿真LPC2103)(LPC2103ARM7(基于Proteus的ARM7一、LPC2103实现流水灯(鹰击长空,longsky2007@)★注:网上资料,仅供学习和参考★:1、仿真环境仿真环境:Proteus Pro7.4sp3IAR Embedded Workbench for ARM Evaluation 4.42A2、电路原理图接11.0592M晶振外接RC复位电路3、程序参照力天电子《LT-ARM210X+用户手册》4、注意事项安装IAR,见图1选择芯片和生成调试文件,见图2在Proteus中绘制原理图后调入调试文件,见图3、图4Proteus7.7SP2中可以仿真的ARM7芯片,见图5图1选择安装IAR for ARM4.42a图2-1选择芯片LPC2103图2-2选择生成Hex文件图2-3选择生成调试文件".elf"图2-4选择软件仿真图3原理图图4调入.hex或.elf文件图5Proteus7.7SP2中可以仿真的ARM7芯片图6仿真结果:延时1.2s/***************************************************************************** *文件名:LEDCON.C*功能:LED闪烁控制。
对发光二极管LED2进行控制,采用软件延时方法。
*使用I/O口直接控制LED,采用拉电流方式。
*说明:将跳线器S4_LED2短接。
****************************************************************************/ #include"..\inc\config.h"/**************************************************************************** *名称:Delay()*功能:长软件延时*入口参数:dly延时参数,值越大,延时越久*出口参数:无****************************************************************************/ void Delay(U32dly){U16i;for(;dly>0;dly--)for(i=0;i<600;i++);}void Delay_ms(U32time)//1毫秒延时{U32i;for(;time>0;time--)for(i=8929;i>0;i--);}void Delay_us(U32time)//1微秒延时{U32i;for(;time>0;time--)for(i=5;i>0;i--);}/*************************PLL设置************************************************/ void PLL_Init(void){/*设置系统各部分时钟*/PLLCON=1;#if((Fcclk/4)/Fpclk)==1VPBDIV=0;#endif#if((Fcclk/4)/Fpclk)==2VPBDIV=2;#endif#if((Fcclk/4)/Fpclk)==4VPBDIV=1;#endif#if(Fcco/Fcclk)==2PLLCFG=((Fcclk/Fosc)-1)|(0<<5);#endif#if(Fcco/Fcclk)==4PLLCFG=((Fcclk/Fosc)-1)|(1<<5);#endif#if(Fcco/Fcclk)==8PLLCFG=((Fcclk/Fosc)-1)|(2<<5);#endif#if(Fcco/Fcclk)==16PLLCFG=((Fcclk/Fosc)-1)|(3<<5);#endifPLLFEED=0xaa;PLLFEED=0x55;while((PLLSTAT&(1<<10))==0);PLLCON=3;PLLFEED=0xaa;PLLFEED=0x55;}/**************************************************************************** *名称:main()*功能:控制LED闪烁****************************************************************************/ void main(void){PINSEL0=0x00000000;//设置所有管脚连接GPIOPINSEL1=0x00000000;IO0DIR=LED2CON;//设置LED2控制口为输出PLL_Init();while(1){IO0SET=LED2CON;//LED2端口高电平Delay_ms(300);//延时3sIO0CLR=LED2CON;//LED2端口低电平Delay_ms(300);//延时3s}}/******************************************************************************************************** **文件名:config.h**------------------------------------------------------------------------------------------------------********************************************************************************************************/#ifndef TRUE#define TRUE1#endif#ifndef FALSE#define FALSE0#endiftypedef unsigned char U8;/*无符号8位整型变量*/ typedef signed char S8;/*有符号8位整型变量*/ typedef unsigned short U16;/*无符号16位整型变量*/ typedef signed short S16;/*有符号16位整型变量*/ typedef unsigned int U32;/*无符号32位整型变量*/ typedef signed int S32;/*有符号32位整型变量*/ typedef float fp32;/*单精度浮点数(32位长度)*/ typedef double fp64;/*双精度浮点数(64位长度)*//********************************//*ARM的特殊代码*//********************************/#include"LPC2103.h"/********************************//*应用程序配置*//********************************//********************************//*本例子的配置*//********************************//*系统设置,Fosc、Fcclk、Fcco、Fpclk必须定义*/#define Fosc11059200//晶振频率,10MHz~25MHz,应当与实际一至#define Fcclk(Fosc*4)//系统频率,必须为Fosc的整数倍(1~32),且<=60MHZ#define Fcco(Fcclk*4)//CCO频率,必须为Fcclk的2、4、8、16倍,范围为156MHz~320MHz #define Fpclk(Fcclk/4)*4//VPB时钟频率,只能为(Fcclk/4)的1~4倍#include"target.h"//这一句不能删除/************************************************LED Define*************************************************/#define LED3CON(0x1<<17)/*P0.17*/#define LED2CON(0x1<<18)/*P0.18*/#define LED1CON(0x1<<19)/*P0.19*/#define LED_MASK LED1CON|LED2CON|LED3CON/************************************************BUZZER Define*************************************************/#define BEEP0x1<<21/*P0.21*//************************************************PWMDAC Define*************************************************/#define PWM0x1<<20/*P0.20*//************************************************KEY Define*************************************************/#define KEY10x1<<16/*P0.16*/#define KEY20x1<<15/*P0.15*/#define ISP0x1<<14/*P0.14*//************************************************IIC EEPROM Define*************************************************/#define SCL0x1<<2/*P0.2*/#define SDA0x1<<3/*P0.3*//************************************************Msster Clock*************************************************/#define MCK11059200/************************************************ADC Define*************************************************/#define ADC00x01<<22/*P0.22*/ #define ADC10x01<<23/*P0.23*//************************************************LCD Define*************************************************/#define DB40x01<<4#define DB50x01<<5#define DB60x01<<6#define DB70x01<<7#define DBS0xf<<4//数据位移#define RS0x01<<26#define RW0x01<<25//R/W#define EN0x01<<24//DE#define LCDBL0x01<<19/************************************************SPI Define*************************************************/#define SCLK0x01<<4#define MISO0x01<<5#define MOSI0x01<<6#define RCK0x01<<7/******************************************************************************************************** **文件名:LPC2103.H**------------------------------------------------------------------------------------------------------********************************************************************************************************/ /*External Interrupts*//*外部中断控制寄存器*/#define EXTINT(*((volatile unsigned char*)0xE01FC140))#define EXTWAKE(*((volatile unsigned short*)0xE01FC144))#define EXTMODE(*((volatile unsigned char*)0xE01FC148))#define EXTPOLAR(*((volatile unsigned char*)0xE01FC14C))/*SMemory mapping control.*//*内存remap控制寄存器*/#define MEMMAP(*((volatile unsigned char*)0xE01FC040))/*Phase Locked Loop(PLL)*//*PLL控制寄存器*/#define PLLCON(*((volatile unsigned char*)0xE01FC080))#define PLLCFG(*((volatile unsigned char*)0xE01FC084)) #define PLLSTAT(*((volatile unsigned short*)0xE01FC088)) #define PLLFEED(*((volatile unsigned char*)0xE01FC08C))/*Power Control*//*功率控制寄存器*/#define PCON(*((volatile unsigned char*)0xE01FC0C0)) #define PCONP(*((volatile unsigned long*)0xE01FC0C4))/*VPB Divider*//*VLSI外设总线(VPB)分频寄存器*/#define VPBDIV(*((volatile unsigned char*)0xE01FC100))/*Memory Accelerator Module(MAM)*//*存储器加速模块*/#define MAMCR(*((volatile unsigned char*)0xE01FC000)) #define MAMTIM(*((volatile unsigned char*)0xE01FC004))/*Vectored Interrupt Controller(VIC)*//*向量中断控制器(VIC)的特殊寄存器*/#define VICIRQStatus(*((volatile unsigned long*)0xFFFFF000))#define VICFIQStatus(*((volatile unsigned long*)0xFFFFF004))#define VICRawIntr(*((volatile unsigned long*)0xFFFFF008))#define VICIntSelect(*((volatile unsigned long*)0xFFFFF00C))#define VICIntEnable(*((volatile unsigned long*)0xFFFFF010))#define VICIntEnClr(*((volatile unsigned long*)0xFFFFF014))#define VICSoftInt(*((volatile unsigned long*)0xFFFFF018)) #define VICSoftIntClear(*((volatile unsigned long*)0xFFFFF01C)) #define VICProtection(*((volatile unsigned long*)0xFFFFF020)) #define VICVectAddr(*((volatile unsigned long*)0xFFFFF030)) #define VICDefVectAddr(*((volatile unsigned long*)0xFFFFF034)) #define VICVectAddr0(*((volatile unsigned long*)0xFFFFF100)) #define VICVectAddr1(*((volatile unsigned long*)0xFFFFF104)) #define VICVectAddr2(*((volatile unsigned long*)0xFFFFF108)) #define VICVectAddr3(*((volatile unsigned long*)0xFFFFF10C)) #define VICVectAddr4(*((volatile unsigned long*)0xFFFFF110)) #define VICVectAddr5(*((volatile unsigned long*)0xFFFFF114)) #define VICVectAddr6(*((volatile unsigned long*)0xFFFFF118)) #define VICVectAddr7(*((volatile unsigned long*)0xFFFFF11C)) #define VICVectAddr8(*((volatile unsigned long*)0xFFFFF120)) #define VICVectAddr9(*((volatile unsigned long*)0xFFFFF124)) #define VICVectAddr10(*((volatile unsigned long*)0xFFFFF128)) #define VICVectAddr11(*((volatile unsigned long*)0xFFFFF12C)) #define VICVectAddr12(*((volatile unsigned long*)0xFFFFF130)) #define VICVectAddr13(*((volatile unsigned long*)0xFFFFF134)) #define VICVectAddr14(*((volatile unsigned long*)0xFFFFF138)) #define VICVectAddr15(*((volatile unsigned long*)0xFFFFF13C)) #define VICVectCntl0(*((volatile unsigned long*)0xFFFFF200)) #define VICVectCntl1(*((volatile unsigned long*)0xFFFFF204)) #define VICVectCntl2(*((volatile unsigned long*)0xFFFFF208)) #define VICVectCntl3(*((volatile unsigned long*)0xFFFFF20C)) #define VICVectCntl4(*((volatile unsigned long*)0xFFFFF210))#define VICVectCntl5(*((volatile unsigned long*)0xFFFFF214))#define VICVectCntl6(*((volatile unsigned long*)0xFFFFF218))#define VICVectCntl7(*((volatile unsigned long*)0xFFFFF21C)) #define VICVectCntl8(*((volatile unsigned long*)0xFFFFF220))#define VICVectCntl9(*((volatile unsigned long*)0xFFFFF224))#define VICVectCntl10(*((volatile unsigned long*)0xFFFFF228))#define VICVectCntl11(*((volatile unsigned long*)0xFFFFF22C)) #define VICVectCntl12(*((volatile unsigned long*)0xFFFFF230))#define VICVectCntl13(*((volatile unsigned long*)0xFFFFF234))#define VICVectCntl14(*((volatile unsigned long*)0xFFFFF238))#define VICVectCntl15(*((volatile unsigned long*)0xFFFFF23C))/*General Purpose Input/Output(GPIO)*//*通用并行IO口的特殊寄存器*/#define IO0PIN(*((volatile unsigned long*)0xE0028000)) #define IO0SET(*((volatile unsigned long*)0xE0028004)) #define IO0DIR(*((volatile unsigned long*)0xE0028008)) #define IO0CLR(*((volatile unsigned long*)0xE002800C))/*Pin Connect Block*//*管脚连接模块控制寄存器*/#define PINSEL0(*((volatile unsigned long*)0xE002C000)) #define PINSEL1(*((volatile unsigned long*)0xE002C004))/*Universal Asynchronous Receiver Transmitter0(UART0)*//*通用异步串行口0(UART0)的特殊寄存器*/#define U0RBR(*((volatile unsigned char*)0xE000C000)) #define U0THR(*((volatile unsigned char*)0xE000C000)) #define U0IER(*((volatile unsigned long*)0xE000C004)) #define U0IIR(*((volatile unsigned long*)0xE000C008)) #define U0FCR(*((volatile unsigned char*)0xE000C008)) #define U0LCR(*((volatile unsigned char*)0xE000C00C)) #define U0LSR(*((volatile unsigned char*)0xE000C014)) #define U0SCR(*((volatile unsigned char*)0xE000C01C)) #define U0DLL(*((volatile unsigned char*)0xE000C000)) #define U0DLM(*((volatile unsigned char*)0xE000C004)) #define U0ACR(*((volatile unsigned long*)0xE000C020)) #define U0TER(*((volatile unsigned char*)0xE000C030))/*Universal Asynchronous Receiver Transmitter1(UART1)*//*通用异步串行口1(UART1)的特殊寄存器*/#define U1RBR(*((volatile unsigned char*)0xE0010000)) #define U1THR(*((volatile unsigned char*)0xE0010000)) #define U1IER(*((volatile unsigned char*)0xE0010004)) #define U1IIR(*((volatile unsigned char*)0xE0010008)) #define U1FCR(*((volatile unsigned char*)0xE0010008)) #define U1LCR(*((volatile unsigned char*)0xE001000C)) #define U1MCR(*((volatile unsigned char*)0xE0010010)) #define U1LSR(*((volatile unsigned char*)0xE0010014)) #define U1MSR(*((volatile unsigned char*)0xE0010018)) #define U1SCR(*((volatile unsigned char*)0xE001001C)) #define U1DLL(*((volatile unsigned char*)0xE0010000))#define U1DLM(*((volatile unsigned char*)0xE0010004)) #define U1ACR(*((volatile unsigned long*)0xE0010020)) #define U1TER(*((volatile unsigned char*)0xE0010030))/*I2C(8/16bit data bus)*//*芯片间总线(I2C)的特殊寄存器*/#define I2CONSET(*((volatile unsigned char*)0xE001C000)) #define I2CSTAT(*((volatile unsigned char*)0xE001C004)) #define I2DAT(*((volatile unsigned char*)0xE001C008)) #define I2ADR(*((volatile unsigned char*)0xE001C00C)) #define I2SCLH(*((volatile unsigned int*)0xE001C010)) #define I2SCLL(*((volatile unsigned int*)0xE001C014)) #define I2CONCLR(*((volatile unsigned char*)0xE001C018))/*SPI(Serial Peripheral Interface)*//*SPI总线接口的特殊寄存器*/#define SPI_SPCR(*((volatile unsigned short*)0xE0020000)) #define SPI_SPSR(*((volatile unsigned char*)0xE0020004)) #define SPI_SPDR(*((volatile unsigned short*)0xE0020008)) #define SPI_SPCCR(*((volatile unsigned char*)0xE002000C)) #define SPI_SPINT(*((volatile unsigned char*)0xE002001C))/*Timer0*//*定时器0的特殊寄存器*/#define T0IR(*((volatile unsigned char*)0xE0004000))#define T0TCR(*((volatile unsigned char*)0xE0004004)) #define T0TC(*((volatile unsigned long*)0xE0004008)) #define T0PR(*((volatile unsigned long*)0xE000400C)) #define T0PC(*((volatile unsigned long*)0xE0004010)) #define T0MCR(*((volatile unsigned short*)0xE0004014)) #define T0MR0(*((volatile unsigned long*)0xE0004018)) #define T0MR1(*((volatile unsigned long*)0xE000401C)) #define T0MR2(*((volatile unsigned long*)0xE0004020)) #define T0MR3(*((volatile unsigned long*)0xE0004024)) #define T0CCR(*((volatile unsigned short*)0xE0004028)) #define T0CR0(*((volatile unsigned long*)0xE000402C)) #define T0CR1(*((volatile unsigned long*)0xE0004030)) #define T0CR2(*((volatile unsigned long*)0xE0004034)) #define T0CR3(*((volatile unsigned long*)0xE0004038)) #define T0EMR(*((volatile unsigned short*)0xE000403C)) #define T0CTCR(*((volatile unsigned long*)0xE0004070)) #define PWM0CON(*((volatile unsigned long*)0xE0004074))/*Timer1*//*定时器1的特殊寄存器*/#define T1IR(*((volatile unsigned char*)0xE0008000))#define T1TCR(*((volatile unsigned char*)0xE0008004)) #define T1TC(*((volatile unsigned long*)0xE0008008)) #define T1PR(*((volatile unsigned long*)0xE000800C)) #define T1PC(*((volatile unsigned long*)0xE0008010))#define T1MCR(*((volatile unsigned short*)0xE0008014)) #define T1MR0(*((volatile unsigned long*)0xE0008018)) #define T1MR1(*((volatile unsigned long*)0xE000801C)) #define T1MR2(*((volatile unsigned long*)0xE0008020)) #define T1MR3(*((volatile unsigned long*)0xE0008024)) #define T1CCR(*((volatile unsigned short*)0xE0008028)) #define T1CR0(*((volatile unsigned long*)0xE000802C)) #define T1CR1(*((volatile unsigned long*)0xE0008030)) #define T1CR2(*((volatile unsigned long*)0xE0008034)) #define T1CR3(*((volatile unsigned long*)0xE0008038)) #define T1EMR(*((volatile unsigned short*)0xE000803C)) #define T1CTCR(*((volatile unsigned long*)0xE0008070)) #define PWM1CON(*((volatile unsigned long*)0xE0008074))/*Timer2*//*定时器2的特殊寄存器*/#define T2IR(*((volatile unsigned char*)0xE0070000))#define T2TCR(*((volatile unsigned char*)0xE0070004)) #define T2TC(*((volatile unsigned short*)0xE0070008)) #define T2PR(*((volatile unsigned short*)0xE007000C)) #define T2PC(*((volatile unsigned short*)0xE0070010)) #define T2MCR(*((volatile unsigned short*)0xE0070014)) #define T2MR0(*((volatile unsigned short*)0xE0070018)) #define T2MR1(*((volatile unsigned short*)0xE007001C)) #define T2MR2(*((volatile unsigned short*)0xE0070020)) #define T2MR3(*((volatile unsigned short*)0xE0070024))#define T2CCR(*((volatile unsigned short*)0xE0070028)) #define T2CR0(*((volatile unsigned short*)0xE007002C)) #define T2CR1(*((volatile unsigned short*)0xE0070030)) #define T2CR2(*((volatile unsigned short*)0xE0070034)) #define T2CR3(*((volatile unsigned short*)0xE0070038)) #define T2EMR(*((volatile unsigned short*)0xE007003C)) #define T2CTCR(*((volatile unsigned long*)0xE0070070)) #define PWM2CON(*((volatile unsigned long*)0xE0070074))/*Timer3*//*定时器3的特殊寄存器*/#define T3IR(*((volatile unsigned char*)0xE0074000))#define T3TCR(*((volatile unsigned char*)0xE0074004)) #define T3TC(*((volatile unsigned short*)0xE0074008)) #define T3PR(*((volatile unsigned short*)0xE007400C)) #define T3PC(*((volatile unsigned short*)0xE0074010)) #define T3MCR(*((volatile unsigned short*)0xE0074014)) #define T3MR0(*((volatile unsigned short*)0xE0074018)) #define T3MR1(*((volatile unsigned short*)0xE007401C)) #define T3MR2(*((volatile unsigned short*)0xE0074020)) #define T3MR3(*((volatile unsigned short*)0xE0074024)) #define T3CCR(*((volatile unsigned short*)0xE0074028)) #define T3CR0(*((volatile unsigned short*)0xE007402C)) #define T3CR1(*((volatile unsigned short*)0xE0074030)) #define T3CR2(*((volatile unsigned short*)0xE0074034)) #define T3CR3(*((volatile unsigned short*)0xE0074038))#define T3EMR(*((volatile unsigned short*)0xE007403C)) #define T3CTCR(*((volatile unsigned long*)0xE0074070)) #define T3PWMCON(*((volatile unsigned long*)0xE0074074))/*Real Time Clock*//*实时时钟的特殊寄存器*/#define ILR(*((volatile unsigned char*)0xE0024000))#define CTC(*((volatile unsigned short*)0xE0024004)) #define CCR(*((volatile unsigned char*)0xE0024008)) #define CIIR(*((volatile unsigned char*)0xE002400C))#define AMR(*((volatile unsigned char*)0xE0024010)) #define CTIME0(*((volatile unsigned long*)0xE0024014)) #define CTIME1(*((volatile unsigned long*)0xE0024018)) #define CTIME2(*((volatile unsigned long*)0xE002401C)) #define SEC(*((volatile unsigned char*)0xE0024020))#define MIN(*((volatile unsigned char*)0xE0024024)) #define HOUR(*((volatile unsigned char*)0xE0024028)) #define DOM(*((volatile unsigned char*)0xE002402C)) #define DOW(*((volatile unsigned char*)0xE0024030)) #define DOY(*((volatile unsigned short*)0xE0024034)) #define MONTH(*((volatile unsigned char*)0xE0024038)) #define YEAR(*((volatile unsigned short*)0xE002403C)) #define ALSEC(*((volatile unsigned char*)0xE0024060)) #define ALMIN(*((volatile unsigned char*)0xE0024064)) #define ALHOUR(*((volatile unsigned char*)0xE0024068))#define ALDOM(*((volatile unsigned char*)0xE002406C)) #define ALDOW(*((volatile unsigned char*)0xE0024070)) #define ALDOY(*((volatile unsigned short*)0xE0024074)) #define ALMON(*((volatile unsigned char*)0xE0024078)) #define ALYEAR(*((volatile unsigned short*)0xE002407C)) #define PREINT(*((volatile unsigned short*)0xE0024080)) #define PREFRAC(*((volatile unsigned short*)0xE0024084))/*Watchdog*//*看门狗的特殊寄存器*/#define WDMOD(*((volatile unsigned char*)0xE0000000)) #define WDTC(*((volatile unsigned long*)0xE0000004)) #define WDFEED(*((volatile unsigned char*)0xE0000008)) #define WDTV(*((volatile unsigned long*)0xE000000C))/*ADC特殊寄存器*/#define AD0CR(*((volatile unsigned long*)0xE0034000)) #define AD0GDR(*((volatile unsigned long*)0xE0034004)) #define AD0STAT(*((volatile unsigned long*)0xE0034030)) #define AD0INTEN(*((volatile unsigned long*)0xE003400C)) #define AD0DR0(*((volatile unsigned long*)0xE0034010)) #define AD0DR1(*((volatile unsigned long*)0xE0034014)) #define AD0DR2(*((volatile unsigned long*)0xE0034018)) #define AD0DR3(*((volatile unsigned long*)0xE003401C)) #define AD0DR4(*((volatile unsigned long*)0xE0034020))#define AD0DR5(*((volatile unsigned long*)0xE0034024))#define AD0DR6(*((volatile unsigned long*)0xE0034028))#define AD0DR7(*((volatile unsigned long*)0xE003402C))/*Define firmware Functions*//*定义固件函数*/#define rm_init_entry()((void(*)())(0x7fffff91))()#define rm_undef_handler()((void(*)())(0x7fffffa0))()#define rm_prefetchabort_handler()((void(*)())(0x7fffffb0))()#define rm_dataabort_handler()((void(*)())(0x7fffffc0))()#define rm_irqhandler()((void(*)())(0x7fffffd0))()#define rm_irqhandler2()((void(*)())(0x7fffffe0))()#define iap_entry(a,b)((void(*)())(0x7ffffff1))(a,b)/********************************************************************************************************* **End Of File********************************************************************************************************/。
单片机流水灯程序
流水灯程序闲来没事,就总结一下流水灯的工作,用两种语言实验C语言和汇编语言。
学习单片机的第一个程序就是流水灯实验!学习语言的输出的第一个程序就是hello word! 这都是一个过程!我们知道单片机执行的机器语言!汇编就是其执行的根本的语言,任何程序的编译最终还是要生成HEX语言,汇编语言~~!来回显示,并且显示时还会发出蜂咛声!P1口接八个发光二极管,P2.3接一个蜂咛器!一.汇编语言mov r7,#8main:mov r0,#8 ;一个循环需要移动8位acall ds1ms ;延时,以便人眼可以观察到acall ds1msmov a,p1 ;读P0口当前显示的数据送到Arr a ;将A中的数据循环右移1位mov p1,a ;再将A中右移过的数据送到P0djnz r0,loopdjnz r7,main ;移动不够8位,跳到LOOP处循环,ljmp rel ;流动1遍跳转到MAIN处循环流。
;---显示延时----------ds1ms: mov r1,#1ds1lo: mov r2,#200ds2lo: mov r3,#200djnz r3,$djnz r2,ds2lodjnz r1,ds1loret ;延时返回rel:end二.C语言#include<reg52.h>unsigned char i;unsigned char temp;unsigned char a,b;void delay(void) //延时子程序{unsigned char m,n,s;for(m=20;m>0;m--)for(n=20;n>0;n--)for(s=248;s>0;s--);}void main(void) //主程序{while(1) //循环条件永远为真,以下程序一直执行下去。
{temp=0xfe;P1=temp; //直接对I/O口P1赋值,使P1.0输出低点平。
delay(); //延时for(i=1;i<8;i++) //实现广告灯的移动{a=temp<<i;b=temp>>(8-i);P1=a|b;delay();}for(i=1;i<8;i++) //实现广告灯的反方向移动{a=temp>>i;b=temp<<(8-i);P1=a|b;delay();}}}实验很简单!懂的朋友完全可以在此基础上开发!比如一个爱心的流水灯。
ARM流水灯课设
一.Cortex系列ARM核心及体系结构介绍众所周知,英国的ARM公司是嵌入式微处理器世界当中的佼佼者。
ARM一直以来都是自己研发微处理器内核架构,然后将这些架构的知识产权授权给各个芯片厂商,精简的CPU 架构,高效的处理能力以及成功的商业模式让ARM公司获得了巨大的成功,使他迅速占据了32位嵌入式微处理器的大部分市场份额,甚至现在,ARM芯片在上网本市场的也大有与INTEL的ATOM处理器一较高低的实力。
目前,随着对嵌入式系统的要求越来越高,作为其核心的嵌入式微处理器的综合性能也受到日益严峻的考验,最典型的例子就是伴随3G网络的推广,对手机的本地处理能力要求很高,现在一个高端的智能手机的处理能力几乎可以和几年前的笔记本电脑相当。
为了迎合市场的需求,ARM公司也在加紧研发他们最新的ARM架构,Cortex系列就是这样的产品。
在Cortex之前,ARM核都是以ARM为前缀命名的,从ARM1一直到ARM11,之后就是Cortex系列了。
Cortex在英语中有大脑皮层的意思,而大脑皮层正是人脑最核心的部分,估计ARM公司如此命名正有此含义吧。
发布于2005年,根据应用和需求划分成整套系列的完整解决方案Cortex-A:针对复杂OS和应用程序Cortex-R:针对实时系统的嵌入式处理器Cortex-M:针对价格敏感应用领域的嵌入式处理器ARM Cortex处理器系列都是基于ARMv7架构的产品,从尺寸和性能方而来看,既有少于33000个门电路的Cortex-M系列,也有高性能的Cortex-A系列。
其中,Cortex-A系列是针对日益增长的,运行包括Linux、Windows,CE和Symbian操作系统在内的消费娱乐和无线产品设计的;ARM Cortex-R系列针对的是需要运行实时操作系统来进行控制应用的系统,包括汽车电子、网络和影像系统;ARM Cortex-M系列则面向微控制器领域,为那些对开发费用非常敏感同时对性能要求不断增加的嵌入式应用所设计的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用arm7设计流水灯试设计一个闪烁流水灯控制器,该控制器可以控制8个灯顺序亮灭,当按钮K按下1次后,每次顺序点亮一个灯。
而且每个点亮的灯在闪烁3次后,才能灭,周而复始,直到按钮K二次按下。
(用状态机设计)、从原理图可以看出,如果我们想让接在P1.0口的LED1亮起来,那么我们只要把P1.0口的电平变为低电平就可以了;相反,如果要接在P1.0口的LED1熄灭,就要把P1.0口的电平变为高电平就可以;同理,接在P1.1~P1.7口的其他7个LED的点亮和熄灭方法方法同LED1。
因此,要实现流水灯功能,我们只要将LED2~LED8依次点亮、熄灭,依始类推,8只LED变会一亮一暗的做流水灯了。
实现8个LED流水灯程序用中文表示为:P1.0低、延时、P1.0高、P1.1低、延时、P1.1高、P1.2低、延时、P1.2高、P1.3低、延时、P1.3高、P1.4低、延时、P1.4高、P1.5低、延时、P1.5高、P1.6低、延时、P1.6高、P1.7低、延时、P1.7高、返回到开始、程序结束。
从上面中文表示看来实现单片机流水灯很简单,但是我们不能说P1.0你变低,它就变低了。
因为单片机听不懂我们的汉语的,只能接受二进制的“1、0......”机器代码。
我们又怎样来使单片机按我们的意思去工作呢?为了让单片机工作,只能将程序写为二进制代码交给其执行;早期单片机开发人员就是使用人工编写的二进制代码交给单片机去工作的。
今天,我们不必用烦人的二进制去编写程序,完全可以将我们容易理解的“程序语言”通过“翻译”软件“翻译”成单片机所需的二进制代码,然后交给单片机去执行。
这里的“程序语言”目前主要有汇编语言和C语言两种;在这里我们所说的“翻译”软件,同行们都叫它为“编译器”,将“程序语言”通过编译器产生单片机的二进制代码的过程叫编译。
前面说到,要想使LED1变亮,只需将对应的单片机引脚电平变为低电平就可以了。
现在让我们将上面提到的8只LED流水灯实验写为汇编语言程序。
实现8个LED流水灯汇编语言源程序 liu01.asm;----- 主程序开始 -----START: CLR P1.0 ;P1.0输出低电平,使LED1点亮ACALL DELAY ;调用延时子程序SETB P1.0 ;P1.0输出高电平,使LED1熄灭CLR P1.1 ;P1.1输出低电平,使LED2点亮ACALL DELAY ;调用延时子程序SETB P1.1 ;P1.1输出高电平,使LED2熄灭CLR P1.2 ;P1.2输出低电平,使LED3点亮ACALL DELAY ;调用延时子程序SETB P1.2 ;P1.2输出高电平,使LED3熄灭CLR P1.3 ;P1.3输出低电平,使LED4点亮ACALL DELAY ;调用延时子程序SETB P1.3 ;P1.3输出高电平,使LED4熄灭CLR P1.4 ;P1.4输出低电平,使LED5点亮ACALL DELAY ;调用延时子程序SETB P1.4 ;P1.4输出高电平,使LED5熄灭CLR P1.5 ;P1.5输出低电平,使LED6点亮ACALL DELAY ;调用延时子程序SETB P1.5 ;P1.5输出高电平,使LED6熄灭CLR P1.6 ;P1.6输出低电平,使LED7点亮ACALL DELAY ;调用延时子程序SETB P1.6 ;P1.6输出高电平,使LED7熄灭CLR P1.7 ;P1.7输出低电平,使LED8点亮ACALL DELAY ;调用延时子程序SETB P1.7 ;P1.7输出高电平,使LED8熄灭ACALL DELAY ;调用延时子程序AJMP START ;8个LED流了一遍后返回到标号START处再循环;----- 延时子程序 -----DELAY: MOV R0,#255 ;延时一段时间D1: MOV R1,#255DJNZ R1,$DJNZ R0,D1RET ;子程序返回END ;程序结束在上面主程序中用到了五条汇编语言指令:CLR、ACALL、SETB、LJMP、END。
CLR:是将其后面指定的位清为0,程序中使对应端口输出低电平ACALL:是子程序调用指令,程序中调用了DELAY延时子程序SETB:是将其后面指定的位置成1,程序中使对应端口输出高电平AJMP:是无条件跳转指令,意思是:跳转到指定的标号处继续运行END:是程序结束的伪指令,意思是告诉编译器,程序到此结束。
伪指令只告诉编译器此程序到此有何要求或条件,它不参与和影响程序的执行。
在上面源程序中"ACALL DELAY"指令的作用是调用DELAY延时子程序。
为什么要使用这指令呢?如果不用该指令能够实现"流水"效果吗?答案是肯定的,一定要用该指令才能看到我们需要的"流水"效果。
如果不用该指令,则由于8个LED 发光与熄灭的时间都很短,我们肉眼无法看到LED的熄灭与点亮,凭我们肉眼看到的是LED1~LED8都同时亮(半亮),而看不到“流水”效果的!注:初学者可以将上面源程序中所有"ACALL DELAY"指令行删除后再编译后烧写到单片机进行验证一下。
产生这种现象主要是因为单片机执行每条指令的时间很短,我们知道实验板上单片机的时钟高达11.0592MHz,在这个时钟信号(即晶体振荡信号)下,一个“机器周期”仅大约1.08uS(微秒)。
本程序中我们用到的SETB P.x和CLR P.x 均属于单周期指令,也就是说,执行一句 SETB P.x 用时仅1.08uS(微秒),CLR P.x 也是1.08uS(微秒);也就是点亮和熄灭时间都为1.08uS(微秒),在如此高速的流水速度下,8个LED发光与熄灭的时间都很短,当然凭我们的肉眼看不到“流水”效果了!这里需要说明的是,按汇编语法要求,所编制的程序(下称源程序)之格式和书写要求必须依下列原则:1、源程序必须为纯文本格式文件,如用Windows“附件”中的“记事本”编写的文本文件或用UltraEdit文本编辑器编辑;2、源程序的扩展名应是 *.ASM;3、一行只能写一条语句,以回车作为本句的结束,每一语句行长度应少于80个字符(即40个汉字)。
4、每行的格式应为:标号:命令参数;注释。
即一行由四部份组成,各部份的顺序不能搞错,依实际要求可以缺省其中的一部份或几部份,甚至全部省去,即空白行。
需要使用标号时标号后面必须有“:”(冒号),而命令语句和参数之间必须用空格分开,如果命令有多个参数,则参数与参数之间必须用“,”(逗号)分开,需要注释时注释前必须用“;”(分号),“;”后面的语句可以写任何字符,包括汉字用于解释前面的汇编语句,它将不参与汇编,不生成代码。
由于汇编程序对我们还不直观,所以在编写源程序时,应当养成多写注释的习惯,这样有助于今后源程序的阅读和维护。
标号是标志程序中某一行的符号名,编译后标号的数值就是标号所在行代码的地址。
在宏汇编ASM51中标号的长度不受限制,但标号中不能包含‘:'或其它的一些特殊符号,也不能用汉字,可以用数字作标号,但必须用字母开头。
当标号作参数用(如标号作转移地址),在命令后面出现时,必须舍去‘:'(如上面程序中的 AJMP START中的START是不能再有:)。
每行只能有一个标号,一个标号只能用在一处,如果有两行用了同一个标号,则汇编时就会出错。
由于标号的长度没有限制,可以用有意义的英文或汉语拼音来说明行,使源程序读起来更方便。
在源程序中的字母不区分大小写,也就是说 start 和 START 是一样的,请不要用大小写方式去区分不同的标号。
好啦!我们知道了汇编语言程序的规则,现在就动手编辑源程序吧。
马上启动Keil单片机集成开发环境,建立新工程liu01.UV2,将上面的源程序liu01.asm 导入到工程中,设置好Keil工程的编译参数,编译得到HEX格式的目标文件liu01.hex,用 ISP编程器将目标文件liu01.hex烧写到AT89S51单片机中,接下来就是将烧写好的AT89S51从编程器上取下,放到“ S51增强型单片机实验板”上通电,我们就看到了LED1~LED8的"流水"效果了。
到此,我们做的流水灯已成功,工作原理也清楚啦,若你完全掌握了上面程序,那么你就可以将“流水灯”的流向改变一下,可以将从"左向右流"改为从"右向左流",也可以改为"两边向内流"、"内部向外流"......,我想你一定能用前面学到的方法实现这些功能。
可能有些高手说,前面的编程方法是最最笨的!不错!但初学单片机初期可以不必讲究语言的简练,只要能实现预先要求就好,最主要的是学好基本指令(111条)的用法,清楚各个指令的功能,这是初学者要知道的。
那么还有更好的编程思路吗?当然有!请跟随站长继续学习下面的内容。
在前面学习的程序中我们让LED流水是去逐个控制P1端口的每个位来实现的,因此程序显得有点复杂,下面我们就采用新的思路来编程。
新的编程思路如下:我们在程序一开始就给P1口送一个数,这个数本身就让P1.0先低,其他位为高,然后让这个数据向高位移动不就实现“流水”效果啦?的确如此!8051指令中没有让P1数据移动的指令,但有对累加器ACC中数据左移或右移的指令,ACC在指令中常写为A,累加器A数据左移指令为"RL A",累加器数据右移指令为"RR A",累加器在数据传输和数据处理过程中作用十分重要,累加器ACC为8位。
他可与片内所有单字节寄存器交换数据,实际上P1和其他端口在单片机中也是一个寄存器。
这样我们可以将需移动的数据先放到ACC中,让其移动,然后将ACC 移动后的数据再转送到P1口,这样同样可以实现“流水”效果。
下面程序就是采用新的编程思路源程序liu02.asm。
实现8个LED流水灯汇编语言程序 liu02.asm;----- 主程序开始 -----START: MOV ACC,#0FEH ;ACC中先装入LED1亮的数据(二进制的11111110) MOV P1,ACC ;将ACC的数据送P1口MOV R0,#7 ;将数据再移动7次就完成一个8位流水过程LOOP: RL A ;将ACC中的数据左移一位MOV P1,A ;把ACC移动过的数据送p1口显示ACALL DELAY ;调用延时子程序DJNZ R0,LOOP ;没有移动够7次继续移动AJMP START ;移动完7次后跳到开始重来,以达到循环流动效果;----- 延时子程序 -----DELAY: MOV R0,#255 ;延时一段时间D1: MOV R1,#255DJNZ R1,$DJNZ R0,D1RET ;子程序返回END ;程序结束接下来,我们将上述程序编译,并烧写到实验芯片中,放到实验板上可以看到程序的"流水"效果是一样的,但源程序看起来更加简洁,直观。