1、课程设计任务书设 计 题 目 10: 简易波形发生器学生姓名课程名称 微处理器与接口技术 专业班级地点 起止时间 2016 年 12 月 26 日12 月 30日设计内容硬件设计及样品制作设计参数1.利用单片机实现方波、三角波、正弦波输出。2.测试仪器采用示波器3.能够实现按键选择功能设计进度1. 2016 年 12 月 26 日27 日查阅资料,确定设计方案2. 2016 年 12 月 28 日29 日程序设计和硬件调试3. 2016 年 12 月 30 日撰写课程设计报告,答辩设计成果1. 设计说明书一份(不少于 2000 字);2. 样品一套。参考资料1. 楼然苗,李光飞,单片机课程设计
2、指导,北京航空航天大学出版社,20122. 李全利,单片机原理及应用,清华大学出版社,2014说明1本表应在每次实施前由指导教师填写一式 2 份,审批后所在系(部)和指导教师各留 1份。2多名学生共用一题的,在设计内容、参数、要求等方面应有所区别。3若填写内容较多可另纸附后。系(部)分管领导: 教研室主任: 指导教师:年 月 日目录第一章 引言 1第二章 电路原理 22.1 基本原理 .22.2 PCF8951 引脚功能 .22.3 PCF8951 电路原理 .3第三章 程序设计 33.1 程序设计与分析 .33.2 主程序流程图 8第四章 调试、测试分析及结果 84.1 程序编译 .84.2
3、 观测波形 .94.3 结果分析 .10第五章 小结 10参考文献 11附录 1 程序 .11附录 2 电路图 .161第一章 引言单片机具有良好的控制性能和优秀的嵌入品质,近年来单片机在各种领域都获得广泛的应用:智能仪器仪表、机电一体化产品、实时工业控制、分布系统的前端模块、家用电器、交通运输、航空航天与军事。简易波形发生器这一实验运用到 AT89C52 单片机、PCF8591 芯片的 D/A 转换功能,用 Keil Vision 软件进行编程,最后将程序烧写入单片机,单片机连接示波器进行波形的检测。AT89C52 是一个低电压,高性能 CMOS8 位单片机,片内含 8k bytes 的可反
4、复擦写的 Flash 只读程序存储器和 256 bytes 的随机存取数据存储器(RAM),器件采用 ATMEL 公司的高密度、非易失性存储技术生产,兼容标准 MCS-51 指令系统,片内置通用 8 位中央处理器和 Flash 存储单元。AT89C52 有 40 个引脚,32个外部双向输入/输出(I/O)端口,同时内含 2 个外中断口,3 个 16 位可编程定时计数器,2 个全双工串行通信口,2 个读写口线,AT89C52 可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和 Flash 存储器结合在一起,特别是可反复擦写的 Flash 存储器可有效地降低开发成本。PCF8591 是
5、单片、单电源低功耗的 8 位 CMOS 数据采集器件,具有一个输出和一个串行 I2C 总线接口 PCF8591 具有 4 个模拟输入、1 个模拟输出和 1 个串行 I2C 总线接口。PCF8591 的 3 个地址引脚 A0, A1 和 A2 可用于硬件地址编程,允许在同个 I2C 总线上接入 8 个 PCF8591 器件,而无需额外的硬件。在PCF8591 器件输入输出的地址、控制和数据信号都是通过双线双向 I2C 总线以串行的方式进行传输。其功能包括多路模拟输入、内置跟踪保持、8-bit 模数转换和 8-bit 数模转换。I2C 总线系统中的每一片 PCF8591 通过发送有效地址到该器件来
6、激活。该地址包括固定部分和可编程部分,可编程部分必须根据地址引脚 A0、A1 和 A2来设置,在 I2C 总线协议中地址必须是起始条件后作为第一个字节发送。地址字节的最后一位是用于设置以后数据传输方向的读/写位,发送到 PCF8591 的第二个字节将被存储在控制寄存器,用于控制器件功能。控制寄存器的高半字节用于允许模拟输入。Vision 集成开发软件是 Keil 公司的产品,它集编辑、翻译(或汇编)、仿真调试等功能于一体、具有当代典型嵌入式处理器开发的典型页面。常用的版本是 Vision3,最新的版本是 Vision4,。它支持数百种嵌入式处理器2(包括 80C51 系列、非 80C51 系列
7、的多种单片机以及 ARM 处理器等芯片)开发。可以用汇编程序及 C51 语言的编程。第二章 电路原理2.1基本原理图 1 基本原理图信号发生器系统主要由 CPU、D/A 转换电路、基准电压电路、按键和波形指示电路、电源等电路组成。2.2 PCF8951引脚功能VDD、VSS:电源端。(2.56V)SDA、SCL:I2C 总线的数据线、时钟线。OSC:外部时钟输入端,内部时钟输出端。EXT:内部、外部时钟选择线,使用内部时钟时 EXT 接地。波形指示开关按键 单片机 D/A 转换电源输出3AGND:模拟信号地。AOUT:D/A 转换输出端。VREF:基准电源端。图 2 PCF8591芯片2.3
8、PCF8951电路原理I2C 总线只有两根连线,所以 PCF8591 只需要两根线连接到单片机,由开发板的电路图可知,AT89C52 与之相关的两个 I/O 口是 P1.1 和 P1.2。只需两根线便可完成数据的传输,这就使得器件间连接电路简单,电路板的体积会有效减小,系统的可靠性和灵活性将大大提高。由 PCF8591 的数据手册可知发送给PCF8591 的第三个字节被存储到 DAC 数据寄存器,并使用片上 D/A 转换器转换成对应的模拟电压。D/A 转换模拟输出电压由自动清零单位增益放大器缓冲。这个缓冲放大器可通过设置控制寄存器的模拟输出允许标志来开户或关闭。在激活状态,输出电压将保持到新的
9、数据字节被发送。在 PCF8591 器件上输入输出的地址、控制和数据信号都是通过双线双向 I2C 总线以串行的方式进行传输,电路简便。在执行 A/D 转换时,输出模拟电压由下方公式给出:=+(256 ) 7i=0i2i在设计是基于已经固化了的硬件电路运用软件编程的手段根据 PCF8591 的时序图实现 D/A 转换。为能够实现按键选择功能,定义 P3 的三个 I/O 口分别对应 s1、s2、s3 三个按键,编写每个按键的功能函数,然后定义按键扫描函数写入语句实现处理按键功能。在按键功能函数中,编写程序将数据从 SDA 引脚输入 PCF8591 芯片,每一个按键功能函数实现一种波形的产生。当三个
10、按键之一按下时,按键扫描函数会判断被按下的按键并调动其功能函数,向 PCF8591 输入相应的数据,输出对应的波形。在这些按键功能函数中,用循环语句将预先设计好的数据输入 PCF8591 芯片中实现数模转换输出模拟量形成波形。电路原理图见附录 2。第三章 程序设计3.1程序设计与分析设计参数是利用单片机实现方波、三角波、正弦波输出,测试仪器采用示波器,能够实现按键选择功能。按下按键 S1 输出三角波,按下按键 S2 输出方4波,按下按键 S3 输出正弦波。程序设计的主干应有文件包含、宏定义、端口定义、全局变量定义、自定义函数、主函数。三个 I/O 口分别接一个按键,PCF8591 需要两根线连
11、接到单片机,由开发板的电路图可知,单片机与之相关的两个 I/O 口是 P1.1 和 P1.2,所以端口定义如下:sbitS1=P30;sbit S2=P31;sbit S3=P32;sbitscl=P11;/IIC 的时钟线sbitsda=P12;/IIC 的数据线。由于用到 I2C 总线型的 PCF8591 芯片,因此还得写 I2C 总线初始化函数,通过观测 PCF8591D/A 转换的时序图,可以写出 IIC 的初始化函数、IIC 的起始信号函数、IIC 的停止信号函数、IIC 的应答信号函数、向 IIC 写一个字节的数据函数、向 PCF8591 里写入数据(即电压量的数据)的语句。voi
12、d init(void)/IIC 的初始化scl=1;delayus();sda=1;delayus();void start(void)/IIC 的起始信号scl=1;sda=1;delayus();sda=0;5delayus();scl=0;delayus();void stop(void)/IIC 的停止信号sda=0;scl=1;delayus();sda=1;delayus();scl=0;void ack(void)/IIC 的应答信号sda=0;scl=1;delayus();scl=0;sda=1;void write_byte(uchar date)/向 IIC 写一个字节
13、的数据uchari,temp;6temp=date;for(i=0;i#include #include 14#define uchar unsigned char#define uint unsignedintbit flag;sbitscl=P11; / 将 p1.0 口模拟时钟口sbitsda=P12; / 将 p1.3 口模拟数据口sbit S1= P30; sbit S2= P31; sbit S3= P32; ucharfl=0;uchar code fang=0x00,0xff; uchar code sanjiao=0x0f,0x1e,0x2d,0x3c,0x4b,0x5a,0
14、x69,0x78,0x87,0x96,0xa5,0xb4,0xc3,0xd2,0xe1,0xf0,0xff,0xff,0xf0,0xe1,0xd2,0xc3,0xb4,0xa5,0x96,0x87,0x78,0x69,0x5a,0x4b,0x3c,0x2d,0x1e,0x0f; uchar code zhengxian=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
15、,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,0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea
16、,0xe9,0xe7,150xe5,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,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51,0x4e,0x4c,0x48,0x
17、45,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,0x
18、09,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;void delayms(ucharms)/延时函数 uchari;while(ms-)for (i=0; i12
19、3; i+);16void delayus(void)/循环一次空语句 1 秒;void init(void)/IIC 的初始化scl=1;delayus();sda=1;delayus();void start(void)/IIC 的起始信号scl=1;sda=1;delayus();sda=0;delayus();scl=0;delayus();void stop(void)/IIC 的停止信号sda=0;17scl=1;delayus();sda=1;delayus();scl=0;void ack(void)/IIC 的应答信号sda=0;scl=1;delayus();scl=0;s
20、da=1;void write_byte(uchar date)/向 IIC 写一个字节的数据uchari,temp;temp=date;for(i=0;i8;i+)temp=temp1;scl=0;delayus();sda=CY;18delayus();scl=1;delayus();scl=0;delayus();sda=1;delayus();void write(ucharadd,ucharsda,uint date)start();write_byte(add);/0x90 表示器件地址为 000 的写操作ack();write_byte(sda);/0x40 表示四路单数入 00
21、 通道无增益的器件控制指ack();write_byte(date);/表示 DA 数据ack();stop();void trag()/输出三角波函数uchar s;init();19for(s=0;s34;s+) write(0x90,0x40,sanjiaos);delayus();void squ()/输出方波函数 uchar f;init();/I2C 总线初始化for(f=0;f2;f+)write(0x90,0x40,fangf);delayus();void sin(void)/输出正弦波函数 uchar x=0;init();for(x=0;x255;x+)write(0x90,0x40,zhengxianx);delayus();20void keyscan()/按键功能函数if(P3if(P3if(S1=0)fl=0;if(S2=0)fl=1;if(S3=0)fl=2;else flag=0;void main()init();while(1)keyscan();if(fl=0)trag();if(fl=1)squ();21if(fl=2)sin();附录 2 电路图图 8 硬件电路图 7 PCF8591在开发板上的电路结构22图 9 示波器显示三角波 图 10 示波器显示方波图 11 示波器显示正弦波