凌阳单片机SPCE061A
4.4.SPCE061A串口

1
SIO同步串行接口为凌阳科技定义的一个串行接口, 多用于与外部设备进行数据传输。 SPCE061A也提供了一个全双工的UART接口,与 标准UART接口兼容。
2
3
SIO为凌阳科技定义的同步串行通讯接口 1位串行接口; 1个Clock(SCK)、1个Data(SDA); 可设地址位数,或无地址模式; SCK(IOB0)、SDA(IOB1)
b6 TxPinEn b5 b4 b3 b2 b1 b0 -
b7 RxPinEn 1:允通接收管脚 0:禁止接收管脚
1:允通发送管脚 0:禁止发送管脚
28
-
-
-
-
P_UART_Command2(读)(7022H)
该单元读出为UART状态信息。 第7位是RxRDY标志位,当接收到数据时该标志位被置为 “1”,读P_UART_Data单元将清除该标志位。 第6位是TxRDY标志位,该标志位被置为“1”,表示发 送器的数据缓存器为空,已准备好可以发送写入 P_UART_Data单元的数据。
0
X X X X
X
1 0 X X
X
X X 1 0
用作普通的I/O口(默认)
设置数据帧的写传输 设置数据帧的读传输(默认) 关断读/写帧的传输 接通读/写帧的传输(默认)
6
b4
b3
b1
b0
设置功能说明
Clk_Select Add_Select X X X X 0 0 1 1 X X X X 0 1 0 1 0 0 1 1 X X X X 0 1 0 1 X X X X 串行设备地址(缺省)设置为16位(A0~A15) 无地址设置 串行设备地址设置为8位(A0~A7) 串行设备地址设置为24位(A0~A23) 数据传输速率设为CPUClk/16(缺省设置) 数据传输速率设为CPUClk/4 数据传输速率设为CPUClk/8 数据传输速率设为CPUClk/32
凌阳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 低电压监测/低电压复位
凌阳SPCE061A十六位程序通过硬件反复调试

