单片机信号发生器设计报告

单片机系统综合训练----设计报告

重庆科技学院

学生实习(实训)总结报告

院(系): 电气与信息工程学院 专业班级:_ _测控1202___ _ 学生姓名:________XX_______ 学 号:__XXXXXXXXXX_ _____ 实习(实训)地点:______ _XXXX_ ___________

报告题目: 报告日期: 2014 年 11 月 15 日

指导教师评语: _______________________________________

________________________________________________________

成绩(五级记分制):______ _______

指导教师(签字):

1

单片机系统综合训练----设计报告

实习(实训)总结报告的写法及基本要求

一、实习(实训)报告一般由标题和正文两部分组成

1.标题:标题可以采取规范化的标题格式,基本格式为,“关于××的实习(实训)报告”。

2.正文:正文一般分前言,主体,结尾三部分。

(1)前言:主要描述本次实习(实训)的目的意义、大纲的要求及接受实习(实训)任务等情况。

(2)主体:实习(实训)报告最主要的部分,详述实习(实训)的基本情况,包括:项目、内容、安排、组织、做法,以及分析通过实习(实训)经历了哪些环节,接受了哪些实践锻炼,搜集到哪些资料,并从中得出一些具体认识、观点和基本结论。

(3)结尾:可写出自己的收获、感受、体会和建议,也可就发现的问题提出解决问题的方法、对策;或总结全文的主要观点,进一步深化主题;或提出问题,引发人们的进一步思考;或展望前景,发出鼓舞和号召等。

二、对实习(实训)报告的要求

1.按照大纲要求在规定的时间完成实习(实训)报告,报告内容必须真实,不得抄袭。学生应结合自己所在工作岗位的工作实际写出本行业及本专业(或课程)有关的实习(实训)报告。

2.校外实习报告字数要求:不少于800字每周,累计实习3周及以上的不少于2000字。用A4纸书写或打印 (正文使用小四号宋体、行距1.5倍。其余排版要求以美观整洁为准)。校内实习(实训)报告字数要求可适当减少,具体要求由院系依据课程特点规定。

3.实习(实训)报告撰写过程中需接受指导教师的指导,学生应在实习(实训)结束之前将成稿交实习(实训)指导教师。

三、实习(实训)考核的主要内容

1.平时表现:实习(实训)出勤和实习(实训)纪律的遵守情况;实习(实训)现场的表现和实习(实训)笔记的记录情况、笔记的完整性。

2.实习(实训)报告:实习(实训)报告的完整性和准确性;实习(实训)的收获和体会。

3.答辩:在生产现场随机口试;实习(实训)结束时抽题口试。

2

单片机系统综合训练----设计报告

摘 要 本次实验以单片机为核心设计了一个低频函数信号发生器。信号发生器采用数字波形合成技术,通过硬件电路和软件程序相结合,可输出自定义波形,如正弦波、方波、三角波及其他任意波形。波形的频率和幅度在一定范围内可任意改变。通过C语言编程实现了波形的生成、硬件电路和软件部分的设计。介绍了单片机控制D/A转换器产生上述信号的硬件电路和软件编程、DAC0832 D/A转换器的原理和使用方法、AT89C52以及与设计电路有关的各种芯片、关于产生不同低频信号的信号源的设计方案。该信号发生器具有体积小、价格低、性能稳定、功能齐全、可以显示和调节当前时间等优点。

关键词:单片机 波形 DA转换

3

单片机系统综合训练----设计报告

目 录

实习(实训)总结报告的写法及基本要求 ...................................................................................... 2

摘 要 .................................................................................................................................................................... 3

1.功能描述(课程设计内容及要求) ............................................................................................................... 5

2 方案设计 .......................................................................................................................................................... 5

2.1 系统分析 .............................................................................................................................................. 5

3、硬件选择及电路设计 .................................................................................................................................... 6

3.1 最小系统设计 ...................................................................................................................................... 6

