单片机课程设计说明书.docx
《单片机课程设计说明书.docx》由会员分享,可在线阅读,更多相关《单片机课程设计说明书.docx(29页珍藏版)》请在冰豆网上搜索。
单片机课程设计说明书
单片机课程设计说明书
采用DAC832设计的波形发生器设计
专业
电气工程学院
学生姓名
吴栋梁
班级
B电气081
学号
0810601127
指导教师
张兰红
完成日期
2011年6月23日
目录
1概述1
1.1DAC0832波形发生器的背景和意义1
1.2DAC0832波形发生器的发展和现状1
2方案论证2
3硬件设计3
3.1总体设计3
3.2单片机的简介3
3.3单片机最小系统电路4
3.4D/A电路5
4软件设计7
5软硬件联调13
6结束语17
参考文献17
附录18
附录1:
原理图18
附录2:
PCB图18
附录3:
程序清单19
附录4:
器件清单23
采用DAC832设计的波形发生器设计
1概述
1.1DAC0832波形发生器的背景和意义
基于单片机和DAC0832的波形发生器的设计,本课题是充分运用大学期间对所学专业知识,结合现在使用的波形发生器的基本功能,完成一个系统的设计的全过程,通过单片机和模数转换芯片以及放大器产生多种波形的发生器在控制领域有着相当广泛的应用。
应用单片机控制的波形发生器的设计,整个系统控制简单,能够全方位的掌握在校期间所学的大部分知识,对单片机的学习是必不可少的,数模转换也是一个非常重要的知识,在对于数字电子和模拟电子的掌握上有着非常大的应用,运算放大器的使用更加增强了对模拟电路的理解,整个系统体积小,成本低廉功能齐全,通过不同的按钮,系统输出相应的波形,从而对所学的知识做了全面的深入的学习和掌握。
1.2DAC0832波形发生器的发展和现状
波形发生器在生产实践和科技领域中有着广泛的应用,在电路实验和设备检测中也具有十分广泛的用途。
例如在通信、广播、电视系统中都需要射频发射,这就需要波形发生器,在工业、农业、生物医学等领域中,如高频感应加热、熔炼、淬火、超声诊断、核磁共振图像等,都需要功率或大或小、频率或高或低的信号。
在现代社会中,自动化技术早已渗透到社会生产的各个领域,高精度、宽频率、高稳定性的波形发生器对于所属整体系统的性能改善和提高起着至关重要的作用。
多波形的函数信号发生器是电子实验室的基础设备之一,目前各类学校的广泛是使用的是标准产品,虽然功能齐全,性能指标高,但是价格昂贵,本课题所研究的波形发生器采用单片机和DAC0832结合起来,通过数字电子电路向模拟电路转化,该系统虽然性能指标不如标准产品,但是体积小,成本低,便于携带等特点,亦可作为电子随身设备之一。
系统通过单片机产生数字信号通过DAC0832转换为模拟信号,再通过放大器就可以得到各种波形,通过几个按钮切换想要的波形
2方案论证
方案一:
波形产生是用STC8052RC执行某一波形发生程序,向D/A转换器的输入端按一定的规律发生数据,从而在D/A转换电路的输出端得到相应的电压波形。
此方案优点电路原理简单,实现起来容易。
方案二:
采用8052单片机,并且采样频率由外部晶体震荡器产生,由晶体振动器产生脉冲,通过74161进行分频,并通过74151进行选频。
74160十进制加计数器在本设计中承担地址发生器的功能,增加了外部数据存储器,从而使波形频率得到了较大的提高,但是比较复杂,所以我们选择了方案一
3硬件设计
3.1总体设计
图3-1总体框图
3.2单片机的简介
功能:
形成扫描码,键值识别、键处理、参数设置;产生定时中断;形成波形的数字编码,并输出到D/A接口电路和显示驱动电路。
STC8052RC外接12M晶振作为时钟频率。
并采用电源复位设计。
复位电路采用上电复位,它的工作原理是,通电时,电容两端相当于短路,于是RST引脚上为高电平,然后电源通过对电容充电。
RST端电压慢慢下降,降到一定程序,即为低电平,单片机开始工作。
STC8052RC的P1口做为D/A转换芯片0832的接口。
用定时/计数器作为中断源。
不同的频率值对应不同的定时初值,允许定时器溢出中断。
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位漏极开路双向I/O口,每脚可吸收8个TTL门电流。
P0口能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口。
P1口缓冲器能接收输出4个TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入。
P1口外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流,这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下表所示:
口管脚备选功能
P3.0RXD串行输入口
P3.1TXD串行输出口
P3.2INT0外部中断0
P3.3INT1外部中断1
P3.4T0计时器0外部输入
P3.5T1计时器1外部输入
P3.6WR外部数据存储器写选通
P3.7RD外部数据存储器读选通
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平。
ALE/PROG:
当访问外部存储器时,地址锁存器允许的输出电平用于锁存地址的低位字节。
PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取址期间,每个机器周期两次PSEN有效。
但在访问外部数据存储器时,这两次有效的PSEN信号将不出现。
EA/VPP:
当EA保持低电平时,则在此期间外部出现存储器(0000H-FFFFH),不管是否有内部程序存储器。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
反向振荡器的输出。
3.3单片机最小系统电路
单片机最小系统电路,如下图所示,18和19引脚两端并联一12M的晶振,两个20pf的电容连接在晶振的两脚,电容另一脚共地。
图3-2单片机最小系统图
3.4D/A电路
功能:
将波形样值的编码转换成模拟值,完成双极性的波形输出。
由一片0832和一块UA741运放组成。
DAC0832是一个具有两个输入数据寄存器的8位DAC。
目前生产的DAC芯片分为两类,一类芯片内部设置有数据寄存器,不需要外加电路就可以直接与微型计算机接口。
另一类芯片内部没有数据寄存器,输出信号随数据输入线的状态变化而变化,因此不能直接与微型计算机接口,必须通过并行接口与微型计算机接口。
DAC0832是具有20条引线的双列直插式CMOS器件,它内部具有两级数据寄存器,完成8位电流D/A转换,故不需要外加电路。
0832是电流输出型,示波器上显示波形,通常需要电压信号,电流信号到电压信号的转换可以由运算放大器UA741实现。
图3-3D/A电路
4软件设计
图4-1方波
图4-2锯齿波
图4-3三角波图4-4正弦波
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
#defineDAC0832XBYTE[0x7fff]
sbitk1=P1^0;
sbitk2=P1^1;
sbitk3=P1^2;
sbitk4=P1^3;
sbitk5=P1^4;
unsignedcharmm=0;
unsignedcharflag=0;
unsignedcharx,y;
ucharcodeSETTAB[]={//正弦波数据(正部分)
0x80,0x83,0x86,0x89,0x8D,0x90,0x93,0x96,//(正上升部分)
0x99,0x9C,0x9F,0xA2,0xA5,0xA8,0xAB,0xAE,
0xB1,0xB4,0xB7,0xBA,0xBC,0xBF,0xC2,0xC5,
0xC7,0xCA,0xCC,0xCF,0xD1,0xD4,0xD6,0xD8,
0xDA,0xDD,0xDF,0xE1,0xE3,0xE5,0xE7,0xE9,
0xEA,0xEC,0xEE,0xEF,0xF1,0xF2,0xF4,0xF5,
0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,
0xFD,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFD,
0xFD,0xFC,0xFB,0xFA,0xF9,0xF8,0xF7,0xF6,//(正下降部分)80
0xF5,0xF4,0xF2,0xF1,0xEF,0xEE,0xEC,0xEA,
0xE9,0xE7,0xE5,0xE3,0xE1,0xDE,0xDD,0xDA,
0xD8,0xD6,0xD4,0xD1,0xCF,0xCC,0xCA,0xC7,
0xC5,0xC2,0xBF,0xBC,0xBA,0xB7,0xB4,0xB1,
0xAE,0xAB,0xA8,0xA5,0xA2,0x9F,0x9C,0x99,
0x96,0x93,0x90,0x8D,0x89,0x86,0x83,0x80,
//正弦波数据(负部分)
0x80,0x7C,0x79,0x78,0x72,0x6F,0x6C,0x69,//(负下降部分)128,0x80
0x66,0x63,0x60,0x5D,0x5A,0x57,0x55,0x51,
0x4E,0x4C,0x48,0x45,0x43,0x40,0x3D,0x3A,
0x38,0x35,0x33,0x30,0x2E,0x2B,0x29,0x27,
0x25,0x22,0x20,0x1E,0x1C,0x1A,0x18,0x16,
0x15,0x13,0x11,0x10,0x0E,0x0D,0x0B,0x0A,
0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,
0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,
0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,//(负上升部分)//80
0x0A,0x0B,0x0D,0x0E,0x10,0x11,0x13,0x15,
0x16,0x18,0x1A,0x1C,0x1E,0x20,0x22,0x25,
0x27,0x29,0x2B,0x2E,0x30,0x33,0x35,0x38,
0x3A,0x3D,0x40,0x43,0x45,0x48,0x4C,0x4E,
0x51,0x55,0x57,0x5A,0x5D,0x60,0x63,0x66,
0x69,0x6C,0x6F,0x72,0x76,0x79,0x7C,0x80
};
voidDelayMS(uintms)
{
uchari;
while(ms--)
{
for(i=0;i<120;i++);
}
}
voidfangbo()
{
DAC0832=y;
x++;
if(flag==0)
{y=0xff;
if(x==128){flag=1;y=0x00;}//方波+
}
else{y=0x00;
if(x==0){flag=0;y=0xff;}//方波-
}
}
voidjuchibo()//锯齿波
{
DAC0832=y;
y+=1;
}
voidsanjiaobo()
{
DAC0832=y;
x++;
if(flag==0)
{y+=2;//三角波数据(上升部分)
if(x==128){flag=1;y-=2;}
}
else{y-=2;
if(x==0){flag=0;y=0;}//三角波数据(下升部分)
}
}
voidjietibo()//阶梯波
{
DAC0832=y;
y+=25;
}
voidsin()//正弦波
{DAC0832=SETTAB[y];
x++;
y++;
}
voidread_key()
{
if(k1==0)
{DelayMS(10);
if(k1==0)
{mm=1;
while(k1==0);
}
}
elseif(k2==0)
{DelayMS(10);
if(k2==0)
{mm=2;
while(k2==0);
}
}
elseif(k3==0)
{DelayMS(10);
if(k3==0)
{mm=3;
while(k3==0);
}
}
elseif(k4==0)
{DelayMS(10);
if(k4==0)
{mm=4;
while(k4==0);
}
}
elseif(k5==0)
{DelayMS(10);
if(k5==0)
{mm=5;
while(k5==0);
}
}
}
main()
{TMOD=0x02;
TL0=156;
TH0=156;
TR0=1;
ET0=1;
EA=1;
mm=0;
for(;;)
{read_key();
}
}
voidt_0()interrupt1using2
{switch(mm)
{case1:
fangbo();break;
case2:
juchibo();break;
case3:
sanjiaobo();break;
case4:
jietibo();break;
case5:
sin();break;
}
}
5软硬件联调
在参考资料《单片机原理与接口技术》书后把仿真图和原理图画了出来,但发现错误一种很多,最后经过网上查资料等终于把问题都解决的。
但在设计中发现仿真软件和实物连起来还有点区别,就算按照仿真软件来焊接实物可能会有错,一开始有用到74LS373,但不出波形,最后把74LS373去掉了,发现谐振很大波形不是很好
图5-1实物正面图
图5-2实物背面图
图5-3方波
图5-4锯齿波
图5-5三角波
图5-6正弦波
图5-7阶梯波
6结束语
经过这两个星期的课程设计,发现了单片机真的很实用,从一开始的查找资料,发现资料并没有多大用,再上网搜索各种有关波形发生器的设计,不断地对所设计的系统进行修改,直到可以发出波形,然后把原理图画出来。
通过老师的检查再对原理图等进行修改,是错误越来越少。
仿真图和原理图画好后就是进行实物的操作,从排版到焊接,从焊接最小系统,然后再是整个系统,都亲自一步一步做了过来。
一开始最小系统没亮让我知道了什么是虚焊,自己通过万用表查电路的问题所在,最终还是吧板子成功的做了出来。
从一开始的没有经验,不知道如何下手,去图书馆查书,看各种设计方案,最后选择方案,然后再是焊面包板,对软硬件进行联调,其中遇到了很多很多问题,但大家都没有放弃。
其中的问题我通过自己查阅资料,问同学,请教张老师,最终还是一一我解决了。
这过程中虽然很辛苦,很累,但是最终能把板子做成功我还是很开心的。
通过这次课程设计,我学到了很多课本中学不到的知识,实践出真知这才是真的。
尽管经历了不少的艰辛,但给我积累的一点设计经验,最终把板子做出来还是有点小小的成就感,后面的路还有很长,我要继续努力,继续好好地学习,不断进步!
我还是相信有志者事竟成的。
我的C语言和单片机知识一定会更上一层楼的。
在这我要谢谢张兰红老师在这一学期对我的指导和帮助,感谢一学期对我的教育。
参考文献
刘军《单片机原理与接口技术》华东理工大学出版
陈益飞《单片机原理及应用技术》国防工业出版社
附录
附录1:
原理图
附录1:
Protel原理图
附录2:
PCB图
附录2:
PCB图
附录3:
程序清单
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
#defineDAC0832XBYTE[0x7fff]
sbitk1=P1^0;
sbitk2=P1^1;
sbitk3=P1^2;
sbitk4=P1^3;
sbitk5=P1^4;
unsignedcharmm=0;
unsignedcharflag=0;
unsignedcharx,y;
ucharcodeSETTAB[]={//正弦波数据(正部分)
0x80,0x83,0x86,0x89,0x8D,0x90,0x93,0x96,//(正上升部分)
0x99,0x9C,0x9F,0xA2,0xA5,0xA8,0xAB,0xAE,
0xB1,0xB4,0xB7,0xBA,0xBC,0xBF,0xC2,0xC5,
0xC7,0xCA,0xCC,0xCF,0xD1,0xD4,0xD6,0xD8,
0xDA,0xDD,0xDF,0xE1,0xE3,0xE5,0xE7,0xE9,
0xEA,0xEC,0xEE,0xEF,0xF1,0xF2,0xF4,0xF5,
0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,
0xFD,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFD,
0xFD,0xFC,0xFB,0xFA,0xF9,0xF8,0xF7,0xF6,//(正下降部分)80
0xF5,0xF4,0xF2,0xF1,0xEF,0xEE,0xEC,0xEA,
0xE9,0xE7,0xE5,0xE3,0xE1,0xDE,0xDD,0xDA,
0xD8,0xD6,0xD4,0xD1,0xCF,0xCC,0xCA,0xC7,
0xC5,0xC2,0xBF,0xBC,0xBA,0xB7,0xB4,0xB1,
0xAE,0xAB,0xA8,0xA5,0xA2,0x9F,0x9C,0x99,
0x96,0x93,0x90,0x8D,0x89,0x86,0x83,0x80,
//正弦波数据(负部分)
0x80,0x7C,0x79,0x78,0x72,0x6F,0x6C,0x69,//(负下降部分)128,0x80
0x66,0x63,0x60,0x5D,0x5A,0x57,0x55,0x51,
0x4E,0x4C,0x48,0x45,0x43,0x40,0x3D,0x3A,
0x38,0x35,0x33,0x30,0x2E,0x2B,0x29,0x27,
0x25,0x22,0x20,0x1E,0x1C,0x1A,0x18,0x16,
0x15,0x13,0x11,0x10,0x0E,0x0D,0x0B,0x0A,
0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,
0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,
0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,//(负上升部分)//80
0x0A,0x0B,0x0D,0x0E,0x10,0x11,0x13,0x15,
0x16,0x18,0x1A,0x1C,0x1E,0x20,0x22,0x25,
0x27,0x29,0x2B,0x2E,0x30,0x33,0x35,0x38,
0x3A,0x3D,0x40,0x43,0x45,0x48,0x4C,0x4E,
0x51,0x55,0x57,0x5A,0x5D,0x60,0x63,0x66,
0x69,0x6C,0x6F,0x72,0x76,0x79,0x7C,0x80
};
voidDelayMS(uintms)
{
uchari;
while(ms--)
{
for(i=0;i<120;i++);
}
}
voidfangbo()
{
DAC0832=y;
x++;
if(flag==0)
{y=0xff;
if(x==128){flag=1;y=0x00;}//方波+
}
else{y=0x00;
if(x==0){flag=0;y=0xff;}//方波-
}
}
voidjuchibo()//锯齿波
{
DAC0832=y;
y+=1;
}
voidsanjiaobo()
{
DAC0832=y;
x++;
if(flag==0)
{y+=2;//三角波数据(上升部分)
if(x==128){flag=1;y-=2;}
}
else{y-=2;
if(x==0){flag=0;y=0;}//三角波数据(下升部分)
}
}
voidjietibo()//阶梯波
{
DAC0832=y;
y+=25;
}
void