单片机课程设计简易函数发生器.docx
- 文档编号:9572995
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:30
- 大小:739.76KB
单片机课程设计简易函数发生器.docx
《单片机课程设计简易函数发生器.docx》由会员分享,可在线阅读,更多相关《单片机课程设计简易函数发生器.docx(30页珍藏版)》请在冰点文库上搜索。
单片机课程设计简易函数发生器
摘要…………………………………………………………………………2
第一章课程设计任务书……………………………………………3
第二章系统的要紧功能说明………………………………………4
系统的要紧功能……………………………………………………4
系统的设计思路……………………………………………………4
第三章元器件介绍……………………………………………………5
单片机AT89C51……………………………………………………5
数模转换器DAC0832………………………………………………6
数码管显示器………………………………………………………8
3.4接口扩展8255A……………………………………………………9
其他元器件说明……………………………………………………10
第四章硬件设计………………………………………………………10
工作原理……………………………………………………………10
单片机及外围电路设计……………………………………………11
输入模块设计………………………………………………………11
显示模块设计………………………………………………………12
系统硬件设计图……………………………………………………12
硬件系统设计图……………………………………………………14
第五章软件设计………………………………………………………15
程序分析……………………………………………………………15
程序流程图…………………………………………………………15
程序设计……………………………………………………………16
源程序………………………………………………………………21
参考文献……………………………………………………………………27
小结与体会…………………………………………………………………27
摘要
本设计是一个基于单片机的简易函数发生器,函数信号发生器的设计方式有多种,利用单片机设计的函数信号发生器具有编程灵活、显示清楚等优势。
它能产生方波、正弦波、锯齿波和三角波等波形,并实现对频率的调剂。
在编程语言上,此处选择了简便有效的C语言,在波形调试和与硬件配合时加倍容易。
通过不断改良,此刻已实现了所有与其目标。
关键词:
单片机函数发生波形C语言
第一章课程设计任务书
题目:
简易函数信号发生器设计
初始条件:
1.采纳MCS51作为主控芯片;
2.采纳D/A转换和放大处置,输出信号;
3.要求能输出方波、三角波、锯齿波和正弦波4种信号,频率可调。
要求完成的要紧任务:
1、查阅参考资料,自学相关可编程接口芯片的内部结构、工作方式和初始化编程进程;
2、依照设计系统的具体功能和性能参数,明确设计目标;
3、单片机系统及其扩展接口电路设计,绘制系统硬件原理图;
4、编制系统操纵源程序,绘制源程序流程图,包括初始化和监控程序;
5、撰写设计说明书(包括参考资料目录,字数很多于5000字)
时刻安排:
(两周)
序号
内容
所用时间(天)
1
查阅资料,学习相关芯片知识
2
2
系统及扩展电路硬件设计
3
3
初始化程序和应用程序设计
3
4
相关硬件电路和程序调试
3
5
课程设计答辩
1
合计
12
指导教师签名:
2021年1月3日
系主任(或责任教师)签名:
年月日
第二章系统的要紧功能说明
系统的要紧功能
课程设计要求的内容为:
制作简易函数发生器,采纳MCS51作为主控芯片;采纳D/A转换和放大处置,输出信号;要求能输出方波、三角波、锯齿波和正弦波4种信号,频率可调。
该系统不但知足了课程设计题目的大体要求,而且增设了LED波形指示灯,数码管频率显示器等原件,使操作更简单,利用界面更人性化。
系统的设计思路
第三章元器件介绍
单片机AT89C51
1.大体组成
AT89C51内部结构
1.运算器
运算器由8位算术逻辑运算单元ALU(ArithmeticLogicUnit)、8位累加器ACC(Accumulator)、8位寄放器B、程序状态字寄放器PSW(ProgramStatusWord)、8位暂存寄放器TMP1和TMP2等组成。
2.操纵器
要紧由程序计数器PC、指令寄放器IR、指令译码器ID、堆栈指针SP、数据指针DPTR、时钟发生器及按时操纵逻辑等组成。
3.单片机芯片引脚描述
单片机引脚图
(1)主电源引脚VCC
(2)外接晶振引脚XTAL1和XTAL2
(3)复位引脚RST,输入高电平是AT89C51复位
(4)输入/输出引脚P0、P1、P2、P3(共32根)
(5)程序存储器选择信号引脚EA
(6)外部程序存储器读选通信号引脚PSEN
(7)外部存储器低8位地址锁存信号引脚ALE
数模转换器DAC0832
DAC0832是8分辨率的D/A转换集成芯片。
与微处置器完全兼容。
那个DA芯片以其价钱低廉、接口简单、转换操纵容易等优势,在单片机应用系统中取得普遍的应用。
D/A转换器由8位输入锁存器、8位DAC寄放器、8位D/A转换电路及转换操纵电路组成。
DAC0832
(1)分辨率为8位;
(2)电流稳固时刻1us;
(3)可单缓冲、双缓冲或直接数字输入;
(4)只需在满量程下调整其线性度;
(5)单一电源供电(+5V~+15V);
(6)低功耗,20mW。
DAC0832结构:
(1)D0~D7:
8位数据输入线,TTL电平,有效时刻应大于90ns(不然锁存器的数据会犯错);
(2)ILE:
数据锁存许诺操纵信号输入线,高电平有效;
(3)CS:
片选信号输入线(选通数据锁存器),低电平有效;
(4)WR1:
数据锁存器写选通输入线,负脉冲(脉宽应大于500ns)有效。
由ILE、CS、WR1的逻辑组合产生LE1,当LE1为高电平常,数据锁存器状态随输入数据线变换,LE1的负跳变时将输入数据锁存;
(5)XFER:
数据传输操纵信号输入线,低电平有效,负脉冲(脉宽应大于500ns)有效;
(6)WR2:
DAC寄放器选通输入线,负脉冲(脉宽应大于500ns)有效。
由WR2、XFER的逻辑组合产生LE2,当LE2为高电平常,DAC寄放器的输出随寄放器的输入而转变,LE2的负跳变时将数据锁存器的内容打入DAC寄放器并开始D/A转换。
(7)IOUT1:
电流输出端1,其值随DAC寄放器的内容线性转变;
(8)IOUT2:
电流输出端2,其值与IOUT1值之和为一常数;
(9)Rfb:
反馈信号输入线,改变Rfb端外接电阻值可调整转换满量程精度;
(10)Vcc:
电源输入端,Vcc的范围为+5V~+15V;
(11)VREF:
基准电压输入线,VREF的范围为-10V~+10V;
(12)AGND:
模拟信号地
(13)DGND:
数字信号地
数码管显示器
LED数码管由7个发光二极管组成,另外,还有一个圆点型发光二极管(在图中以dp表示),用于显示小数点。
通过七段发光二极管亮暗的不同组合,能够显示多种数字、字母和其它符号。
本设计采纳共阴极接法:
把发光二极管的阴极连在一路组成公共阴极。
利历时公共阴极接地,如此阳极端输入高电平的段发光二极管就导通点亮,而输入低电平的那么不点亮。
各数字及部份字母代码表如下:
字型
共阴极字形代码
字型
共阴极字形代码
字型
共阴极字形代码
0
3FH
6
7DH
C
39H
1
06H
7
07H
d
5EH
2
5BH
8
7FH
E
79H
3
4FH
9
6FH
F
71H
4
66H
A
77H
灭
00H
5
6DH
b
7CH
3.48255A
Intel8086/8088系列的可编程外设接口电路简称PPI,型号为8255(改良型为8255A及8255A-5),具有24条输入/输出引脚、可编程的通用并行输入/输出接口电路。
它是一片利用单一+5V电源的40脚双列直插式大规模集成电路。
8255A的通用性强,利用灵活,通过它CPU可直接与外设相连接。
8255A在利用前要写入一个方式操纵字,选择A、B、C三个端口各自的工作方式,共有三种;
方式0:
大体的输入输出方式,即不必联络就能够够直接进行的I/O方式。
其中A、B、C口的高四位或低四位可别离设置成输入或输出。
方式1:
选通I/O,现在接口和外围设备需联络信号进行和谐,只有A口和B口能够工作在方式1,现在C口的某些线被规定为A口或B口与外围设备的联络信号,余下的线只有大体的I/O功能,即只工作在方式0.
方式2:
双向I/O方式,只有A口能够工作在这种方式,该I/O线即可输入又可输出,现在C口有5条线被规定为A口和外围设备的双向联络线,C口剩下的三条线可作为B口方式1的联络线,也能够和B口一路方式0的I/O线。
8255A是一个并行输入、输出器件,具有24个可编程设置的I/O口,包括3组8位的I/O为PA口、PB口、PC口,又可分为2组12位的I/O口:
A组包括A口及C口高4位,B组包括B口及C组的低4位。
A口能够设置为方式0、方式1、方式2,B口与C口只能设置为方式0或方式1.
其他元器件说明
晶振电路利用12MHZ的晶体振荡器,30PF的电容。
复位电路采纳10UF的电容,10K的电阻。
波形指示区采纳四个绿色LED灯。
频率显示器电路中除3个7段数码管外还利用了3个三极管。
波形信号的放大电路上采纳了两个放大器。
要紧元器件列表:
原件名称
备注
元件名称
备注
单片机
AT89C51
LED灯
数模转换器
DAC0832
运算放大器
锁存器
74LS373
三极管
NPN
并行接口芯片
8255A
晶振
12MH
示波器
7段数码管
共阴极
第四章硬件设计
工作原理
本系统由单片机AT89C51对不同的模块进行统一调配操纵以达到设计目的。
第一是输入模块,为节省引脚,此处设计为4×4矩阵键盘。
软件选用反转法扫描。
此功能由P1口操纵。
数据读入后,经单片机程序分析,别离操纵三个输出部份:
.四个LED灯,通过其亮灭显示当前输出的波形类型,此功能由P、P、P、P四个引脚操纵;
.三个共阴极数码显示管,用以显示当前波形的频率,此功能由P0口输出数据,8255A扩展接话柄现;
.示波器。
P0口分时复用,操纵数码管显示后对数模转换器DAC0832输出波形数据,信号经放大电路放大,然后送至示波器显示。
外围原件此处省略不讲,软件部份见下章。
单片机及外围电路设计
如下图,单片机P口采纳总线的连接形式。
晶振频率为12MHz,电容C1、C2均为10uF。
复位电路中,电容C3的作用是在按钮按下时贮存电能,电阻R11用作在按钮断开时爱惜电路。
口接高电平和按钮,用来实现外部中断的下降沿触发。
输入模块设计
为节省接口,键盘设计为4*4矩阵键盘,通过P1口的高四位和低四位别离对键盘的行和列进行扫描,从而检测出按下的键。
具体工作情形详见软件部份。
接口扩展
为了解决接口不足的问题,本设计中利用8255A芯片对P0口进行扩展,它采纳工作方式0即最大体的输入输出方式。
用锁存器进行地址锁存,将P0口输出的数据依次寄存在A、B、C口,操纵所接的三个数码管持续显示。
显示模块设计
频率显示
此处采纳3个共阴极的数码管显示波形频率,显示方式为静态显示。
提供数据的8255A芯片具有锁存功能,故数据只需输入一次即可持续显示。
次设计结构简单又能实现所要求的功能,同时也是设计要求外的创新点。
波形选择
此处为设计要求外的第二处创新点,为了告知操作者示波器当前显示波的波形,我采纳了四个LED灯对相应的波形进行指示,通过观看灯的亮灭就能够加以区分。
图示状态为:
三角波正在显示。
波形显示
此处是整个系统的第二核心,当P0口对频率显示信号输出完毕后,数模转换器开关打开,P0开始为其输送波形信号。
输入的信号经功率放大器放大后送至示波器显示
系统硬件设计图
第五章软件设计
程序分析
本设计采纳简单方便的C语言编写程序。
为了使编程时思路清楚,采纳模块化的编写方式,即分功能编写子程序,再由主函数依照需要依次挪用。
依照思路,程序进入主函数后需先对要用到的外部中断和按时计数器进行初始化,然后进入波形输出的无穷循环中,在此进程中由中断系统对输出进行操纵,第一程序操纵P1口扫描键盘,从头输入波形和频率的信息,输入的数据经程序处置后输出数据送至LED波形指示灯和数码管频率显示器对输入信息进行显示。
以后P0口为数模转换器输送波形数据,使示波器显示波形。
程序流程图
程序设计
主函数
voidmain()
{
chushihua();//挪用初始化程序,对中断和按时计数器初始化
while
(1)
{
{switch(old)
{case33:
fang();break;//检查按键的返回值并选择输出波形
case44:
tran();break;
case55:
jvchi();break;
case66:
sin();break;
}
}
}
}
初始化程序:
voidchushihua()
{sled=0x80;//8255A操纵寄放器初始化
IT0=1;//外部中断0下降沿触发
EX0=1;//外部中断0中断许诺
EA=1;//CPU中断许诺打开
PX0=1;//外部中断0优先
TMOD=0x20;//
TR1=1;//
}
延时程序:
因为C语言编写的程序必需通过编译才能应用于单片机,而不同的语句编译后指令的周期不确信,故延时函数不宜利用简单的for语句或while语句。
本处利用单片机的按时计数器计时,在专门大程度上提高了延不时刻的精准性。
voiddelay()//延时
{
while(!
TF1);
TF1=0;
}
voiddelayms(uintj)//
{ucharmm;
while(j--)
{for(mm=0;mm<216;mm++);}
}
显示程序:
此处的显示程序为数码管频率显示提供数据。
为了便于编程,显示程序由显示子程序和总显示程序两部份组成。
显示子程序设置了三个不同的参数,通过总程序的挪用及赋值,在数组中挪用不用的数字对应的代码进行显示。
voidxshz(ucharh,ucharm,ucharp)//显示子程序
{sled1=smg[h];
sled2=smg[m];
sled3=smg[p];
}
voidxsh()//总显示
{if(k==3)xshz(a[0],a[1],a[2]);
if(k==2)xshz(12,a[0],a[1]);
if(k==1)xshz(12,12,a[0]);
if(k==0)xshz(10,0,11);
}
键盘输入程序:
本处利用键盘的扫描方式为反转法,其原理是给端口赋值两次,通过检测两次的结果而取得按键的信息。
例如:
1.给P1口赋值0x0f,即00001111,假设第一个键按下了,那么这时P1口的实际值为00001110;
2.给P1口再赋值0xf0,即11110000,若是第一个键按下了,那么这时P1口的实际值为11100000;
3.把两次P1口的实际值相加得11101110,即0xee。
由此咱们便取得了按下第一个键时所对应的数值0xee,以此类推可得出其他15个按键对应的数值,有了这种对应关系,矩阵键盘编程问题也就解决了,也确实是程序的算法已经有了。
ucharinput()//输入
{ucharhang,lie,rr;
rr=0;
P1=0xf0;
if((P1&0xf0)!
=0xf0)//软件消抖
{delayms(20);
if((P1&0xf0)!
=0xf0)
{hang=P1&0xf0;
P1=0x0f;
lie=P1&0x0f;
rr=hang+lie;
}
}
if(rr==table[0])return(33);//对不同扫描结果返回不同的值
elseif(rr==table[1])return(44);
elseif(rr==table[4])return
(1);
elseif(rr==table[5])return
(2);
elseif(rr==table[2])return(55);
elseif(rr==table[3])return(66);
elseif(rr==table[6])return(3);
elseif(rr==table[7])return(0);
elseif(rr==table[8])return(4);
elseif(rr==table[9])return(5);
elseif(rr==table[10])return(6);
elseif(rr==table[11])return(11);
elseif(rr==table[12])return(7);
elseif(rr==table[13])return(8);
elseif(rr==table[14])return(9);
elseif(rr==table[15])return(22);
elsereturn(12);
}
波形函数:
方波
voidfang()
{uchari;
DAC0832=0;
for(i=0;i<128;i++)
delay();
DAC0832=0xff;
for(i=0;i<128;i++)
delay();
}
锯齿波
voidjvchi()
{unsignedcharx;
for(x=0;x<255;x++)
{DAC0832=x;
delay();}
}
三角波
voidtran()//三角波
{unsignedchary;
for(y=0;y<128;y++)
{DAC0832=y;
delay();
}
for(y=128;y>0;y--)
{DAC0832=y;
delay();
}
}
正弦波
voidsin()
{unsignedcharmm;
for(mm=0;mm<255;mm++)
{DAC0832=table2[mm];
delay();}
}
中断函数:
voidzhongduan()interrupt0//中断
{uchare,f=0;
f=0;
k=0;
while(input()==12);
a[0]=input();
if(a[0]==33){p30=0;p31=1;p33=1;p34=1;old=a[0];}
elseif(a[0]==44){p31=0;p30=1;p33=1;p34=1;old=a[0];}
elseif(a[0]==55){p33=0;p31=1;p30=1;p34=1;old=a[0];}
elseif(a[0]==66){p34=0;p30=1;p31=1;p33=1;old=a[0];}
else{
for(e=0;e<3;e++)
{while(input()>9);
a[e]=input();
f=10*f+a[e];
k++;
xsh();
delayms(100);
}
TH1=256-(1000000/f)/256;
TL1=256-(1000000/f)/256;
}
}
5.4源程序
#include
#include
#defineDAC0832XBYTE[0x0200]
#definesled1XBYTE[0x0100]
#definesled2XBYTE[0x0101]
#definesled3XBYTE[0x0102]
#definesledXBYTE[0x0103]
#defineucharunsignedchar
#defineuintunsignedint
ucharinput();
uintf;
sbitp30=P3^0;
sbitp31=P3^1;
sbitp33=P3^3;
sbitp34=P3^4;
sbitp35=P3^5;
sbitp36=P3^6;
sbitp37=P3^7;
ucharold;
uchara[4];
uchark=0;
ucharcodesmg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x39,
0x3e,0x00};
ucharcodetable[]={0xe7,0xeb,0xed,0xee,0xd7,0xdb,0xdd,0xde,0xb7,0xbb,0xbd,
0xbe,0x77,0x7b,0x7d,0x7e};
ucharcodetable2[]={
0x80,0x83,0x85,0x88,0x8A,0x8D,0x8F,0x92,
0x94,0x97,0x99,0x9B,0x9E,0xA0,0xA3,0xA5,
0xA7,0xAA,0xAC,0xAE,0xB1,0xB3,0xB5,0xB7,
0xB9,0xBB,0xBD,0xBF,0xC1,0xC3,0xC5,0xC7,
0xC9,0xCB,0xCC,0xCE,0xD0,0xD1,0xD3,0xD4,
0xD6,0xD7,0xD8,0xDA,0xDB,0xDC,0xDD,0xDE,
0xDF,0xE0,0xE1,0xE2,0xE3,0xE3,0xE4,0xE4,
0xE5,0xE5,0xE6,0xE6,0xE7,0xE7,0xE7,0xE7,
0xE7,0xE7,0xE7,0xE7,0xE6,0xE6,0xE5,0xE5,
0xE4,0xE4,0xE3,0xE3,0xE2,0xE1,0xE0,0xDF,
0xDE,0xDD,0xDC,0xDB,0xDA,0xD8,0xD7,0xD6,
0xD4,0xD3,0xD1,0xD0,0xCE,0xCC,0xCB,0xC9,
0xC7,0xC5,0xC3,0xC1,0xBF,0xBD,0xBB,0xB9,
0xB7,0xB5,0xB3,0xB1,0xAE,0xAC,0xAA,0xA7,
0xA5,0xA3,0xA0,0x9E,0x9B,0x99,0x97,0x94,
0x92,0x8F,0x8D,0x8A,0x88,0x85,0x83,0x80,
0x7D,0x7B,0x78,0x76,0x73,0x71,0x6E,0x6C,
0x69,0x67,0x65,0x62,0x60,0x5D,0x5B,0x59,
0x
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计 简易 函数 发生器