单片机课程设计报告-基于单片机的模数转换及PWM波形发生器.doc

上传人:韩长文 文档编号:5019341 上传时间:2020-01-29 格式:DOC 页数:27 大小:357KB
返回 下载 相关 举报
单片机课程设计报告-基于单片机的模数转换及PWM波形发生器.doc_第1页
第1页 / 共27页
单片机课程设计报告-基于单片机的模数转换及PWM波形发生器.doc_第2页
第2页 / 共27页
单片机课程设计报告-基于单片机的模数转换及PWM波形发生器.doc_第3页
第3页 / 共27页
单片机课程设计报告-基于单片机的模数转换及PWM波形发生器.doc_第4页
第4页 / 共27页
单片机课程设计报告-基于单片机的模数转换及PWM波形发生器.doc_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《单片机课程设计报告-基于单片机的模数转换及PWM波形发生器.doc》由会员分享,可在线阅读,更多相关《单片机课程设计报告-基于单片机的模数转换及PWM波形发生器.doc(27页珍藏版)》请在三一文库上搜索。

1、单片机课程设计报告课程名称: 单片机课程设计 实验项目: 基于单片机的PWM波形发生器 专业班级: 电子科学与技术0902班 姓 名: 学 号: 课设时间: 2012/2/27 批阅时间: 指导教师: 成 绩: 目录目录.摘要.1设计任务.1第一章 概述.2 1.1 STC89C54RD+介绍.2 1.2 PWM知识介绍.3 1.3 PCF8591P芯片介绍4 1.4 74HC573芯片介绍.5第二章 硬件电路的设计.6 2.1 系统设计框图.6 2.2 系统复位电路.6 2.3 时钟电路.7 2.4 模数转换电路.8 2.5 数码管驱动及显示电路.8第三章 遇到问题及解决方案.10第四章 设

2、计心得与体会.11参考文献12附录A 程序清单.13附录B 元件清单.25摘要本次课程设计我们组主要设计了根据A/D输入:0-5V,可调脉宽的PWM波形发生器,并能够很好的显示占空比。本次设计使用PCF8591P AD-DA芯片以及单片机来实现模数转换,通过调节电位器以达到输入电位0-5V,同时在数码管上显示0-255的数字量变化的效果。关键词:单片机 PWM PCF8591P 模数转换 占空比设计任务1、通过电位器的调节实现A/D输入0-5V2、通过电位器来调整PWM的脉宽3、通过数码管显示占空比的变化 第一章 概述1.1 STC89C54RD+介绍STC89C54RD+单片机具有提高MCU

3、的运行速度,运行稳定,价格便宜,良好的性价比等特点,其支持的最高时钟为80M,这样能最大限度地提高MCU的运行速度;具有双倍速功能,支持6时钟周期模式运行;具有ISP在线系统编程功能,大大缩短开发复杂度,同时可节省购买编程器的额外投入;STC89C54RD+单片机内部包括16KB的Flash程序存储器ROM、1KB的数据存储器 RAM,与普通的8051单片机完全兼容,而51单片机的开发环境也很成熟:如KeilC语言笨广泛地应用于新产品的开发,这对于缩短系统开发周期有着很重要的意义。其管脚图如下: 图11.2 PWM知识介绍 脉冲宽度调制(PWM),是英文“Pulse Width Modulat

4、ion”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。脉冲宽度调制是一种模拟控制方式,其根据相应载荷的变化来调制晶体管栅极或基极的偏置,来实现开关稳压电源输出晶体管或晶体管导通时间的改变,这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。PWM控制技术以其控制简单,灵活和动态响应好的优点而成为电力电子技术最广泛应用的控制方式,也是人们研究的热点。由于当今科学技术的发展已经没有了学科之间的界限,结合现代控制理论思想或实现无谐振软开关技术

5、将会成为PWM控制技术发展的主要方向之一。随着电子技术的发展,出现了多种PWM技术,其中包括:相电压控制PWM、脉宽PWM法、随机PWM、SPWM法、线电压控制PWM等,而在镍氢电池智能充电器中采用的脉宽PWM法,它是把每一脉冲宽度均相等的脉冲列作为PWM波形,通过改变脉冲列的周期可以调频,改变脉冲的宽度或占空比可以调压,采用适当控制方法即可使电压与频率协调变化。可以通过调整PWM的周期、PWM的占空比而达到控制充电电流的目的。PWM的一个优点是从处理器到被控系统信号都是数字形式的,无需进行数模转换。让信号保持为数字形式可将噪声影响降到最小。噪声只有在强到足以将逻辑1改变为逻辑0或将逻辑0改变