凌阳SPCE061A十六位程序(通过硬件反复调试)下面这些凌阳SPCE061A十六位单片机的程序都是我在开发板上通过硬件反复调试通过的,大家可随便拿去用,有问题可与我联系哦,我在51hei的id是ikedge. 第一个能用的程序:点亮IOA的低八位//新建一个***.asm文件.include hardware.inc; //头文件的格式.PUBLIC _main //全局.code //定义在代码段_main:r1=0x00FF[P_IOA_Dir]=r1 //方向输出r1=0x0055[P_IOA_Buffer]=r1 //输出r1=0x00FF[P_IOA_Attrib]=r1 //同向输出用4HZ的中断闪烁led.include hardware.inc;.PUBLIC _main.code_main:r1=0x00FF[P_IOA_Dir]=r1r1=0x0055[P_IOA_Buffer]=r1r1=0x00FF[P_IOA_Attrib]=r1INT IRQr3=0x0008[P_INT_Ctrl]=r3 //打开IRQ5中断//r2=0x002D//[P_TimerA_Ctrl]=r2 //选择2Hz的中断.TEXT.public _IRQ5_IRQ5:r4=0x00FF[P_IOA_Dir]=r4r4=0x00AA[P_IOA_Buffer]=r4r4=0x00FF[P_IOA_Attrib]=r4RETI;经过修改的十六位控制八位流水灯.include hardware.inc;.PUBLIC _main//.PUBLIC _loop.code_main:// r1=0x00FF// [P_IOA_Dir]=r1// r1=0x0055// [P_IOA_Buffer]=r1// r1=0x00FF// [P_IOA_Attrib]=r1r4=0x0001INT IRQ //打开中断开关r3=0x1000[P_INT_Ctrl]=r3 //打开IRQ1对应的timerA的中断[P_TimerA_Ctrl]=r2 //选择4096Hz频率自加溢出的中断//r2=0xf000 //1secondr2=0xfe57 //0.1second//r2=0xe000 //2second//r2=0xf800 //0.5second//r2=0xfffe[P_TimerA_Data]=r2 //置初值f800/634Loop_loop:r5 = 0x0001[P_Watchdog_Clear] = r5goto _loop.TEXT.public _IRQ1_IRQ1:r1=0x00FF[P_IOA_Dir]=r1r1=0x00FF[P_IOA_Attrib]=r1r4=r4 LSL 1CMP r4 ,0x0000jz _loop1jmp _loop2_loop1:r4=0x0001_loop2:[P_IOA_Data]=r4r1=0x1000[P_INT_Clear]=r1//r5 = 0x0001// [P_Watchdog_Clear] = r5 RETI;使用系统时钟计数的流水灯.include hardware.inc;.PUBLIC _main//.PUBLIC _loop.code_main:// r1=0x00FF// [P_IOA_Dir]=r1// r1=0x0055// [P_IOA_Buffer]=r1// r1=0x00FF// [P_IOA_Attrib]=r1//r1=0x0073 //fosc频率是40.96M CPU频率是fosc/8 //r1=0x0033 //fosc频率是20.48M CPU频率是fosc/8 r1=0x0013 //fosc频率是24.576M CPU频率是fosc/8 //r1=0x0063 //fosc频率是32.768M CPU频率是fosc/8//r1=0x00f3 //fosc频率是49.152M CPU频率是fosc/8//r1=0x00f0 //fosc频率是49.152M CPU频率是fosc [P_SystemClock]=r1r4=0x0001INT IRQ //打开中断开关r3=0x1000[P_INT_Ctrl]=r3 //打开IRQ1对应的timerA的中断r2=0x0031 //选择fosc/256的频率自加[P_TimerA_Ctrl]=r2 //选择4096Hz频率自加溢出的中断//r2=0xf000 //1second//r2=0xfe57 //0.1second//r2=0xe000 //2second//r2=0xf800 //0.5secondr2=0x0000[P_TimerA_Data]=r2 //置初值f800/634Loop_loop:r5 = 0x0001[P_Watchdog_Clear] = r5goto _loop.TEXT.public _IRQ1_IRQ1:r1=0x00FF[P_IOA_Dir]=r1r1=0x00FF[P_IOA_Attrib]=r1r4=r4 LSL 1r4=r4&0x00ffCMP r4 ,0x0000jz _loop1jmp _loop2_loop1:r4=0x0001_loop2:[P_IOA_Data]=r4r1=0x1000[P_INT_Clear]=r1//r5 = 0x0001// [P_Watchdog_Clear] = r5 RETI;IOB08作为PWM输出.include hardware.inc;.PUBLIC _main//.PUBLIC _loop.code_main:r1=0xFFFF[P_IOB_Dir]=r1r1=0xFFFF[P_IOB_Attrib]=r1r1=0x0000[P_IOA_Buffer]=r1//r1=0x0073 //fosc频率是40.96M CPU频率是fosc/8 //r1=0x0033 //fosc频率是20.48M CPU频率是fosc/8 r1=0x0013 //fosc频率是24.576M CPU频率是fosc/8 //r1=0x0063 //fosc频率是32.768M CPU频率是fosc/8//r1=0x00f3 //fosc频率是49.152M CPU频率是fosc/8//r1=0x00f0 //fosc频率是49.152M CPU频率是fosc [P_SystemClock]=r1r4=0x0001INT IRQ //打开中断开关r3=0x1000[P_INT_Ctrl]=r3 //打开IRQ1对应的timerA的中断r2=0x0071 //选择fosc/256的频率自加[P_TimerA_Ctrl]=r2 //选择4096Hz频率自加溢出的中断//r2=0xf000 //1second//r2=0xfe57 //0.1second//r2=0xe000 //2second//r2=0xf800 //0.5secondr2=0xfff0[P_TimerA_Data]=r2 //置初值f800/634Loop_loop:r5 = 0x0001[P_Watchdog_Clear] = r5goto _loop.TEXT.public _IRQ1_IRQ1:r1=0x00FF[P_IOA_Dir]=r1r1=0x00FF[P_IOA_Attrib]=r1r4=r4 LSL 1r4=r4&0x00ffCMP r4 ,0x0000jz _loop1jmp _loop2_loop1:r4=0x0001_loop2:[P_IOA_Data]=r4r1=0x1000[P_INT_Clear]=r1//r5 = 0x0001// [P_Watchdog_Clear] = r5RETI;// 工程名称:ADC_LINE.scs// 功能描述: 通过改变LINE_IN端口的模拟电压来改变IOB口输出的数据,// 采用自动方式即定时器A溢出执行ADC转换,可以通过发光// 二极管的点亮了解转换的数据值。
SPCE061A是凌阳公司设计的一种16位单片机

SPCE061A是凌阳公司设计的一种16位单片机,该款单片机资源丰富,具有极高的性价比,该单片机内置有2路DA转换,8路AD转换及在线仿真,并且有16×16位的乘法运算和内积运算的DSP功能,这为它进行复杂的语音数字信号的压缩编码与解码提供了便利,还可以做数字滤波器。
这些特点为我们进行在语音处理尤其是语音识别领域的应用提供了便利。
语音识别技术在各个层面均有广泛的应用前景。
电脑软件领域,例如:语音命令、语音输入,对话系统、查询系统、教学软件、游戏软件等;消费性电子产品领域,例如:电子记事本、声控玩具、语音拔号功能的手机等;工业产品领域,例如:车用移动电话、车用导航系统等;电话系统领域,例如:语音识别总机服务、语音拔号、语音订票订位等。
1 语音识别基本原理语音识别就是让机器听得懂人们所讲的话,基本框架如图1和图2所示。
图1是语音训练模型的部分:将已知的语音信号经由端点侦测(End Point Detection)及特征参数求取(Feature Extraction)而产生标准的语音参考样本。
将待测的语音信号,经与图1同样的处理步骤求得特征参数后再与前述的标准语音参考样本对比,找出最相似的参考样本作为辨识的结果。
2 语音识别分类若依使用者的限制而言可分为特定人语音与非特定人语音识别。
2.1 特定人语音识别使用特定人语音识别系统前,须先把使用者的语音参考样本存入当成比对的资料库,即特定人语音识别系统在使用前就必须先进行图1的训练学习步骤。
2.2 非特定人语音识别使用本系统前根本不需要先学习,便能直接使用。
一套最佳的语音识别系统是不须经过学习便能进行语音识别,但通常辩识率都比较低。
另外以说话方式的连续是否又可分为非连续语音识别和连续语音识别。
对于非连续语音来说,识别所说的每一个字必须分开辨认;而连续语音识别可以一般自然流利的说话方式来进行人性化的语音识别,但由于关系到相连音的问题,很难达到好的辨认效果。
凌阳SPCE061A单片机智能万用表设计

