资源描述
基于STM32的信号发生器设计
【摘 要】本系统以单片机STM32F107为控制核心,通过按键输入所需波形参数的数字量,然后由STM32F107自带的DA把数字量转换成模拟量来调整波形的幅值、频率及方波的占空比;电压步进100mV,频率步进50Hz,方波占空比可调;按键应用的是独立按键,用来切换波形、时钟,幅值,频率以及占空比;其频率的调解就是调节其中断间隔的时间,幅值就是调节其数字的大小;为了波形的合成,采用的点的个数都是128个;显示部分采用TFT液晶,实时显示其波形名称,幅值、频率以及占空比参数变化。
关键字: 信号发生器设计;三相 ;STM32;DA转换
目录
前言 1
1设计任务 2
1.1 波形发生器系统的设计指标 2
1.2基本要求 2
2设计方案 3
2.1 信号产生部分 3
2.2 幅度进行调整部分 3
2.3 对频率调整部分 4
3系统整体设计 5
3.1 系统总框图 5
3.2 各模块功能 5
3.2.1 波形产生电路 5
3.2.2 按键部分 5
3.2.3 显示部分 5
3.2.4 DAC转换器 6
4各个模块的实现及分析 7
4.1 正弦波的产生 7
4.2 三角波的产生 7
4.3 方波的产生 7
4.4 幅度的控制 7
4.5 频率的控制 7
4.6 按键模块 8
4.7 RTC的设置 8
5 软件设计 10
6调试部分 11
6.1控制电路的调试 11
6.2硬件电路的调试 11
7系统测试与数据分析 12
7.1 正弦波、方波和三角波的频率测试 12
7.2 正弦波、方波和三角波的幅值测试 12
7.3 方波占空比测试 12
总结 14
参考文献 15
附录 信号发生器各模块的程序 16
前言
信号发生器作为一种历史悠久的测量仪器,早在20年代电子设备刚出现时就产生了。随着通信和雷达技术的发展,40年代出现了主要用于测试各种接收机的标准信号发生器,使得信号发生器从定性分析的测试仪器发展成定量分析的测量仪器。同时还出现了可用来测量脉冲电路或作脉冲调制器的脉冲信号发生器。
自60年代以来信号发生器有了迅速的发展,出现了函数发生器。这个时期的信号发生器多采用模拟电子技术,由分立元件或模拟集成电路构成,其电路结构复杂,且仅能产生正弦波、方波、锯齿波和三角波等几种简单波形。
自从70年代微处理器出现以后,利用微处理器、模数转换器和数模转换器,硬件和软件使信号发生器的功能扩大,产生比较复杂的波形。这时期的信号发生器多以软件为主,实质是采用微处理器对D/A的程序控制,就可以得到各种简单的波形。
在80年代以后,数字技术日益成熟,信号发生器绝大部分不再使用机械驱动而采用数字电路,从一个频率基准有数字合成电路产生可变频率信号。
90年代末出现了集中真正高性能的函数信号发生器,HP公司推出了型号为HP770S的信号模拟装置系统,它是由HP8770A任意波形数字化和HP1770A波形发生软件组成。
信号发生器技术发展至今,引导技术潮流的仍是国外的几大仪器公司,如日本横河、Agilent、Tektronix等。美国的FLUKE公司的FLUKE-25型函数发生器是现有的测试仪器中最具多样性功能的几种仪器之一,它和频率计数器组合在一起,在任何条件下都可以给出很高的波形质量,能给出低失真的正弦波和三角波,还能给出过冲很小的快沿方波,其最高频率可达到5MHz,最大输出幅度可达到10Vpp。 国内也有不少公司已经有了类似的仪器。如南京盛普仪器科技有限公司的SPF120DDS信号发生器,华高仪器生产的HG1600H型数字合成函数\任意波形信号发生器。国内信号发生器起步晚,但发展至今,已经渐渐跟上国际的脚步,能够利用高新技术开发出达到国际水平的高性能多功能信号发生器。
信号发生器在生产实践和科技领域中有着广泛的应用,各种波形曲线均可用三角函数方程式来表达。函数信号发生器是各种测试和实验过程中不可缺少的工具,在通信、测量、雷达、控制教学等领域应用十分广泛。不论是在生产、科研还是在教学上,信号发生器都是电子工程师信号仿真实验的最佳工具。而且,信号发生器的设计方法多,设计技术也越来越先进,随着我国经济和科技的发展,对对应的测试仪器和测试手段也提出了更高的要求,信号发生器已成为测试仪器中至关重要的一类,因此,开发信号发生器具有重大意义。
1设计任务
1.1 波形发生器系统的设计指标
设计完成一个频率振幅可调的正弦波、方波和三角波信号发生器。
1.2基本要求
(1) 根据ADC的值(8位)来设定输出信号的幅值,幅值范围0-3.3V,设定的幅值显示在LCD上。
(2)输出信号的频率范围为100Hz-1KHz,128个点。
(3)可通过按键或触摸笔切换输出信号类型。
2设计方案
2.1 信号产生部分
方案一:采用模拟分立元件或单片压控函数发生器,可以产生正弦波、方波、三角波,通过调整外部元件可以改变输出频率,但采用模拟元器件由于元件分散性太大,因而产生频率稳定性较差,精度低,地抗干扰能力低,成本高,而且灵活心性较差,不能实现任意波形以及波形运算输出等智能化的功能。
方案二:使用集成函数发生器芯片ICL8038。
芯片ICL8032能输出方波、三角波、正弦波和锯齿波四种不同的波形,将他作为信号发生器。它是电压控制频率的集成芯片,失真度很低。可输入不同的外部电压来实现不同的频率输出。为了达到数控的目的,可用高度的DAC来输出电压以控制正弦波的频率。
方案三:采用锁相式频率合成方案,锁相式频率合成一个高稳定度和精确度的大量离散技术,他在一定程度上解决了既要频率稳定精确又要频率在较大的范围内可调的矛盾,但是频率受VCO可便频率范围的影响,高低频率比不可能做的很高,而且只能产生正弦波或方波。
方案四:直接数字频率合成技术(DDS)。
DDS是一种纯数字化方法。它现将所需正弦波一个周期的离散样点的幅值数字量存入ROM中,然后按一定的地址间隔读出,并经DA转换器形成模拟正弦波,再经低通滤波器得到质量较好的信号。
方案五:利用函数将波形的点数据保存在芯片的RAM中,根据所要的波形的频率计算出它的周期,经计算得到在定时器定时时间固定的前提下产生一个完整的波形所需要的输出的点数,这样数据指针可以根据点数的数量来进行移动,得到频率准确、切换快速的信号。
VCO不能实现稳定频率信号的输出并且难于数字控制。并且电容、电阻参数随温度等其他因素的影响,频率稳定度以及电路的稳定度都较低,实现也比较复杂,不予采纳。虽然ICL8038可很好的实现频率输出的控制,但查看ICL8038的设计资料可知频率输出范闹为0.01Hz~1kHz不能达到题目的要求,故不予选用。PLL方案和DDS方案都能实现100Hz~1KHz的稳定的信号输出,.且能达到较小的频率步进,但是PLL的动态特性却很差,在频率改变时,环路从小稳定到稳定的过程有时间问延迟。相比较而言,DDS 的频率输出范围一般低于PLL,且杂散也大于PLL方案,但DDS信号源具有输出频率稳定度高、精度更高、分辨率更高且易于程控等优点,且频率改变不存在失调过程,尽管有杂散干扰,只需在输出级加滤波器仍可以得到质量很好的波形。而方案五集中了上述四个方案的各个优点,因此采用方案五来实现波形信号的产生。
2.2 幅度进行调整部分
方案一:用高速模拟乘法器实现
采用AD835高速模拟乘法器,来实现模拟调制。模拟乘法器AD835的-3dB截止频率为250MHz,能够满足题日的要求。但是AD835的差分输入范围仅为±1V,因此必须对输入信号进行预处理,这样在增加硬件的同时,又加大了设计的难度。
方案二:采用高速的D/A转换器
在STM32f107中集成着一个高速的D/A转换器,我们可以直接在软件中设置一个幅度的参数来改变输出波形的幅度大小。
综上所述,采用方案二,虽然增加了软件的难度,延迟了波形的输出时问,但是可以不用外加硬件拓展,节省了成本。
2.3 对频率调整部分
方案一:通过在存储芯片ROM中保存不同频率信号的信号发生点数,在频率切换时调用ROM中所存储的不同点数模块来实现频率的切换。
方案二:在存储芯片RAM中保存由软件实时产生的波形点数,通过所取的点数的不同来决定发生的波形的频率。
由于设计中的信号要进行不断的改变,因此波形的数据不能存储在ROM中,应该存储RAM中,因此采用方案二的设计方法。
3系统整体设计
3.1 系统总框图
如图1所示为系统总框图。
图1 系统总框图
3.2 各模块功能
3.2.1 波形产生电路
通过软件将波形数据存储到RAM当中去,再把这些数据输送到D/A转换器进行转换得到模拟波形。
3.2.2 按键部分
用STM32F107开发板上自身带有的键盘得到键值,通过中断服务程序将键值信息传给控制芯片。
3.2.3 显示部分
波形直接在示波器上显示,波形的中间调试参数在液晶屏上显示。
液晶原题图如图2所示。
图2 液晶原题图
3.2.4 DAC转换器
数字/模拟转换模块(DAC)是12位数字输入,电压输出的数字/模拟转换器。DAC可以配置为8位或12位模式,也可以与DMA控制器配合使用。DAC工作在12位模式时,数据可以设置成左对齐或右对齐。DAC模块有2个输出通道,每个通道都有单独的转换器。在双DAC模式下,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。DAC可以通过引脚输入参考电压VREF+以获得更精确的转换结果。
DAC主要特征
● 2个DAC转换器:每个转换器对应1个输出通道
● 8位或者12位单调输出
● 12位模式下数据左对齐或者右对齐
● 同步更新功能
● 噪声波形生成
● 三角波形生成
● 双DAC通道同时或者分别转换
● 每个通道都有DMA功能
● 外部触发转换
● 输入参考电压VREF+
DAC输出电压:数字输入经过DAC被线性地转换为模拟电压输出,其范围为0到VREF+。 任一DAC通道引脚上的输出电压满足下面的关系:
DAC输出 = VREF x (DOR / 4095)
单个DAC通道的框图如下图3所示。
图3 单个DAC通道的框图
4各个模块的实现及分析
4.1 正弦波的产生
本设计中信号的产生直接用STM32F107芯片上集成的D/A转换器和软件的结合来生成。波形的信号数据采用了函数计算的方法来取得:
Y=sin(N) (4-1)
其中,N表示所要取得的点数的多少。在设计中我选择N=128,即一个完整的基本的正弦信号有128个数据信号点组成。将数据存储到控制芯片STM32F107的RAM当中,根据所要的频率来取得信号数据的多少,点数多少的计算如下:
N=T/2t (4-2)
其中,N表示点数,T表示所要产生的波形信号的周期,t表示定时器的时问长短,从RAM中取得点数的间隔为:
M=128/N (4-3)
其中M表示在RAM中的表格取得点数的间隔,根据不同的间隔的大小决定产生一个完整的波形信号所要的数据多少不同。
设计中要求信号的最高产生的频率为1KHZ,根据条奎斯特定理,采样的频率最少要为所要信号的频率的两倍,但是为了更好的保证信号的完整输出,我们至少要让它采样10个点才能输出完整波形,就要求采样的频率为他的10倍即10KHZ.采样时间的大小为100us。
4.2 三角波的产生
在设计中,三角波的产生就直接利用定时器定时时间的长短来控制信号数据的输出,信号数据从一个较低(或高)的位置开始按照一定的规律步进,当其达到一个高度时再按照相同的步进下降到原来的数据大小,如此反复的输出就构成了三角波模拟信号的输出。
4.3 方波的产生
在设计中,方波的产生由大小不同的两个信号数据交替输出形成,每个信号数据输出的时间长短根据所要点信号频率来决定。
4.4 幅度的控制
在设计中,为了能使波形在示波器中显示,这样就要设定好波形的幅度,在设计时我把波形的幅度控制在128之内,才能很好的显示波形。同时为了改变幅度的大小,我设置了一个参数直接与所取得的信号数据相乘,这就改变了信号数据的大小,也就使得D/A转换时的数据大小产生变化,从而体现在输出的信号波形在幅度上发生改变。
4.5 频率的控制
在输出的信号数据的时间间隔一定时,当产生一个完整波形时所需要的点数发生变化时信号的周期就发生变化,这样它的频率就相应的变化。因此,在设计中,通过固定定时器的定时长短,改变波形数据的点数多少就改变了信号的频率。
4.6 按键模块
按键是直接与STM32F107芯片的PC4、PB10、PC13、PA0连接,通过ARM芯片对引脚输入数据,0表示有效,l表示无效。键l用来选择输出波形,键2用来改变波的幅值,键3用来改变波形的频率,键4用来改变方波的占空比。按键原理图如图4所示。
图4 按键原理图
4.7 RTC的设置
RTC( Real-time clock)是实时时钟的意思。神舟IV号开发板的处理器STM32F107集成了RTC( Real-time clock)实时时钟,在处理器复位或系统掉电但有实时时钟电池的情况下,能维持系统当前的时间和日期的准确性。实时时钟是一个独立的定时器。RTC实时时钟模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。
RTC由两个主要部分组成。第一部分(APB1接口),用来和APB1总线相连。此单元还包含一组16位寄存器,可通过APBI总线对其进行读写操作APBI接口由APB1总线时钟驱动,用来与APBI总线接口。另一部分(RTC核心)由一组可编程计数器组成,分成两个主要模块。第一个模块是RTC的预分频模块,它可编程产生最长为1秒的RTC时间基准TR_CLK。RTC的预分频模块包含了一个20位的可编程分频器(RTC预分频器)。如果在RTC_CR寄存器中设置了相应的允许位,则在每个TR CLK周期中RTC产生一个中断(秒中断)。第二个模块是一个32位的可编程计数器,可被初始化为当前的系统时间。系统时间按TR CLK周期累加并与存储在RTC ALR寄存器中的可编程时间相比较,如果RTC_CR控制寄存器中设置了相应允许位,比较匹配时将产生一个闹钟中断。图5为简化的RTC框图 。
图5简化的RTC框图
5 软件设计
本系统的软件设计采用C语言,对ARM7进行编程实现各项功能。采用KEIL软件编写,可以实现波形的切换、幅度频率的调节以及方波的占空比调节、液晶显示等功能。主程序主要起到一个导向和决策功能,决定什么时候系统采取何种动作。其余各种功能的实现主要通过具体的子程序来完成。
系统总流程图如图6所示。
图6 系统总流程图
6调试部分
6.1控制电路的调试
对控制电路进行时序仿真,在仿真图中几乎总会出现我们所不需要的毛刺,这些毛刺有时会给系统带来致命的影响,我们必须采取措施消除这样的毛刺。由于毛刺一般出现在信号发生电平转换的时刻,也即输出信号的建立时间内,而在输出信号的保持时间内不大会出现。因此,若带有毛刺的信号持续时间较长,我们可在输出信号的持续时间内用一定宽度的高电平脉冲选通一个与门来获得该信号,此时毛刺自然已被消除。高电平脉冲可由软件控制锁存器来得到。若带有毛刺的信号保持时间较短,可利用D触发器的D输入端对毛刺不敏感的特点,在输出信号的保持时间内用触发器读取输出信号,此时毛刺自然也已被消除,触发器的时钟沿可由软件控制地址译码器来得到。
另外 ,在某些情况下,需要对信号进行一定的延时,以完成特定的功能。利用D触发器可在时钟的控制下对信号进行比较精确的延时,这种方法的最小延时是半个时钟周期。延时也是消除毛刺的手段之一。
6.2硬件电路的调试
在硬件电路调试中,要注意焊接的艺术和元件的布局,让整体显得美观。不能出现漏焊、错焊等现象。在烧录入程序之后,对电路进行测试,看电路是否能达到预期的功能。如果不能,则要进行程序的调试,并检测电路连接、元件使用等方面的问题,努力排除故障,让系统功能实现。
7系统测试与数据分析
7.1 正弦波、方波和三角波的频率测试
幅值调至1.0V
正弦波、方波和三角波的频率测试结果如表1所示。
表1 正弦波、方波和三角波的频率测试结果
7.2 正弦波、方波和三角波的幅值测试
频率调至500Hz
正弦波、方波和三角波的幅值测试结果如表2所示。
表2 正弦波、方波和三角波的幅值测试结果
7.3 方波占空比测试
幅值调至1.0V 频率调至500Hz
方波占空比测试结果如表3所示。
表3 方波占空比测试结果
总结
通过这次基于STM32的信号发生器设计,让我对数字信号的产生、调节以及DA转换原理有了更加深刻的了解,除此之外,对M3内核的了解以及STM32F107板上资源的了解与运用又更加娴熟了一步。在测试阶段,尤其是在方案选择以及程序的编写上,有很深的体会,有时候一个简单的错误就有可能造成致命错误,导致信号无法正常产生。通过本次课程设计,我更加深刻的认识到团队合作的重要性,在刚开始设计的时候由于对信号的产生不太熟悉,到处收集资料选择方案,致使耽误很多时间,之后与同学商量,一起探讨。最后成功设计出所需波形,完成任务。所以说合作,是设计成功的关键,只有大家团结一致,才能更快更好的完成任务。
参考文献
[1] 康华光.电子技术基础模拟部分第四版[M].北京:高等教育出版社,1999.6. [2] 阎石.数字电子技术基础第四版[M].北京:高等教育出版社,1999.6.
[3]王福瑞等.单片微机测控系统设计大全[M].北京航空航天大学出版社,1998(331-337).
[4]宁改娣,杨拴科.DSP控制器原理及应用[M].科学出版社,2002.
[5] 周立功等.ARM嵌入式系统基础教程[M].北京:北京航空航天大学出版社,2005.1.
[6] 周立功等.ARM嵌入式系统实验教程[M].北京:北京航空航天大学出版社,2005.1.
[7] 唐清善.Protel DXP高级实例教程[M].中国水利水电出版社,2004.4.
[8] 罗浩等.一种新的基于ARM的数据采集系统设计[J].信阳师范学院学报(自然科学版),2006.4.
[9] 秦伟等.基于ARM 处理器的数据采集系统的设计[J].自动化技术与应用.2006 年第10 期.
[10] 杜春雷.ARM体系结构与编程.清华大学出版社,2003.
[11] 李宁.ARM开发工具ReaIView MDK使用入门[M].北京航空航天大学出版社,2008.
[12] 李宁.基于MDK的STM32处理器开发应用[M].北京航空航天大学出版社,2008.
[13]刘黎明等.单片机与嵌入式系统应用[J].英文刊名MICROCON TROLLER&EMBEDDED SYSTEM. 2002(7).
附录 信号发生器各模块的程序
/*----------------------------------------------------------------------------
* 功 能 :STM32 DAC 数模转换(正弦波/矩形波/三角波)输出实验
* 说 明 :按 SW5 输出正弦波 / 按 SW4 输出矩形波 / 按 SW3 输出三角波, 输出端口 PA4
*----------------------------------------------------------------------------*/
#include <stdio.h>
#include <stm32f10x_lib.h> // STM32F10x Library Definitions
#include "STM32_Reg.h" // STM32 register and bit Definitions
#include "STM32_Init.h" // STM32 Initialization
#include "common.h"
#include "sine_wave_1024.h"
// 输出端口 : PA4
#define SINE_WAVE 1//sine 正弦波
#define RECT_WAVE 2//rectangular 矩形波
#define HACKLE_WAVE 3//hackle 三角波
UINT8 flag = 0;
UINT8 func = SINE_WAVE;
/*----------------------------------------------------------------------------
MAIN function
*----------------------------------------------------------------------------*/
int main (void)
{
UINT16 i = 0;
UINT32 *pDAC_BASE = (UINT32 *)DAC_BASE;
stm32_Init(); // STM32 setup
LED_Init();
//打开DAC时钟使能
RCC->APB1ENR |= (UINT32)(1 << 29);
//设置DAC控制参数 *(pDAC_BASE + 0x00) = (0x01 << 0)| (0x00 << 2) | (0x04 << 3) | (0x03 << 6) | (0x0b << 8);
*(pDAC_BASE + 0x04) = 0x01
printf(" --------------- Program start --------------- \r\n");
while (TRUE) // Loop forever
{
if(!Get_SW5())
{
func = SINE_WAVE;
}
else if(!Get_SW4())
{
func = RECT_WAVE;
}
else if(!Get_SW3())
{
func = HACKLE_WAVE;
}
switch(func)
{
case SINE_WAVE:
//-------------------------------------------------------------
#ifdef SINE_WAVE
if(i < 1024) i+=2;
else i = 0;
*(pDAC_BASE + 0x08) = Sine_WAVE[i] << 4;
#endif
//-------------------------------------------------------------
break;
case RECT_WAVE:
#ifdef RECT_WAVE
for(i=0;i<2000;i++)
*(pDAC_BASE + 0x08) = 0x0fff;
for(i=0;i<2000;i++)
*(pDAC_BASE + 0x08) = 0;
#endif
//-------------------------------------------------------------
break;
case HACKLE_WAVE:
#ifdef HACKLE_WAVE
if(flag)
{
flag = 0;
while(TRUE)
{
if(i < 4096) i += 1;
else break;
*(pDAC_BASE + 0x08) = i;
}
}
else
{
flag = 1;
while(TRUE)
{
if(i > 0) i -= 1;
else break;
*(pDAC_BASE + 0x08) = i;
}
}
#endif
break;
default:
break;
}
//-------------------------------------------------------------
} // end while
} // end main
/*----------------------------------------------------------------------------
* 设置方向
*----------------------------------------------------------------------------*/
void Set_IO_direction(UINT8 PORT, UINT8 GPIO, UINT8 Value)
{
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
if(PORT == PORT_A)
{
if(GPIO < 8)
{
GPIOA->CRL &= ~(0x0f << (GPIO * 4)); //Clr used bit
GPIOA->CRL |= (Value << (GPIO * 4)); //Set used bit
}
else
{
GPIOA->CRH &= ~(0x0f << (GPIO * 4 - 8 * 4));//Clr used bit
GPIOA->CRH |= (Value << (GPIO * 4 - 8 * 4));//Set used bit
}
}
if(PORT == PORT_B)
{
if(GPIO < 8)
{
GPIOB->CRL &= ~(0x0f << (GPIO * 4)); //Clr used bit
GPIOB->CRL |= (Value << (GPIO * 4)); //Set used bit
}
else
{
GPIOB->CRH &= ~(0x0f << (GPIO * 4 - 8 * 4));//Clr used bit
GPIOB->CRH |= (Value << (GPIO * 4 - 8 * 4));//Set used bit
}
}
if(PORT == PORT_C)
{
if(GPIO < 8)
{
GPIOC->CRL &= ~(0x0f << (GPIO * 4)); //Clr used bit
GPIOC->CRL |= (Value << (GPIO * 4)); //Set used bit
}
else
{
GPIOC->CRH &= ~(0x0f << (GPIO * 4 - 8 * 4));//Clr used bit
GPIOC->CRH |= (Value << (GPIO * 4 - 8 * 4));//Set used bit
}
}
if(PORT == PORT_D)
{
if(GPIO < 8)
{
GPIOD->CRL &= ~(0x0f << (GPIO * 4)); //Clr used bit
GPIOD->CRL |= (Value << (GPIO * 4)); //Set used bit
}
else
{
GPIOD->CRH &= ~(0x0f << (GPIO * 4 - 8 * 4));//Clr used bit
GPIOD->CRH |= (Value << (GPIO * 4 - 8 * 4));//Set used bit
}
}
if(PORT == PORT_E)
{
if(GPIO < 8)
{
GPIOE->CRL &= ~(0x0f << (GPIO * 4)); //Clr used bit
GPIOE->CRL |= (Value << (GPIO * 4)); //Set used bit
}
else
{
GPIOE->CRH &= ~(0x0f << (GPIO * 4 - 8 * 4));//Clr used bit
GPIOE->CRH |= (Value << (GPIO * 4 - 8 * 4));//Set used bit
}
}
}
/*----------------------------------------------------------------------------
SendChar
Write character to Serial Port.
*----------------------------------------------------------------------------*/
int SendChar (int ch) {
while (!(USART2->SR & USART_FLAG_TXE));
USART2->DR = (ch & 0x1FF);
return (ch);
}
/*----------------------------------------------------------------------------
GetKey
Read character to Serial Port.
*----------------------------------------------------------------------------*/
int GetKey (void) {
while (!(USART2->SR & USART_FLAG_RXNE));
return ((int)(USART2->DR & 0x1FF));
}
void LED_Init(void)
{
Set_IO_direction(PORT_E,LED1,OUTPUT);
Set_IO_direction(PORT_E,LED2,OUTPUT);
Set_IO_direction(PORT_E,LED3,OUTPUT);
Set_IO_direction(PORT_E,LED4,OUTPUT);
Set_IO_direction(PORT_B,SW2,INPUT);
Set_IO_direction(PORT_B,SW3,INPUT);
Set_IO_direction(PORT_E,SW4,INPUT);
Set_IO_direction(PORT_E,SW5,INPUT);
Turn_OFF_LED1();
Turn_OFF_LED2();
Turn_OFF_LED3();
Turn_OFF_LED4();
}
/*----------------------------------------------------------------------------
insert a delay time.
*----------------------------------------------------------------------------*/
void delay(unsigned int nCount)
{
for(; nCount != 0; nCount--);
}
正弦波归一化程序:
tosin[256]=
展开阅读全文