凌阳61单片机使用指南
61单片机
课程设计(实验报告)题目:凌阳单片机姓名:骆艳学号:2009301050220指导老师:周云峰2010 年 6 月 15 日前言当今社会上企业对于大学生动手能力的要求比较高,为了提高学生的自主动手能力和实践创新能力,学校组织学生进行两周的单片机课程设计。
而本课程设计所采用的便是凌阳科技大学制作的61板。
61板是SPCE061A EMU BOARD 的简称,是以凌阳16位单片机SPCE061A为核心的精简开发—仿真—实验板,大小相当于一张扑克牌,是“凌阳科技大学计划”专为大学生、电子爱好者等进行电子实习、课程设计、毕业设计、电子制作及电子竞赛所设计的,也可作为单片机项目初期研发使用。
它是一套使用方便、功能强大的十六位单片机开发系统,具备上手快、学习面广、技术性和趣味性强等特点,使它不仅适应于初学者,也适应于高层次的产品开发者。
我们通过基于61 板的电子实习,加强学生对电子学的认识和提高,在今后的课程设计、毕业设计以及具有创意的电子制作和产品设计中都能用61 板完成和进行高层次知识的学习。
电子实习与电子技术等理论课有很大的不同。
理论课枯燥乏味,如同纸上谈兵,让学生提不起来兴趣。
而电子实习是以电子产品生产为工程背景,通过实习使学生学到电子产品的工艺设计知识,并通过电子产品的制作,使学生了解电子产品制造过程、熟悉电子产品工艺,掌握制作电子产品的操作技能,为进一步学习和应用奠定基础。
目录设计(61板单片机) (1)前言.................................................................................................................................. - 1 - 第一章单片机的基本概念和作用........................................................................................ - 3 -1.1 单片机的应用领域及其优点 (3)1.2 单片机的工作过程 (4)第二章凌阳61板介绍.......................................................................................................... - 5 -2.1 了解61板单片机 (6)2.261板的集成环境IDE (8)2.361板地开发方式 (10)2.4 61板的各功能模块 (11)2.561板的各部分硬件电路 (13)第三章流水灯设计 (14)3.1设计方案 (15)3.3硬件连接图 (16)3.3流水灯原理 (17)3.4流程图 (18)3.5流水灯程序 (19)第四章总结 (14)致谢 (19)第一章单片机的基本概念和作用单片微型计算机简称单片机,是典型的嵌入式微控制器(Microcontroller Unit),常用英文字母的缩写MCU表示单片机,它最早是被用在工业控制领域。
凌阳61开发板基本工作原理及实际电路识图技能训练1
凌阳61开发板基本工作原理及实际电路识图技能训练1凌阳61开发板基本工作原理及实际电路识图技能训练凌阳61开发板是一款广泛应用于电子工程领域的开发工具,它能够帮助工程师们快速搭建原型电路并进行测试。
本文将介绍凌阳61开发板的基本工作原理以及实际电路识图技能训练。
一、凌阳61开发板的基本工作原理凌阳61开发板是一种单片机开发工具,它的基本工作原理是通过与计算机连接,将计算机上的程序下载到开发板上,然后通过开发板上的单片机控制其他电路元件的工作。
简单来说,它是一个桥梁,将计算机上的指令传输给其他电路元件。
凌阳61开发板的核心部件是单片机,单片机是一种集成电路芯片,内部包含了处理器、存储器、输入输出接口等功能模块。
单片机通过与其他电路元件连接,实现对元件的控制和数据传输。
凌阳61开发板还包括了一些常用的外设接口,如LED显示屏、按键、蜂鸣器等,这些外设可以通过单片机的控制来实现各种功能。
通过编写程序,工程师可以控制这些外设的亮灭、发声等操作。
二、实际电路识图技能训练在电子工程领域,掌握电路识图技能是非常重要的。
电路识图是指通过电路图来理解和分析电路的工作原理。
下面将介绍一些实际电路识图技能训练的方法。
1. 学习电路图符号电路图符号是用来表示电子元件的图形符号,不同的元件有不同的图形表示。
工程师需要学习各种元件的图形符号,并能够准确理解它们的含义。
通过学习电路图符号,工程师可以更好地理解和分析电路图。
2. 分析电路图结构电路图是由各种电子元件和连接线组成的,工程师需要通过分析电路图的结构,了解各个元件之间的连接关系。
通过分析电路图结构,工程师可以理解电路的整体工作原理,从而更好地进行故障排除和维修工作。
3. 熟悉常用电路模块在电子工程中,有一些常用的电路模块,如放大器、滤波器、稳压器等。
工程师需要熟悉这些常用电路模块的工作原理和电路图结构。
通过熟悉常用电路模块,工程师可以更好地理解和设计电路。
4. 实践操作电路除了理论学习,实践操作电路也是非常重要的。
凌阳SPCE061A单片机原理及应用说明书
***如有印装问题可调换***
本社图书封面为激光防伪覆膜,谨防盗版。
前言
近几年来,“后 PC 时代”的提法不时见诸报端。863 计算机首席专家高文教授曾经说 过:所谓后 PC 时代,是英文 Pervasive Computing 的中文意译,Pervasive 的原意是普遍的、 蔓延的、渗透的,所以 Pervasive Computing 应译为渗透到各个方面的计算。因此,后 PC 时代是指计算机无处不在,将渗透到我们生活的方方面面。后 PC 时代的绝大多数计算机会 以非计算机的形式出现。例如,电视机、电冰箱、机器人、数控设备等,其中心控制部件 是计算机,但它几乎都是以嵌入式系统的形式存在的,而不是像 PC 机一样摆放在计算机工 作台上的。作为嵌入式系统主要部件的单片机已成为一个重要的研究领域。
中国版本图书馆 CIP 数据核字(2003)第 105077 号
策 划 陈宇光
责任编辑 曹华 陈宇光
出版发行 西安电子科技大学出版社 西安市太白南路 号
电话
邮编
经 销 新华书店
印 刷 西安兰翔印刷厂
版次
年 月第 版
年 月第 次印刷
开本
毫米× 毫米
印张
字数
千字
印 数~ 册
定价
元
·
XDUP 1592001-1
转换
i
4.4.2 A/D 转换器设置............................... 62 4.4.3 A/D 转换器的物理性能 ................... 63 4.5 DAC 音频输出........................................ 66 4.5.1 硬件组成.......................................... 66 4.5.2 寄存器设置 ...................................... 67 4.6 串行设备输入/输出端口 SIO.................. 68 4.6.1 寄存器设置 ...................................... 69 4.6.2 应用举例.......................................... 70 4.7 通用异步串行通信口 UART................... 72 4.7.1 UART 数据帧格式........................... 72 4.7.2 工作寄存器设置............................... 72 4.8 工作方式 ................................................ 76 4.8.1 睡眠方式.......................................... 76 4.8.2 低电压监测/低电压复位
61板说明2
SUNPLUS Easy Living Technology for
凌阳大学计划
61板自检方法
第七步:按KEY2键
KEY2键
现象:语音提示“AD测试成功”
SUNPLUS Easy Living Technology for
音量调节 SUNPLUS Easy Living Technology for 电位器
喇叭插座
3个按键
凌阳大学计划
“61板”套件1
喇叭
10pin排线
电池盒
SUNPLUS Easy Living Technology for
凌阳大学计划
61板适用人群
参加课程设计、生产实习、毕业设计和电子竞赛 的老师和大学生。
准备掌握DSP和语音处理方面(和弦音乐播放、录 制、识别)的技术开发人员。 学习新技术单片机电子爱好者。 进行工控领域、仪器仪表、家用电器、通讯等领 域的单片机的产品研发人员。
SUNPLUS Easy Living Technology for
凌阳大学计划
61板自检方法
第六步:接排线
具体方法:将A口低8位和B口低8位用排线短接,注意A0-A7~B0-B7。 将A口高8位和B口高8位用排线短接,注意A8-A15~B8-B15。
凌阳大学计划
61板自检方法
第八步:按KEY3键
KEY3键
现象:喇叭会发出叫声
SUNPLUS Easy Living Technology for
凌阳大学计划
恭喜你,61板测试成功
SUNPLUS Easy Living Technology for
61板使用说明书 (2)
61 板 在线调试器 probe PC 机 这种开发方式适合做研发使用
优点 方便自己开发或产品研发过程使用 能够实时在线仿真 调试和下载程序 缺点 对于学生或初学者学习来说 其中加入的 PROBE 的成本相对较高
PROBE
OR
61板
CO -L
INNNEE
CT
PC机
图 1.2 61 板
PROBE/下载线 计算机三者之间的连接图
6
凌陽大學計劃 开发原理
61 板 的开发是通过 EZ-PROBE 或在线调试器 PROBE 实现的 用它可 以替代在单片机应用项目的开发过程中常用的两件工具 硬件在线实时仿真器 和程序烧写器 他们都利用了 SPCE061A 芯片内置的在线仿真电路 ICE In- Circuit Emulator 和凌阳公司的在线串行编程技术 EZ-PROBE 和 PROBE 均工作于凌阳 IDE 集成开发环境软件包下 他们对应的 5 芯的仿真头分别连接到 61 板 的缓冲电 路输入管脚和 SPCE061A 芯片相应管脚上 实现在目标电路板上的 CPU SPCE061A 调试 运行用户编制的程序 另一头是标准 25 针打印机接口 直接连接到计算机 打印口与上位机通讯 如图 1.2 在计算机 IDE 集成开发环境软件包下 完成在 线调试功能
语音试验 7 个
I/O 口实验
一 语音播放
Timer A/B 实验
SACM_A2000 实验
61板使用手册
录音及辨识等、SRAM 和 FLASH 等的扩展 第四阶段:学生可以使用一些外接的模组,如:LCD、USB、FLASH 扩展等
3、 下载运行:给出操作步骤,通过学习熟悉一般单片机的开发环境的使用,而且在下载完毕后即可实现报时 器、音乐盒、复读机等功能;
4、 其他:该开发板含有 A/D 和 D/A 的功能,通过动手实践也可以实现简易万用表功能,而且还包含有电源电 路:输出 5V 和 3.3V 两种电压,学习基本电源电路的结构:整流、滤波和稳压。
适合学生课程设计
1、 设计有一般单片机在 I/O 口、A/D、D/A 及 I/O 扩展等方面的应用举例,老师和学生可以结合实际情况选择 学习;
2、 学生不外接电路就可以实现 MIC 录音、和语音播放的功能,也可以动手外搭面包板或自己用万能板焊接一 些简单的外围电路,如发光二极管、LED 数码管或按键就可以实现更多的功能,
适合学生毕业设计
对于学生毕业设计,如果觉得一般单片机的扩展功能还不能满足学习要求,我们还配有: 1、 128×64LCD 模组 2、 USB 模组
3、 4M 的存储器(memory)扩展
4、 其他应用方案
而且在编程实战一章中,我们提供了阶段学习的内容和实验: 第一阶段:学习掌握基础 I/O、定时器/计数器、9 个中断向量的 14 个中断源还有 A/D、D/A 等部分内容,后面附有
2、 测试:即完成原来通过安装收音机并进行调试的功能,并进一步掌握一般单片机的各种性能指标。同时提 供现成的测试程序,该程序具有智能的语音提示功能,只需根据提示内容完成每一步操作和现象的观察即 可完成各部分功能的测试,如电源电路是否正常,I/O 焊接是否有短路,A/D 转换和 D/A 转换电路是否正常 等,并给出详细的测试步骤和测试要求;
凌阳61单片机使用指南
凌阳61单片机使用指南凌阳61单片机使用指南第一章:简介1.1 概述本章介绍凌阳61单片机的基本信息,包括产品特点、硬件规格等。
第二章:硬件连接2.1 引脚定义本节介绍凌阳61单片机各个引脚的功能和使用方式。
2.2 电源接口本节介绍凌阳61单片机的电源接口及相关注意事项。
2.3 外部设备连接本节介绍凌阳61单片机与外部设备的连接方式和通信协议。
第三章:软件开发3.1 开发环境搭建本节详细介绍凌阳61单片机软件开发所需的开发环境搭建步骤。
3.2 编程语言选择本节介绍凌阳61单片机支持的编程语言,并分析其特点和适用场景。
3.3 开发工具使用本节介绍凌阳61单片机的开发工具的使用方法和常用功能。
3.4 编程实例本节提供凌阳61单片机的编程实例,帮助读者快速上手开发。
第四章:调试与测试4.1 调试工具本节介绍凌阳61单片机调试工具的选择和使用方法。
4.2 常见问题解答本节了一些常见问题,并提供解决方案和调试方法。
第五章:附件本文档涉及的附件包括:- 凌阳61单片机引脚定义图- 凌阳61单片机外部设备连接示意图- 凌阳61单片机开发环境搭建视频教程附件可以通过邮件(exampl)向我们索取。
法律名词及注释:1.单片机:是一种集成电路中的集成块,由一个处理器核心、存储器和各种周边设备组成的微型计算机。
2.编程语言:用于编写计算机程序的一种形式化语言,用来精确地描述计算机操作的步骤。
3.通信协议:设备之间进行数据交换和通信时所约定的规则和格式,包括物理层传输、数据之间的转换和通信协议的解释等。
SPCE061A单片机实验指导书
SPCE061A单片机实验指导书电子工程系SPCE061A单片机实验指导书编写说明本实验指导书是针对“单片机原理及其接口技术”课程实验教学大纲编写的,其中的所有实验是在凌阳十六位单片机SPCE061A实验板(61板)的基础上进行,由于该实验板采用了开放式的设计方法,除语音部分(麦克风和放音喇叭及其驱动电路部分)已设计在实验板上外,所由其它资源全部留给用户自由使用,对于开设设计性、综合性实验提供了必要的空间。
本实验指导书共包括10个实验,其中所有实验均为设计性、综合性实验。
在实验指导书中只给出实验要求,并提供相关的实验板和相应的元器件,要求同学根据实验要求,设计出满足实验要求的实验原理、硬件电路设计,实际连线,编写相关程序、调试,并对实验结果进行记录、分析。
目录实验一SPCE061A开发环境实验实验二普通IO口实验实验三定时/计数器实验实验四系统时钟实验实验五FIQ中断实验实验六信号发生器实验实验七 A/D转换实验实验八七段数码LED显示实验实验九录放音实验实验十键扫描显示程序实验一 SPCE061A开发环境实验【实验目的】1)熟悉µ’nSP™ IDE环境及在该环境下用汇编语言和C语言编写的应用程序。
2)熟悉简单的µ’nSP™汇编语言指令和C语言程序的编写方法。
【实验设备】1)装有WINDOWS系统和µ’nSP™ IDE仿真环境的PC机一台。
2) µ’nSP™十六位单片机61开发板一个【实验步骤】1)将µ’nSP™ IDE打开后,建立一个新工程。
2)在该项目的源文件夹(SOURCE FILES)下建立一个新的汇编语言文件。
3)编写汇编代码。
4)编译程序,软件调试,观察并跟踪其结果,查看各个寄存器状态【程序范例1】//===============================================================//// Program: 计算1 to 100累加值// Output: [sum] = 5050(十进制) 或13BA(十六进制)//===============================================================//.RAM // 定义预定义RAM 段.var R_Sum; // 定义变量.CODE //定义代码段.public _main; // 对main程序段声明_main: r1 = 0x0001; // r1=[1..100]r2 = 0x0000; // 寄存器清零L_SumLoop:r2 += r1; // 累计值存到寄存器r2r1 += 1; // 下一个数值cmp r1,100; // 加到100否jna L_SumLoop; // 如果r1 <= 100 跳到L_SumLoop[R_Sum] = r2; // 在R_Sum中保存最终结果L_ProgramEndLoop: // 程序死循环jmp L_ProgramEndLoop;【程序范例】//===============================================================//// Program: 计算1 to 100累加值// Output: [sum] = 5050(十进制) 或13BA(十六进制)//===============================================================//int main(){int i, Sum=0;for (i=0;i<=100;i++)Sum = Sum + i; // Sum 是累加的结果while(1){ }; // 程序死循环// 用变量Watch 窗口看Sum 的值}【程序练习】在µ’nSP™ IDE下用汇编语言使用冒泡法编写一个排序程序。
凌阳单片机实验指导书
第一章SPCE061A 基础应用实验实验一熟悉µ’nSP™ IDE 集成开发环境下汇编语言程序的编写【实验目的】1. 熟悉SPCE061A 单片机常用的汇编指令;2. 学会使用SPCE061A 单片机汇编语言以及伪指令构造汇编程序;3. 掌握µ’nSP™ IDE 集成开发环境的一般使用方法。
【实验设备】1. 装有Windows 系统和µ’nSP™ IDE 集成开发环境的PC 机一台,SPCE061A 实验仪一套。
2. 本实验用到的实验仪硬件模块为:CPU 区电路模块、供电电路模块、下载模式选择电路模块。
【实验要求】1. 编程要求:编写一个汇编语言程序。
2. 实现功能:从1 到100 进行累加,并把计算结果保存在[Sum]单元里。
3. 实验现象:实验过程中,单步运行时,可通过IDE 的调试工具寄存器观察窗口(Register Window)观察通用寄存器的变化,通过变量观察窗口(Toggle Watch)观察变量Sum 的变化;累加结束后保存累加结果:通过变量观察窗口(Toggle Watch)可以观察到变量Sum 的值为5050(十六进制表示为0x13BA)。
【实验原理】SPCE061A 的汇编指令按其功能主要有数据传送指令、算术指令、逻辑指令、转移指令和控制指令。
在程序运行中主要用到r1~r4 四个通用寄存器和BP(r5)、SP、PC、SR 四个特殊功能寄存器。
其中r1~r4一般作为目标寄存器或源寄存器,参与数据传输或算术逻辑运算。
【程序流程】初始化寄存器r2 作为累加器,初始值为0;寄存器r1 为加数,初始值为1。
初始化操作完成后即进入累加循环;在累加循环当中,累加器的数值加上加数,并保存在累加器当中,加数自加1;当加数加到了100,退出累加循环,把r2 累加的结果送到[Sum]单元中。
程序流程图如图1-1 所示。
图1-1 程序流程图【实验步骤】鉴于本实验为本书的第一个实验,所以在此介绍一些有关unSP IDE 操作的步骤;在之后的实验中,将不再重述。
凌阳61单片机使用7段数码管显示数字时钟的程序
凌阳61单片机使用7段数码管显示数字时钟的程序#include<SPCE061v004.h>#include<unspmacro.h>//中断函数定义void IRQ1(void) __attribute__((ISR));void IRQ5(void) __attribute__((ISR));void IRQ6(void) __attribute__((ISR));enum{ RUN, CHGSECOND, CHGMINUTE, CHGHOUR } clock_status; //时钟的状态unsigned int hour,minute,second;unsigned int show_hour, show_minute, show_second;enum{ NOKEY, PRESSING, PRESSED } key_status; //键盘按下与否的状态unsigned key_code;// 7段LED数码管的字形码,采用高八位输出,决定显示的字形,如: '0'、'1'等const unsigned int zhixingma[] = { 0x3f00, 0x0600, 0x5b00, 0x4f00,0x6600, 0x6d00, 0x7c00, 0x0700,0x7f00,0x6f00 };//数码管选择的"位段码",决定哪一位数码管显示const unsigned int weiduanma[] = {0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040}; //数码管的两个DD引脚,为时,中间的冒号亮const unsigned int wei_DD = 0x0081;void display(unsigned int wei, unsigned int number){*P_IOA_Data = zhixingma[number];//设置位段码时,不能改变冒号的状态*P_IOB_Data = weiduanma[wei] | (*P_IOB_Buffer & wei_DD);}//取反数码管中间的冒号void opposite_dots(){*P_IOB_Data = wei_DD ^ (*P_IOB_Buffer);}void delay(unsigned int howlong){while(howlong--){unsigned int temp = 0x00ff;*P_Watchdog_Clear = 1;while(temp--);}}void init(){INT_OFF();*P_IOA_Dir = 0xff00;*P_IOA_Attrib = 0xff00;*P_IOB_Dir = 0x00ff;*P_IOB_Attrib = 0x00ff;*P_TimerA_Data = 0xffff - 256;*P_TimerA_Ctrl = C_SourceA_1 | C_SourceB_256Hz;*P_INT_Ctrl = C_IRQ1_TMA | C_IRQ6_TMB2 | C_IRQ5_2Hz; INT_IRQ();}void change_clock(){unsigned int key_code = get_key();static unsigned int max;switch(key_code){ // key_code == 0 will do nothing case 1:switch( clock_status ){case CHGSECOND:if(++second == 60) second = 0;break;case CHGMINUTE:if(++minute == 60) minute = 0;break;case CHGHOUR:if(++hour == 24) hour =0;break;default:break;}break;case 2:switch( clock_status ){case CHGSECOND:if(--second == 0) second = 59;break;case CHGMINUTE:if(--minute == 0) minute = 59;break;case CHGHOUR:if(--hour == 0) hour = 23;break;default:break;}break;case 3:switch( clock_status ){case RUN:clock_status = CHGSECOND;break;case CHGSECOND:clock_status = CHGMINUTE;break;case CHGMINUTE:clock_status = CHGHOUR;break;case CHGHOUR:clock_status = RUN;break;}break;default:break;}}int main(){init();while(1){change_clock();if(show_second){display(5, second % 10);delay(1);display(4, second / 10);delay(1);}if(show_minute){display(3, minute % 10);delay(1);display(2, minute / 10);delay(1);}if(show_hour){display(1, hour % 10);delay(1);display(0, hour / 10);delay(1);}}void IRQ1(){//时钟计数中断if( (C_IRQ1_TMA & *P_INT_Ctrl) != 0 ){ if( clock_status == RUN ){ second++;if(second >= 60 ) second=0, minute++;if(minute >= 60 ) minute=0, hour++;if(hour >= 24 ) hour=0;}*P_INT_Clear = C_IRQ1_TMA;}}void IRQ5(){//数码管闪烁if( (C_IRQ5_2Hz & *P_INT_Ctrl) != 0){switch(clock_status){case RUN:opposite_dots();show_hour = show_minute = show_second = 0xffff;break;case CHGSECOND:show_second ^= 0xffff;show_minute = show_hour = 0xffff;break;case CHGMINUTE:show_minute ^= 0xffff;show_second = show_hour = 0xffff;break;case CHGHOUR:show_hour ^= 0xffff;show_second = show_minute = 0xffff;break;}*P_INT_Clear = C_IRQ5_2Hz;}}void IRQ6(){ //每10ms扫描一次键盘static unsigned int old_key = 0;static unsigned int key_count = 0;unsigned int current_key;if( (C_IRQ6_TMB2 & *P_INT_Ctrl) != 0){ current_key = *P_IOA_Data & 0x0007;if( current_key != 0){ //有按键if( key_status == NOKEY ){ old_key = current_key;key_count++;key_status = PRESSING;}else{if( current_key == old_key) //不相等,抖动{if( ++key_count >= 5)//有>5次扫描的值相等,说明不是抖动,判断按键值{ if(current_key == 0x0001) key_code = 1;if(current_key == 0x0002) key_code = 2;if(current_key == 0x0004) key_code = 3;}}else{//抖动old_key = 0;key_count = 0;key_status = NOKEY;}}}else{ //无按键old_key = 0;key_count = 0;if( key_status == PRESSING ) key_status = PRESSED; //按键释放了 }*P_INT_Clear = C_IRQ6_TMB2;}}。
61板说明
SUNPLUS Easy Living Technology for
凌阳大学计划
(二)实验内容
I/O口实验 Timer A/B实验 中断实验 (含6个实验) 系统时钟实验 A/D转换实验 D/A转换实验 即录即放实验 异步串行通讯(UART)实验 睡眠唤醒实验 低电压检测(LVD)/低电压复 位(LVR)实验 FLASH/SRAM读/写实验 SUNPLUS Easy Living Technology for
凌阳大学计划
(三)如何利用“61板”进行开发
简易开发如上图中的①: “61板”+下载线+PC机 这里我们将“61板”上的数据缓冲电路和下载线统称为 “EZ-PROBE” 这种开发方式适合学生和初学者使用, 我们还可提供PCB板和整套元器件散件 ,并配有原理 图和装配图。 优点:开发成本低,学生买的起。
SUNPLUS Easy Living Technology for
凌阳大学计划
(二)实验内容
6位7段LED数码管显示实验 4*4键盘输入在LED数码管上的显示实验 日历时钟实验 并口扩展ROM实验 并口扩展SRAM实验 LED点阵模块等实验 还提供USB、液晶(LCD)、4M存储器 (memory)扩展等实验
SUNPLUS Easy Living Technology for
凌阳大学计划
(一)61板简介
是以16位单片机SPCE061A为核心的精简开发 -仿真-实验板 ,大小相当于一页扑克牌,是 “凌阳大学计划”专为大学生、电子爱好者等进 行电子实习、课程设计、毕业设计、电子制作 及电子竞赛所设计的,也可作为单片机项目初期 研发使用。
凌阳大学计划
凌阳61单片机使用指南
凌阳61单片机使用指南凌阳61单片机使用指南1、简介1.1 设备概述1.2 技术参数1.3 硬件连接2、开发环境搭建2.1 安装IDE2.2 配置编译器2.3 驱动安装3、编程基础3.1 数据类型3.2 变量和常量3.3 运算符3.4 控制流程语句4、IO口输入输出编程4.1 GPIO配置 4.2 输入读取 4.3 输出控制4.4 中断处理5、定时器编程5.1 定时器配置 5.2 定时中断5.3 定时器应用6、串口通信编程 6.1 串口配置 6.2 数据发送 6.3 数据接收6.4 中断处理7、ADC和DAC编程 7.1 ADC配置7.2 ADC采样7.3 DAC配置7.4 DAC输出8、PWM编程8.1 PWM配置8.2 PWM控制8.3 PWM应用9、外部中断编程9.1 外部中断配置 9.2 中断触发方式9.3 中断处理10、蓝牙通信编程10.1 蓝牙模块选择 10.2 蓝牙通信协议 10.3 蓝牙配置10.4 数据传输11、存储器编程11.1 Flash存储器 11.2 EEPROM存储器12、计时器编程12.1 计时器配置12.2 计时器应用附件:无法律名词及注释:1、单片机:指一种将微处理器的中央处理器、存储器、定时器和通信接口等功能集成在一个芯片上的集成电路。
2、GPIO:General Purpose Input Output,通用输入输出口。
用于与外部设备进行数字信号的输入和输出。
3、中断:指计算机运行过程中,由硬件或软件发出的一个特定信号,用于改变程序的正常执行顺序。
4、ADC:Analog to Digital Converter,模数转换器。
用于将模拟信号转换为数字信号。
5、DAC:Digital to Analog Converter,数模转换器。
用于将数字信号转换为模拟信号。
6、PWM:Pulse Width Modulation,脉宽调制。
一种通过改变信号的脉冲宽度来控制模拟量的技术。
凌阳SPCE061A单片机实验程序
本实验程序是凌阳SPCE61A单片机的程序代码!希望大家能够把单片机学好,部分程序有C语言版本的,有一部分没有,我认为C语言版本的其实是按照汇编版的改编的,都是大同小异,所以后面一部分中断程序就没有写C语言版本的!望理解^_^//使用汇编语言实现A 口的输出.RAM.CODE.public _main.define P_IOA_Dir 0X7002.define P_IOA_Attrib 0X7003.define P_IOA_Data 0X7000.define P_watchdog_clear 0X7012 _main:R1=0x00FF //初始化[P_IOA_Dir] = R1[P_IOA_Attrib] = R1R1 = 0x0000[P_IOA_Data] = R1LP1: [P_IOA_Data] = R1R1 += 1CALL delayR2 = 0X0001 //清狗[P_watchdog_clear] = R2JMP LP1delay: .PROCBP = 0LPN: BP += 1CMP BP,0X9000JNZ LPNRETF.ENDP//使用C语言实现A 口的输出#define P_IOA_Data (volatile unsigned int *)0x7000 #define P_IOA_Dir (volatile unsigned int *)0x7002 #define P_IOA_Attrib (volatile unsigned int *)0x7003 #define P_watchdog_clear (volatile unsigned int *)0X7012 int main (void){unsigned int i = 0 ,j = 0;*P_IOA_Dir = 0xffff;*P_IOA_Attrib = 0xffff;*P_IOA_Data = 0x0000;while (1){for (i = 0;i <= 255;++i){for (j = 0 ; j <= 2222; ++j) //延时,可以更改*P_IOA_Data = i ;*P_watchdog_clear = 0x0001;}}}//使用汇编语言实现A 口作为输入口、B 口作为输出口.RAM.CODE.public _main.define P_IOA_Dir 0X7002 //定义地址.define P_IOA_Attrib 0X7003.define P_IOA_Data 0X7000.define P_IOB_Dir 0X7007.define P_IOB_Attrib 0X7008.define P_IOB_Data 0X7005.define P_watchdog_clear 0X7012_main:R1=0x0000 //A口初始化[P_IOA_Dir] = R1[P_IOA_Attrib] = R1[P_IOA_Data] = R1R1=0x00FF //B口初始化[P_IOB_Dir] = R1[P_IOB_Attrib] = R1R1=0x0000[P_IOB_Data] = R1LPP:R1 = [P_IOA_Data] //键盘程序调用取键值CMP R1,0JZ LP2CALL delayR2 = [P_IOA_Data]CMP R1,R2JZ LP2[P_IOB_Data] = R1delay: .PROCBP = 0LPN: BP += 1CMP BP,0X9000JNZ LPNRETF.ENDPLP2: R1 = 0X0001 //清狗[P_watchdog_clear] = R1JMP LPP//使用C 语言实现A 口作为输入口、B 口作为输出口#define P_IOA_Data (volatile unsigned int *)0x7000 #define P_IOA_Dir (volatile unsigned int *)0x7002 #define P_IOA_Attrib (volatile unsigned int *)0x7003 #define P_IOB_Data (volatile unsigned int *)0X7005 #define P_IOB_Dir (volatile unsigned int *)0X7007 #define P_IOB_Attrib (volatile unsigned int *)0X7008 #define P_watchdog_clear (volatile unsigned int *)0X7012 int f (unsigned int t){unsigned int s;t = *P_IOA_Data;if (t == 0 )return t;else{delay();s = *P_IOA_Data;if (t ==s)return t;elsereturn 0;}}void delay (void){unsigned int m;for(m = 0;m<100; ++m){*P_watchdog_clear = 0x0001;}}int main (void){unsigned int i,t;*P_IOA_Dir = 0x0000; // //A口初始化*P_IOA_Attrib = 0x0000;*P_IOA_Data = 0x0000;*P_IOB_Dir = 0x00FF; //B口初始化*P_IOB_Attrib = 0x00FF;*P_IOB_Data = 0x0000;while (1){t = *P_IOA_Data; //取键值i = f(t); //返回键值if (i == 0)*P_IOB_Data = i;else{*P_IOB_Data = i;}*P_watchdog_clear = 0x0001;}}//使用汇编语言实现A 口的输出//系统时钟.RAM.CODE.public _main.define P_IOA_Dir 0X7002 .define P_IOA_Attrib 0X7003.define P_IOA_Data 0X7000 .define P_SystemClock 0X7013 .define P_watchdog_clear 0X7012_main:R1 = 0X0000 //24.576MHZ[P_SystemClock] = R1R1=0x00FF //初始化[P_IOA_Dir] = R1[P_IOA_Attrib] = R1R1 = 0x0000[P_IOA_Data] = R1LP1: [P_IOA_Data] = R1CALL delayCALL delayR1 = 0XFFFF[P_IOA_Data] = R1CALL delayCALL delaydelay: .PROCBP = 0xFFFFLPN: BP -= 1JNZ LPNRETF.ENDPR2 = 0X0001 //清狗[P_watchdog_clear] = R2JMP LP1//系统时钟//使用C语言实现A 口的输出#define P_IOA_Data (volatile unsigned int *)0x7000 #define P_IOA_Dir (volatile unsigned int *)0x7002 #define P_IOA_Attrib (volatile unsigned int *)0x7003 #define P_SystemClock (volatile unsigned int *)0X7013 #define P_watchdog_clear (volatile unsigned int *)0X7012 int main (void){unsigned int i,j;*P_IOA_Dir = 0x00FF;*P_IOA_Attrib = 0x00FF;*P_IOA_Data = 0x0000;*P_SystemClock = 0x0000;while (1){for (i = 0;i < 2222;++i)for (j = 0;j < 22;++j){*P_IOA_Data = 0x0000 ;*P_watchdog_clear = 0x0001;}for (i = 0;i < 2222;++i)for (j = 0;j < 22;++j){*P_IOA_Data = 0xFFFF ;*P_watchdog_clear = 0x0001;}}}//使用汇编语言定时器TimerA.RAM.CODE.public _main.define P_IOB_Dir 0x7007.define P_IOB_Attrib 0x7008.define P_IOB_Data 0x7005.define P_watchdog_clear 0x7012.define P_TimerA_Data 0x700A.define P_TimerA_ctrl 0x700B_main:R1=0x0FFF //B口初始化同相低电平输出[P_IOB_Dir] = R1[P_IOB_Attrib] = R1R1=0x0000[P_IOB_Data] = R1R1 = 0x0215 // 输入256HZ 输出1秒占空比8/16[P_TimerA_ctrl] = R1R1 = 0xFFEF //计数初值[P_TimerA_Data] = R1LP1:R2 = 0x0001 //清狗[P_watchdog_clear] = R2 JMP LP1//使用C语言定时器TimerA#define P_IOB_Data (volatile unsigned int *)0X7005 #define P_IOB_Dir (volatile unsigned int *)0X7007#define P_IOB_Attrib (volatile unsigned int *)0X7008#define P_watchdog_clear (volatile unsigned int *)0X7012#define P_TimerA_Data (volatile unsigned int *)0X700A #define P_TimerA_ctrl (volatile unsigned int *)0X700Bint main (void){*P_IOB_Dir = 0x0F00; //B口初始化同相低电平输出*P_IOB_Attrib = 0x0F00;*P_IOB_Data = 0x0000;*P_TimerA_ctrl = 0x0215; // 输入256HZ 输出1秒占空比8/16*P_TimerA_Data = 0xFFEF; //计数初值while (1){*P_watchdog_clear = 0x0001;}}// 使用汇编语言A/D转换.RAM.CODE.public _main.define P_IOA_Dir 0X7002 //定义地址.define P_IOA_Attrib 0X7003.define P_IOA_Data 0X7000.define P_IOB_Dir 0X7007.define P_IOB_Attrib 0X7008.define P_IOB_Data 0X7005.define P_watchdog_clear 0X7012.define P_ADC_MUX_Ctrl 0X702B.define P_ADC_Ctrl 0X7015.define P_ADC_MUX_Data 0X702C_main:R1=0x0000 //A口初始化悬浮输入口[P_IOA_Dir] = R1[P_IOA_Data] = R1R1=0x00FF[P_IOA_Attrib] = R1[P_IOB_Dir] = R1 //B口初始化同相低电平输出口[P_IOB_Attrib] = R1R1=0x0000[P_IOB_Data] = R1R1=0x0001 //选择通道LINE_IN为IOA0[P_ADC_MUX_Ctrl] = R1R1=0x0001 //允许A/D转换[P_ADC_Ctrl] = R1ZH:R1 = [P_ADC_MUX_Data] //判断是否转换完成? 读取P_ADC_MUX_Data的值TEST R1,0x8000JZ ZHR1 = [P_ADC_MUX_Data]R1 = R1 LSR 4R1 = R1 LSR 2[P_IOB_Data] = R1R1 = 0X0001 //清狗[P_watchdog_clear] = R1JMP ZH// 使用C语言A/D转换#define P_IOA_Data (volatile unsigned int *)0x7000#define P_IOA_Dir (volatile unsigned int *)0x7002#define P_IOA_Attrib (volatile unsigned int *)0x7003#define P_IOB_Data (volatile unsigned int *)0X7005#define P_IOB_Dir (volatile unsigned int *)0X7007#define P_IOB_Attrib (volatile unsigned int *)0X7008#define P_watchdog_clear (volatile unsigned int *)0X7012#define P_ADC_MUX_Ctrl (volatile unsigned int *)0X702B#define P_ADC_Ctrl (volatile unsigned int *)0X7015#define P_ADC_MUX_Data (volatile unsigned int *)0X702Cint main (void){unsigned int i ;unsigned int j ;*P_IOA_Dir = 0x0000 ; //A口初始化悬浮输入口*P_IOA_Data = 0x0000 ;*P_IOA_Attrib = 0x00FF ;*P_IOB_Dir = 0x00FF ; //B口初始化同相低电平输出口*P_IOB_Attrib = 0x00FF ;*P_IOB_Data = 0x0000 ;*P_ADC_MUX_Ctrl = 0x0001; //选择通道LINE_IN为IOA0*P_ADC_Ctrl = 0x0001 ; //允许A/D转换for(i = 0;i < 5;++i) ; //等待while(1){i = *P_ADC_MUX_Data ; //判断是否转换完成? 读取P_ADC_MUX_Data的值i = i & 0x8000 ;if(i == 0);else{j = *P_ADC_MUX_Data;j >>= 6 ; //右移6位*P_IOB_Data = j ;}*P_watchdog_clear = 0X0001 ; //清狗}}//使用汇编语言实现A 口作为输入口、B 口作为输出口触键唤醒.RAM.CODE.public _main.define P_IOA_Dir 0X7002 //定义地址.define P_IOA_Attrib 0X7003.define P_IOA_Data 0X7000.define P_IOB_Dir 0X7007.define P_IOB_Attrib 0X7008.define P_IOB_Data 0X7005.define P_watchdog_clear 0X7012.define P_INT_Ctrl 0X7010.define P_IOA_Latch 0X7004.define P_SystemClock 0X7013.define P_INT_Clear 0X7011_main:R1=0x00FD //设置IOA1为带下拉电阻的输入口,其他IOA口都设置为输出口[P_IOA_Dir] = R1[P_IOA_Attrib] = R1R1=0x0000[P_IOA_Data] = R1R1=0x00FF //B口初始化初始化IOB口为同相低电平输出口[P_IOB_Dir] = R1[P_IOB_Attrib] = R1R1=0x0000[P_IOB_Data] = R1INT OFFR1 = 0X0080 //开启唤醒中断[P_INT_Ctrl] = R1R1 = 0X0000 //熄灭灯[P_IOB_Data] = R1R1 = [P_IOA_Latch] //锁存IOA数据[P_IOA_Data]INT IRQR1 = 0X0007 //睡眠[P_SystemClock] = R1LP2: R1 = 0X0001 //清狗[P_watchdog_clear] = R1JMP LP2.TEXT.PUBLIC _IRQ3_IRQ3:INT OFFPUSH R1,R4 TO [SP]R1 = 0X0080 //是否是触键唤醒TEST R1,[P_INT_Ctrl]JZ EXITR1 = 0XFFFF //点亮8颗灯[P_IOB_Data] = R1EXIT:R1 = 0X0080 //清中断[P_INT_Clear] = R1POP R1,R4 FROM [SP]INT IRQRETI.END//使用C 语言实现A 口作为输入口、B 口作为输出口#define P_IOA_Data (volatile unsigned int *)0x7000#define P_IOA_Dir (volatile unsigned int *)0x7002#define P_IOA_Attrib (volatile unsigned int *)0x7003#define P_IOB_Data (volatile unsigned int *)0X7005#define P_IOB_Dir (volatile unsigned int *)0X7007#define P_IOB_Attrib (volatile unsigned int *)0X7008#define P_watchdog_clear (volatile unsigned int *)0X7012#define P_INT_Ctrl (volatile unsigned int *)0X7010#define P_IOA_Latch (volatile unsigned int *)0X7004#define P_SystemClock (volatile unsigned int *)0X7013#define P_INT_Clear (volatile unsigned int *)0X7011int main(void){unsigned int i ;ASM (" INT OFF ") ;*P_IOA_Dir = 0x00FD ; //设置IOA1为带下拉电阻的输入口,其他IOA口都设置为输出口*P_IOA_Attrib = 0x00FD;*P_IOA_Data = 0x0000;*P_IOB_Dir = 0x00FF ; //B口初始化初始化IOB口为同相低电平输出口*P_IOB_Attrib = 0x00FF;*P_IOB_Data = 0x0000;*P_INT_Ctrl = 0X0080; //开启唤醒中断*P_IOB_Data = 0X0000; //熄灭灯i = *P_IOA_Latch ; //锁存IOA数据ASM (" INT IRQ ") ; //开中断*P_SystemClock = 0X0007; //睡眠while(1){*P_watchdog_clear = 0X0001 ; //清狗}}unsigned int t;void IRQ3(void)__attribute__((ISR));void IRQ3(void){t = *P_INT_Ctrl ;if (t == 0X0080 ){*P_IOA_Data = 0XFFFF ;*P_INT_Clear = 0X0080;}else*P_INT_Clear = 0X0080;}//使用汇编语言:IRQ6 中断.DEFINE P_IOA_DATA 0x7000.DEFINE P_IOA_DIR 0x7002.DEFINE P_IOA_ATTRI 0x7003.DEFINE P_IOB_DATA 0x7005.DEFINE P_IOB_DIR 0x7007.DEFINE P_IOB_ATTRI 0x7008.DEFINE P_INT_CTRL 0x7010.DEFINE P_INT_CLEAR 0x7011.DEFINE P_WatchDog_Clear 0x7012.DEFINE P_Timebase_setup 0x700e.RAM.VAR G_Time1.VAR G_Time2.CODE.PUBLIC _main_main:INT OFFR1 = 0xFFFF //设置IOA口为同相高电平输出口[P_IOA_ATTRI] = R1[P_IOA_DIR] = R1[P_IOA_DATA] = R1R1 = 0xFFFF //设置IOB口为同相高电平输出口[P_IOB_ATTRI] = R1[P_IOB_DIR] = R1[P_IOB_DATA] = R1R1 = 0x0003[P_Timebase_setup] =R1R1 = 0x0003 //开中断IRQ6_C_Tmb1和IRQ6_C_Tmb2 [P_INT_CTRL] = R1R1 = 0x0000[G_Time1] = R1[G_Time2] = R1INT I RQL_Loop:R1 = 0x0001[P_WatchDog_Clear] = R1JMP L_Loop.TEXT.PUBLIC _IRQ6_IRQ6:PUSH R1,R5 to [sp] //压栈保护R1 = 0x0001TEST R1,[P_INT_CTRL] //比较是否为IRQ6_C_Tmb2的中断源JNZ L_IRQ6_C_Tmb2 //是,则转至对应程序段L_IRQ6_C_Tmb1: //否,则进入IRQ6_C_Tmb1程序段;R2 = [G_Time1]R2 += 0x0001[G_Time1] = R2CMP R2,64 //比较是否为1秒;JBE L_LED1_OFF //小于等于则LED灭;R1 = 0xfff0 //大于则LED亮;[P_IOA_DATA] = R1CMP R2,128 //比较是否为两秒;JBE L_LED1_RET //小于等于则LED继续亮;R2 = 0x000 //否则,G_Time1单元清零,返回中断;[G_Time1] =R2JMP L_LED1_RETL_LED1_OFF:R1 = 0xFFFF[P_IOA_DATA] = R1L_LED1_RET:R1 = 0x0002[P_INT_CLEAR] = R1R1 = 0x0001[P_WatchDog_Clear] = R1POP R1,R5 FROM [sp]RETIL_IRQ6_C_Tmb2:R2 = [G_Time2]R2 += 0x0001[G_Time2] = R2CMP R2,64 //比较是否为0.5秒;JBE L_LED2_OFF //小于等于则LED灭;R1 = 0xfff0 //大于则LED亮;[P_IOB_DATA] = R1CMP R2,128 //比较是否为1秒;JBE L_LED2_RET //小于等于则LED继续亮;R2 = 0x0000 //否则,G_Time2单元清零,返回中断;[G_Time2] = R2JMP L_LED2_RETL_LED2_OFF:R1 = 0xFFFF[P_IOB_DATA] = R1L_LED2_RET:R1 = 0x0001[P_INT_CLEAR] = R1POP R1,R5 from [sp] RETI//使用汇编语言IRQ4.define P_IOA_DATA 0x7000.define P_IOA_DIR 0x7002.define P_IOA_ATTRI 0x7003.define P_IOB_DATA 0x7005.define P_IOB_DIR 0x7007.define P_IOB_ATTRI 0x7008.define P_INT_CTRL 0x7010.define P_INT_CLEAR 0x7011.define P_watchdog_clear 0x7012.RAM.VAR G_Time1.VAR G_Time2,G_Time4.CODE.public _main_main:INT OFFR1 = 0xFFFF //IOA口为同相高电平输出口;[P_IOA_ATTRI] = R1[P_IOA_DIR] = R1R1 = 0x0000[P_IOA_DATA] = R1R1 = 0x0070 //开中断IRQ4_4KHz、IRQ4_2KHz和IRQ4_1KHz[P_INT_CTRL] = R1R1 = 0x0000[G_Time1] = R1[G_Time2] = R1[G_Time4] = R1INT IRQL_Loop:R1 = 0x0001 //清狗等待中断[P_watchdog_clear] = R1JMP L_Loop.TEXT.PUBLIC _IRQ4_IRQ4:PUSH R1,R5 to [sp] //压栈保护;R1 = 0x0010TEST R1,[P_INT_CTRL] //比较是否为1KHz的中断源;JNZ LED2kHZ_OFF //是,则转至对应程序段;R1 = 0x0020TEST R1,[P_INT_CTRL] //否,则比较是否为2KHz的中断源;JNZ IRQ4_2k //是,则转至对应程序段;L_IRQ4_4k: //否,则进入4KHz程序段;R2 = [G_Time4]R2 += 0x0001[G_Time4] = R2CMP R2,1024 //比较JBE LED4kHZ_OFF //小于等于则LED灭;R1 = 0x00f0 //大于则LED亮;[P_IOA_DATA] = R1CMP R2,2048 //比较JBE LED2kHZ_OFF //小于等于则LED继续亮;R2 = 0x0000 //否则,G_Time4单元清零,返回中断;[G_Time4] = R2JMP LED2kHZ_OFFLED4kHZ_OFF:R1 = 0x0000[P_IOA_DATA] = R1LED2kHZ_OFF:R1 = 0x0040POP R1,R5 from [sp]RETIIRQ4_2k:R2 = [G_Time2]R2 += 0x0001[G_Time2] = R2CMP R2,1024 //比较JBE LED2kHZ_OFF //小于等于则LED灭;R1 ^= 0x000C //大于则LED亮;[P_IOA_DATA] = R1CMP R2,2048 //比较;JBE LED2kHz_RET //小于等于则LED继续亮;R2 = 0x0000 //否则,G_Time2单元清零,返回中断;[G_Time2] = R2JMP LED2kHz_RETLED2kHZ_OFF:R1 = 0x0000[P_IOA_DATA] = R1LED2kHz_RET:R1 = 0x0020POP R1,R5 from [sp]RETILED2kHZ_OFF:R2 = [G_Time1]R2+ = 0x0001[G_Time1] = R2CMP R2,1024 //比较;JBE LED1kHZ_OFF //小于等于则LED灭;R1 = 0x0003 //大于则LED亮;[P_IOA_DATA] = R1CMP R2, 2048 //比较;JBE LED1kHz_RET //小于等于则LED继续亮;R2 = 0x0000 //否则,G_Time1单元清零,返回中断;[G_Time1] = R2JMP LED1kHz_RETLED1kHZ_OFF:R1 = 0x0000[P_IOA_DATA] = R1LED1kHz_RET:R1 = 0x0010POP R1,R5 from[sp] RETI//使用汇编语言外部中断EXT1、EXT2.define P_IOA_Dir 0X7002 //定义地址.define P_IOA_Attrib 0X7003.define P_IOA_Data 0X7000.define P_IOB_Dir 0X7007.define P_IOB_Attrib 0X7008.define P_IOB_Data 0X7005.define P_FeedBack 0X7009.define P_INT_Ctrl 0x7010.define P_INT_clear 0x7011.define P_Timebase_setup 0x700E.define P_watchdog_clear 0X7012.RAM.CODE.PUBLIC _main_main:INT OFFR1 = 0xFFFF //IOA口为同相低电平输出[P_IOA_Attrib] = R1[P_IOA_Dir] = R1R1 = 0x0000[P_IOA_Data] = R1R1 = 0x0000 //IOB2 、IOB3 口为上拉电阻输入[P_IOB_Attrib] = R1[P_IOB_Dir] = R1R1 = 0x0001[P_IOB_Data] = R1R1 = 0X000C //设置IOB 口为特殊功能[P_FeedBack] = R1R1 = 0X0300 //开启IRQ3_EXT1,IRQ3_EXT2 中断[P_INT_Ctrl] = R1INT IRQLP1:R1 = 0X0001[P_watchdog_clear] = R1JMP LP1//外部中断.TEXT.PUBLIC _IRQ3_IRQ3:INT OFFPUSH R1,R4 TO [SP]R1 = 0X0200 //是否是EXT2 中断TEST R1,[P_INT_Ctrl]JNZ IRQ3_EXT2 // 是否是EXT2,是则跳转到EXT2R1 = 0X0100TEST R1,[P_INT_Ctrl]JNZ IRQ3_EXT1 // 是否是EXT1,是则跳转到EXT1R1 = 0X0380[P_INT_clear] = R1POP R1,R4 FROM [SP]RETIIRQ3_EXT1:R1 = 0X00F0[P_IOA_Data] = R1R1 = 0X0100[P_INT_clear] = R1POP R1,R4 FROM [SP]INT IRQRETIIRQ3_EXT2:R1 = 0X000F[P_IOA_Data] = R1R1 = 0X0200[P_INT_clear] = R1 POP R1,R4 FROM [SP] INT IRQRETI//使用汇编语言外部中断IRQ0 1 2.define P_IOA_Dir 0X7002 //定义地址.define P_IOA_Attrib 0X7003.define P_IOA_Data 0X7000.define P_IOB_Dir 0X7007.define P_IOB_Attrib 0X7008.define P_IOB_Data 0X7005.define P_FeedBack 0X7009.define P_INT_Ctrl 0x7010.define P_INT_clear 0x7011.define P_watchdog_clear 0X7012.define P_TimerA_Data 0x700A.define P_TimerA_ctrl 0x700B.define P_TimerB_Data 0x700C.define P_TimerB_ctrl 0x700D.RAM.CODE.PUBLIC _main_main:INT OFFR1 = 0xFFFF //IOA口为同相低电平输出[P_IOA_Attrib] = R1[P_IOA_Dir] = R1R1 = 0x0000[P_IOA_Data] = R1R1 = 0xFFFF //IOB口为同相低电平输出[P_IOB_Attrib] = R1[P_IOB_Dir] = R1R1 = 0x0000[P_IOB_Data] = R1R1 =0x0034 //4096hz[P_TimerA_ctrl] = R1R1 = 0xDFFF[P_TimerA_Data] = R1R1 =0x0004 //4096hz[P_TimerB_ctrl] = R1R1 = 0xEFFF[P_TimerB_Data] = R1R1 = 0x5400 //开启IRQ3_EXT1,IRQ3_EXT2 中断[P_INT_Ctrl] = R1INT IRQLP1:R1 = 0X0001[P_watchdog_clear] = R1JMP LP1//外部中断.TEXT.PUBLIC _IRQ0_IRQ0:INT OFFPUSH R1,R4 TO [SP]R1 = 0x4000 // 中断[P_INT_clear] = R1POP R1,R4 FROM [SP]INT IRQRETI.TEXT.PUBLIC _IRQ1_IRQ1:INT OFFPUSH R1,R4 TO [SP]R1 = [P_IOA_Data]R1 ^= 0x000F[P_IOA_Data] = R1R1 = 0x1000[P_INT_clear] = R1POP R1,R4 FROM [SP]INT IRQRETI.TEXT.PUBLIC _IRQ2_IRQ2:INT OFFPUSH R1,R4 TO [SP]R1 = [P_IOB_Data]R1 ^= 0x000F[P_IOB_Data] = R1R1 = 0x0400[P_INT_clear] = R1POP R1,R4 FROM [SP]INT IRQRETI目前做了这么多实验,实验程序共享给大家!希望大家能够把单片机学好!^_^ ^_^ ^_^ ^_^ ^_^。
凌阳61单片机的优势分析和学习指导
凌阳61单片机的优势分析和学习指导前言61板是什么?61板是凌阳十六位单片机中的一款--SPCE061A的开发系统。
61板是SPCE061A的硬体开发系统,用户只采用61板就可以进行开发,与61板配套的软体开发工具名称为凌阳十六位单片机集成开发环境(unSP IDE),凌阳大学计划网站提供开发环境的免费下载和升级。
"61板"是以16位单片机SPCE061A为核心的精简开发-仿真-实验板,大小相当于一页扑克牌,是"凌阳大学计划"专为大学生、电子爱好者等进行电子实习、课程设计、毕业设计、电子制作及电子竞赛所设计的,也可作为单片机项目初期研发使用。
61板的主要特点是:简单、易学、实用。
它采用的是精简指令集,在这个指令系统中共有41条指令,指令功能简单且容易掌握。
"61板"除了具备单片机最小系统电路外还包括有电源电路、音频电路(含MIC输入部分和DAC音频输出部分)、复位电路等,而且体积小、采用电池供电,方便随身携带,使学生在掌握软件的同时,熟练单片机硬件的设计制作,锻炼学生的动手能力,也为单片机学习者和开发者创造了一个良好的学习和新产品开发的机会!拥有"61板"即可拥有单片机实验板(具有DSP功能和语音处理功能)+仿真器+编程器,集成开发环境(IDE)支持C语言。
61板可以做什么?一套开发系统可以做的,就是帮助开发者实现他想要实现的功能。
例如开发者想利用61板设计一个录音笔,61板实现录音笔功能不需要外扩任何电路,因此,开发者只需要编写要实现录音笔功能的代码就可以了。
61板免费配送SPCE061A的集成开发环境,因此用户只要在PC机上安装集成开发环境后,就可以进行代码编写。
电冰箱主控板,洗衣机主控板,智能小车等61板都可以做到。
只有你想不到的,没有单片机开发系统做不到的,好好想想你要做什么吧?然后马上动手在用61板实现。
通过近一年来的使用,同道工作室的工作人员发现SPCE061A开发板是一个非常经典的16位单片机开发板,特点为成本低、功能强、资料全,只要有51单片机的基础上手不难,特别适合电子相关的大学生进行电子实习、课程设计、毕业设计、电子制作及电子竞赛等。
凌阳61板实验指导书
专业感知与实践实验指导书电路与系统教研室实验一实验设备介绍 (3)凌阳61板硬件介绍 (3)LED键盘模组扩展板结构介绍 (7)集成开发环境介绍 (8)实验二 8061的简单IO操作 (13)介绍常用的几条指令 (13)点亮一盏LED灯实例 (14)数码管显示数字实例 (15)实验三键控发光二极管循环点亮 (17)实验四按键显示数字 (20)实验五电子时钟分秒设计 (23)实验六数字电子语音报时钟 (25)实验一实验设备介绍凌阳61板硬件介绍61板硬件结构一、61板的结构图如图1所示。
图1表框图说明POWER5v&3V供电电路PLL锁向环外部电路Power-电源指示灯Sleep-睡眠指示灯RESET复位电路K4复位按键PROBE在线调试器串行5pin接口S5EZ-PROBE和PROBE切换的拨断开关J12、J3耳机插孔和两pin喇叭插针DAC一路音频输出电路,采用SPY0030集成音频放大器MIC麦克风输入电路OSC32768晶振电路VREF A/D转换外部参考电压输入接口R/C芯片其他外围电阻、电容电路K1~K3扩展的按键:接IOA0~IOA2 SPCE061A61板核心:16位微处理器PORTA/B32个I/O口二、具体功能介绍,如61板图2图2(一)输入/输出(I/O)接口"61板"将SPCE061A的32个I/O口全部引出:IOA0~IOA15,IOB0~IOB15,对应的引脚为:A口,41~48、53、54~60;B口,5~1、81~76、68~64。
而且该I/O口是可编程的,即可以设置为输入或输出:设置为输入时,分为悬浮输入或非悬浮输入,非悬浮输入又可以设置为上拉输入或是下拉输入;在5V情况下,上拉电阻为150K,下拉电阻为110K;设置为输出时,可以选择同相输出或者反相输出。
(二)音频输入/输出接口正如我们在前面介绍的"61板"具有强大的语音处理功能,如图2所示,X1是语音的MIC 输入端,带自动增益(AGC)控制,J12和J3都是语音输出接口,一个是耳机插孔另一个是两pin的插针外接喇叭,由DAC输出引脚21或22经语音集成放大器SPYOO30放大,然后输出,SPY0030是凌阳的芯片,相当于LM386,但是比386音质好,它可以工作在~范围内,最大输出功率可达700mW(386必须工作在4V以上,而且功率只有100mW)。
凌阳61板时钟程序
//=========================================================================== //// The information contained herein is the exclusive property of// Sunplus Technology Co. And shall not be distributed, reproduced,// or disclosed in whole in part without prior written permission.//// (C) COPYRIGHT 2001 SUNPLUS TECHNOLOGY CO.// ALL RIGHTS RESERVED//// The entire notice above must be reproduced on all authorized copies.////=========================================================================== =// 工程名称:Time.scs; Time.spj "语音播报电子钟"// 功能描述: 结合"61板"的三个按键完成带有语音播报功能的电子钟:// 1、KEY1--按一下播放年、月、日,再按一下播放时、分;(I/O口A0)// 连续按3s,则进入调整状态;调整状态下调整内容的切换// 2、KEY2--年、月、日、时、分的增加(I/O口A0)// 3、KEY3--年、月、日、时、分的减少(I/O口A0)// 文件来源:61板说明书// IDE环境:SUNPLUS u'nSPTM IDE 1.8.0(or later)//// 涉及的库:(a) C-Lib: (CMacro.lib);// (b) SACM-Lib: SacmV25.lib;Sacmv32e.lib// 硬件连接:针对配合SPCE061A精简开发板使用// 组成文件:// main.c// FIQ.asm/key.asm/system.asm// hardware.asm/Resource.asm// Time.h/Resource.inc// 日期: 2003-5-22(建立)// 2003-6-16(添加版本说明及版权声明)// 2003-7-16(代码标准化)//=========================================================================== ===#include "a2000.h"#include "consist.h"unsigned int SpeechAdjustTemp=0; //读时间中间变量unsigned int Key=0;unsigned int KeyPressFlag=0; //有键按下标志unsigned int TimeCount = 0; //两分钟计时单元unsigned int SleepFlag=0; //睡眠标志unsigned int TimeChangeCount=0; //校时状态下按键计时unsigned int KeyStatus=0; //校时状态还是报时状态,1-----校时unsigned int KeyAdjust=0; //0-YY 1-MM 2-DD 3-hh 4-mm 5-ss 6-exit unsigned int YearOrTime=0; //报时1----year 0----timeunsigned int TimeChangeKey = 0; //校时状态下加减标志unsigned int KeyCount=0; //按键计数单元unsigned int SecondAddOne=0;unsigned int HourMinTemp=0; //读时、分unsigned int i=0;unsigned int j=0;//作息时间表unsigned int gTimeVSShem[16]={0x0800,0x0832,0x0900,0x0932,0x0934,0x0a05,0x0a0a,0x0b00,0x0b0a,0x0c00,0x0d1e,0x0e14,0x0e1e,0x0f14,0x0f15,0x0f32};//************************播放提示语音*********************////input: 播放序号//*********************************************************//void PlayRespond(unsigned int Result){ SACM_A2000_Initial(1);SACM_A2000_Play(Result,3,3);while((SACM_A2000_Status()&0x0001) != 0){ Clear_WatchDog();SACM_A2000_ServiceLoop();}SACM_A2000_Stop();}//***************延时子程序********************************////*********************************************************//void Delay3ms(){int delaytemp=0;for(delaytemp=0;delaytemp<0xFFFF;delaytemp++);}//***************语音报时**********************************////函数:PlayAdjustTime(AdjustTemp)//描述:调用子函数:// ReadRealYear(): 年---16进制低14位// ReadRealMonthDay(): 月----高8位日---低8位16进制// ReadRealHourMin(): 时----高8位分---低8位16进制// ReadRealSecond(): 秒16进制//参数:0---年;1---月;2--日;3--时;4---分;5---秒//返回:无//*********************************************************// PlayAdjustTime(AdjustTemp) //*************调整时间播放{switch(AdjustTemp){case 0: //年SpeechAdjustTemp=ReadRealYear();PlaySpeakYear(SpeechAdjustTemp);break;case 1: //月SpeechAdjustTemp=ReadRealMonthDay();PlaySpeakMonth(SpeechAdjustTemp>>8);break;case 2: //日SpeechAdjustTemp=ReadRealMonthDay();PlaySpeakDay(SpeechAdjustTemp & 0x00ff);break;case 3: //时SpeechAdjustTemp=ReadRealHourMin();PlaySpeakHour(SpeechAdjustTemp>>8);break;case 4: //分SpeechAdjustTemp=ReadRealHourMin();PlaySpeakMinute(SpeechAdjustTemp & 0x00ff);break;// case 5: //秒// SpeechAdjustTemp=ReadRealSecond();// PlaySpeakSecond(SpeechAdjustTemp);// break;case 5: break;default: break;}}//***************语音报时子函数****************************// //函数:PlayAdjustTime(AdjustTemp)//描述:调用子函数:// PlaySpeakYear(): 报年// PlaySpeakMonth(): 报月// PlaySpeakDay(): 报日// PlaySpeakHour(): 报时// PlaySpeakMinute(): 报分//参数:年;月;日;时;分;数据均为16进制//返回:无//*********************************************************////input: 年-----16进制//*********************************************************//PlaySpeakYear(int YearTemp) //*************年{PlayRespond((YearTemp/1000)+C_T00);PlayRespond((YearTemp%1000)/100+C_T00);PlayRespond((YearTemp%100)/10+C_T00);PlayRespond((YearTemp%10)+C_T00);PlayRespond(C_YEAR);}//input:月------16进制//*********************************************************//PlaySpeakMonth(int MonthTemp) //*************月{if(MonthTemp<10) PlayRespond(MonthTemp+C_T00);else if(MonthTemp==10) PlayRespond(C_T10);else if(MonthTemp==11) PlayRespond(C_T11);else if(MonthTemp==12) PlayRespond(C_T12);PlayRespond(C_MONTH);}//input:日------16进制//*********************************************************//PlaySpeakDay(int DayTemp) //*************日{ if((DayTemp/10)> 1) PlayRespond(DayTemp/10+C_T00); //十位>1报if((DayTemp/10)>0) PlayRespond(C_T10); //报十,十位为1不报1 if((DayTemp%10)!= 0) PlayRespond(DayTemp%10+C_T00);PlayRespond(C_DAY);}//input: 时------16进制//*********************************************************//PlaySpeakHour(int DayTemp) //*************时{if(DayTemp>=1 && DayTemp<=7){ PlayRespond(C_LINGCHEN); //1—7 凌晨if(DayTemp==2) PlayRespond(C_S02); //两else PlayRespond(DayTemp+C_T00);}else if(DayTemp>=8 && DayTemp<=12){ PlayRespond(C_NOON); //8--12 上午switch(DayTemp){ case 10:PlayRespond(C_T10); break; //十点case 11:PlayRespond(C_T11); break; //十一点case 12:PlayRespond(C_T12); break; //十二点default: PlayRespond(DayTemp+C_T00);break;}}else if(DayTemp>=13 && DayTemp<=19){ PlayRespond(C_AFTERNOON); //13--19 下午1--7if(DayTemp==14) PlayRespond(C_S02); //两else PlayRespond(DayTemp-12+C_T00);}else if(DayTemp>=20 && DayTemp<=24){ PlayRespond(C_NIGHT); //20--24 晚上8--12switch(DayTemp){ case 22:PlayRespond(C_T10); break; //十点case 23:PlayRespond(C_T11); break; //十一点case 24:PlayRespond(C_T12); break; //十二点default: PlayRespond(DayTemp-12+C_T00);break;}}PlayRespond(C_DIAN); //点}//input: 分------16进制//*********************************************************//PlaySpeakMinute(int MinTemp) //*************分{if(MinTemp==0) PlayRespond(C_ZHENG); //正点else{ if((MinTemp/10)>1) PlayRespond(MinTemp/10+C_T00); //分的十位if((MinTemp/10) >0) PlayRespond(C_T10); //分的十位大于1报,为1不报1if((MinTemp%10)!=0) PlayRespond(MinTemp%10+C_T00); //分的个位不为0则报PlayRespond(C_MIN); //分}}//input:秒------16进制//*********************************************************//PlaySpeakSecond(int SecondTemp) //*************秒{ if(SecondTemp == 0) PlayRespond(SecondTemp + C_T00); //0秒if((SecondTemp/10)>1) PlayRespond(SecondTemp/10+C_T00); //秒的十位大于1报,为1只报十if((SecondTemp/10)> 0) PlayRespond(C_T10);if((SecondTemp%10)!= 0) PlayRespond(SecondTemp%10+C_T00);PlayRespond(C_SECOND);}//********************报时*********************************////input:1 ----- 报年、月、日// 0 ----- 报时、分、秒//*********************************************************//void SpeakTime(TimeType){if(TimeType == 0x01){PlayAdjustTime(CON_YEAR); //年PlayAdjustTime(CON_MONTH); //月PlayAdjustTime(CON_DAY); //日}else{PlayRespond(C_BELL); //报时声PlayRespond(C_NOW); //现在时刻PlayAdjustTime(CON_HOUR); //时PlayAdjustTime(CON_MINUTE); //分}}//*********************************************************////函数:main()//描述:主函数//*********************************************************//int main(){System_Initial();while(1){Key_Scan_ServiceLoop(); //键盘扫描//**********************TRIG/TIME**************************************************//if(Key==1 && KeyStatus==0 ) //keystate 校时状态还是报时状态,1-----校时{KeyCount=1; //按键计数单元Key=0;}if(Key==0x8001 && KeyStatus==0 ){KeyCount++;Key=0;}if (KeyPressFlag==0 && KeyCount>0 ){if(KeyCount<20) //报时{YearOrTime=YearOrTime ^ 0x01; //报年月日或时分:报时1----year 0----timeSpeakTime(YearOrTime);KeyCount=0;}else if(KeyCount>=20) //进入调整时间状态{KeyCount=0;KeyStatus=1;KeyAdjust=0;TimeCount = 0;Start256HzRTC();PlayAdjustTime(KeyAdjust);}}//*********************************************************************************//if(KeyStatus==1) //keystate 校时状态还是报时状态,1-----校时{switch(Key){case 1:KeyAdjust++;if(KeyAdjust == 5) //KeyAdjust:0-YY 1-MM 2-DD 3-hh 4-mm 5-ss 6-exit{KeyStatus=0; KeyAdjust=0;PlayAdjustTime(CON_YEAR); //年PlayAdjustTime(CON_MONTH); //月PlayAdjustTime(CON_DAY); //日PlayAdjustTime(CON_HOUR); //时PlayAdjustTime(CON_MINUTE); //分Stop256HzRTC();}elsePlayAdjustTime(KeyAdjust);Key=0;TimeCount = 0;TimeChangeKey=0;break;case 2:Adjust_Time_Up(KeyAdjust);TimeChangeCount = 0; //调校时间状态下,有键按下,计时器清0TimeChangeKey=1; //调校时间状态下,有加减键按下标志TimeCount = 0; //两分钟计时单元Key=0;break;case 4:Adjust_Time_Down(KeyAdjust);//KeyAdjust:0-YY 1-MM 2-DD 3-hh 4-mm 5-ss 6-exitTimeChangeCount = 0;TimeChangeKey=1;TimeCount = 0; //两分钟计时单元Key=0;break;default:break;}if(TimeChangeKey==1 && TimeChangeCount > 40){TimeChangeKey=0;PlayAdjustTime(KeyAdjust);}if(TimeCount > 120){KeyStatus=0;KeyAdjust=0;}}//*********************************************************************************//Calendar_Counter(); //调整万年历if(SecondAddOne==0xFFFF) //分加1时,与作息时间比较{SecondAddOne=0;HourMinTemp=ReadRealHourMin();for(i=0;i<16;i++) //作息时间if(HourMinTemp==gTimeVSShem[i]){for(j=0;j<15;j++){LightOn(); //LED闪烁15次Delay3ms();LightOff();Delay3ms();}break;}}if(SleepFlag == 0x01 && KeyStatus == 0 )SP_GoSleep(); // 进入睡眠模式}}//*****************************主程序结束******************************************// //*********************************************************************************//。
初学凌阳单片机_4_学习从61板上MIC录入语音的方法
单片机与可编程器件电子世界2005年10期23・・让我们来尝试一下61A板MIC录入语音的方法和播放效果。
首先点击光盘→电子竞赛→基础篇→语音功能→DVRFLASH,先浏览DVR FLASH.pdf文件,将要进行的工程项目的功能是:点按K1键,开始录音;点按K2键,停止录音;点按K3键,播放录音内容。
再将DVR FLASH文件夹拷贝到自己的硬盘目录下,进入IDE,打开工程项目DVR FLASH.spj ,点击橡皮擦图标,选定体名称SPCE061A→OK,编译链接Build后,出现的错误信息表明缺少两个头文件hardware.h和dvr.h(图1),寻找发现在Include中有所需头文件(图2),添加头初学凌阳单片机(4)——学习从61板上MIC 录入语音的方法・北京航空航天大学工程训练中心 李 坚 耿 珂・图2文件(图3)到工程项目中,编译链接 Build后,出现的错误信息表明,用来产生目标文件的hardware.h头文件不符合规定(图4)。
试着将Include文件夹下的此文件复制到工程项目DVRDLASH.spj 所在目录下,hardware.h头文件问题解决了,新出现的dvr.h头文件问题(图5)估计与hardware.h头文件的问题相同,所以依上述方法办理。
再次编译链接Build,出现五个错误(图6),错误分为两类:一是文件调用;一是函数定义。
这次直接将两个.inc文件从Include文件夹下复制到所用工程项目目录下,再次编译链接Build,问题集中到hardware.asm文件上(图7),寻找D:盘,无错误信息提示中的路径D:\programFiles\sunplus\unSOIED180\,工程项目中又包含有hardware.asm这个文件,并提示所包含的文件在Include目录下,无奈下试着将Include目录下的该文件拷贝到DVR FLASH.spj所在目录下,图1图3图4电子世界2005年10期24・・单片机与可编程器件图8即向DVR_FLASH目录中添加hardware.asm文件(图8),编译链接Build后,错误信息发生了变化(图9),不知为什么会有这样的变化,按理说hardware.asm是同一个文件,只是在不同的目录下,但毕竟是有了变化,而且这些错误我们以前曾经见过,在Resource.asm文件中添加对这些函数的定义即可。
课件:单片机安装与调试
工程训练中心
课程内容
一 、61凌阳单片机简介 二、 61单片机焊接注意事项及其焊接步骤 三、 61凌阳单片机测试步骤
一 、61凌阳单片机简介
电源区 下载区
复位区 端口区
音频区
键控区
一 、61凌阳单片机简介
1、61 板的套件: 1) 开发板及散件:
以 SPCE061A 为核心的具有 DSP 功能和语音特色的 16 位单片机开发板; 2)下载线:通过它就可以完成在线仿真、在线调试、在线 下载; 3)光盘:包括教材、IDE 软件开发环境、100 多个程序范 例、实验指导书上下册、应用范例等凌阳 大学计划的技术资料,基本实现“无师自通” ;
对照原理一步步排查; 现象 2:电压正常;进行键盘
部分测试。
三、 61凌阳单片机测试步骤
Step 4:测试 61 板电源部分那个器件坏掉 断开电源: 用万用表检查发光二极管是否坏掉,或者方向弄错; 测量 J10 的两端是否短路,如果是,先检查 D3 是否击穿; 如果 J10 没有短路,再测 SPY0029 的 3 脚与地是否短路, 如果是,检测 D4 是否击穿 (要先从板子将负极拖开 测试) ,否则就是
Step 17: 焊接U1、 U2 、U4 芯片座 注意U2、U4座子的凹进的表示与电路板子上的凹口
一致。 焊接 U1 SPCE061A 的座子, 注意座子的斜切口与
电路板子上的斜切口一致。
二、61单片机焊接注意事项及其焊接步骤
Step 18: 管脚修整 剪断已焊接元件多余的引脚,(长度大概 1mm
二、61单片机焊接注意事项及其焊接步骤
Step 14: 焊接单排插针(数量 9 个)
二、61单片机焊接注意事项及其焊接步骤
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
凌阳单片机资料使用指南
1.1 初次接触单片机-使用《跟我学SPCE061A 单片机》
\61教学与创新\2教材与教案\跟我学SPCE061A单片机《跟我学SPCE061A单片机》无论有没有学过单片机,都可以从里面学习到有关凌阳SPCE061A单片机的基础知识。
初学单片机的朋友,在学习时常会碰到些一时间无法理解的概念、原理等;对于这些不解,可以从微机原理、数字电路、模拟电路以及C语言编程类的书籍、资料中找到答案,假如之前没有学过这些知识呢?怎么办?其实不用太在意,最好找时间自己学习一下,对于初学者,最重要的是这些知识中的相关概念的理解,找一找,问一问,总会找到答案的。
当然,最好还是系统地去学,这样打好了基础,在往深层次发展时才不会感到步履艰难。
这就需要我们的学习下面的材料了!
1.2 初次接触凌阳单片机-SPCE061A 30 课时PPT
\61教学与创新\2教材与教案\SPCE061A教学30课时PPT 在这份PPT资料中,以图文、动画的形式向单片机爱好者展示SPCE061A的CPU特点、资源概况,各个硬件外设的工作机制以及使用方法,另外还介绍有关SPCE061A的开发工具介绍、汇编语言、极具特色的语音功能等等。
另外,这份PPT资料中,在每一页都写上了详尽的注释,在学习时留意看一下,会发现很多教材上所没有的东西的。
这个主要是提供给老师作为凌阳单片机教学和辅导来使用。
1.3 怎么样把凌阳单片机用起来呢?
学以致用,学习单片机无非就是为了使用它。
很多同学学习单片机考试通过就算OK。
实际上我们认为这种观念是要不得的。
单片机绝不是一门等同于模电、数电等科的课程。
这是一种工具,是工具就要去用。
学过C语言,我们可以在单片机用C语言对硬件进行操作,来熟悉C语言的使用;学过PID算法、模糊控制,我们就可以在水温控制、电机控制等场合去体会控制算法对被控对象的影响;学过卷积(或内积)运算,我们就可以尝试编写软件滤波算法等。
当然学过传感器了,我们还可以通过单片机对传感器采集来的数据进行处理。
可以说无论是控制、通讯、仪器仪表还是其他什么专业的内容,我们都可以使用单片机这个工具轻易的把理论和实践结合起来。
所以学习单片机就要把它看成一个平台。
单纯的单片机技术是没有什么用途的,关键是应用。
要能够动起手来做实验,需要这些东西:
1,开发板:
要使用一款单片机,开发板是必不可少的,针对SPCE061A单片机的开发板有好几种:SPCE061A精简开发板(也就是常说的61板了)、实验箱、实验仪。
而61板一般是指大家在凌阳大学计划网站上看到的小红电路板,还有一种61板叫61B板,是贴片封装的SPCE061A 精简开发板。
简单的说,只要有一块61板,就无需其它开发板设备了,当然我们还需要软件;2,软件开发工具:
要使用SPCE061A单片机,集成开发环境:unSP IDE是必不可少的;光盘中提供两个版本的集成开发环境:unSP IDE 1.16.1和最新的unSP IDE 2.0.0(\工具和开发软件)进行安装后,只要配合开发板、下载线,就可以进行在线仿真、在线调试了。
如果需要了解unSP IDE 的使用,可以在SPCE061A的教材书中找到相关的内容,或都也可以通过《unSP IDE用户手册》进行学习。
在使用unSP IDE的过程中,如果遇到使用上的问题可以到凌阳大学计划论坛
中进行讨论,也可以发邮件到unsp@ 进行咨询。
3,动手实践
开发板和集成开发环境都有了,而且都进行了一定程序上的了解,这时还要怎么做呢?当然是开始做实验了。
学习使用一款单片机,最基础的是要学会使用这款单片机的各个功能,从基础的做起,不建议新学SPCE061A单片机的朋友一开始就用一个复杂的项目去学,还是从其各个功能模块的使用学起;从I/O端口操作、定时器使用、中断等,一项一项、一步一步来。
可以通过参考\四年动手实践,同时欢迎登陆凌阳大学计划技术论坛(/dvbbs/)在那里可以与凌阳科技的工程师自由地进行交流。
1.4 当需要其他的硬件资源时?
会用SPCE061A单片机以后,在一个设计中,单片机虽然是重要的,但不是设计的全部,肯定还会涉及到外围的电路、软件的算法等;所以要成为一名优秀的电子工程师,就需要丰富的相关知识储备,有关模拟电路的、数字逻辑电路的、高频电子的,有关通信原理的、控制理论的、传感接收的知识,同时有了想做一些东西的想法,可以结合很多配套的模组,如SPLC501液晶显示模组、电机模组、超声波测距模组等等;用户可以使用这些模组配合61 板进行一些综合性的方案设计。
(\实验设备和配套模组\凌阳大学计划配套模组)
通过这一系列的学习,我们可以学会了基本的凌阳SPCE061A单片机的使用,基本可以随心所欲的搭建一些自己的方案了,在论坛中也可以称为“高手”了!。