3.2按键电路设计 ....................................................................................................................................... 6

3.3显示电路设计 ....................................................................................................................................... 7

3.4 DAC转换电路设计 ............................................................................................................................... 7

4、软件设计 ........................................................................................................................................................ 8

4.1程序编制思想 ....................................................................................................................................... 8

4.2操作指南 ............................................................................................................................................... 8

4.3 主程序 .................................................................................................................................................. 8

4.4 按键子程序 .......................................................................................................................................... 9

4.5 时钟程序 ............................................................................................................................................ 10

4.6 显示子程序 ......................................................................................................................................... 11

5 程序调试 ........................................................................................................................................................ 12

6 技术小结 ........................................................................................................................................................ 12

7函数信号发生器的使用说明 ......................................................................................................................... 12

8心得体会 ......................................................................................................................................................... 13

9参考文献 ......................................................................................................................................................... 13

附录1:电路原理图 ......................................................................................................................................... 14

附录2:程序参考清单 ..................................................................................................................................... 15

4

单片机系统综合训练----设计报告

设计报告

1.功能描述(课程设计内容及要求)

设计一个单片机低频信号发生器 ◆ 读数直观,精确,性能稳定,操作方便

◆ 低频信号发生采用单片机波形合成发生器产生高精度,低失真的正弦波、方便、三角波

◆ 频率输出范围 0Hz ~ 100Hz 正弦波

◆波形频率可以通过按键调节

◆可以显示和按键调节当前时间

◆调节档位通过不同LED的显示来表示

2 方案设计

2.1 系统分析

实验要求实现单片机控制生成各种波形(方波,三角波,正弦波),需要DA转换芯片;实现按键的选择/调节波形,需要按键系统;

单片机信号发生器设计报告

实现时间/波形频率显示需要数码管显示单元;最后STC89C52也是必不可少的。所以该系统可以大体分成4部分:数码管显示系统、STC89C52芯片、按键系统以及PCF8591DA转换芯片。单片机根据按键的选择输出波形信号,再通过DA转换器将数字信号转换成模拟信号输出;也可以根据按键的选择在数码管显示和按键调节时间及波形的频率。根据方案总体规划-要求,设计系统结构原理如图2.1所示。

图2.1 系统方案设计框图

5

单片机系统综合训练----设计报告

3、硬件选择及电路设计

3.1 最小系统设计

根据实验要求,采用STC89C52芯片。电路如图3.1所示:

单片机信号发生器设计报告

图3.1 单片机最小系统电路

3.2按键电路设计

按键选用4按键的普通按键(模式按键、up键、down键、波形选择键),电路如图3.2所示:

单片机信号发生器设计报告

图3.2 按键电路

6

单片机系统综合训练----设计报告

3.3显示电路设计 显示器采用普通4位数码管即可,电路如图3.3所示:

单片机信号发生器设计报告

图3.3 显示电路

3.4 DAC转换电路设计 DA转换采用PCF8951芯片,电路如图3.4所示:

单片机信号发生器设计报告

图3.4 DAC转换电路

7

单片机系统综合训练----设计报告

4、软件设计

4.1程序编制思想

程序每5ms扫描一位按键,检查是否有键按下,有键按下则产生相应动作:改变时间(小时/分钟)、选择波形/时间模式、改变频率。STC89C52将产生的波形数字信号送到PCF9851转换为模拟信号通过示波器显示对应的波形。在波形的频率修改方面可以通过定时,决定波形的256个点之间的输出间隔来改变波的频率。

4.2操作指南 ◆ 接通电源,按下电源开关,数码管显示默认时间,mode按键复位

◆按下mode键改变小时档位对应LED发光,此时可以选择按下UP/DOWN调节小时的加减

◆按下mode键改变分钟档位对应LED发光,此时可以选择按下UP/DOWN调节分钟的加减

◆按下mode键改变波形档位对应LED发光,数码管显示默认波频率,此时可以选择按下UP/DOWN调节频率的加减,按下改变波形键可以改变输出的波形

