实训任务书 2
摘 要 4
Abstract 4
波形发生器的设计 5
1.1 实训目的 5
1.2 实训内容 5
1.3 实训步骤 5
1.4 Keil uVision简介 6
1.5 实验原理 7
1.5.1 数码管显示原理 7
1.5.2 各种波形产生思路 8
1.6 DAC0832介绍 10
1.6.1 DAC0832的主要特性参数 11
1.6.2 DAC0832结构 11
1.6.3 DAC0832工作方式 12
1.7 程序 13
1.7.1 主程序 13
1.7.2 VIIC_C51.C 22
1.7.3 ZLG7290 33
实训心得 38
参考文献 39
实训任务书
课程名称 微计算机应用及计控技术实训
实训地点 秋实楼 时间 2015年1月
项目 波形发生器的设计
指导教师 贾玉瑛、李爱莲、梁丽、陈波、李琦
一、实训目的
1、掌握使用D/A转换器生成用户所需要的波形;
2、掌握数/模转换的基本原理及编程方法;
3、掌握D/A转换芯片DAC0832的结构特点、工作原理及使用方法;
二、基本要求
(1)预习要求:学生要根据实训题目要求查阅参考资料,提前进行认真的预习,初步弄懂实训内容、原理,并写出预习报告;预习报告应包括基本的实训内容和实训方案,基本实训步骤、过程以及数据记录,对于有设计内容的项目要提前做好设计方案。
(2)操作要求:学生要搞清本次实训需使用的仪器,每种仪器在实训中所起的作用,合理选择使用仪器,正确使用测量方法。根据已设计的实训步骤并经老师同意后开始实训。学生要认真观察分析实训现象, 记录实训数据。运用所学知识解决实训中发生的问题;每项实训结果,需经教师认可后,方可结束实训;实训后认真填写实训记录。
(3)实训报告要求:学生在做完实训后,科学地、真实地、完整地完成实训报告。实 训报告应包括实训原理、实训方法的概述;实训步骤的描述;实训现象和实训数据的记载;
三、实训内容
1、设计软件程序,通过DAC0832实现D/A转换,使其分别产生三角波、个锯齿波、方波;
2、设计一个单片机系统,能够在不同开关控制下输出不同的波形形式。
3、利用2*4键盘输入加四位LED显示器显示,改变波形的周期。
四、参考资料
1、DAC08320的数据手册。
2、参考《单片机实验与实验教程》实验37内容。
五、实训步骤
1、参考实验37进行接线
2、开关线接到单片机的P1口,自己设计接线。
3、运行程序观察结果,通过开关控制输出波形的形式,用示波器观察输出的波 形。
摘 要
本设计是波形发生器的设计,以 51单片机为核心,通过按键输入控制输出信号的类型、频率,采用 D/A转换芯片DAC0832输出相应的波形,同时以LED 显示器进行实时显示信号相关信息。我们采用 C 语言进行编程,可实现方波,锯齿波,三角波,三种波形的产生,且波形的类型、频率可通过按键调节,并频率显示在数码管上。
关键字:单片机、D/A转换芯片DAC0832
Abstract
This design is the design of waveform generator, using 51 single chip microcomputer as the core, through the key input type, frequency control output signal, using D/A conversion chip DAC0832 the corresponding output waveform, simultaneously by LED display to display information related to real time signal. We use C language to program, can achieve a square wave, sawtooth wave, triangle wave, three kinds of waveform generation, type, frequency and waveform can be adjusted via buttons, and frequency in the digital tube display.
Key word: Microcontroller, D/A conversion chip DAC0832
波形发生器的设计
一.1 实训目的1、掌握使用D/A转换器生成用户所需要的波形;
2、掌握数/模转换的基本原理及编程方法;
3、掌握D/A转换芯片DAC0832的结构特点、工作原理及使用方法;
一.2 实训内容1、设计软件程序,通过DAC0832实现D/A转换,使其分别产生三角波、个锯齿波、方波;
2、设计一个单片机系统,能够在不同开关控制下输出不同的波形形式。
3、利用2*4键盘输入加四位LED显示器显示,改变波形的周期。
一.3 实训步骤1、参考实验37进行接线
2、开关线接到单片机的P1口,自己设计接线。
3、运行程序观察结果,通过开关控制输出波形的形式,用示波器观察输出的波形。
一.4 Keil uVision简介
Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。如果你使用C语言编程,那么Keil几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。
优点:
1.Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。
2.与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。用过汇编语言后再使用C来开发,体会更加深刻。 Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面
一.5 实验原理一.5.1 数码管显示原理
一位 LED 显示器由 8 个发光二极管组成,其中 7 个发光二极管 a-h控制 7 个笔画段的亮或暗,另一位控制一个小数点的亮和暗。LED 显示器有共阴极和共阳极 2 种形式。共阳极显示器是发光二极管的阳极连接在一起,当需要显示某字符时,只需要将共阳极端接高电平,a-h 中某些位接低电平即可。共阴极显示器是发光二极管的阴极连接在一起,当需要显示某字符时,只需要将共阴极端接低电平,a-h 中某些位接高电平即可。
显示器的工作方式
显示器的工作方式分为静态显示方式和动态显示方式两种。
☞ 静态显示方式
静态显示方式就是显示器在显示一个字符时,相应的发光二极管恒定的导通或截止,例如 a、b、c、、e、f 导通,g 截止时显示“0”,这种使显示器显示字符的字形数据常称为段数据。静态显示方式的每一个七段显示器,需要由一个 8 位并行口控制。优点是显示稳定,提高了工作效率,缺点是位数较多时显示口随之增加。
☞ 动态显示方式
动态显示方式是一位一位的轮流点亮各位显示器,对于每一位显示器来说,每隔一段时间点亮一次。显示器的亮度既与导通电流有关,也与点亮时间和间隔时间的比例有关。调整电流和时间参数可以实现亮度较高较稳定的显示,如显示器的位数不大于 8 位,则控制显示器公共极的电位只需要一个 8 位口(位数据口),控制字形也需要一个 8 位口(段数据口)。
数码管字型码
要使显示管显示不同的数字或者字符,需要使端口输出相应的字型码
显示器字形与字型码对应关系表
一.5.2 各种波形产生思路【1】 方波产生思路
方波的产生比较简单,只需要根据按键输入的幅值和频率计算出相应的DA数据送给数据就可以产生相应的波形。
具体来说,例如产生500Hz的2.5V的波形。
首先,要计算出定时器的定时频率,由于,方波只有两种状态,峰值和0值。峰值时由按键设定的,其中峰值占一个周期的一半,即要定时产生1000Hz的定时器频率,每进一次中断函数就把DA的数据更新为上次值的取反。让DA数据在峰值和0之间依次切换即可。
【2】 锯齿波产生思路
首先,根据按键设定的波形频率,选择一个周期内合适的点数,根据点数和峰值计算相邻3个点的幅度的步进值,根据点数和频率设定相邻3点的时间值,计算出定时器的初值,然后从0开始逐渐叠加,当叠加到最高点,然后溢出归零。
【3】 三角波产生思路
首先,根据按键设定的波形频率,选择一个周期内合适的点数,根据点数和峰值计算相3个点的幅度的步进值,根据点数和频率设定相邻3点的时间值,计算出定时器的初值,然后,设置一个变量每进一次定时中断DA数据就加幅值步进,当等于总点数的一半时,每进一次定时中断就把DA数据减幅值步进直到DA数据为0,计数变量清零。每进一次定时中断输出刷新DA的数据就可以产生一定频率和幅值的三角波。
一.6 DAC0832介绍 DAC0832是8分辨率的D/A转换集成芯片。与微处理器完全兼容。这个DA芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到广泛的应用。D/A转换器由8位输入锁存器、8位DAC寄存器、8位D/A转换电路及转换控制电路构成。
一.6.1 DAC0832的主要特性参数 * 分辨率为8位;
* 电流稳定时间1us;
* 可单缓冲、双缓冲或直接数字输入;
* 只需在满量程下调整其线性度;
* 单一电源供电(+5V~+15V);
* 低功耗,20mW。
一.6.2 DAC0832结构* D0~D7:8位数据输入线,TTL电平,有效时间应大于90ns(否则锁存器的数据会出错);
* ILE:数据锁存允许控制信号输入线,高电平有效;
* CS:片选信号输入线(选通数据锁存器),低电平有效;
* WR1:数据锁存器写选通输入线,负脉冲(脉宽应大于500ns)有效。由ILE、CS、WR1的逻辑组合产生LE1,当LE1为高电平时,数据锁存器状态随输入数据线变换,LE1的负跳变时将输入数据锁存;
* XFER:数据传输控制信号输入线,低电平有效,负脉冲(脉宽应大于500ns)有效;
* WR2:DAC寄存器选通输入线,负脉冲(脉宽应大于500ns)有效。由WR2、XFER的逻辑组合产生LE2,当LE2为高电平时,DAC寄存器的输出随寄存器的输入而变化,LE2的负跳变时将数据锁存器的内容打入DAC寄存器并开始D/A转换。
* IOUT1:电流输出端1,其值随DAC寄存器的内容线性变化;
* IOUT2:电流输出端2,其值与IOUT1值之和为一常数;
* Rfb:反馈信号输入线,改变Rfb端外接电阻值可调整转换满量程精度;
* Vcc:电源输入端,Vcc的范围为+5V~+15V;
* VREF:基准电压输入线,VREF的范围为-10V~+10V;
* AGND:模拟信号地
* DGND:数字信号地
一.6.3 DAC0832工作方式⑴单缓冲方式。单缓冲方式是控制输入寄存器和DAC寄存器同时接收资料,或者只用输入寄存器而把DAC寄存器接成直通方式。此方式适用只有一路模拟量输出或几路模拟量异步输出的情形。
⑵双缓冲方式。双缓冲方式是先使输入寄存器接收资料,再控制输入寄存器的输出资料到DAC寄存器,即分两次锁存输入资料。此方式适用于多个D/A转换同步输出的情节。
⑶直通方式。直通方式是资料不经两级锁存器锁存,即 CS*,XFER* ,WR1* ,WR2* 均接地,ILE接高电平。此方式适用于连续反馈控制线路和不带微机的控制系统,使用时,必须通过另加I/O接口与CPU连接,以匹配CPU与D/A转换。
一.7 程序一.7.1 主程序#include"reg51.h"
#include"ZLG7290.h"
#include"VIIC_C51.h"
#include"absacc.h"
#include"intrins.h"
#define PA XBYTE[0xfff]
#define uchar unsigned char
#define uint unsigned int
uchar count,change ,val,num,zk,keyport;
uchar code Table[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
bit flag,ful_flag;
uint cycle;
uint bai,shi,ge,shu;
void KeyScan(void);
void delay(uint time);
void fangbo(void);
void juchi();
void sanjiao();
void out();
void Init();
void display();
void main()
{
Init();
while(1)
{
KeyScan();
display();
}
}
void time0()interrupt 1
{
switch(cycle)
{
case 0:{TH0=(65536-461)/256;TL0=(65536-461)%256; break;}
case 1:{TH0=(65536-921)/256;TL0=(65536-921)%256; break;}
case 2:{TH0=(65536-1382)/256;TL0=(65536-1382)%256; break;}
}
out();
}
void Init()
{
TMOD|=0X01;
TR0=1;
EA=1;
ET0=1;
TH0=(65536-461)/256;
TL0=(65536-461)%256;
}
void fangbo()
{
change++;
if(change<42)
PA=255;
else
PA=0;
if(change==85)
change=0;
}
void juchi()
{
PA=val;
val+=3;
}
void sanjiao()
{
if(ful_flag==0)
{
val+=3;
PA=val;
}
if(val>=255)
ful_flag=1;
if(ful_flag==1)
{
val-=3;
PA=val;
}
if(val<3)
ful_flag=0;
}
void out()
{
if(num==1)
{
sanjiao();
}
if(num==2)
{
juchi();
}
if(num==3)
{
fangbo();
}
if(zk==1)
{
cycle=0;
zk=0;
}
if(zk==2)
{
cycle=1;
zk=0;
}
if(zk==3)
{
cycle=2;
zk=0;
}
}
void display()
{
if(cycle==0)
{
if(num==1)
shu=1*85;
else
shu=0.5*85;
bai=shu/100;
shi=shu%100/10;
ge=shu%10;
}
if(cycle==1)
{
if(num==1)
shu=2*85;
else
shu=1*85;
bai=shu/100;
shi=shu%100/10;
ge=shu%10;
}
if(cycle==2)
{
if(num==1)
shu=3*85;
else
shu=1.5*85;
bai=shu/100;
shi=shu%100/10;
ge=shu%10;
}
// com1=0;com2=1;com3=1;
// Send_164(Table[bai]);
// delay(4);
// com1=1;com2=0;com3=1;
// Send_164(Table[shi]);
// delay(4);
// com1=1;com2=1;com3=0;
// Send_164(Table[ge]);
// delay(4);
ZLG7290_SendCmd(0x60,Table[ge]);
delay(1);
ZLG7290_SendCmd(0x60+1,Table[shi]);
delay(1);
ZLG7290_SendCmd(0x60+2,Table[bai]);
delay(1);
}
void delay(uint time) //1ms
{
uint i,j;
for(i=time;i<0;i--)
for(j=110;j<0;j--);
}
void KeyScan(void)
{
keyport=ZLG7290_GetKey();
switch(keyport)
{
case 1:num=1;break;
case 2:num=2;break;
case 3:num=3;break;
case 4:zk=1;break;
case 5:zk=2;break;
case 6:zk=3;break;
}
}
一.7.2 VIIC_C51.C 此程序是I2C操作平台(主方式的软件平台)的底层的C子程序,如发送数据
及接收数据
#include <reg52.h> /*头文件的包含*/
#include <intrins.h>
#define uchar unsigned char /*宏定义*/
#define uint unsigned int
#define _Nop() _nop_() /*定义空指令*/
/* 常,变量定义区 */
/*端口位定义*/
sbit SDA=P1^7; /*模拟I2C数据传送位*/
sbit SCL=P1^6; /*模拟I2C时钟控制位*/
/*状态标志*/
bit ack; /*应答标志位*/
/*******************************************************************
起动总线函数
函数原型: void Start_I2c();
功能: 启动I2C总线,即发送I2C起始条件.
********************************************************************/
void Start_I2c()
{
SDA=1; /*发送起始条件的数据信号*/
_Nop();
SCL=1;
_Nop(); /*起始条件建立时间大于4.7us,延时*/
_Nop();
_Nop();
_Nop();
_Nop();
SDA=0; /*发送起始信号*/
_Nop(); /* 起始条件锁定时间大于4μs*/
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0; /*钳住I2C总线,准备发送或接收数据 */
_Nop();
_Nop();
}
/*******************************************************************
结束总线函数
函数原型: void Stop_I2c();
功能: 结束I2C总线,即发送I2C结束条件.
********************************************************************/
void Stop_I2c()
{
SDA=0; /*发送结束条件的数据信号*/
_Nop(); /*发送结束条件的时钟信号*/
SCL=1; /*结束条件建立时间大于4μs*/
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=1; /*发送I2C总线结束信号*/
_Nop();
_Nop();
_Nop();
_Nop();
}
/*******************************************************************
字节数据传送函数
函数原型: void SendByte(uchar c);
功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
此状态位进行操作.(不应答或非应答都使ack=0 假)
发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
********************************************************************/
void SendByte(uchar c)
{
uchar BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
{
if((c<<BitCnt)&0x80)SDA=1; /*判断发送位*/
else SDA=0;
_Nop();
SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/
_Nop();
_Nop(); /*保证时钟高电平周期大于4μs*/
_Nop();
_Nop();
_Nop();
SCL=0;
}
_Nop();
_Nop();
SDA=1; /*8位发送完后释放数据线,准备接收应答位*/
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
if(SDA==1)ack=0;
else ack=1; /*判断是否接收到应答信号*/
SCL=0;
_Nop();
_Nop();
}
/*******************************************************************
字节数据传送函数
函数原型: uchar RcvByte();
功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
发完后请用应答函数。
********************************************************************/
uchar RcvByte()
{
uchar retc;
uchar BitCnt;
retc=0;
SDA=1; /*置数据线为输入方式*/
for(BitCnt=0;BitCnt<8;BitCnt++)
{
_Nop();
SCL=0; /*置时钟线为低,准备接收数据位*/
_Nop();
_Nop(); /*时钟低电平周期大于4.7μs*/
_Nop();
_Nop();
_Nop();
SCL=1; /*置时钟线为高使数据线上数据有效*/
_Nop();
_Nop();
retc=retc<<1;
if(SDA==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */
_Nop();
_Nop();
}
SCL=0;
_Nop();
_Nop();
return(retc);
}
/*******************************************************************
应答子函数
原型: void Ack_I2c(bit a);
功能:主控器进行应答信号,(可以是应答或非应答信号)
********************************************************************/
void Ack_I2c(bit a)
{
if(a==0)SDA=0; /*在此发出应答或非应答信号 */
else SDA=1;
_Nop();
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop(); /*时钟低电平周期大于4μs*/
_Nop();
_Nop();
_Nop();
SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/
_Nop();
_Nop();
}
/*******************************************************************
向无子地址器件发送字节数据函数
函数原型: bit ISendByte(uchar sla,ucahr c);
功能: 从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.
如果返回1表示操作成功,否则操作有误。
注意: 使用前必须已结束总线。
********************************************************************/
bit ISendByte(uchar sla,uchar c)
{
Start_I2c(); /*启动总线*/
SendByte(sla); /*发送器件地址*/
if(ack==0)return(0);
SendByte(c); /*发送数据*/
if(ack==0)return(0);
Stop_I2c(); /*结束总线*/
return(1);
}
/*******************************************************************
向有子地址器件发送多字节数据函数
函数原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);
功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
如果返回1表示操作成功,否则操作有误。
注意: 使用前必须已结束总线。
********************************************************************/
bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
{
uchar i;
Start_I2c(); /*启动总线*/
SendByte(sla); /*发送器件地址*/
if(ack==0)return(0);
SendByte(suba); /*发送器件子地址*/
if(ack==0)return(0);
for(i=0;i<no;i++)
{
SendByte(*s); /*发送数据*/
if(ack==0)return(0);
s++;
}
Stop_I2c(); /*结束总线*/
return(1);
}
/*******************************************************************
向无子地址器件读字节数据函数
函数原型: bit IRcvByte(uchar sla,ucahr *c);
功能: 从启动总线到发送地址,读数据,结束总线的全过程,从器件地
址sla,返回值在c.
如果返回1表示操作成功,否则操作有误。
注意: 使用前必须已结束总线。
********************************************************************/
bit IRcvByte(uchar sla,uchar *c)
{
Start_I2c(); /*启动总线*/
SendByte(sla+1); /*发送器件地址*/
if(ack==0)return(0);
*c=RcvByte(); /*读取数据*/
Ack_I2c(1); /*发送非就答位*/
Stop_I2c(); /*结束总线*/
return(1);
}
/*******************************************************************
向有子地址器件读取多字节数据函数
函数原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);
功能: 从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
如果返回1表示操作成功,否则操作有误。
注意: 使用前必须已结束总线。
********************************************************************/
bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
{
uchar i;
Start_I2c(); /*启动总线*/
SendByte(sla); /*发送器件地址*/
if(ack==0)return(0);
SendByte(suba); /*发送器件子地址*/
if(ack==0)return(0);
Start_I2c();
SendByte(sla+1);
if(ack==0)return(0);
for(i=0;i<no-1;i++)
{
*s=RcvByte(); /*发送数据*/
Ack_I2c(0); /*发送就答位*/
s++;
}
*s=RcvByte();
Ack_I2c(1); /*发送非应位*/
Stop_I2c(); /*结束总线*/
return(1);
}
一.7.3 ZLG7290#include "REG52.h"
#include "viic_c51.h"
#define zlg7290 0x70 //ZLG7290的IIC地址
#define SubKey 0x01
#define SubCmdBuf 0x07
#define SubDpRam 0x10
** 函数名称: DelayNS
** 功能描述: 长软件延时
** 输 入: i : 延时参数,值越大时延时越久
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
void delayMS(unsigned char i)
{
unsigned char j,k;
for(k=0;k<i;k++)
for(j=0;j<60;j++);
}
** 函数名称: ZLG7290_SendData
** 功能描述: 发送数据
** 输 入:SubAdd : 输入数据
** DATA : 输入值
**
** 输 出: 0 : Fail
** 1 : OK
** 全局变量: 无
** 调用模块: delayMS
unsigned char ZLG7290_SendData(unsigned char SubAdd,unsigned char Data)
{
if(SubAdd>0x17)
return 0;
ISendStr(zlg7290,SubAdd,&Data,1);
delayMS(10);
return 1;
}
** 函数名称: ZLG7290_SendCmd
** 功能描述: 发送命令(对子地址7、8)
** 输 入:DATA1 : 命令1
** DATA2 : 命令2
** 输 出: 0 : Fail
** 1 : OK
** 全局变量: 无
** 调用模块: ISendStr、delayMS
unsigned char ZLG7290_SendCmd(unsigned char Data1,unsigned char Data2)
{
unsigned char Data[2];
Data[0]=Data1;
Data[1]=Data2;
ISendStr(zlg7290,0x07,Data,2);
delayMS(10);
return 1;
}
/*********************************************************************************************************
** 函数名称: ZLG7290_SendBuf
** 功能描述: 向显示缓冲区发送数据
** 输 入: * disp_buf : 要发送数据的起始地址
** num : 发送个数
** 输 出: 无
** 全局变量: 无
** 调用模块: ZLG7290_SendCmd
********************************************************************************************************/
void ZLG7290_SendBuf(unsigned char * disp_buf,unsigned char num)
{
unsigned char i;
for(i=0;i<num;i++)
{
ZLG7290_SendCmd(0x60+i,*disp_buf);
disp_buf++;
}
}
/*********************************************************************************************************
** 函数名称: ZLG7290_GetKey
** 功能描述: 读取键值
** 输 入: 无
** 输 出: >0 键值
** =0 无键按下
** 全局变量: 无
** 调用模块: IRcvStr、delayMS
********************************************************************************************************/
unsigned char ZLG7290_GetKey()
{
unsigned char rece;
rece=0;
IRcvStr(zlg7290,1,&rece,1);
delayMS(10);
return rece;
}
实训心得 经过这段时间的单片机课程设计,终于完成了波形发生器的设计,基本达到设计要求,从心底里来说,还是很高兴的,毕竟这次设计把实物都做了出来。
在本次设计的过程中,我发现很多的问题,虽然以前还做过这样的设计但这次设计真的让我长进了很多。对于单片机设计,其硬件电路是比较简单的,主要是解决程序设计的问题,而程序设计是一个很灵活的东西,它反映了你解决问题的逻辑思维和创新能力,它才是一个设计的灵魂所在。因此在整个设计过程中大部分时间是用在程序上面的。很多子程序是可以借鉴书本上的,但怎样衔接各个子程序才是关键的问题所在,这需要对单片机的结构很熟悉。因此可以说单片机的设计是软件和硬件的结合,二者是密不可分的。
同时在本次设计的过程中,我还学会了高效率的查阅资料、运用工具书、利用网络查找资料。我发现,在我们所使用的书籍上有一些知识在实际应用中其实并不是十分理想,各种参数都需要自己去调整。偶而还会遇到错误的资料现象,这就要求我们应更加注重实践环节。
最后还要在此感谢指导老师们和我的同学,他们在整个过程中都给予了我充分的帮助与支持。
参考文献1、DAC08320的数据手册。
2、参考《单片机实验与实验教程》实验37内容。
3、周立功《单片机应用设计基础》
4、网络上一些资源
5、谭浩强《C 程序设计》
|