智能数字万用表的设计摘 要:本智能数字万用表由凌阳SPCE061A 单片机、MC14433——321位A/D 转换电路、自动量程转换电路、交直流转换电路和大、小电阻测量电路组成,能够对交流电压、直流电压、大电阻和小电阻进行精确测量。
使用凌阳SPCE061A 单片机作为控制模块,实现量程自动转化;使用MC14433实现A/D 转换;使用简易软键盘、凌阳SPLC501液晶显示模组实现输入和显示;使用单片机读取MC14433的数字信号来控制模拟开关,从而改变反馈电阻的大小实现档位的不同选择;本设计能够准确对被测量进行测量,所有性能指标符合要求。
关键词:数字万用表 单片机 MC14433 交直流电压测量 电阻测量一、方案论证1.交流电压的测量:由于交流电压不能直接测量,必须转换为直流电压。
转换方案有3种:方案一、热电偶测量法:根据交流有效值的物理定义来实现测量的,利用热电偶电路平衡原理通过两端的电势比较得到有效值。
但热电偶转换线性度差,且热电偶具有配对较难、响应速度慢、负载能力差等缺点。
方案二、模拟运算法:根据有效值的数学定义,用集成器件乘法器、开放器等依次对被测信号进行平方、平均、开方等计算直接得到交流输入信号的有效值。
这种方案测量的动态范围小、精度不高且输入信号的幅度变小时,平均器输出电压的平均值下降值很快、输出幅度很小。
方案三、交流整形电路:使用AD637等集成有效值转换芯片,把交流电压信号转换为幅值等于交流有效值的直流电压信号,在对直流电压进行测量,这种方案电路简单、响应速度快、失真度小、工作稳定可靠。
综上,采用方案三进行交流电压的测量。
2.小电阻的测量:由于小电阻在通入电压后发热,测量出的电阻值会产生较大的误差,对于小电路有3种方案测量:方案一、直流电桥测量法。
直流电桥又分直流单电桥和直流双电桥。
采用这两种方法测量时很多操作需要手动,并且对元件精度要求高,通过数字电位器来改变需要的电阻参数,索然可以实现数控,但数字电位器的每一级步进电阻值不确定,调节困难,用单片机处理计算复杂并且测量时操作不便。
使用SPCE061A实现的模拟交通灯控制

使用SPCE061A实现的模拟交通灯控制摘要:本文主要介绍了利用凌阳十六位SPCE061A单片机以及模拟交通灯控制板而设计的一个模拟交通灯控制的实现方案。
关键词:SPCE061A 模拟交通灯控制1 引言SPCE061A是凌阳公司设计的一种新型的十六位单片机,该款单片机资源丰富,具有极高的性价比。
该单片机内置有32位IO端口,2路D/A转换,8路A/D转换及在线仿真等丰富的功能,这些都为我们实现模拟交通灯控制提供了良好的条件。
本系统由一块61板和一块模拟交通灯控制板组成,可以模拟比较复杂的路口交通灯控制。
2 61A板电路特性简介·基本外围电阻电容;·麦克输入的电路和DAC输出的外围电路;·32个I/O口全部引出;·电源部分采用的是电池供电,也可以外接5V的稳压源,通过SPY0029稳压到3.3V;·PROBE接口在线调试;·一路DAC输出;·复位电路;·三个按键K1、K2、K3分别接IOA0、IOA1和IOA2,另一端接高电平;用于作演示,也为自己设计电路提供方便;·一个红色电源指示灯和一个绿色睡眠指示灯;·音频输出将SPEAKER的两端引出,使用者只需外接一个0.5W@8Ω的喇叭即可听到悦耳的声音。
3 系统总体方案介绍3.1 总结构框图图3.1 模拟交通灯控制系统结构图本系统由一块61板和一块自制的模拟交通灯控制板组成。
61板和模拟交通灯控制板通过排线连接。
这里先简单介绍系统的结构,具体电路请参考后面的电路原理图。
系统以一片SPCE061A为核心,检测键盘模块和流量检测模块。
根据检测结果按照程序设定的方式去控制红绿灯模块、倒计时数码管模块和放音模块。
3.2模拟交通灯控制板简介下图是模拟交通灯控制板布局示意图。
图中的表示2位7段的LED数码管(用作倒计时显示),表示双色LED(用作红黄绿灯),表示小按键(用来模拟车流)。
1.2硬体结构介绍SPCE061A单片机

