PIC单片机课程设计信号发生器.docx
- 文档编号:3814166
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:36
- 大小:1.09MB
PIC单片机课程设计信号发生器.docx
《PIC单片机课程设计信号发生器.docx》由会员分享,可在线阅读,更多相关《PIC单片机课程设计信号发生器.docx(36页珍藏版)》请在冰点文库上搜索。
PIC单片机课程设计信号发生器
福州大学
《PIC课程设计》
信号发生器
哈哈,福大的学弟学妹们有福了。
XXXXXXXXXX学生姓名:
011100XXXX号:
学
2011专业班级:
电气学院级XX班
XXXXXXXXX指导教师:
日27月6年二○一四
1、概述···································1
2、课程设计内容···························1
2.1、整体方案·····························1
2.2、硬件设计·····························2
2.3、软件设计·····························4
3、仿真结果·······························7
4、设计体会·······························11
1、概述
信号发生器是一种常用的信号源,广泛应用于电子电路、自动控制系统和教学实验等领域。
目前使用的信号发生器大部分是函数信号发生器,且特殊波形发生器的价格昂贵。
本设计采用PIC16F887单片机作为逻辑控制单元,利用MCP4821芯片转换单片机发出的数据,经过放大器放大产生正弦波、三角波、锯齿波和方波信号。
通过外部按键切换波形,通过电位计经过AD转化控制信号周期大小。
本设计利用液晶显示芯片1602作为显示单元,显示波形的类型和波形的周期。
信号发生器在显示生活中也起到很重要的作用,是电子技术领域的一种常用设备,长期以来都是由模拟电路构成的。
这类仪器作为信号源,在高频范围内其频率稳定度高,可调性好。
然而,在科学研究和生产实践中,如工业过程控制、生物医学等领域,通常需要用低频信号源。
由模拟电路生成低频信号性能不能令人满意,而且用于低频其RC很大。
大电阻、大电容在制造上有困难,参数准确度难以保证,同时体积大、漏电损耗显著。
利用单片机用程序设计方法产生波形,其频率底限几乎无限度、稳定度好,频率幅值可以由电位计调整。
本设计实现的功能为:
1、装置能生成正弦波、三角波、锯齿波、方波,通过波形切换按键进行切换。
2、装置波形周期能通过电位计调节。
3、生成波形设有两档,以满足更高周期(更低频率)的要求。
2、课程设计内容
2.1、整体方案
本设计采用PIC16F887单片机作为逻辑控制单元,通过MCP4821芯片转换单片机发出的数据,经过放大器放大产生正弦波、三角波、锯齿波和方波信号。
通过电位计经过AD转化控制信号周期大小,通过外部按键切换波形。
利用液晶显示芯片1602作为显示单元,显示波形的类型和波形的周期。
整体框图如下图(图一)所示。
1
LCD160显示模外部按PIC16F88单片电位转换模D放大器输TL082C芯MCP842
图一:
整体框图、硬件设计2.2液晶显示芯单片机芯片、LCD1602这次课设所用到的硬件模块有PIC16F887放大器、按键和电位计。
硬件电路图如下图(图二TL082CP片、MCP8421芯片、所示)
图二:
整体硬件图2
PIC16F8771)单片机模块:
(的升级版,主要参数与是16F877本次课程设计所用的单片机为PIC16F877,而价格比口的使用)类似,但使用更为灵活、有的参数更加细化(如877ARB兼容,但增加了一些功能。
887引脚与877A877A更低。
LCD1602
)显示模块:
(160液晶也160字符型液晶,它是一种专门用来显示字母、数字、符等的点阵型液晶模块。
它由若干5X或5X1等点阵字符位组成,每个点字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔起到了字符间距和行间距的作用正因为如此所以它不能很好地显示图(用定CGRA,显示效果也不好
采位数据线接线方式R口的低四位LC的位连接,节省单机I/口液晶显示器用来显示时间星期和温度首先要进行显示时间定位即写入命令。
然后进行显示数据输入,即定初数据VEVS都拉低VD时表示读时写数据R时表示写高电平R时,写命令,数据使能端,下降沿送入有效RDRD,数据输入端,使用液晶显示器端的位RD用于背光显(RD7=1RV用于调整背光亮度,上电后要延15ms后,才能进行初始化。
硬件连接图如下图(图三
图三:
LCD1602硬件连接图
3
(3)DA转换模块:
MCP8421芯片
MicrochipTechnologylnc.的MCP482X器件为2.7V-5.5V、低功耗、地DNL的12位数模转换器,具有内部带隙电压基准,可选2x缓冲器输出和串行外设接口(SPI)。
本设计通过SPI通讯与MCP8421芯片通讯,将数据量转化成模拟量。
(4)放大器模块:
TL082CP芯片
TL082CP芯片是双列8引脚封装。
结型场效应管高阻输入,工作电压=+/-18V,静态电流=1.4mA,输入偏置电流=30PA,转换速率=16V/us,功耗=680mW,增益带宽=3MHz,输入失调电压=2-5mV,工作温度=-55-125°C,电压反馈型。
本设计DA转换后,通过TL082CP芯片,经过一电压跟随器和一级放大输出所要的波形。
DA转换模块和放大器模块硬件连接图如下图(图四)
图四:
DA转换及放大器硬件连接图
2.3、软件设计
本设计以PIC16F887单片机为主控器,有数模转换电路,运算放大器等组成低频信号发生器。
主要思想为:
通过TMR2定时器定时的通过SPI通讯向MCP8421芯片输出数据进行DA转换,在主循环中不断的进行AD采样,和向LCD1602显示模块输入数据显示所要显示所生成的波形和周期。
主程序及中断的流程图如下图(图五)。
4
口中断TMR2中断RWave=毫延10
主程序开YE输出正弦RB0=程序初始N的YE转AWave=Wave=NYEYENO输出三角波显示LCDWave++Wave=1NO的点RB1=1Wave=3YESYES输出锯齿波NONOK=1的点YESNOK=1K=0T2CON=0b0Wave=4T2CON=0b000001010000100YES输出方波的毫秒延时30NO点TMR2IF=0中断结束中断结束
图五:
程序及中断流程图以调节输出PR2AD转换值赋给将AD主函数不断的进行转换以及LCD显示,LCD显示输出为何波形,周期为多少。
波形周期,中断定时输出波形的点,调整定时器的定时时间即可改TMR2通过定时器二口按键中断用于切换波形和调档。
调档即调整定时器二变输出波形的周期。
RB的预分频比。
5
各子程序流程图如图下图(图六)。
写数LC初始LCA转换开D转换开显LC显转A转D初始计算周LC功能设入初始初始选显示开关CS=采样延码转BCD3-D写LCD160SP分两写入数据光标、画显LCGO=延传数据示初始地位移设MCP842写入显示高四位GO=返清屏设LDAC=据的代第四位交等执行显返LDAC=D7-D写返CS=延时ADIF=0返回返回转化结果存入AD_RESULTPR2=AD_RESULT返回
图六:
个子程序流程图6
3、仿真结果
如下图为方正结果:
方波波形图
锯齿波波形图
7
三角波波形图
正弦波波形图8
现在以正弦波为例,显示周期调整和换挡的功能。
分别为高档和低档时的波形:
高档时的正弦波波形
低档时的正弦波波形
9
电位计调得较大
电位计调得较小10
4、设计体会课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。
因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要的。
本次设计的一个非常的的收获是意识到结构框架的对整个设计的重要性,设计时应该遵循“先整体后隔离”和“循序渐进”的思路。
“先整体后隔离”:
先根据要实现的功能确定整体框架,明确那些要放在主函数中?
那些要放在中断中?
需要用到哪些模块?
先写好程序流程图,再深入解决每个小模块,子程序。
“循序渐进”:
程序不能一些子就完成,因此,可分模块完成,先让程序完成较为基本的功能,在逐一添加模块。
这样一旦出问题就能尽快的确定问题出来哪里。
本次的设计遇到的很多的问题,通过问题的解决,我不断的提高自己检测问题和解决问题的能力,并从中收获颇多有所总结。
以为对如何排查问题的总结:
故障的排查可以从“空间”和“时间”上排查。
“空间”上排查即为:
把整个系统划分为几个模块,如软件模块,硬件模块,其中软硬件又可以因具体情况再加以细分,然后通过软件调试设置断点,和用万用表检查硬件模块来缩小范围,最终确定问题所在。
“时间”上的排查即为:
把要实现的结果在流程上划分为几个阶段,然后逐个排查运行到各个阶段是否与预期的情况一样,从而确定问题出来哪里。
11
程序如下:
#include
__CONFIG(0x00F1);
__CONFIG(0x3FFF);
#defineucharunsignedchar
#defineuintunsignedint
#definenn100
/*-------DA转换相关宏定义------*/
#defineSHDNRE2
#defineCSRE1
#defineLDACRE0
/*-------LCD相关宏定义---------*/
#defineLCD_RSRD4
#defineLCD_RWRD5
#defineLCD_ERD6
#defineLCD_LEDRD7
#defineCOM0//定义命令为0
#defineDATA1//定义数据为1
/*-------SPI通讯相关宏定义-----*/
#defineSPI_WRITE(A)\
SSPBUF=A;\
while(BF==0);\
BUF=SSPBUF
/*-------全局变量设置----------*/
unsignedintX;//DA转换的变量数字量
unsignedintAD_RESULT;
charBUF,N;
charwave;//波形代号
chark;//档次,对应两个分频比。
bitK;//档次,对应两个分频比。
unsignedintT;//周期
chardis[16]=T=.ms;
//正弦波表格,
constunsignedintSIN[100]={
2048,2111,2173,2235,2297,2357,2416,2474,2530,2584,
2636,2685,2733,2777,2819,2857,2892,2924,2953,2978,
2999,3017,3030,3040,3046,3048,3046,3040,3030,3017,
2999,2978,2953,2924,2892,2857,2819,2777,2733,2685,
2636,2584,2530,2474,2416,2357,2297,2235,2173,2111,
2048,1985,1923,1861,1799,1739,1680,1622,1566,1512,
12
1460,1411,1363,1319,1277,1239,1204,1172,1143,1118,
1097,1079,1066,1056,1050,1048,1050,1056,1066,1079,
1097,1118,1143,1172,1204,1239,1277,1319,1363,1411,
1460,1512,1566,1622,1680,1739,1799,1861,1923,1985};
//三角波表格,
constunsignedinttriangular[100]={
2048,2088,2128,2168,2208,2248,2288,2328,2368,2408,
2448,2488,2528,2568,2608,2648,2688,2728,2768,2808,
2848,2888,2928,2968,3008,3048,3008,2968,2928,2888,
2848,2808,2768,2728,2688,2648,2608,2568,2528,2488,
2448,2408,2368,2328,2288,2248,2208,2168,2128,2088,
2048,2008,1968,1928,1888,1848,1808,1768,1728,1688,
1648,1608,1568,1528,1488,1448,1408,1368,1328,1288,
1248,1208,1168,1128,1088,1048,1088,1128,1168,1208,
1248,1288,1328,1368,1408,1448,1488,1528,1568,1608,
1648,1688,1728,1768,1808,1848,1888,1928,1968,2008};
//锯齿波表格,
constunsignedintsawtooth[100]={
1048,1068,1088,1108,1128,1148,1168,1188,1208,1228,
1248,1268,1288,1308,1328,1348,1368,1388,1408,1428,
1448,1468,1488,1508,1528,1548,1568,1588,1608,1628,
1648,1668,1688,1708,1728,1748,1768,1788,1808,1828,
1848,1868,1888,1908,1928,1948,1968,1988,2008,2028,
2048,2068,2088,2108,2128,2148,2168,2188,2208,2228,
2248,2268,2288,2308,2328,2348,2368,2388,2408,2428,
2448,2468,2488,2508,2528,2548,2568,2588,2608,2628,
2648,2668,2688,2708,2728,2748,2768,2788,2808,2828,
2848,2868,2888,2908,2928,9488,2968,2988,3008,3028};
constunsignedintsquare[100]={
1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,
1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,
1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,
1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,
1048,1048,1048,1048,1048,1048,1048,1048,1048,1048,
3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,
3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,
3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,
3048,3048,3048,3048,3048,3048,3048,3048,3048,3048,
3048,3048,3048,3048,3048,3048,3048,3048,3048,3048};
//函数声明!
voidDAC(uintx);//DA转换程序
voidCSH();//初始化
voiddisplay(uintR1,charR2);
voidADC(chark);
13
voidDELAY_INT(uintn);
/*-------生成波形------------*/
voidout_sin();//输出正弦波
voidout_triangular();//输出三角波
voidout_sawtooth();//输出锯齿波
voidout_square();//输出方波
/*-------LCD相关函数---------*/
voidLCD_CSH(void);
voidLCD_BUSY(void);
ucharLCD_READ(void);
voidLCD_WRITE(ucharR1,ucharFLAG);
voidLCD_WRITE_4(ucharR1,ucharFLAG);
voidDELAY_US(ucharn);
voidDELAY(uintn);
voidLCD_WRITE_STR(ucharR1,ucharR2,constuchar*str);显示//LCD
voidmain(void)
{
CSH();
LCD_CSH();
wave=1;
K=0;
N=0;
ADC(0);
PR2=AD_RESULT>>2;
while
(1)
{
display(T,K);
ADC(0);
}
}
//===========中断服务子程序。
voidinterruptINT_ISR(void)
{
if(TMR2IF==1)
{
if(wave==1)
out_sin();
if(wave==2)
out_triangular();
if(wave==3)
out_sawtooth();
if(wave==4)
14
out_square();
}
if(RBIF==1)
{
DELAY_INT(10);
if(RB0==0)
{
if(wave++==4)
wave=1;
}
if(RB1==0)
{
if(K==1)
K=0;
else
K=1;
if(K==0)
//TMR2T2CON=0b00000100;使能,预分频比,后分频比1:
1
if(K==1)
//TMR2使能,预分频比,后分频比1:
4T2CON=0b00000101;
}
DELAY_INT(30);
}
RBIF=0;
TMR2IF=0;
TMR2=0;
}
voiddisplay(uintR1,charR2)
{
charq=0,b=0,s=0,g=0;
if(R2==0)
{k=1;dis[11]='L';}
if(R2==1)
{k=4;dis[11]='H';}
T=224+PR2*k;
while(T>=1000)
{T-=1000;q++;}
while(T>=100)
{T-=100;b++;}
while(T>=10)
{T-=10;s++;}
g=T;
dis[2]=q+'0';
15
dis[3]=b+'0';
dis[4]=s+'0';
dis[6]=g+'0';
if(wave==1)
LCD_WRITE_STR(0,0,sinewave);
if(wave==2)
LCD_WRITE_STR(0,0,riangularwave);
if(wave==3)
LCD_WRITE_STR(0,0,sawtoothwave);
if(wave==4)
LCD_WRITE_STR(0,0,squarewave);
LCD_WRITE_STR(1,0,dis);
}
//////DA转换
voidDAC(uintx)
{
chari,j;
x+=0x7000;//HSDN=1,参考电压缓冲,放大倍数GA=1
CS=0;//片选有效
i=x>>8;
j=x;
SPI_WRITE(i);//输出命令的高8位
SPI_WRITE(j);//输出命令的低8位
LDAC=0;NOP();//DA输出有效
LDAC=1;NOP();
CS=1;
}
voidADC(chark)
{
chari;
ADCON0=0b01000001;
ADCON1=0b10000010;
ADCON0|=(k<<3);
for(i=0;i<5;i++)
NOP();
GO=1;
while(GO==1);
ADIF=0;
AD_RESULT=0;
AD_RESULT=ADRESH<<8;
AD_RESULT|=ADRESL;//结果存在于AD_RESULT中
PR2=AD_RESULT>>2;
}
/////初始化
16
voidCSH()
{
ANSELH=0;//设B口为普通IO口
//ANSEL=0;//设RE口为普通I/O口s
ANSEL=0b00000011;//设RA0和RA1口为模拟量输入
TRISA=0b00000011;//设RA0口为输入
TRISB=0b00001111;
TRISC=0b00010000;//RC3输出(SCK),RC4输入(SDI),RC5输出(SDO)
TRISD=0b00000000;//RD口为输出,显示LCD模块。
TRISE=0b11111000;//RE0-2为输出
//----AD转化设置-------//
ADCON0=0b01000001;
ADCON1=0b10001110;
//----中断和T0设置-----//
OPTION_REG=0b00001000;//允许上拉电阻,预分频给看门狗,即TMR0分频比1:
1.
WPUB=0b00001111;
IOCB=0b00001111;//低四位电平变化中断允许
GIE=1;RBIE=1;RBIF=0;TMR0IE=0;T0IF=0;
//----TMR2设置--------//
//PR2=99;//按照计算,每20us中断一次
T2CON=0b00000100;
TMR2IE=1;//允许TMR2中断
PEIE=1;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PIC 单片机 课程设计 信号发生器