基于单片机的简易低频信号发生器的设计

发布时间:2018-07-02 00:18:28

第1章 绪论

1.1 信号发生器的现状与发展

信号发生器是一种常用的信号源,广泛的应用于电子电路、自动控制和科学实验等领域。它是一种为电子测量和计量工作提供符合严格技术要求的电信号设备。因此,信号发生器和示波器、电压表、频率计等仪器一样是最普通、最基本的,也是应用最广泛的电子仪器之一,几乎所有的电参量的测量都需要用到信号发生器。

自六十年代以来,信号发生器就有了迅速的发展,出现了函数发生器、扫描信号发生器、合成信号发生器、控制信号发生器等种类。各种信号发生器的主要性能指标也都有了大幅度的提高,同时在简化机械结构、小型化、多功能等各方面也有了显著的发展。

1.2 设计内容及方案的确定

本课题要求以MCS-51系列单片机为核心,设计一个简易低频信号发生器。要求能输出0.150HZ的正弦波、三角波和方波信号,能方便的用键盘选择不同的输出并在LED显示器上显示。单片机通过查表的方法完成波形数据要求,输出的正弦波、三角波和方波信号频率在0.150HZ可调,系统有启动、调频和不同波形选择按键,转速显示要求至少4位。根据要求我们组讨论如下:直接采用8DA转换芯片,让单片机对8DA芯片进行控制,从而输出波形。

第2 基于单片机的简易低频信号发生器的设计

2.1 总体设计框图

2.1.1总体设计框图

如方框图所示根据要求我们组讨论如下:通过C程序的编译,频率档位选择按键UPDOWN以及波形选择按键SWITCH,通过数码管显示频率档位和波形。并且通过DAC0832实现数模转换,最后用示波器观察输出的结果。

2.2 单片机结构及系统工作原理

数模转换器器工作原理就是模拟信号数字化的逆过程,模拟信号数字化通过采样、量化、编码完成,那么数字信号模拟化的过程读取二进制码、二进制码权值相加、输出一个总的电流或电压。这其实就是一个模拟电子计数中的加法器。量化电平个数相对于数模转换的分辨率,对于低频低成本的信号发生器,为了简化程序设计,所以直接采用8DA转换芯片DAC0832,让单片机AT89C518DA芯片进行控制,从而输出波形。

单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。单尽管他的大部分功能集成在一块小芯片上,但是它具有一个完整计算机所需要的大部分部件:CPU、内存、内部和外部总线系统,大部分还会具有外存。同时集成诸如通讯接口、定时器,实时时钟等外围设备。

我们所设计的程序是总结了目前各个智能化设计程序的水位监测系统,采用51控制单片机,集水位采集、存储、显示及远程联网于一体的设计,使得仪器仪表数字化、智能化、微型化。同时采用AT89系列单片机,AT89系列单片机是ATEML公司的8Flash单片机。AT89系列单片的核心是8031,在软件和硬件方面与MCS-51系列完全兼容,AT89系列的指令与有关定义和MCS51完全相同,MCS—51系列单片机应用系统编写的程序可以直接使用。

AT89系列的引脚排列、定义与MCS-51完全一致,可以直接替换。由于内部有FlashROM,所以编写的程序烧录很方便,易于电擦除,可以反复使用,非常方便用户对程序进行修改,缩短研制周期,降低了研制成本。在单片机部有Flash存贮器,功耗特别低,FlashROM的容量从TA89C10511KAT89S5520K,有许多品种,选择余地大。

2.3 系统工作流程图

2.3.1 系统工作流程图

C编译时,通过在主程序内设置中断初始化、调用按键子程序、档位频率键、波形种类选择键的设置,在辅助程序中编译好各个子程序使得程序可以通顺流程的进行

2.4独立按键流程图

编译按键子程序时,要求开始后系统默认设置波形种类选择档位为1,设置频率档位为5,通过标志位来判断走向,如果标志位不为0则直接结束,如果标志位为0,则按键松开后看a的取值来选择波形种类,如果 a>3,则认为a=1,如果不大于则结束。

2.4.1 独立按键流程图

2.5中断服务程序流程图

2.5.1 中断服务程序流程图

程序开始后根据Case语句给定时器赋初值,判定a的取值,如果a=1则输出正弦波形,如果a=2则输出三角波形,如果a=3则输出方波波形,待波形输出后看中断服务计数i的取值如果i++;if(i>255)i=0,则程序结束。

第3 各硬件单元电路的设计

3.1 AT89C51单元电路的设计