输入/输出(I/O)接口
输入/输出接口(也可简称为I/O端口)是单 片机与外设交换信息的通道。输入端口负责从外界 接收检测信号、键盘信号等各种开关量信号。输出 端口负责向外界传送由内部电路产生的处理结果、 显示信息、控制命令、驱动信号等。μ’nSP™内有 并行和串行两种方式的I/O口。并行口线路成本较 高,但是传输速率也较高;串行端口的传输速率较 低但可以节省大量的线路成本。SPCE061A有两 个16位的通用并行I/O口:A口和B口。
30
看门狗Watchdog
SPCE061A的清狗周期为0.75S; 清看门狗操作寄存器:
P_Watchdog_Clear(0x7012H)
清狗操作:
在每个0.75S的清狗周期里 P_Watchdog_Clear写入0x0001。
31
看门狗结构与时序
32
SPCE061A的LVD与LVR
可通过编程设置低电压监测(LVD) 具有低电压复位功能(LVR)
Sunplus SPCE061A 微控制器
SPCE061A单片机简介
2
概述
SPCE061A为凌阳科技新推出的 unSP内核的高集成度,高性能十六 位单片机。 下面我们将从总体去了解一下这款单 片机的硬件结构;另外我们还将介绍 SPCE061A的一些基础硬件模块。
3
SPCE061A性能简介<1>
18
SPCE061A时钟电路
SPCE061A时钟电路采 用晶体振荡器。右图为 SPCE061A时钟电路的 接线图。 外接晶振采用32768Hz。 用于钟表、实时时钟延 时及其他与时间相关的 产品。
19
PLL锁相环
PLL电路的作用是将系统提供的实时时钟的 基频(32768Hz)进行倍频,输出系统时钟: Fosc 锁相环(PLL) Fosc
SPCE061A语音单片机自主实验报告

SPCE061A语音型单片机自主实验高等工程学院39032415李柏2010-10-30、11-6一、S PCE061A芯片简介SPCE061A实验箱是以台湾凌阳16位单片机SPCE061A为核心设计的实验培训系统能完成教学大纲所规定的各项基础实验和毕业设计并能感受到凌阳独具特色的语音处理功能该系统集成度高驱动能力大扩展方便语音处理功能强大是各高校学生学习凌阳单片机必备的实验工具也是验证教学从事科研专案的开发科技制作及竞赛的实用教学设备特别是其独具的语音实验处理功能为相关教学和专案研发赋予许多新的内容和功能从而更实用更符合潮流更具有竞争力。
PCE061A 是继μ’nSP™(Microcontroller and Signal Processor)系列产品SPCE500A等之后凌阳科技推出的又一款16位结构的微控制器。
与SPCE500A不同的是,在存储器资源方面考虑到用户的较少资源的需求以及便于程序调试等功能,SPCE061A里只内嵌32K字的闪存(FLASH)。
较高的处理速度使μ’nSP™能够非常容易地、快速地处理复杂的数字信号。
因此,与SPCE500A相比,以μ’nSP™为核心的SPCE061A微控制器是适用于数字语音识别应用领域产品的一种最经济的选择。
其主要性能如下,内置2K字SRAM;内置32K FLASH;具有2个16位可编程定时器/计数器(可自动预置初始计数值);2个10位DAC(数-模转换)输出通道;32位通用可编程输入/输出端口;14个中断源可来自定时器A / B,时基,2个外部时钟源输入,键唤醒等等。
使用凌阳音频编码SACM_S240方式(2.4K位/秒),能容纳210秒的语音数据;具有WatchDog功能。
图1 实验箱整体图二、工作记录10月30日主要内容:运行example文件夹中的诸多例程。
具体实验步骤:1、使用数据线连接单片机与电脑主机,单片机与电源,打开相应开关。
2、打开,进入IDE界面。
凌阳音频压缩算法--SPCE061A单片机教材书

第7章 凌阳音频压缩算法7.1 背景介绍7.1.1 音频的概述(特点、分类)我们所说的音频是指频率在20 Hz~20 kHz的声音信号,分为:波形声音、语音和音乐三种,其中波形声音就是自然界中所有的声音,是声音数字化的基础。
语音也可以表示为波形声音,但波形声音表示不出语言、语音学的内涵。
语音是对讲话声音的一次抽象。
是语言的载体,是人类社会特有的一种信息系统,是社会交际工具的符号。
音乐与语音相比更规范一些,是符号化了的声音。
但音乐不能对所有的声音进行符号化。
乐谱是符号化声音的符号组,表示比单个符号更复杂的声音信息内容。
7.1.2 数字音频的采样和量化将模拟的(连续的)声音波形数字元化(离散化),以便利数字计算机进行处理的过程,主要包括采样和量化两个方面。
数字音频的质量取决于:采样频率和量化位数这两个重要参数。
此外,声道的数目、相应的音频设备也是影响音频质量的原因。
7.1.3 音频格式的介绍音频文件通常分为两类:声音文件和MIDI文件(1)声音文件:指的是通过声音录入设备录制的原始声音,直接记录了真实声音的二进制采样数据,通常文件较大;(2)MIDI文件:它是一种音乐演奏指令序列,相当于乐谱,可以利用声音输出设备或与计算机相连的电子乐器进行演奏,由于不包含声音数据,其文件尺寸较小。
1)声音文件的格式WAVE文件——*.WAVWAVE文件使用三个参数来表示声音,它们是:采样位数、采样频率和声道数。
在计算机中采样位数一般有8位和16位两种,而采样频率一般有11025Hz(11KHz),22050Hz(22KHz)、44100Hz(44KHz)三种。
我们以单声道为例,则一般WAVE文件的比特率可达到88K~704Kbps。
具体介绍如下:(1) WAVE格式是Microsoft公司开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范;(2) 用于保存Windows平台的音频信息资源,被Windows平台及其应用程序所广泛支持。
凌阳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目前做了这么多实验,实验程序共享给大家!希望大家能够把单片机学好!^_^ ^_^ ^_^ ^_^ ^_^。
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驱动液晶1602的程序

