单片机简易信号发生器实训报告.doc
《单片机简易信号发生器实训报告.doc》由会员分享,可在线阅读,更多相关《单片机简易信号发生器实训报告.doc(26页珍藏版)》请在冰点文库上搜索。
重庆科技学院课程设计
重庆科技学院
学生实习(实训)总结报告
学院:
电气与信息工程学院专业班级:
XXX
学生姓名:
XXX学号:
XXX
实习(实训)地点:
逸夫科技大楼I512
报告题目:
单片机简易信号发生器设计
报告日期:
2014年3月10日
指导教师评语:
_________________________________________
成绩(五级记分制):
指导教师(签字):
目录
一、实验目的和意义 1
1.1设计目的和意义 1
1.2任务 1
二、方案设计 1
2.1系统分析 1
2.2器件选择 2
2.2.1微处理器 2
2.2.2显示器 3
2.2.3按键 3
三、系统硬件设计 3
3.1单片机数据处理系统 3
3.2最小的系统设计 4
3.3按键控制电路 5
3.4数码管显示电路 5
3.5LED报警灯电路 6
3.6IICEEROM模块 6
3.7实时时钟电路(扩展功能) 6
四、系统软件设计 7
4.1操作功能设计 7
4.2程序编制思想 7
4.3主程序设计 8
4.3.1系统工作流程图 9
4.3.2独立按键流程图 10
4.3.3中断服务程序流程图 11
五、程序调试 11
5.1.1硬件调试:
11
5.1.2软件调试:
12
5.1.3波形与显示的调试:
12
六、技术小结 12
七、心得体会 13
八、参考文献:
13
附录1系统硬件电路图 14
附录2程序清单 15
关于单片机简易信号发生器设计的实习
(实训)报告
一、实验目的和意义
1.1设计目的和意义
波形发生器亦称函数发生器,作为实验用信号源,是现今各种电子电路实验设计应用中必不可少的仪器设备之一。
目前,市场上常见的波形发生器多为纯硬件的搭接而成,且波形种类有限,多为锯齿、正弦、方波、三角等波形。
本系统利用单片机AT89S52采用程序设计方法产生正弦波、方波、三角波三种波形,再通过D/A转换器DAC0832将数字信号转换成模拟信号,滤波放大,最终由示波器显示出来,能产生1Hz—3kHz的波形并且可调。
系统通过键盘来控制三种波形的类型选择、频率变化,并通过液晶屏1602显示其各自的类型以及数值,系统大致包括信号发生部分、数/模转换部分以及液晶显示部分三部分,达到了用单片机控制产生三种波形并且显示的功能目的。
关键词89S52信号发生D/A转换器液晶屏1602
1.2任务
本次课程设计一个基于单片机的信号发生器,要求完成以下功能:
1.基本功能
1)可以产生正弦波、方波、三角波,频率可调
2)按键选择输出波形
3)按键调节输出信号频率
2.扩展功能
显示当前时间
二、方案设计
2.1系统分析
本课题要求以MCS-51系列单片机为核心,设计一个简易低频信号发生器。
要求能输出1~100HZ的正弦波、三角波和方波信号,能方便的用键盘选择不同的输出并在LED显示器上显示。
单片机通过查表的方法完成波形数据要求,输出的正弦波、三角波和方波信号频率在1~100HZ可调,系统有启动、调频和不同波形选择按键,转速显示要求至少4位。
根据要求可直接采用8位DA转换芯片,让单片机对8位DA芯片进行控制,从而输出波形。
2.2器件选择
2.2.1微处理器
市场上微处理器种类很多。
这里,选取微处理器从多方面考:
成本低、性能高、能够满足功能要求等等。
这里,选取STC89C51芯片。
因为其功能与普通51芯片相同,其价格非常低廉、程序空间大、资源较丰富、在线下载非常方便。
同时,使用该芯片,编程上亦可采用所熟悉的KEIL软件,使课程设计非常简单。
STC89C51RC是采用8051核的ISP(InSystemProgramming)在系统可编程芯片,最高工作时钟频率为80MHz,片内含8KBytes的可反复擦写1000次的Flash只读程序存储器,器件兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISPFlash存储单元,具有在系统可编程(ISP)特性,配合PC端的控制程序即可将用户的程序代码下载进单片机内部,省去了购买通用编程器,而且速度更快。
STC89C52RC系列单片机是单时钟/机器周期(1T)的兼容8051内核单片机,是高速/低功耗的新一代8051单片机,全新的流水线/精简指令集结构,内部集成MAX810专用复位电路。
图2.1STC89C51RC引脚图
2.2.2显示器
常见的显示器件LED数码管和LCD液晶器件。
LED数码管能够显示数字和部分字符,价格便宜,硬件电路、软件编程均非常简单,而且使用动态扫描技术可节省大量硬件成本。
LCD液晶显示器件,显示字迹清晰、能够显示数字、字符和汉字,但价格比LED非常高,编程复杂,软硬件调试都比较花时间。
系统显示主要还是数字,根据这两种显示器件的特性,选取LED数码管器件。
由于系统要求显示小时和分钟,采用四位数码管显示即可。
2.2.3按键
按键是用来设置模式切换、频率或时间的加减等功能的。
这里采用普通按键即可,选用原则:
以最少的按键,实现尽可能多的功能。
所以这里,设置三个按键:
模式键、UP键、DOWN键。
三、系统硬件设计
3.1单片机数据处理系统
由于STC89C51单片机片内有4KB的ROM程序存储器,因此,只需要外围有时钟电路和复位电路即可,单片机P1引脚用来实现段选,P25、P26、P27用来实现位选,P34接ADC0809,P23、P00分别接蜂鸣器和LED灯,实现数据处理和报警判断,下面是单片机数据处理系统原理图。
图3.1单片机数据处理系统电路
3.2电压采集系统设计
电压采集电路采集差压流量变送器输出的1-5V的电压信号通过P33引脚传送给ADC0809模数转换器,电路图如下。
图3.2电压采集电路
3.3按键控制电路
本设计实现采用4个按键控制,下面是按键电路图。
图3.3按键电路图
3.4数码管显示电路
本硬件采用的是数码管显示。
试验箱数码管为共阴极数码管,所以此设计程序中编入的是共阴极数码管0-9段码,使用了其中三位实现显示功能,用来显示系统实时采集的电压值转化后的电压值,及在报警上下限修改状态下的上下限值。
下面是数码管显示的电路图。
图3.4 数码管显示电路
3.5LED报警灯电路
LED灯端口与单片机P00口相接,当显示值超过报警上下限时灯就会亮,电路图如下。
图3.5 LED报警灯电路
3.6IICEEROM模块
IICEEROM模块于单片机P36、P37口相接,进行D/A转换,即是将数字量转换成相应的模拟量,常用于控制系统中。
图3.6IICEEROM模块
3.7实时时钟电路(扩展功能)
实时时钟电路为本设计的扩展功能,要求可以显示当时的北京时间。
在时钟模式下,通过按键控制,在数码管上前两位显示小时,后两位显示分钟。
图3.7实时时钟电路
四、系统软件设计
4.1操作功能设计
根据系统功能描述,可以将功能大致分成两类:
信号发生功能、北京时间功能
系统设有四个数码管,四个按键。
菜单设计如下:
菜单1:
北京显示:
显示格式为:
小时.分钟(如:
09.50,为9点50分)
菜单2:
修改北京时间的小时:
显示格式为:
P34亮(按键UP和DN来实现增减)
菜单3:
修改北京时间的分钟:
显示格式为:
P35亮(按键UP和DN来实现增减)
菜单4:
输出波形的选择:
显示格式为:
P34~P37不亮(按键MODE来实现)
菜单5:
修改波形的频率:
显示格式为:
(按键UP和DN来实现增减)
4.2程序编制思想
数模转换器器工作原理就是模拟信号数字化的逆过程,模拟信号数字化通过采样、量化、编码完成,那么数字信号模拟化的过程读取二进制码、二进制码权值相加、输出一个总的电流或电压。
这其实就是一个模拟电子计数中的加法器。
量化电平个数相对于数模转换的分辨率,对于低频低成本的信号发生器,为了简化程序设计,所以直接采用8位DA转换芯片PCF8591,让单片机AT89C51对8位DA芯片进行控制,从而输出波形。
单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。
概括的讲:
一块芯片就成了一台计算机。
它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。
单尽管他的大部分功能集成在一块小芯片上,但是它具有一个完整计算机所需要的大部分部件:
CPU、内存、内部和外部总线系统,大部分还会具有外存。
同时集成诸如通讯接口、定时器,实时时钟等外围设备。
我们所设计的程序是总结了目前各个智能化设计程序的水位监测系统,采用51控制单片机,集水位采集、存储、显示及远程联网于一体的设计,使得仪器仪表数字化、智能化、微型化。
同时采用AT89系列单片机,AT89系列单片机是ATEML公司的8位Flash单片机。
AT89系列单片的核心是8031,在软件和硬件方面与MCS-51系列完全兼容,AT89系列的指令与有关定义和MCS一51完全相同,MCS—51系列单片机应用系统编写的程序可以直接使用。
AT89系列的引脚排列、定义与MCS-51完全一致,可以直接替换。
由于内部有FlashROM,所以编写的程序烧录很方便,易于电擦除,可以反复使用,非常方便用户对程序进行修改,缩短研制周期,降低了研制成本。
在单片机部有Flash存贮器,功耗特别低,FlashROM的容量从TA89C1051的1K到AT89S55的20K,有许多品种,选择余地大。
4.3主程序设计
主程序内进行的是对数据的实时扫描,对数据进行转换和输出,对数据进行判断是否超限,调用显示和报警函数,主程序流程图如下所示。
图4.3主程序
如方框图所示根据要求:
通过C程序的编译,频率档位选择按键UP、DO以及波形选择按键MODN,通过数码管显示频率档位和波形。
并且通过PCF8591实现数模转换,最后用示波器观察输出的结果。
4.3.1系统工作流程图
开始
中断
初始化
键盘扫
描子程序
数码管显示
图4.3.1系统工作流程图
在C编译时,通过在主程序内设置中断初始化、调用按键子程序、档位频率键、波形种类选择键的设置,在辅助程序中编译好各个子程序使得程序可以通顺流程的进行
4.3.2独立按键流程图
编译按键子程序时,要求开始后系统默认设置波形种类选择档位为1,设置频率档位为5,通过标志位来判断走向,如果标志位不为0则直接结束,如果标志位为0,则按键松开后看a的取值来选择波形种类,如果a>3,则认为a=1,如果不大于则结束。
键松开?
MODN
标志位=0?
Y
N
a+1
开始
MODN
按下?
消抖延时20ms
N
Y
a=1
a>3?
结束
Y
N
图4.3.2独立按键流程图
4.3.3中断服务程序流程图
开始
a=1?
a=2?
Case语句给定时器赋初值
输出正弦波
输出三角波
输出方波
Y
Y
a=3?
Y
N
N
结束
i++;if(i>255)i=0;
图4.3.3中断服务程序流程图
程序开始后根据Case语句给定时器赋初值,判定a(key1)的取值,如果a(key1)=1则输出正弦波形,如果a(key1)=2则输出三角波形,如果a(key1)=3则输出方波波形,待波形输出后看中断服务计数i的取值如果i++;if(i>255)i=0,则程序结束。
五、程序调试
5.1.1硬件调试:
检查线路连接有无错误,SDA和SCL接单片机的P36和P37口,VCC接电源,GND接地,AOUT接示波器,在下载数据到单片机之后数据在传输的时候PCF8591上的一个红色的灯会不停的闪,说明有数据在传输,否则无数据传输。
5.1.2软件调试:
首先看I2C协议是否正确,否则不能传输数据,再看按键的逻辑关系是否正确,还有就是LCD的显示是否正确。
5.1.3波形与显示的调试:
调节电源,使其输出5V电压,调整好示波器。
给电路供电,观察示波器,记录各频段对应波形的情况,峰峰值。
调试结果表明,该电路在要求频率范围内的大部分频率范围基本上不失真,除了在最高频率的最低频率有少许失真,其中,当频率接近100Hz时,方波高低电压跃变时出现毛刺,审过零比较器的频率特性所致,另外,在最高频和最低频段,三角波出现少许弯斜,可选用频率特性更为宽的电容进行校正。
六、技术小结
软件设计上,根据功能分了几个模块编程。
模块主要有:
主程序模块、定时器1、定时器0、LCD显示模块、DAC转换模块。
主程序先是进行一些初始化的工作,然后根据按键选择波形标志的值进入相应的波形,若刚开始没有改变程序初始的频率、幅值的波形,则输出的程序初始的频率为20HZ/幅值为3V的波形;若改变了幅值或频率,单片机扫描,根据变化的频率或幅值进行中断定时的初始值的设定,进行定时器中断后,将重新设定的频率或幅度值显示在LCD12864上,然后将变化后的波形的各个数字量通过DACPCF8591转换成模拟量输出新的波形。
经过一段时间运行后,可以对系统的性能进行测试。
对于本波形发生器来说,用示波器可以测试其性能指标,按前面所述设计的波形发生器,能产生正弦波、三角波及方波信号,其幅值可以0—5V内变化,频率也可以调整。
调试过程:
将程序输入单片机,连接示波器,示波器显示正弦波,数码管显示器显示时间;按下ENT进行时间和波形模式的转换,按一下KEY1键波形由三角波变为正弦波,再按下由正弦波变为方波,再按一下则恢复三角波;按一下KEY2键则增加波形的频率,按一下KEY3键则减少波形的频率。
七、心得体会
这次单片机课程设计我们历时两个星期,但经过这两个星期的实践和体验下来,我对单片机越来越感兴趣了,之前对我来说学到的仅是那些理论知识,通过这次设计的具体应用,我发现了它的强大之处。
这次课程设计感触最深的是团队和合作。
在这我要谢过那些帮我的老师和同学。
现在想来,学校安排的课程设计确实有着它深层的意义,它不仅仅让我们综合那些理论知识来运用到设计和创新,还让我们知道了一个团队凝聚在一起时所能发挥出的巨大潜能。
通过这次课程设计我也发现了自身存在的不足之处,虽然感觉理论上已经掌握,但在运用到实践的过程中仍有意想不到的困惑,经过一番努力才得以解决。
这也激发了我今后努力学习的兴趣,我想这将对我以后的学习产生积极的影响。
单片机课程设计结束了,但通过设计我所学到的东西却将长久的存在。
相信这次设计带给我们的严谨的学习态度和一丝不苟的科学作风将会给我们未来的工作和学习打下一个更坚实的基础。
这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在老师及同学的指导下,终于将问题解决了。
同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!
八、参考文献:
1.教材《单片机原理及应用》王景景编机械工业出版社2010
2.《单片微型计算机原理、应用及接口技术》张迎新编国防工业出版社2005
3.《单片机实用系统设计技术》房小翠编国防工业出版社2004
4.《单片机应用系统设计》何立民编北航出版社2006
23
附录1系统硬件电路图
附录2程序清单
#include
#include
#defineTHC00xee
#defineTLC00x00
boxing();
shijian();
#defineucharunsignedchar
#defineuintunsignedint
#defineNOP()_nop_()
#define_Nop()_nop_()
#defineAddW0x90 //写数据地址
#defineAddR0x91 //读数据地址
sbitSCL=P3^6;//I2C时钟
sbitSDA=P3^7;//I2C数据
bitack;/*应答标志位*/
sbitkey1=P2^0;
sbitkey2=P2^1;
sbitkey3=P2^2;
sbitP32=P3^2;
sbitP14=P1^4;
ucharware=0;
ucharf=15;
ucharA=25;
ucharData_Buffer[4]={1,2,3,4};
ucharcodeDuan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x76};
ucharcount,sec,min,h;
ucharMode=0;
sbitP24=P2^4;
sbitP25=P2^5;
sbitP26=P2^6;
sbitP27=P2^7;
sbitLED1=P3^4;//四个指示灯
sbitLED2=P3^5;
sbitLED3=P3^6;
sbitLED4=P3^7;
unsignedcharcodesanjiao[]={0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,
88,92,96,100,104,108,112,116,120,124,128,124,120,116,112,108,104,100,96,92,88,84,80,76,72,68,
64,60,56,52,48,44,40,36,32,28,24,20,16,12,8,4,0};
unsignedcharcodesin[]={135,145,158,167,176,188,199,209,218,226,234,240,245,249,252,254,254,253,251,
247,243,237,230,222,213,204,193,182,170,158,146,133,121,108,96,84,72,61,50,41,32,24,17,11,7,3,1,0,0,2,5,9,
14,20,28,36,45,55,66,78,90,102,114,128};
voiddelay1(uintz)//延时函数
{
uintx,y;
for(x=z;x>0;x--)
{
for(y=60;y>0;y--)
{
;
}
}
}
/*******************************************************************
起动总线函数
函数原型:
voidStart_I2c();
功能:
启动I2C总线,即发送I2C起始条件.
********************************************************************/
voidStart_I2c()
{
SDA=1;/*发送起始条件的数据信号*/
_Nop();
SCL=1;
_Nop();/*起始条件建立时间大于4.7us,延时*/
_Nop();
_Nop();
_Nop();
_Nop();
SDA=0;/*发送起始信号*/
_Nop();/*起始条件锁定时间大于4μs*/
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0;/*钳住I2C总线,准备发送或接收数据*/
_Nop();
_Nop();
}
/*******************************************************************
结束总线函数
函数原型:
voidStop_I2c();
功能:
结束I2C总线,即发送I2C结束条件.
********************************************************************/
voidStop_I2c()
{
SDA=0;/*发送结束条件的数据信号*/
_Nop();/*发送结束条件的时钟信号*/
SCL=1;/*结束条件建立时间大于4μs*/
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=1;/*发送I2C总线结束信号*/
_Nop();
_Nop();
_Nop();
_Nop();
}
/*******************************************************************
字节数据发送函数
函数原型:
voidSendByte(UCHARc);
功能:
将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
此状态位进行操作.(不应答或非应答都使ack=0)
发送数据正常,ack=1;ack=0表示被控器无应