◆按下mode键复位

4.3 主程序

主程序流程图如图4.3所示。

8

单片机系统综合训练----设计报告

图4.3 主程序流程图

4.4 按键子程序

if(p32==0)

{ m++;if(m>=4)m=0;}

if(m==0)

{P34=1;P35=1;}

if(m==1)

{P34=0;P35=1; if(key2==0)hour++;if(key3==0){hour--;if(hour<0)hour=23;}}

if(m==2)

{ P34=1;P35=0;if(key2==0)min++;if(key3==0){min--;if(min<0){min=59;hour--;}}

if(m==3)

{ if(key1==0)delay1(20);if(key1==0){while(key1==1);mode++;if(mode>3)mode=0;} if(m==3)

{P34=1;P35=1;if(key2==0){delay1(20);if(key2==0){while(key2==1);f++;if(f>100) f=0; }}} if(m==3)

{P34=1;P35=1;if(key3==0){delay1(20);if(key3==0){while(key3==1);f--;if(f<=0)f=100;}}

单片机信号发生器设计报告

9

单片机系统综合训练----设计报告

4.5 时钟程序

时钟程序流程图如图4.5所示。

单片机信号发生器设计报告

图4.5 主程序流程图

代码如下。

void timer1() interrupt 3

{

static unsigned char sec=0; static int min=00,hour=12; static unsigned char m=0;

TH1=THC1;

TL1=TLC1;

10

单片机系统综合训练----设计报告

count++; if(count>200) {count=0;sec++; if(sec>=60) { sec = 0;min++;} if(min>=60) { min=0; hour++;} if(hour>=24) { hour=0; }}

4.6 显示子程序

显示程序流程图如图4.6

单片机信号发生器设计报告

图4.6 数码管流程图

代码如下。

if(m==0|m==1|m==2)

{

Data_Buffer[2]=min/10; //数码管显示时间 Data_Buffer[3]=min%10;

Data_Buffer[0]=hour/10;

Data_Buffer[1]=hour%10;

}

if(m==3)

{

Data_Buffer[2]=f%100/10;//数码管显示频率 Data_Buffer[3]=f%10;

Data_Buffer[0]=0;

Data_Buffer[1]=f/100;

}

11

单片机系统综合训练----设计报告

}

}

void timer0() interrupt 1

{

static unsigned char Bit=0; //静态变量,退出程序后,值保留

TH0=THCO;

TL0=TLCO;

Bit++;

if(Bit>=4)Bit=0;

P2|=0xf0; //先关位码

P0=Duan[Data_Buffer[Bit]];//开段码

if(Bit==1) P0|=0x80; //先关位码, 小数点显示

switch(Bit) //送位码

{

case 0: P24=0;break;

case 1: P25=0;break;

case 2: P26=0;break;

case 3: P27=0;break;

}

}

5 程序调试

软件调试:软件调试注意程序的正确性(4个准确):看程序中的定时是否准确,时间的进位是否准确,I2C总线协议是否准确和波形点的数据是否准确。

硬件调试:在软件(程序)正确的情况下 ,下载程序到单片机系统,接通电源按下开关,按照操作指南看是否达到实验预期效果否则更换单片机和示波器,如果问题任然存在,则继续重复软件调试。

6 技术小结

该单片机低频函数信号发生器是基于AT89C51单片机编程级扩展的,主要部件包括ST89C52、PCF8951芯片,4单位按键,4位显示数码管组成,结构简单,功能众多,定时准确,可以显示和调节当前时间,可以输出频率1~100Hz的低失真波形,超额地达到实验要求。

7函数信号发生器的使用说明

按键1可以修改输出波形,按键2可以增加时间和频率,按键3可以减少时间和频率,按键4可以选择修改模式,PCF8951灯为信号输出状态指示灯,P34为修改小时指示灯,P35为修改分钟指示灯。

12

单片机系统综合训练----设计报告

8心得体会

通过本次的单片机低频信号发生器的设计实验发现自身存在的很多问题,导致在设计的过程中遇到问题不断:首先用定时的方式确定每个点的输出时间间隔来达到调节频率的目的,在运算的时候容易出错,不好确定定时时间;其次是在I2C总线协议的运用不大熟练,导致程序的运行容易出错;然后是在每个模块的程序写好后的串联过程容易出错,不能对程序整体有很好的把握;最后是在函数嵌套的运用很是不熟练。

程序的本身也有很多不足:比如尽管消抖函数的延迟时间设置很低但是按键仍然不灵敏,然后是方波的输出频率不大准确。这些种种问题都是需要自己在将来的学习中去找到根源并努力解决。

在实验的过程中很多不懂的问题都得到了老师和同学的热心帮助,这就让我有了进一步学习的动力。然后是在发现和解决问题的过程中学习到很多难能可贵的知识,这将使我以后的学习更加容易发现问题。

9参考文献

[1]丁向荣,谢俊,王彩申.单片机C语言编程与实践.北京:电子工业出版社,2009.8

[2]贺亮. 从零开始学51单片机[M]. 电子工业出版社. 2012.

[3]林立,张俊亮. 单片机原理及应用[M]. 电子工业出版社. 2012.

[4]谭浩强.C程序设计.北京:清华大学出版社,2002

[5]胡文金,钟秉翔. 单片机应用技术实训教程[M]. 重庆大学出版社. 2005.

13

单片机系统综合训练----设计报告

附录1:电路原理图

单片机信号发生器设计报告

14

单片机系统综合训练----设计报告

附录2:程序参考清单

#include <reg51.h>

#include <intrins.h>

#define uchar unsigned char

#define uint unsigned int

#define NOP() _nop_()

#define _Nop() _nop_()

#define THCO 0xee

#define TLCO 0x0

#define THC1 0xee

#define TLC1 0x0

#define AddW 0x90 // 写数据地址

#define AddR 0x91 // 读数据地址

/*-----------------变量定义---------------*/

unsigned char code Duan[]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

unsigned char Data_Buffer[4]={1,2,3,4};

uchar code sanjiaobo[128]={0x00,0x04,0x08,0x0c,0x10,0x14,0x18,0x1c,0x20,0x24,0x28,0x2c,

0x30,0x34,0x38,0x3c,0x40,0x44,0x48,0x4c,0x50,0x54,0x58,0x5c,

0x60,0x64,0x68,0x6c,0x70,0x74,0x78,0x7c,0x80,0x84,0x88,0x8c,

0x90,0x94,0x98,0x9c,0xa0,0xa4,0xa8,0xac,0xb0,0xb4,0xb8,0xbc,

0xc0,0xc4,0xc8,0xcc,0xd0,0xd4,0xd8,0xdc,0xe0,0xe4,0xe8,0xec,

0xf0,0xf4,0xf8,0xfc,

0xfe,0xfa,0xf6,0xf2,0xee,0xea,0xe6,0xe2,0xde,0xda,0xd6,0xd2,

0xce,0xca,0xc6,0xc2,0xbe,0xba,0xb6,0xb2,0xae,0xaa,0xa6,0xa2,

0x9e,0x9a,0x96,0x92,0x8e,0x8a,0x86,0x82,0x7e,0x7a,0x76,0x72,

0x6e,0x6a,0x66,0x62,0x5e,0x5a,0x56,0x52,0x4e,0x4a,0x46,0x42,

0x3e,0x3a,0x36,0x32,0x2e,0x2a,0x26,0x22,0x1e,0x1a,0x16,0x12,

0x0e,0x0a,0x06,0x02,};

uchar code fangbo[256]={0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0xff,0xff,0xff,0xff,};

uchar code zhengxianbo[128]={0x80,0x86,0x8c,0x92,0x98,0x9f,0xa5,0xab, 0xb0,0xb6,0xbc,0xc1,

0xc7,0xcc,0xd1,0xd5, 0xDA,0xde,0xe2,0xe6,0xea,0xed,0xf0,0xf3,

15

单片机系统综合训练----设计报告

0xf6,0xf8,0xfa,0xfc,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xfe,

0xfd,0xfc,0xfa,0xf8,0xf6,0xf3,0xf0,0xed,0xea,0xe6,0xe3,0xde,

0xDA,0xd6,0xd1,0xcc,0xc7,0xc1,0xbc,0xb6,0xb1,0xab,0xa5,0x9f, 0x99,0x92,0x8c,0x86,0x80,0x79,0x73,0x6d, 0x67,0x61,0x5b,0x55, 0x4f,0x49,0x43,0x3e, 0x39,0x33,0x2e,0x2a,0x25,0x21,0x1d,0x19, 0x15,0x12,0x0f,0x0c,0x09,0x07,0x05,0x03,0x02,0x01,0x00,0x00, 0x00,0x00,0x00,0x01, 0x02,0x03,0x05,0x07,0x09,0x0c,0x0e,0x12, 0x15,0x18,0x1c,0x20, 0x25,0x29,0x2e,0x33, 0x38,0x3d,0x43,0x48, 0x4e,0x54,0x5a,0x60,0x66,0x6c,0x73,0x79,};

unsigned int count=0;

uchar mode=0, f=1;

/*----------------端口定义----------------*/

sbit SCL=P3^6; //I2C 时钟

sbit SDA=P3^7; //I2C 数据

bit ack; //应答标志位

sbit key1=P2^0;

sbit key2=P2^1; //小时加\频率加

sbit key3=P2^2; //分钟加\频率减

sbit P24=P2^4;

sbit P25=P2^5;

sbit P26=P2^6;

sbit P27=P2^7;

sbit p14=P1^4; //热敏电阻

sbit p32=P3^2; //时间\频率模式切换按键

sbit P34=P3^4;

sbit P35=P3^5;

/*---------------延迟函数-----------------*/

void delay1( uchar n )

{

while( --n )

{;}

}

/*---------------启动I2C总线-----------------*/

void Start_I2c()

{

SDA=1; //发送起始条件的数据信号 _Nop();

SCL=1;

_Nop();_Nop();_Nop();_Nop();_Nop();//延时5μs(>4.7μs) SDA=0; //发送起始信号

_Nop();_Nop();_Nop();_Nop();_Nop();//延时5μs(>4.7μs) 16

单片机系统综合训练----设计报告

SCL=0; //保持,准备发送或接收数据

_Nop();_Nop();

}

/*---------------结束I2C总线-----------------*/

void Stop_I2c()

{

SDA=0; //发送结束条件的数据信号

_Nop(); //发送结束条件的时钟信号

SCL=1; //结束条件建立时间大于4μs

_Nop();_Nop();_Nop();_Nop();_Nop();

SDA=1; //发送I2C总线结束信号

_Nop();_Nop();_Nop();_Nop();

}

/*----------------字节数据发送函数--------------*/

void SendByte(unsigned char c)/*发送数据c(可以是地址,也可以是数据),发完后等待应答,并对 此状态位进行操作.数据发送正常使ack=1,不应答使ack=0*/ {

unsigned char BitCnt;

for(BitCnt=0;BitCnt<8;BitCnt++) //要传送的数据长度为8位

{

if((c<<BitCnt)&0x80)SDA=1; //判断发送位

else SDA=0;

_Nop();

SCL=1; //将时钟线置为高电平,通知被控器开始接收数据位 _Nop();_Nop();_Nop();_Nop();_Nop(); //保证时钟高电平周期大于4μs

SCL=0;

}

_Nop();_Nop();

SDA=1; //发送完后(8位长度的数据)释放数据线,准备接收应答位 _Nop();_Nop();

SCL=1;

_Nop();_Nop();_Nop();

if(SDA==1)ack=0;

else ack=1; //判断是否接收到应答信号

SCL=0;

_Nop();_Nop();

}

/*----------------信号转换函数--------------*/

void WriteDAC(uchar dat,num)

17

单片机系统综合训练----设计报告

{

unsigned char i;

Start_I2c();

SendByte(AddW);

SendByte(0x40);

for(i=0;i<num;i++)

{

SendByte(dat);

}

Stop_I2c();

}

/*----------------时间显示函数--------------*/

void timer1() interrupt 3

{

static unsigned char sec=0; static int min=00,hour=12;

static unsigned char m=0;

TH1=THC1;

TL1=TLC1;

count++;

if(count>200)

{

count=0;

sec++;

if(sec>=60)

{ sec = 0;

min++;

}

if(min>=60)

{

min=0;

hour++;

}

if(hour>=24)

{

hour=0;

}

if(p32==0)

{

m++;

if(m>=4)

m=0;

}

18

单片机系统综合训练----设计报告

if(m==0)

{P34=1;P35=1;}

if(m==1)

{

P34=0;P35=1;

if(key2==0)

hour++;

if(key3==0)

{hour--;if(hour<0)hour=23;} }

if(m==2)

{

P34=1;P35=0;

if(key2==0)

min++;

if(key3==0)

{min--;if(min<0){min=59;hour--;}} }

if(m==3)

{

if(key1==0)

delay1(1);

if(key1==0)

{

while(key1==1);

mode++;

if(mode>3)

mode=0;

}

if(m==3)

{

P34=1;P35=1;

if(key2==0)

{ delay1(1);

if(key2==0)

{ while(key2==1);

f++;

if(f>100) f=0; } } }

if(m==3)

{P34=1;P35=1;

if(key3==0)

{ delay1(1);

19

单片机系统综合训练----设计报告

if(key3==0)

{ while(key3==1);

f--;

if(f<=0)

f=100;

}

}

}

}

if(m==0|m==1|m==2)

{

Data_Buffer[2]=min/10; //数码管显示时间 Data_Buffer[3]=min%10;

Data_Buffer[0]=hour/10;

Data_Buffer[1]=hour%10;

}

if(m==3)

{

Data_Buffer[2]=f%100/10;//数码管显示频率 Data_Buffer[3]=f%10;

Data_Buffer[0]=0;

Data_Buffer[1]=f/100;

}

}

}

void timer0() interrupt 1

{

static unsigned char Bit=0; //静态变量,退出程序后,值保留

TH0=THCO;

TL0=TLCO;

Bit++;

if(Bit>=4)Bit=0;

P2|=0xf0; //先关位码

P0=Duan[Data_Buffer[Bit]];//开段码

if(Bit==1) P0|=0x80; //先关位码, 小数点显示

switch(Bit) //送位码

{

case 0: P24=0;break;

case 1: P25=0;break;

case 2: P26=0;break;

case 3: P27=0;break;

}

20

单片机系统综合训练----设计报告

}

/*----------------主函数--------------*/

void main()

{

unsigned char i;

TMOD=0x11; //定时器0初始化

TH0=THCO;

TL0=TLCO;

TR0=1;

ET0=1;

TH1=THC1;

TL1=TLC1;

TR1=1;

ET1=1;

EA=1;

p14=0; //关闭热敏电阻

while(1)

{

if(mode==0)//按键选择三角波

{

for(i=0;i<128;i++) //循环送255个三角波数据 WriteDAC(sanjiaobo[i],f);

}

else if(mode==1)//按键选择正弦波

{

for(i=0;i<128;i++) //循环送255个正弦波数据 WriteDAC(zhengxianbo[i],f);

}

else if(mode==2)//按键选择方波

{

for(i=0;i<128;i++) //循环送255个方波数据 WriteDAC(fangbo[i],f);

}

}

}

21

相关推荐