凌阳SPCE061A驱动液晶1602的程序凌阳SPCE061A驱动液晶1602的程序/*本程序由网上两份51单片机的1602驱动程序修改而成,原来的程序不用的部分全部注释掉了。
本程序IOA0~7接1602数据端口,IOB0------RS,IOB1-----RW,IOB2------E,15,16脚不接。
1----GND 2-------VCC,*///先定义接口//# include#include "SPCE061A.H"/*****************************************P1------DB0~DB7 P2.0------RSP2.1------RWP2.2------E*****************************************//*# define LCD_DB P1sbit LCD_RS=P2^0;sbit LCD_RW=P2^1;sbit LCD_E=P2^2;*//******定义函数****************/# define uchar unsigned char# define uint unsigned int//LCD显示内容,定义到代码段uchar LcdBuf1[]= {"welcom!"};uchar LcdBuf2[]= {"MCU-STUDY-BOARD"};void LCD_init(void);//初始化函数void LCD_write_command(uchar command);//写指令函数void LCD_write_data(uchardat);//写数据函数void LCD_disp_char(ucharx,uchary,uchardat);//在某个屏幕位置上显示一个字符,X(0-16),y(1-2)//void LCD_check_busy(void);//检查忙函数。
单片机原理与应用凌阳SPCE061A教学设计

单片机原理与应用凌阳SPCE061A教学设计1. 概述单片机作为嵌入式系统的核心部件,其在各种电子设备中应用广泛。
本教学涉及的单片机型号为凌阳SPCE061A。
本教学设计旨在通过系统化的教学方式,使学生快速掌握该单片机的工作原理和应用。
2. 教学目标本教学设计旨在达到以下教学目标:•熟悉单片机工作原理•能够使用Keil软件进行开发•熟悉单片机的编程语言•能够进行基本的单片机应用开发3. 教学内容3.1 单片机原理•单片机的发展历史•单片机的分类、特点和应用领域•单片机的系统结构、工作原理及其组成部分的功能和特点3.2 单片机编程语言•单片机开发语言C和汇编语言的比较•C语言的基本语法和数据类型•C语言对单片机的控制语句和运算符的使用3.3 Keil软件开发环境•Keil软件的安装和配置•Keil仿真器的使用•Keil软件的功能和使用方法3.4 单片机应用实例•按键控制LED灯的亮灭•LED灯的闪烁和流水灯效果•蜂鸣器的发声和播放音乐4. 教学方法本教学采用“理论讲解+实践操作”相结合的方法,重点讲解单片机的工作原理和编程语言,并通过实例操作让学生更好地理解掌握。
5. 教学评价本教学采用多种评价方式,包括学习笔记、实验报告、课堂测试等。
学生需要通过这些评价方式来检测和提升自己的学习成果。
6. 教学建议针对本教学的教学内容和方式,我们建议学生在学习之前需要掌握一定的电路基础知识,同时具备一定的计算机应用能力。
7. 教学资源教学资源主要包括教学PPT、实验手册、实验材料等。
学生需要认真阅读这些教学资源,并充分利用这些资源来进行自主学习和实践操作。
8. 结语通过本教学设计的学习,相信学生们能够初步掌握单片机的工作原理和应用,同时能够通过自主学习和实践操作,不断提升自己的技术水平。
spec061a单片机

IOB 3 71
IOB 2 72
IOB 1 73
IOB 0 74
75
NC 76
VDD 77
VCO I N 78
VSS 79
80
U1 1 2 X32O 3 X32I 4 TEST 5 NC 6 VDD 7 NC 8 ICE 9 ICECLK 10 ICESDA 11 VSS 12 PVIN 13 DAC1 14 DAC2 15 V2VREF 16 AVSS 17 AGC 18 OPI 19 MICOUT 20 MICN
NC
VDDIO B
NC
IOA 8
40 VDDIOA
39 VDDIOA
VSSI O A L VSSI O A H
36 IOA 7
35 IOA 6
34 IOA 5
33 IOA 4
32 IOA 3
31 IOA 2
IOA 0 IOA 1
28 VSS
27 NC
26 VMI C
25 AVDD
24 VEXTREF
'nSP™家族有以下特点: ‹ 体积小、集成度高、可靠性好且易于扩展
北阳电子内部技术资料 1
第一章 凌阳单片机简介
2
'nSP™家族把各功能部件模块化地集成在一个芯片里,内部采用总线结构,因而减 少了各功能部件之间的连线,提高了其可靠性和抗干扰能力。另外,模块化的结构易于系 统扩展,以适应不同用户的需求。
SPCE061A 有两种封装片,一种为 84 个引脚,PLCC84 封装形式;它的排列如图 1.4所示;另一种为 80 个引脚,LQFP80 封装。它的排列如0所示。
VPP 61
NC 62
63
IOB 1 0 64
SPCE061A单片机介绍

