2.开发软件介绍
2.1Keile C51软件
Keile C51是美国Keile Software公司出品的51系列兼容单片机C语言软件开发系统。与汇
编相比,在功能、结构、可读性上都有明显的优势。Keile C51软件提供提供丰富的库函数和功能强大的集成开发调试工具,生成的目标代码效率非常高。
[4]
Keile软件公司的C51单片机软件开发工具已经用于众多的8051及派生软件实现嵌入应用,可
以编译C源程序、汇编源程序、连接和定位目标文件及库,创建HEX文件以及调试目标程序[4]。 Keile C51编译器是符合ANSI标准的编译器。Keile C51语言扩展支持51单片机的应用包括:1.数据类型 2.存储器类型 3.存储器模型 4.指针 5.重入函数 6.中断函数 7.实时操作系统 8.PL/M和A51源文件接口 。
Keile C51支持的基本数据类型有位型(bit)、无符号字符型(unsigned char)、有符号字符型(signed char)、无符号整型(unsigned int)、有符号整型(signed int)、无符号长整型(unsigned long)、有符号整型(signed long)和浮点型(float)等。
[4]
[4]
2.2Proteus软件
Proteus软件是英国Labcenter electronics公司出版的EDA工具软件。它具有4大功能模块:
1.智能原理图设计(ISIS) 2.完善的电路仿真功能(Prospice) 3.独特的单片机协同仿真功能(VSM) 4.实用的PCB设计平台。
Proteus软件是一款功能强大的电路设计分析软件。在利用其进行单片机的软件仿真时,仅仅使用了其部分功能:1.ISIS智能原理图输入系统。2.Proteus VSM虚拟系统模型。
Proteus ISIS是Proteus软件的核心,其具有以下特性:1.出版高质量的原理图:ISIS提供给用户图形外观,包括线宽、填充类型、字符库等的全部控制,使用户能生成精美的原理图。画完图后可以以图形文件输出。2.良好的用户界面:用户只需单机元件的引脚或者先前布好的线,就能实现布线。而且摆放、移动和删除操作能都直接鼠标实现,无需去单机菜单或图标。3.自动走线:只要单机想要连接的两个引脚,就能简单地实现走线。在特殊的位置需要布线时,只需在中间的角落单机。自动走线也能在元件移动时操作,自动解决相应连线。4.元件库:ISIS的元件库包括8000多个元件,有标准符号、三极管、二极管、CMO微处理存储元件、模拟IC和运算放大器等。 Proteus VSM的核心是ProSpice,是一个组合了SPICE3F5模拟仿真器和基于快速事件驱动的数字仿真器的混合仿真系统。Proteus VSM包含大量的虚拟模型仪器,如示波器、逻辑分析仪、函数发生器、数字信号发生器、时钟计数器、虚拟终端以及简单的电压计、电流计等。
[5]
[5]
[5]
3
3.基于单片机的函数信号发生器设计的实现原理
3.1原理框图
图3-1原理框图
如图3-1,整个系统包括按键、AT89C51单片机、LCD显示、D/A转换器、电流电压转化器、示波器。按键控制AT89C51单片机的输出,包括波形的种类和波形的频率,AT89C51单片机通过LCD来显示波形的种类和波形的频率,单片机输出的是数字信号,DAC0832是电流型D/A转换器,通过DAC0832输出电流信号,再通过电流电压转换器输出电压,示波器接收的是电压信号,所以示波器接收到电压信号后显示出波形。
4.基于单片机的函数信号发生器软件实现
本系统利用单片机AT89C51采用程序设计方法产生正弦波、矩形波、三角波三种波形。 具体功能有:(1)各个波形的切换;(2)频率增减等。 软件的流程图4-1如下:
4
图4-1软件设计流程图
4.1延时模块 void delay(uint z) {
uchar i,j; for(i=z;i>0;i--) for(j=110;j>0;j--); }
void delay1(uint y) {
uint i;
for(i=y;i>0;i--); }
5
//延时子程序 代表MS
//延时代表US
4.2显示模块
图4-2写操作时序图
当我们要进行写指令,设置LCD1602工作方式时:应把RS置为低电平,RW置为低电平,再将数据送到数据口D0-D7,最后E引脚一个高脉冲将数据写入。
当我们要写数据时,在LCD1602上实现显示时:应把RS置为高电平,RW置为低电平,再将数据送到数据口D0-D7,最后E引脚一个高脉冲将数据写入。 void write_com(uchar com) //1602写指令 {
lcdrs=0; }
void write_data(uchar date) {
lcdrs=1;
6
P1=com; delay(5); lcde=1; delay(5); lcde=0;
//1602写数据
P1=date; delay(5); lcde=1; delay(5); lcde=0;
}
void init() //初始化{
lcdrw=0; lcde=0; wr=0; cs=0;
write_com(0x38); write_com(0x0c); /// write_com(0x06); // write_com(0x01); // write_com(0x80+0x00); write_data(0x77); // write_data(0x61); write_data(0x76); write_data(0x65); write_data(0x3a);
write_com(0x80+0x40); write_data(0x66); // write_data(0x3a); }
void write_f(float date) //{
uchar qian,bai,shi,ge; float temp; char temp1;
qian=(int)date/1000; bai=(int)date/100;
//设置16×2显示,5×7点阵,8位数据接口
显示开,光标关,闪烁开
数据读、写操作后,AC自动加一,画面不移动清除DDRAM和AC,光标复位 //写入地址第一行 写wave: //写入地址第二行 写 f: 写频率 //千位计算 //百位计算
7