基于C8051F410的任意波形发生器毕业设计Word文档下载推荐.docx
《基于C8051F410的任意波形发生器毕业设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于C8051F410的任意波形发生器毕业设计Word文档下载推荐.docx(32页珍藏版)》请在冰豆网上搜索。
![基于C8051F410的任意波形发生器毕业设计Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2023-1/10/0cfa7c82-3cde-4da2-ab2f-822ef4746a9e/0cfa7c82-3cde-4da2-ab2f-822ef4746a9e1.gif)
本人授权 大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
涉密论文按学校规定处理。
导师签名:
日期:
注意事项
1.设计(论文)的内容包括:
1)封面(按教务处制定的标准封面格式制作)
2)原创性声明
3)中文摘要(300字左右)、关键词
4)外文摘要、关键词
5)目次页(附件不统一编入)
6)论文主体部分:
引言(或绪论)、正文、结论
7)参考文献
8)致谢
9)附录(对论文支持必要时)
2.论文字数要求:
理工类设计(论文)正文字数不少于1万字(不包括图纸、程序清单等),文科类论文正文字数不少于1.2万字。
3.附件包括:
任务书、开题报告、外文译文、译文原文(复印件)。
4.文字、图表要求:
1)文字通顺,语言流畅,书写字迹工整,打印字体及大小符合要求,无错别字,不准请他人代写
2)工程设计类题目的图纸,要求部分用尺规绘制,部分用计算机绘制,所有图纸应符合国家技术标准规范。
图表整洁,布局合理,文字注释必须使用工程字书写,不准用徒手画
3)毕业论文须用A4单面打印,论文50页以上的双面打印
4)图表应绘制于无格子的页面上
5)软件工程类课题应有程序清单,并提供电子文档
5.装订顺序
1)设计(论文)
2)附件:
按照任务书、开题报告、外文译文、译文原文(复印件)次序装订
指导教师评阅书
指导教师评价:
一、撰写(设计)过程
1、学生在论文(设计)过程中的治学态度、工作精神
□优□良□中□及格□不及格
2、学生掌握专业知识、技能的扎实程度
3、学生综合运用所学知识和专业技能分析和解决问题的能力
4、研究方法的科学性;
技术线路的可行性;
设计方案的合理性
5、完成毕业论文(设计)期间的出勤情况
二、论文(设计)质量
1、论文(设计)的整体结构是否符合撰写规范?
2、是否完成指定的论文(设计)任务(包括装订及附件)?
三、论文(设计)水平
1、论文(设计)的理论意义或对解决实际问题的指导意义
2、论文的观念是否有新意?
设计是否有创意?
3、论文(设计说明书)所体现的整体水平
建议成绩:
(在所选等级前的□内画“√”)
指导教师:
(签名)单位:
(盖章)
年月日
评阅教师评阅书
评阅教师评价:
一、论文(设计)质量
二、论文(设计)水平
评阅教师:
教研室(或答辩小组)及教学系意见
教研室(或答辩小组)评价:
一、答辩过程
1、毕业论文(设计)的基本要点和见解的叙述情况
2、对答辩问题的反应、理解、表达情况
3、学生答辩过程中的精神状态
评定成绩:
教研室主任(或答辩小组组长):
(签名)
教学系意见:
系主任:
基于C8051F410的任意波形发生器
一.硬件电路
1.C8051F410单片机开发板一块
从上两图可以清楚的看到单片机置于板底层,而且是由品诺电子出品的。
2.波形调理电路
下图是波形调理电路,采用了两级同相比例放大电路,第一级在P0.0/IDAC0输入端对地接一330Ω电阻,目的是将电流信号转换成电压信号在对其进行放大,中间一级是电压跟随器,其目的是将两级放大电路相互隔离开,最后一级是压倍可变同相比例放大电路,其放大倍数在1~10之间可变,从而可实现模拟幅度调制。
问题:
为什么I/V转换电阻选330Ω而不直接选1KΩ呢?
解答:
在毕设起初调试阶段也采用过1KΩ电阻,其目的是直接想将2mA电压直接转换成2V电压,但调试许久仞未见到波形产生,最后才发现更换小电阻后就有波形了,于是才知道单片机的驱动能力有限,I/V转换电阻不宜过大,否则就实现不了想达到的效果。
几级电路间当时还采用了双插针隔离,图中P1,P3,P4均是双插针,这样设计的目的是为了调试方便,易查出问题所在。
当然也可以放上单插针建立测试点测试即可,使用双插针在对各级测试好后可采用短路帽短接级联,从而实现整体电路功能。
下面做个简单估算:
想必大家也都熟知同相比例放大电路放大倍数:
那么第一级放大倍数就为3倍,输入电压VP-P为:
330Ω*2mA=660mV,即输入的电压信号峰值为330mV,经过第一级放大转换出的信号幅值约为990mV(约1V)。
第二级放大倍数在1~10之间,也就是说输出电压幅值可在1V~10V之间变化。
当然LM741运放采用的是±
12V供的电,理论上输出波形幅值也可以达到12V,但是受开环增益影响,幅度在达到10V左右及以上的时候波形会有明显失真(当时我看到了正弦波有削顶失真)。
3.LCD12864显示电路
上图为显示电路,12864接法其实很简单,除了VSS,VDD,VO,BLA,BLK接电源外,还有两个空脚(Pin16和Pin18),8位并行数据口DB0~DB7(Pin7~Pin15),其他5位则是逻辑控制口,可通过单片机控制命令对其编程。
本次设计采用了串行数据传输模式,即用到了RS(CS),R/W(SID),E(SCLK),PSB,/RST,其中CS为串行传输片选端,SID为串行数据传输口,SCLK为串行数据传输时钟(通过置0写1完成),PSB为串行并行方式选择端(其中PSB=0为串行工作方式,PSB=1为并行工作方式)。
在设计的时候预留了并行数据口,其目的是为了拓展使用。
注意:
LCM12864M-3.3Ver20在焊接时需要将背面电阻R7上有一个三段焊盘全部断路,出厂时该显示屏这个三段焊盘靠外侧的两个焊盘是短接在一起的,所以一定要拿吸锡纸将焊锡拿掉。
二.软件程序
程序调试环境:
SiliconLaboratoriesIDE
程序:
//-----------------------------------------------------------------------------
//Includes
#include<
c8051f410.h>
//SFRdeclarations
//16-bitSFRDefinitionsfor'
F41x
sfr16TMR3RL=0x92;
//Timer3reloadvalue
sfr16TMR3=0x94;
//Timer3counter
sfr16IDA0=0x96;
//IDA0highandlowbytes
//-----------------------------------------------------------------------------
//GlobalConstants
#defineSYSCLK24500000//InternaloscillatorfrequencyinHz
#defineSAMPLE_RATE_DAC100000L//DACsamplingrateinHz
#definePHASE_PRECISION65536//rangeofphaseaccumulator
//<
PHASE_ADD>
isthechangeinphasebetweenDACsamples;
Itisusedin
//theset_DACsroutine.
//EDITbylineter
unsignedcharm;
unsignedcharn;
sbitChange_waveform=P1^7;
sbitChange_frequency=P1^6;
staticunsignedintFREQUENCY=1000;
//FrequencyoutputinHz
staticunsignedintFREQUENCY1=1;
staticunsignedintFREQUENCY2=1;
//FrequencyoutputinKHz
unsignedintDATA;
//staticunsignedintPHASE_ADD=FREQUENCY*PHASE_PRECISION/SAMPLE_RATE_DAC;
//EDITOVER
unsignedintcodeSINE_TABLE[128]=
{
0x0000,0x0324,0x0647,0x096a,0x0c8b,0x0fab,0x12c8,0x15e2,
0x18f8,0x1c0b,0x1f19,0x2223,0x2528,0x2826,0x2b1f,0x2e11,
0x30fb,0x33de,0x36ba,0x398c,0x3c56,0x3f17,0x41ce,0x447a,
0x471c,0x49b4,0x4c3f,0x4ebf,0x5133,0x539b,0x55f5,0x5842,
0x5a82,0x5cb4,0x5ed7,0x60ec,0x62f2,0x64e8,0x66cf,0x68a6,
0x6a6d,0x6c24,0x6dca,0x6f5f,0x70e2,0x7255,0x73b5,0x7504,
0x7641,0x776c,0x7884,0x798a,0x7a7d,0x7b5d,0x7c29,0x7ce3,
0x7d8a,0x7e1d,0x7e9d,0x7f09,0x7f62,0x7fa7,0x7fd8,0x7ff6,
};
//-----------------------------------------------------------------------------
//FunctionPrototypes
voiddelay_num_10us(unsignedint);
voidmain(void);
voidOSCILLATOR_Init(void);
voidPORT_Init(void);
voidDAC0_Init(void);
voidTIMER3_Init(intcounts);
voidFrequency_conversion(void);
voidSet_DACs(void);
//////////////////////////////////////////////////////////////////////////
/////////////////////////LCD12864显示/////////////////////////
//LCD12864DisplayGlobalConstants
sbitLCD12864_SCLK=P2^2;
//E
sbitLCD12864_SID=P2^1;
//RW
sbitLCD12864_RST=P2^4;
//lowactive可以不用,也就是说,只用两条线和LCD通信
sbitLCD12864_PSB=P2^3;
sbitLCD12864_CS=P2^0;
unsignedcharcodes1[]={"
波形发生器"
unsignedcharcodes2[]={"
波形:
"
unsignedcharcodes21[]={"
Sine"
unsignedcharcodes22[]={"
Square"
unsignedcharcodes23[]={"
Triangular"
unsignedcharcodes3[]={"
频率:
unsignedcharcodes31[]={"
500Hz"
unsignedcharcodes32[]={"
1kHz"
unsignedcharcodes33[]={"
2kHz"
unsignedcharcodes34[]={"
2.5kHz"
unsignedcharcodes4[]={"
幅度:
请调滑变!
"
unsignedcharcodese[]={"
警告:
错误"
unsignedcharcodeAC_TABLE[]={
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,//第一行汉字位置
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,//第二行汉字位置
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,//第三行汉字位置
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,//第四行汉字位置
/*****************************************************************
*名称:
LCD12864_Delay()
*功能:
延时
*输入:
z
*输出:
无
*****************************************************************/
voidLCD12864_Delay(unsignedintz)
{
unsignedinta,b;
for(a=0;
a<
z;
a++)
for(b=0;
b<
120;
b++);
}
LCD12864_sendbyte
按照液晶的串口通信协议,发送数据
zdata
voidLCD12864_SendByte(unsignedcharzdata)
unsignedchari;
for(i=0;
i<
8;
i++)
{
if((zdata<
<
i)&
0x80)
LCD12864_SID=1;
}
else
LCD12864_SID=0;
LCD12864_SCLK=0;
LCD12864_SCLK=1;
LCD12864_write_com()
写串口指令,分三字节写完
com
voidLCD12864_WriteCom(unsignedcharcom)
LCD12864_CS=1;
//打开片选,高电平有效
LCD12864_SendByte(0xf8);
//第一字节
LCD12864_SendByte(com&
0xf0);
//第二字节
LCD12864_SendByte((com<
4)&
//第三字节
}
LCD12864_write_date()
写串口指令
date
voidLCD12864_WriteDate(unsignedchardate)
//打开片选
LCD12864_SendByte(0xfa);
//第一字节
LCD12864_SendByte(date&
LCD12864_SendByte((date<
/**********