Fosc分频,学工程训练中心
SCPE061A中断系统特点
• SPCE061A系列单片机中断系统功能 较强
✓ 十四个中断源 ✓ 两级中断优先级,两级嵌套 ✓ 每个中断源单独设置开或关
25 25
山东大学工程训练中心
SPCE061A中断类型
• 软件中断
由break产生
• 异常中断
山东大学工程训练中心
SPCE061A片内存储器映射
2K word的SRAM。
片内32K Word Flash ROM。
0X0000 0X07FF
2K SRAM
0X0800 0X6FFF
保留空间
0X7000 I/O端口
0X7FFF 系统端口
0X8000
32K FLASH ROM
0XFFF5
0XFFF6 中断向量
28
山东大学工程训练中心
看门狗Watchdog
• 什么是看门狗(Watchdog):
一般MCU的看门狗相当于一个定时器,如果每隔 一定时间不刷新定时器,它将溢出;而且大多数 情况下溢出将复位系统。
• 有什么用:
✓错误恢复的“最后手段”; ✓降低间歇故障的有效手段; ✓提高整个系统的可靠性。
29
山东大学工程训练中心
b0 0 1 0 1 0 1 0 1
CPUCLK Fosc Fosc/2 Fosc/4 Fosc/8 Fosc/16 Fosc/32 Fosc/64
停止(睡眠状态)
22
山东大学工程训练中心
PLL设置对照表
b7
b6
b5
Fosc
0
0
0
20.48MHz
0
0
1
24.576MHz
spce061a单片机

SPCE061A芯片的引脚 SPCE061A芯片的引脚
SPCE061A芯片的引脚 SPCE061A芯片的引脚
SPCE061A特性参数 SPCE061A特性参数
SPCE061A特性参数 SPCE061A特性参数
SPCE061A精简开发板 SPCE061A精简开发板
SPCE061A精简开发板 SPCE061A精简开发板
SPCE061A精简开发板(简称61板),是以凌阳16位单片机SPCE061A为核心的 精简开发-仿真-实验板,大小相当于一张扑克牌,是“凌阳科技大学计划” 专为大学生、电子爱好者等进行电子实习、课程设计、毕业设计、电子制作 及电子竞赛所设计的,也可作为单片机项目初期研发使用。61板除了具备单片 机最小系统电路外,还包括有电源电路、音频电路(含Mic输入部分和DAC音 频输出部分)、复位电路等,采用电池供电,方便学生随身携带!使学生在 掌握软件的同时,熟悉单片机硬件的设计制作,锻炼学生的动手能力,也为 单片机学习者和开发者创造了一个良好的学习条件和开发新产品的机会!61板 上有调试器接口(Probe接口)以及下载线(EZ_Probe)接口,分别可接凌阳 科技的在线调试器、简易下载线,配合unSP IDE,可方便地在板上实现程序 的下载、在线仿真调试。 61板上的主要功能模块如下: 1. SPCE061A单片机最小系统外围电路模块; SPCE061A单片机最小系统外围电路模块; 2. 电源输入模块; 3. 音频电路(包含Mic输入、DAC音频功放输出)模块; 音频电路(包含Mic输入、DAC音频功放输出)模块; 4. 按键模块; 5. I/O端口接口模块; I/O端口接口模块; 6. 调试、下载接口模块;
红外测温计的设计
SPCE061A IDE工具介绍精品PPT课件

Ø 浏览找到sacmv26e.lib库文件 Ø 选择“确定”
μ’nSP IDE库文件的加载<3> 选择setting 菜单
➢ 寄存器(Register)窗口 ➢ 存储器(Memory)窗口 ➢ 变量观察(Watch)窗口
μ’nSP IDE DEBUG窗口<2>
➢ 寄存器(register)窗口
Ø 【功能】寄存器(register)窗口,是为了在 程序调试中“监测”程序中用到的寄存器的变 化,并且可以观察状态标志N、Z、S、C的变 化,还可以在软件仿真的时候观察到每条指令 的Cycle数。如图所示:
μ’nSP IDE库文件的加载<2>
➢ 常用库文件
Ø 音频库
sacmv26e.lib
Ø 宏定义库
CMacro.lib
Ø 语音识别库
bsrv222SDL.lib
Ø 标准C函数库
clib100.lib。。。 。。。
μ’nSP IDE库文件的加载<3>
➢ 举例介绍语音电压表程序中加载音频 库sa下cm面v我26们e看.li一b的下方操作法步。骤!
Ø μ’nSP IDE集成开发环境集程序的编辑、编译、 链接、调试以及仿真等功能为一体。
μ’nSP IDE工具介绍<2>
μ’nSP IDE 总体概述<1>
➢ SPCE061A为凌阳16位单S片PC机E0中61A的一款。
unSP IDE快
➢ μ’nSP IDE集成开发环境同样支持SPCE捷0图6标1A的 开发、调试和仿真。
Sunplus SPCE061A 微控制器
解读SPCE061A单片机语音控制电风扇电路