6、为逻辑1时,也才能对数字信号产生影响。对噪声抵抗能力的增强是PWM相对于模拟控制的另外一个优点,而且这也是在某些时候将PWM用于通信的主要原因。从模拟信号转向PWM可以极大地延长通信距离。在接收端,通过适当的RC或LC网络可以滤除调制高频方波并将信号还原为模拟形式。1.3 PCF8591P芯片介绍PCF8591P 是单片、单电源低功耗8位CMOS数据采集器件,只有4个模拟输入、一个输出和一个串行I2C总线接口。3个地址引脚A0、A1和A2用于编程硬件地址,允许将最多8个器件连接至I2C中线而不需要额外硬件。器件的地址、控制盒数据通过两线双向I2C做总线传输。器件功能包括多路复用模拟输入、片上跟

7、踪和保持功能、8位模数转换和8位数模转换。最大转换速率取决于I2C总线的最高速率。引脚及功能:图二A/D转换器采用逐次逼近转换技术。在A/D转换周期将临时使用片上D/A转换器和高增益比较器。一个A/D转换周期总是开始于发送一个有效模式地址给PCF8591之后,A/D转换周期在应答时钟脉冲的下降沿被触发,并在传输前一次转换时执行。一旦一个转换周期被触发,所选通道的输入电压采样将保存到芯片并被转换为对应的8位二进制码,取自差分输入的采样将被转换为8位二进制补码。开始或停止条件:数据和时钟线在中不忙时保持高电平。在时钟为高电平时,数据线上的一个由高到低的变化定义为开始条件。时钟为高电平时,数据线上的

8、一个由低到高的变化被定义为停止条件。 开始状态 停止状态 图三1.4 74HC573芯片介绍74HC573是八进制 3态非反转透明锁存器,其管脚图如下:图四当锁存使能端C为高时,这些器件的锁存对于数据是透明的(也就是说输出同步)。当锁存使能变低时,符合建立时间和保持时间的数据会被锁存。 OC脚为三态允许控制端,低电平有效;1D-8D为数据输入端;1Q-8Q为数据输出端。第二章 硬件电路设计2.1 系统设计框图通过调节电位器,使加在AD芯片输入端口的电压在0-5V之间变化,AD进行数据的采集,然后将转化好的数据传输给单片机,单片机在根据传输进的信息和数据进行处理,然后输出PWM波形,使LED灯亮

9、度发生变化,并在数码管上显示出正确占空比的值。时钟信号负责给整个程序的运行提高时间的同步,并为必要的延时提供参考依据。图五2.2 系统复位电路开发板上将两个复位系统和在了一起,通过调帽进行选择,这里我们选择的SW1部分的复位系统。上电后,由于电容充电,使RST持续一段时间的高电平。当单片机处于运行状态时,按下复位键也能使RST维持一段时间的高电平,从而实现上电且开关复位的操作。图六2.3 时钟电路为了和单片机的时钟与外部信号保持一致,这里我们采用的是外部震荡方式。外部震荡方式是把已有的时钟信号引入单片机内部,如图所示,这里我们采用的是12MHz的晶振。图七2.4 模数转换电路开发板上的AD是一

10、个似端口输入的AD,这里我们只是用到了其中的一路,故用调帽将需要的端口连接起来,进行数据的采集。图八3.5 数码管驱动及显示电路一个七段的数码管算上小数点位共有八个管脚如果用单片机直接控制,每个数码管至少需要八个端口,这样一个STC89系列的单片机最多只能驱动四个数码管,造成了端口资源的浪费。而在本次课设中我们用到了六个数码管,很明显,用直连的方法是行不通的,故这里我们采用的是动态扫描的方法。动态扫描与直接控制最大的不同是数码管不是静止不动的,而是在动态的发生着变化,只不过这种变化非常快,快到我们的眼睛分辨不出来它们在动,但是若用快速相机可以拍摄下来。这里我们用到了两个74hc573八进制三态

11、非反转透明锁存器,分别控制着位锁存和段锁存,单片机的八个端口同时向两个芯片输送数据,而通过位锁存和段锁存(芯片C端)进行时间点上的输出的控制,这样就做到了用十个端口控制八个七段的数码管了。图九第三章 遇到的问题及解决方案在本次设计过程中,遇到的第一个问题就是在题目的理解上,“基于单片机的PWM发生器”这对我们来说是全新的概念,拿到题目我们是毫无头绪,幸好在老师的细心讲解下我们有了一丝头绪,在后来的寒假中我们查阅很多资料终于对题目要求有了很好的理解。其次就是班级所购买的单片机开发板上没有电位器,这就直接导致设计无法进行,幸好其他班级的单片机开发板上有电位器,所以就借过来使用,但就在使用过程中发现