单片机的设计利用P1 P2口共同控制数码管的一系列显示,P1口为段码输出,P2.0 P2.3 作为位码输出,P0口作为输出,输出到D/A转换器的输入,P3.2 P3.3 P3.4分别作为波形种类选择按键的输入,波形频率档位加的输入,波形频率档位减的输入,P3.6口连接到D/A转换器的WR口。

3.1.1 AT89C51单元设计电路图

3.2 按键的单元电路设计

三个不同的按键一端连在单片机P3口,另一端接地使得电路连通,在按键与单片机间还需增加三个上拉电阻来避免出现悬空的可能性

3.2.1 AT89C51单元设计电路图

3.3 DAC0832芯片的单元电路设计

本单元的设计主要是把单片机的数字输出转换成模拟输出,把单片机的八位输出送到D/A转换器的D10D17作为转换器的输入,从单片机P3.6口输出的信号送到D\A寄存器选通输入WR。因为D\A转换器的输出是电流,所以要加一个运算放大器把电流转换成电压。

3.3.1DAC0832单元设计电路

第4 系统仿真

由于本次课程设计条件的限制,只做了软件(protues)仿真。按照设计的电路连接好, 电路接好后,按照预先设定好的调试步骤,逐步对电路进行系统调试,调试结果做如下:

4.1 方波

当数码管上第四位及波形种类显示位显示为3时,示波器中显示为方波,此时频率的大小受频率档位选择键的控制。

4.1.1方波仿真图

4.2 正弦波

当数码管上第四位及波形种类显示位显示为1时,示波器中显示为正弦波,此时频率的大小受频率档位选择键的控制。

4.2.2正弦波仿真图

4.3 三角波

当数码管上第四位及波形种类显示位显示为2时,示波器中显示为三角波,此时频率的大小受频率档位选择键的控制。

4.3.1三角波仿真图

结束语

这次单片机课程设计我们历时两个星期,但经过这两个星期的实践和体验下来,我对单片机越来越感兴趣了,之前对我来说学到的仅是那些理论知识,通过这次设计的具体应用,我发现了它的强大之处。这次课程设计感触最深的是团队和合作。在这我要谢过那些帮我的老师和同学。现在想来,学校安排的课程设计确实有着它深层的意义,它不仅仅让我们综合那些理论知识来运用到设计和创新,还让我们知道了一个团队凝聚在一起时所能发挥出的巨大潜能。

通过这次课程设计我也发现了自身存在的不足之处,虽然感觉理论上已经掌握,但在运用到实践的过程中仍有意想不到的困惑,经过一番努力才得以解决。这也激发了我今后努力学习的兴趣,我想这将对我以后的学习产生积极的影响。

通过这次设计,我懂得了学习的重要性,了解到理论知识与实践相结合的重要意义,学会了坚持、耐心和努力,这将为自己今后的学习和工作做出了最好的榜样。

单片机课程设计结束了,但通过设计我所学到的东西却将长久的存在。相信这次设计带给我们的严谨的学习态度和一丝不苟的科学作风将会给我们未来的工作和学习打下一个更坚实的基础。

最后真诚的感谢李晓秀的老师的教育与指导,感谢周定双与陈顺舟同学在整个过程中对我的帮助!

参考文献

1】教材《单片微型计算机技术》 刘国荣 机械工业出版社

2】《单片微型计算机原理、应用及接口技术》 张迎新 国防工业出版社

3】单片机实用系统设计技术》 房小翠 国防工业出版社

4】《单片机应用系统设计》 何立民 北航出版社

5】《单片机原理及接口技术 曹琳琳编 国防科技大学出版社

附录A 建议信号发生器设计控制电路及仿真

附录B 源程序清单

#include

#include

#define P0 XBYTE[0xdf00] // P0琐存地址

unsigned char code seg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //显示数组

unsigned char code sig_sin[256]={

0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,

0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8,

0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf4,

0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,

0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,

0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe3,0xe1,0xde,0xdc,

0xda,0xd8,0xd6,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb4,

0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99,0x96,0x92,0x8f,0x8c,0x89,0x86,0x83,

0x80,0x7d,0x79,0x76,0x73,0x70,0x6d,0x6a,0x67,0x64,0x61,0x5e,0x5b,0x58,0x55,0x52,

0x4f,0x4c,0x49,0x46,0x43,0x41,0x3e,0x3b,0x39,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27,

0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x14,0x12,0x10,0xf,0xd,0xc,0xb,0x9,

0x8,0x7,0x6,0x5,0x4,0x3,0x3,0x2,0x1,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,

0x0,0x1,0x1,0x2,0x3,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xa,0xc,0xd,0xe,0x10,0x12,0x13,

0x15,0x17,0x18,0x1a,0x1c,0x1e,0x20,0x23,0x25,0x27,0x29,0x2c,0x2e,0x30,0x33,0x35,

0x38,0x3b,0x3d,0x40,0x43,0x46,0x48,0x4b,0x4e,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,

0x66,0x69,0x6c,0x6f,0x73,0x76,0x79,0x7c

};