解读SPCE061A单片机语音控制电风扇电路随着电子业的发展,智能化家电将是发展的必然趋势,语音控制也必将进入实用阶段。
在现有市场上多功能电风扇的基础上,我们提出了一种新型的语音智能电风扇,使电风扇更加人性化。
本设计以凌阳16位SPCE061A单片机为核心,设计完成了一个语音控制智能电风扇。
随着人们生活水平的提高,人们也不再满足手动的那些机械方面的操作,只要站在房间的某个角落,通过人的语音识别与控制,就能实现对电风扇的控制,这种功能方便了人们的生活,特别是对于残疾人更加方便快捷,易于使用。
值得今后市场的大面积普及,研究语音控制电风扇具有广阔的应用前景。
操作人发出语音指令,系统接受后在内部进行处理、查询,产生响应控制信号,从而控制PWM口的脉宽来调节可控硅的导通角大小,从而实现电机调速的目的。
根据开始录制的语音命令来控制风扇的启动、加快转速,减小转速,匀速运行等。
系统总体框图如下:系统总体框图图中的语音输入部分MIC_IN、滤波电路、声音输出部分的功率放大环节等已经做到了精简开发板61板上,为我们使用提供了方便。
在电机的驱动方面,通过单片机的PWM触发脉冲宽度来直接控制晶闸管来控制速度。
麦克风录音输入ADC及AGC电路凌阳的SPCE061A是16位单片机,具有DSP功能,其中内嵌有高速AD转换器,有很强的信息处理能力,最高时钟可达到49M,具备运算速度高的优势等等,这为语音的播放、录放、合成及辨识提供了条件。
本系统接入MIC 电路,MIC 为录制语音辨识命令服务。
MIC 采集的语言先通过内置自动增益控制放大器,再经过SPCE061A 内置的八通道10 位模数转换器转换位数字量信号,硬件ADC 最高采样速率可达96KHZ。
电机驱动电路对该部分电路的设计,主要应解决两个问题:弱电(凌阳单片机系统)和强电(AC220V)的隔离。
对此,采用了如下图所示的电路,其中MOC3041 是具有双向晶闸管输出的光电隔离器,T1 是功率双向可控硅,RL 是负载,在MOC3041 内部不仅有发光二极管,而且还有过零检测电路和一个小功率双向可控硅。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SCPE061A中断系统特点
SPCE061A系列单片机中断系统功能较强
十四个中断源 两级中断优先级,两级嵌套 每个中断源单独设置开或关
SPCE061A中断类型
软件中断
由break产生
异常中断
在SPCE061A中只有复位
事件中断
IRQ、FIQ中断
SPCE061A中断源<1>
中断源
Fosc/1024中断 PWM INT
+
ICE
RAM
VCP XI/R XO CPU时钟 锁相环 振荡器 实时时钟 7通道10位ADC 单通道ADC+AGC MIC_IN
低电压监测/ 低电压复位 Watchdog
双通道 10位DAC
AUD1 AUD2
串行异步通讯接口
IOB7(RXD) IOB10(TXD)
串行输入输出接口
IOB0 (SCK) IOB1(SDA)
VCP XI/R XO CPU时钟 锁相环 振荡器 实时时钟 7通道10位ADC 单通道ADC+AGC MIC_IN
低电压监测/ 低电压复位 Watchdog
双通道 10位DAC
AUD1 AUD2
串行异步通讯接口
IOB7(RXD) IOB10(TXD)
串行输入输出接口
IOB0 (SCK) IOB1(SDA)
32 管脚通用输入输出端口
IOA15 - 0
IOB15 - 0
SPCE061A片内存储器映射
0X0000 RAM、ROM统一编 0X07FF 0X0800 址。 0X6FFF 2K word的SRAM。0X7000 2K SRAM 保留空间 I/O端口 系统端口 0X7FFF 0X8000 32K FLASH ROM 0XFFF5 0XFFF6 中断向量 0XFFFF
Timer A结构
多种时钟源输入,定时灵活度大
Fosc /2 000 Fosc/ 256 001 32768Hz 010 8192Hz 011 ClkA 4096Hz 100 选择 1 101 0* 110 EXT1 111 P_TimeA_Ctrl 2048Hz 1024Hz 256Hz TMB1 4Hz 2Hz 1 EXT2 4位计数器 TA_TimeOut 000 001 010 011 ClkB 100 选择 101 110 111 APWMO 4位半加器 /2 ClkA 16位定时器/计数器 ClkB P_TimeA_Data 预置 16位寄存器 自动 重预置 TA_TimeOut / 2 至中断系统 TA_TimeOut_ INT
中断优先级 FIQ/IRQ0 FIQ/IRQ1 FIQ/IRQ2 IRQ3
中断向量
FFF6H/FFF8H FFF6H/FFF9H FFF6H/FFFAH FFFBH
保留字 _FIQ/_IRQ0 _FIQ/_IRQ1 _FIQ/_IRQ2 _IRQ3
TimerA中断 TimerB中断 外部中断EXT2 外部中断EXT1 触键唤醒中断 4096Hz时基 2048Hz时基 1024Hz时基
RAM&ROM
u'nSP内核
DTMF
WatchDog IR SIO
UART LVD/LVR
展望unSP
• 智能家电 • 移动图像终端
•网关、网络家电 网关、 网关
TFT LCD 电视 数码相机 DVD/VCD
智能玩具
玩具 其他
unSP内核架构
16
数据总线
16位数据总线 22位地址总线 算数逻辑单元ALU 通用型寄存器 R1~R4 专用型寄存器 多路选择开关 MUX 移位器SHIFTER
P_TimeA_Ctrl 输出脉宽比控制
TAON
P_TimeA_Ctrl
Timer B结构
ClkA 16位定时器/计数器 Fosc /2 Fosc/ 256 32768Hz 8192Hz 4096Hz 1 0* EXT1 至中断系统 000 001 010 011 ClkA 100 选择 101 110 111 P_TimeB_Data 预置 16位寄存器 自动 重预置 4位计数器 TB_TimeOut BPWMO 4位半加器 /2 TB_TimeOut / 2 TB_TimeOut_ INT
凌阳单片机
SPCE061A
单片机基本概念
——什么是单片机 什么是单片机 所谓单片机(Single Chip Microcomputer), 是指在一块芯片中集成有中央处理器(CPU)、 存储器(RAM和ROM)、基本I/O接口以及定 时器、计数器等部件,并具有独立指令系统 的智能器件,即在一块芯片上实现一台微型 计算机的基本功能。 特点是:体积小,控制功能强,性价比高等
低电压的原因(电压反跳、负载过重、电池 电量不足) 低电压监测(Low Voltage Detect) 低电压复位(Low Voltage Reset)
目的是为了通过对系统的电源电压进行监控,而使 系统运行在一个正常、可靠的工作环境,并在一旦 出现电源异常的情况下能立即采取相应的措施,使 系统及时恢复正常。
P_TimeB_Ctrl P_TimeB_Ctrl
TBON 输出脉宽比控制
Timer A与Timer B
Timer A
通用计数器 时钟源A和时钟源B进行“与”操作而形成 IRQ1/FIQ
Timer B
多功能计数器 时钟源仅为时钟源A IRQ1/FIQ
中断的几个概念
中断定义 中断源 中断优先级 中断嵌套
片内PLL倍频RTC 提供Fosc Fosc
b2 b1 b0 系统时钟选频P_SystemClock单元的第2,1,0位
Fosc分频,最终提供CPUCLK CPUCLK
SPCE061A的定时器/计数器
两个16位的定时/计数器:TimerA和TimerB 定时器溢出信号触发IRQ/FIQ中断 定时器溢出信号触发ADC或锁存DAC数据 递增计数方式 自动重载定时器/计数器初始值 输出4位可调脉宽比PWM信号 溢出频率/2的方波输出 多种时钟源输入
IOB口
外部中断输入 串行接口、 PWM输出等复用端口
I/O端口结构
上下拉与悬浮
悬浮输入: 悬浮输入 接其它IC的输出,如此不会 影响速度
VDD
VDD
下拉输入: 下拉输入 有效电平为高且大部分的 状态为低 假设外接key,且高电平时作用。 可以少接一下拉电阻.节省成本与加 工。 上拉输入:有效电平为低且大部分的 上拉输入 状态为高 假设外接key,且低电平时作用。 可以少接一上拉电阻.节省成本与加 工。
SPCE061A
上拉 电阻 下拉 电阻
端口
端口
SPCE061A
同相输出端口结构
I/O A/B口输出
Data 读入 端口
带缓冲输出口
串行口
SIO同步串行接口为凌阳科技定义的一个串 行接口,多用于在电路板之内扩展片外的独 立存储器,借助IOB0作为时钟端(SCK), IOB1作为数据端口(SDA)。 还有一个全双工的异步UART接口模块,用 于多机形成的分布式控制系统,或系统之间 的通信和连网,只需外引两条信号线 IOB7(Rx),IOB10(Tx)。
unSP产品结构
围绕unSP unSP所形成 unSP 的16位unSP unSP系列单片 unSP 机采用的是模块式集成 结构,它以unSP unSP内核 unSP 为中心,集成不同规模 的ROM、RAM和功能 丰富的各种外设接口部 件。
并行I/O ADC DAC & PWM T/C
LCD 控制/驱动 驱动
8通道10位模-数转换器。 7个通道(Line_IN)用于将模拟量信号转换 为数字量信号, 可以直接通过引线(IOA[0~6]) 输入。 1个通道只作为语音输入通道,通过内置有自 动增益控制放大器的麦克风通道(MIC_IN)输 入。
ADC转换过程
启动自动方式 RDY=0 SAR = 10 0000 0000B
锁相环(PLL) 系统时钟发生器 32768Hz晶振
Fosc (默认值24.576MHz)
频率:20.48M,24.576M, 20.48M,24.576M, SPCE061A的时钟 32.768M,40.96M,49.152M
32768Hz RTC(Real Time Clock) RTC
Fosc CPU时钟 b7 b6 b5 Fosc/n (默认值24.576Hz) (默认值:Fosc/8) 系统时钟选频P_SystemClock单元的第7,6,5位 n:1,2,4,8,16,32,64
DAC0输出Vdac0 与Vin逐次比较
比较结束,RDY=1 结果存入结果寄存器
等待读取结果寄存器
SPCE061A的DAC
两路10DAC(DAC1、DAC2) AUD1和AUD2管脚输出 电流型DAC
0~3mA Vdd = 3.3V 0~2mA Vdd = 3.3V
看门狗Watchdog
什么是看门狗(Watchdog)?
低电压复位(LVR)
通过某种方式,使单 片机内存各寄存器的 值变为初始的操作称 为复位。 SPCE061A的复位方 式为低电压复位。
SPCE061A片内结构
ICE_EN ICE_SCK ICE_SDA 16 位微 控制器 u'nSP FLASH 双16位定时器 /计数器 时基 中断控制
+
ICE
RAM
SP R1 R2 R3 R4 BP(R5) SR PC
MUX SHIFTER
16
ALU
0 5 6 9 10 15
CS
6
NZSC
DS
6 6
MUX
ADDR[21:0] 地址总线
ADDRGEN
ICE_EN ICE_SCK ICE_SDA
16 位微 控制器 u'nSP