12、达不到预期的效果,比如我们要显示0-255以及占空比,这就需要6个数码管,而这个单片机开发板上只有4个数码管,只有导致了设计的中断,最后我们决定为了更好地达到设计要求,我们在网上选购了一款单片机开发板,从而以上问题得以解决。还有一个问题就是在编程软件的使用以及编程语言语法的运用上,最后在同学、老师的帮助和指导下都迎刃而解。第四章 设计心得和体会通过这次单片机课程设计,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。创新可以是在原有的基础上进行改进,使之功能不断完善,成为真己的东西。 这个设计过程中,我们通过对原

13、有的模数转换系统进行了改进,使之增添了能够产生幅度可调的PWM波形发生器功能,以及显示其波占空比的功能。设计结果能够符合题意,成功完成了此次实习要求,我们不只在乎这一结果,更加在乎的,是这个过程。这个过程中,我们花费了大量的时间和精力,去图书馆、网上查找相关资料,去请教老师和同学,这有利于我们对单片机知识有更广泛的理解,为我们以后的专业实习以及毕业设计都打下了坚实的基础。在实际的动手动脑过程中我们体验到了成功的艰辛与喜悦,一分耕耘一分收获,只有付出足够的努力,在探索求知的道路上坚持坚持再坚持,成功一定会眷顾我们。当我们看着数码管随着电位器电阻的变化而有序的改变,我们知道我们成功了,我们这两个星

14、期的努力没有白费,谢谢老师的指导和队友的帮助,感谢你们!参考文献:1 李群芳等.单片微型计算机与接口技术.M北京:电子工业出版社,2008.52 谢辉.单片机原理及应用.M北京:化学工业出版社,2010.83 周向红.51系列单片机应用与实践教程.M北京:北京航空航天大学出版社,20084 谭浩强.C语言程序设计.第2版.北京:清华大学出版社,2008.115 李光飞,楼然苗等.单片机课程设计实例指导.北京:清华大学出版社,20046 何利民.IC总线应用系统设计. 北京:机械工业出版社,20047 http:/8 http:/9 http:/ 程序清单延时子程序清单:#include del

15、ay.h/* uS延时函数,含有输入参数 unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下 T=tx2+5 uS */void DelayUs2x(unsigned char t) while(-t);/*mS延时函数,含有输入参数 unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0255 这里使用晶振12M,精确延时使用汇编*/void DelayMs(unsigned char t) while(t-) /大致延时1m

16、S DelayUs2x(65535); DelayUs2x(65535); 显示、定时器初始化及中断子函数清单#includedisplay.h#includedelay.h#define DataPort P0 /定义数据端口 程序中遇到DataPort 则用P0 替换/sbit LATCH1=P20;/定义锁存使能端口 段锁存/sbit LATCH2=P23;/ 位锁存unsigned char code dofly_DuanMa10=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/ 显示段码值09unsigned char code

17、dofly_WeiMa=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;/分别对应相应的数码管点亮,即位码unsigned char TempData8; /存储显示值的全局变量/*- 显示函数,用于动态扫描数码管 输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示 如输入0表示从第一个显示。 Num表示需要显示的位数,如需要显示99两位数值则该值输入2-*/void Display(unsigned char FirstBit,unsigned char Num) static unsigned char i=0; DataP

18、ort=0; /清空数据,防止有交替重影 LATCH1=1; /段锁存 LATCH1=0; DataPort=dofly_WeiMai+FirstBit; /取位码 LATCH2=1; /位锁存 LATCH2=0; DataPort=TempDatai; /取显示数据,段码 LATCH1=1; /段锁存 LATCH1=0; i+; if(i=Num) i=0;/*- 定时器初始化子程序-*/void Init_Timer0(void) TMOD |= 0x01; /使用模式1,16位定时器,使用|符号可以在使用多个定时器时不受影响 /TH0=0x00; /给定初值 /TL0=0x00; EA=

19、1; /总中断打开 ET0=1; /定时器中断打开 TR0=1; /定时器开关打开/*- 定时器中断子程序-*/void Timer0_isr(void) interrupt 1 TH0=(65536-2000)/256; /重新赋值 2ms TL0=(65536-2000)%256; Display(0,8);IC协议子程序:#include i2c.h#include delay.h#define _Nop() _nop_() /定义空指令bit ack; /应答标志位sbit SDA=P21;sbit SCL=P20;/*- 启动总线-*/void Start_I2c() SDA=1;

20、/发送起始条件的数据信号 _Nop(); SCL=1; _Nop(); /起始条件建立时间大于4.7us,延时 _Nop(); _Nop(); _Nop(); _Nop(); SDA=0; /发送起始信号 _Nop(); /起始条件锁定时间大于4 _Nop(); _Nop(); _Nop(); _Nop(); SCL=0; /钳住I2C总线,准备发送或接收数据 _Nop(); _Nop();/*- 结束总线-*/void Stop_I2c() SDA=0; /发送结束条件的数据信号 _Nop(); /发送结束条件的时钟信号 SCL=1; /结束条件建立时间大于4 _Nop(); _Nop();