unsigned char a; //全局信号 信号选择变量

unsigned int b; //全局信号 档位变量 送显示

unsigned int pinlv; // 档位变量 送定时器赋初值

unsigned int i=0; // 中断服务计数

sbit butten_swtich=P3^2; //按键1 波形选择

sbit butten_up =P3^3; //按键2 频率+

sbit butten_down =P3^4; //按键3 频率-

void delay1ms(unsigned char ii)//延时基时1毫秒 子程序

{

unsigned char jj;

for(;ii>0;ii--)

for(jj=0;jj<125;jj++);

}

void Init_Timer1(void) //定时器0初始化

{

EA=1; //开总中断

ET1=1; //定时器T1中断允许

TMOD=0x10; //TMOD=0001 000B,使用定时器T1的模式1

TH1=(65536-500)/256; //定时器T1的高8位赋初值

TL1=(65536-500)%256; //定时器T1的高8位赋初值

TR1=1; //启动定时器T1

}

void butten_scan1() //按键处理子程序

{

if(butten_swtich==0) //信号按键选择

{

delay1ms(20); //消抖延时

if(butten_swtich==0)

{

while(!butten_swtich); //等待按键松开

a++;

if(a>3)a=1; //循环选择

}

}

}

void butten_scan2()

{

if(butten_up==0) //信号按键选择

{

delay1ms(20); //消抖延时

if(butten_up==0)

{

while(!butten_up); //等待按键松开

b=b+1;

if(b>9)b=9; //再按加就不再加了

}

}

else if(butten_down==0) //信号按键选择

{

delay1ms(10); //消抖延时

if(butten_down==0)

{

while(!butten_down); //等待按键松开

b=b-1;

if(b<1)b=1; //再按减 就不再减了

}

}

}

main()

{ a=1;b=5;

Init_Timer1();

while(1)

{

butten_scan1(); //调用按键处理子程序

butten_scan2();

P2=0x1;

P1=seg[a]; //信号输出送显示 1三角波 2正弦波 3方波

delay1ms(10);

P2=0x8;

P1=seg[b]; //档位显示 0~9 默认第5

delay1ms(10);

}

}

void OS_Timer1(void) interrupt 3 // 系统OS定时中断服务

{

switch(b) //根据不同的档位 给定时器赋不同的初值

{

case 1: pinlv=0xf2;break;

case 2: pinlv=0xf3;break;

case 3: pinlv=0xf4;break;

case 4: pinlv=0xf5;break;

case 5: pinlv=0xf6;break;

case 6: pinlv=0xf7;break;

case 7: pinlv=0xf8;break;

case 8: pinlv=0xf9;break;

case 9: pinlv=0xfa;break;

}

TH1=pinlv; //定时器赋初值

TL1=0xff; //定时器赋初值

if (a==1) P0=sig_sin[i]; //P0口给正弦波信号数组

else if (a==2) {if(i<128)P0=2*i;else P0=254-2*i;}//P0口给三角波信号数组

else if (a==3){ if(i>128)P0=0xff;else P0=0;} //方波

i++;if(i>255)i=0;

}

第1章 绪论 1

1.1 信号发生器的现状与发展 1

1.2 设计内容及方案的确定 1

2 基于单片机的简易低频信号发生器的设计 2

2.1 总体设计框图 2

2.2 单片机结构及系统工作原理 3

2.3 系统工作流程图 4

2.4独立按键流程图 4

2.5中断服务程序流程图 6

3 各硬件单元电路的设计 7

3.1 AT89C51单元电路的设计 7

3.2 按键的单元电路设计 8

3.3 DAC0832芯片的单元电路设计 9

4 系统仿真 9

4.1 方波 10

4.2 正弦波 11

4.3 三角波 12

结束语 13

参考文献 14

附录A 建议信号发生器设计控制电路及仿真 15

附录B 源程序清单 16

基于单片机的简易低频信号发生器的设计

相关推荐