21、 _Nop(); _Nop(); _Nop(); SDA=1; /发送I2C总线结束信号 _Nop(); _Nop(); _Nop(); _Nop();/*- 字节数据传送函数 函数原型: void SendByte(unsigned char c);功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对 此状态位进行操作.(不应答或非应答都使ack=0 假) 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。-*/void SendByte(unsigned char c) unsigned char BitCnt; for(BitCnt=0;BitCnt8;B

22、itCnt+) /要传送的数据长度为8位 if(cBitCnt)&0x80)SDA=1; /判断发送位 else SDA=0; _Nop(); SCL=1; /置时钟线为高,通知被控器开始接收数据位 _Nop(); _Nop(); /保证时钟高电平周期大于4 _Nop(); _Nop(); _Nop(); SCL=0; _Nop(); _Nop(); SDA=1; /8位发送完后释放数据线,准备接收应答位 _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); _Nop(); if(SDA=1)ack=0; else ack=1; /判断是否接收到应答信号 SCL=0;

23、_Nop(); _Nop();/*- 字节数据传送函数 函数原型: unsigned char RcvByte();功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号), 发完后请用应答函数。 -*/unsigned char RcvByte() unsigned char retc; unsigned char BitCnt; retc=0; SDA=1; /置数据线为输入方式 for(BitCnt=0;BitCnt8;BitCnt+) _Nop(); SCL=0; /置时钟线为低,准备接收数据位 _Nop(); _Nop(); /时钟低电平周期大于4.7us _Nop(); _

24、Nop(); _Nop(); SCL=1; /置时钟线为高使数据线上数据有效 _Nop(); _Nop(); retc=retc1; if(SDA=1)retc=retc+1; /读数据位,接收的数据位放入retc中 _Nop(); _Nop(); SCL=0; _Nop(); _Nop(); return(retc);void NoAck_I2c(void) SDA=1; _Nop(); _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); /时钟低电平周期大于4 _Nop(); _Nop(); _Nop(); SCL=0; /清时钟线,钳住I2C总线以便继续接收 _

25、Nop(); _Nop(); 主函数:#include #include i2c.h#include delay.h#include display.h#includepwm.h#define AddWr 0x90 /写数据地址 #define AddRd 0x91 /读数据地址sbit led=P10;unsigned char num=0;extern bit ack;unsigned char ReadADC(unsigned char Chl);bit WriteDAC(unsigned char dat);/*- 主程序-*/main() Init_Timer0(); Init_Ti

26、mer1();while (1) /主循环 num=ReadADC(0); TempData0=dofly_DuanManum/100; TempData1=dofly_DuanMa(num%100)/10; TempData2=dofly_DuanMa(num%100)%10; TempData4=dofly_DuanMa0|0x80; TempData5=dofly_DuanMa(num*100)/256)/10; TempData6=dofly_DuanMa(num*100)/256)%10; /主循环中添加其他需要一直工作的程序 DelayMs(10); /*- 读AD转值程序输入参数

27、 Chl 表示需要转换的通道,范围从0-3返回值范围0-255-*/unsigned char ReadADC(unsigned char Chl) unsigned char Val; Start_I2c(); /启动总线 SendByte(AddWr); /发送器件地址 if(ack=0)return(0); SendByte(0x40|Chl); /发送器件子地址 if(ack=0)return(0); Start_I2c(); SendByte(AddWr+1); if(ack=0)return(0); Val=RcvByte(); NoAck_I2c(); /发送非应位 Stop_I

28、2c(); /结束总线 return(Val); /*- 写入DA转换数值输入参数:dat 表示需要转换的DA数值,范围是0-255-*/*bit WriteDAC(unsigned char dat) Start_I2c(); /启动总线 SendByte(AddWr); /发送器件地址 if(ack=0)return(0); SendByte(0x40); /发送器件子地址 if(ack=0)return(0); SendByte(dat); /发送数据 if(ack=0)return(0); Stop_I2c(); */void Timer1(void) interrupt 3stati

29、c unsigned char temp=0;temp+;TH1=(65536-20)/256; TL1=(65536-20)%256;if(temp=num)led=1;elseled=0;定时器一初始化子函数:#include #includepwm.hvoid Init_Timer1(void) TMOD |= 0x10; /使用模式1,16位定时器,使用|符号可以在使用多个定时器时不受影响 /TH0=0x00; /给定初值 /TL0=0x00; EA=1; /总中断打开 ET1=1; /定时器中断打开 TR1=1; /定时器开关打开void Init_Timer1(void);附录B 原件清单 原件名称数目STC89C54RD+芯片1PCF8591P芯片174HC573芯片28位共阴数码管612MHz晶振1LED灯1杜邦线1327

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 研究报告 > 商业贸易


经营许可证编号:宁ICP备18001539号-1