基于PIC16F877A的方波信号发生器电路设计
基于PIC16F877A的课程设计
第一模块:课程原理设计方面的内容●课程设计的目的:我是觉得焊板,是件挺有意思的事丰富同学自己动手做板,设计电路的经验,加强同学的动手能力,强化自我分析问题,解决问题的能力,培养一种全局观,一种良好的思维方式。
同时也可以让同学学到做到事都要细心。
●课程设计的原理:这个课程设计没有什么原理,原理就是先用头脑,构想出自己所要设计的东西,然后用Protel 99SE 画出电路原理图(电路设计原理图会在后面的清单中给出),再按照自己设计的电路图,利用万能的双手,将所需要用到的元件一个一个的焊接到万用板上,然后一个一个的把应该接的器件接起来,最后融合自己在这学期,PIC课程上所学得的编程语言,按照硬件所要实现的功能,编写源程序,最后就祈祷能一下子成功吧。
(原理好像挺简单的)●设计内容:本设计为一个多功能时钟的设计,芯片基于8位机PIC单片机,显示模块用LCD液晶显示器1602.●硬件组成:PIC单片机一片,一个LCD液晶显示器1602,一个7805稳压管,一个4M外接晶振,一个9V电池,电阻、电容若干,按键、导线若干。
(具体的材料清单后面在附录中会给出)●设计要求(自己按自己的要求设计)1.要求能在LCD1602上显示一个电子时钟2.可以通过一个按键来控制正常计时还进入修改时间模块3.再由一个按键控制选位,可以精确到每一位的选定,4.由另一个按键控制时钟的准确调整(可能扩充时钟功能和其它显示模式功能)第二块:焊接实物方面遇到的问题及注意事项1.焊接前一定得先将实物按照电路图合理的摆放在通用板上。
这个很关键,好的实物布局可以在很大程度上降低焊接时的难度。
LCD1602有16个管脚,其中有8个为数据和指令的输入、读出端口,3个为控制读/写数据/指令的端口,其余的背光接口,或是接VCC,或是直接接地。
我在画电路图的时候,将8个数据总线安排到PORTD端口,将3个控制端口安排在PORTA端口,而因为PIC单片机芯片上的管脚排列方式,PORTD的端口是分布在两边,只有PORTB的8个管脚在同一列上,当时安排端口的时候,如果将PORTB端口做为数据总线,PORTC安排作为控制总线,那样会大大降低布线、焊接的难度。
基于PIC16F877A的永磁无刷直流电机的控制器设计
Ab s t r a c t :W i t h t h e d e v e l o p me n t o f s c i e n c e a n d t e c h n o l o g y ,a h i g h e r d e ma n d o f p e r f o r ma n c e o f b r u s h l e s s DC mo t o r i s r a i s e d . B a s e d o n t h e r e s e a r c h o f ma t h e ma t i c a l mo d e l a n d c o n d u c t i s DC mo t o r , we d e s i g n e d h a r d w a r e
王 宇鸡 ,丁 海波 ,杨 华松 ,徐 晨路
( 1 . 中 国煤炭 科 工集 团沈 阳研 究 院 辽 宁 抚 顺 1 1 3 1 2 2 2 ;2 . 辽 宁省 医疗 器械 检验 所 辽 宁 沈 阳 1 1 0 1 7 9 )
摘要: 随 着 科 技 的 发 展 ,对 无刷 直 流 电 动 机 的 性 能 提 出更 高 的要 求 。 本 文在 研 究 无 刷 直 流 电动 机 数 学模 型 、 导 通 方
DC mo t o r
NG Ha i — b o 2 YANG W ANG Yu — k u n 。 DI Hu a — s o n g , XU C h e n — l u
, ,
(1 . S h e n y a n g R e s e a r c h I n s t i t u t e o fC o a l T e c h n o l o g y E n g i n e e r i n g G r o u p C b 仍 F u s h u n 1 1 3 1 2 2 , C h i n a ; 2 . L i a o n mg Me d i c a l
PIC16F877A功能及其编程
4.1.1 端口A
因此,在使用RA口时,除了要设置TRISA外,有 时相关寄存器也要设置。
注意:在上电复位时,与AN有关的端口的默认 设置是作为模拟端口,即ADCON1(见4.6)中默认 值为0b00xx0000,这个值的设置结果是除RA4外的所 有的RA引脚都作为模拟输入。
信的时钟线; RC7/RX/DT:IO引脚、异步串行通信的接收、同步串行通
信的数据线。
4.1.4 端口D
端口D有8个引脚,它除了作为普通IO口外, 还能作为并行从动口使用。
4.1.5 端口E 端口E只有3个引脚,它们都可以作为AD转换
的模拟电压输入口,功能如下:
RE0/RD/AN5:IO引脚、并行从动口的读控制、 模拟电压输入通道AN5;
➢ 中断的特点:可返回性。中断处理结束后必须能 回到原先的程序,并且能继续运行原先的程序,
这就需要在中断时能进行现场保护与恢复。
中断的执行过程
➢ 中断发生:程序执行到某行,突然事件(能够产 生中断的事件)发生,产生中断。
➢ 断点保护:CPU自动将中断时刻即将要执行的下 一条指令的地址压入堆栈。
➢ 中断响应:CPU自动将PC强制设为0X0004,且GIE =0。执行中断服务程序(自动完成现场保护与恢 复,手动清中断标志位)。
将被调试系统占用,因此在调试时此二个引脚暂 不能使用。
3、8个引脚具有内部弱上拉使能控制 由OPTION_REG寄存器的第7位RBPU控制,如果弱 上拉使能,作为输入的RB口在端口悬空时将被上拉 到高电平。以RB0为例,如下图所示:
4、RB0/INT具有外部中断功能。
5、RB的的高4位还具有电平变化中断功能
ADIE
基于PIC16F877A的温室自动控制系统的研究的开题报告
基于PIC16F877A的温室自动控制系统的研究的开题报告一、研究背景温室农业是一种能够使植物在一定程度上获得更加优越的生长环境的农业生产方式,它可以为植物提供温暖、湿度、光照等方面更优秀的生长环境,并且可以使农民在一定程度上实现冬季的生产。
但是,要充分发挥温室农业的优势,建立科学且高效的温室自动控制系统是很有必要的。
目前,许多温室自动控制系统已经得到广泛应用,同时也在研发中不断更新、完善。
目前,经常用于温室自动控制的技术手段有:微机控制技术、物联网技术、嵌入式系统技术等等。
本研究选择利用微型控制技术,基于PIC16F877A型芯片,设计一个完整且具备较高实用价值的温室自动控制系统。
二、研究目的研究目的如下:1、研发一款基于微型控制技术的温室自动控制系统,能够在保持温室环境稳定的情况下更好地管理和保护种植物;2、设计一套可靠的温室自动控制系统,包括温度、湿度、状态监测等参数,可以对种植物的生长情况进行监测和控制;3、通过温室自动控制系统的研发,提高农业生产效率,保护资源环境。
三、研究方案1、研究控制系统的体系结构、性能指标、可行性等方面;2、确定系统的设计方案、功能模块、硬件电路图的设计,并选择PIC16F877A作为主控芯片进行控制设计;3、搭建实验平台,对设计的控制系统的完整性和性能进行测试;4、调试控制系统的软硬件,为最终提供一个完善且具体的温室自动控制系统。
四、研究内容1、温室自动控制系统的总体设计2、基于PIC16F877A型芯片的底层驱动程序编写3、设计系统控制模块和各种输入输出模块4、整合和调试控制策略和数据处理算法5、进行功能性、性能和可行性实验6、完成系统的实际应用五、研究意义1、本研究选择微机控制技术,采用PIC16F877A型芯片作为主控器,研发一套完整的温室自动控制系统,可以更好地管理和保护温室,并最大限度地提高温室农业的生产效率和资源利用效率。
2、本研究为温室自动控制的研发和实践提供一种新的思路和方法,对提高农业生产率、保护资源环境、实现可持续发展具有重要的意义。
pic16f877a编程实例
pic16f877a编程实例pic16f877a是一款常用的单片机,被广泛应用于嵌入式系统中。
它具有多种功能和强大的性能,可以实现各种应用需求。
本文将以pic16f877a编程实例为主题,介绍其基本特性和常见应用。
pic16f877a是一款8位单片机,采用哈佛架构,具有高性能和低功耗的特点。
它内置了8KB的程序存储器,368字节的数据存储器,以及35个I/O引脚,可以满足大多数嵌入式系统的需求。
我们来看一个简单的实例,通过pic16f877a控制LED灯的开关。
```c#include <pic16f877a.h>void main() {TRISB0 = 0; // 设置RB0为输出引脚while(1) {RB0 = 1; // 将RB0引脚电平设置为高,LED灯亮__delay_ms(1000); // 延时1秒RB0 = 0; // 将RB0引脚电平设置为低,LED灯灭__delay_ms(1000); // 延时1秒}}```在上面的程序中,我们首先将RB0引脚设置为输出引脚,然后进入一个无限循环。
在循环中,我们将RB0引脚电平设置为高,LED灯亮起,然后延时1秒;然后将RB0引脚电平设置为低,LED灯熄灭,再次延时1秒。
通过不断重复这个过程,我们可以实现LED灯的闪烁效果。
除了控制LED灯,pic16f877a还可以用来控制其他外设,如蜂鸣器、液晶显示屏等。
下面是一个使用pic16f877a控制蜂鸣器的实例。
```c#include <pic16f877a.h>void main() {TRISB0 = 0; // 设置RB0为输出引脚while(1) {RB0 = 1; // 将RB0引脚电平设置为高,蜂鸣器鸣叫__delay_ms(1000); // 延时1秒RB0 = 0; // 将RB0引脚电平设置为低,蜂鸣器停止鸣叫__delay_ms(1000); // 延时1秒}}```在上面的程序中,我们同样将RB0引脚设置为输出引脚,并进入一个无限循环。
单片机简易信号发生器课程设计
单片机简易信号发生器课程设计
单片机简易信号发生器是一种基于单片机技术的电子设备,它可以产生各种不同的信号波形,如正弦波、方波、三角波等。
在电子工程领域中,信号发生器是一种非常重要的测试仪器,它可以用于测试各种电子设备的性能和参数,如放大器、滤波器、振荡器等。
在本次课程设计中,我们将使用单片机技术设计一款简易的信号发生器。
首先,我们需要选择一款适合的单片机芯片,如AT89C51、PIC16F877A等。
然后,我们需要编写相应的程序代码,实现信号波形的产生和输出。
在程序设计中,我们可以使用定时器和计数器来实现不同频率的信号波形产生。
例如,我们可以使用定时器产生一个固定频率的方波信号,然后通过改变计数器的值来改变方波的占空比。
同样地,我们也可以使用定时器和计数器来产生正弦波和三角波等不同形式的信号波形。
在硬件设计方面,我们需要选择适合的电路元件来实现信号波形的输出。
例如,我们可以使用DAC芯片来将数字信号转换为模拟信号,然后通过放大器和滤波器来输出信号波形。
当然,我们也可以选择其他的电路方案来实现信号波形的输出。
单片机简易信号发生器是一款非常有用的电子设备,它可以用于各种电子设备的测试和调试。
通过本次课程设计,我们可以学习到单
片机技术的应用和信号发生器的原理,提高我们的电子技术水平。
用PIC16F877A单片机制作的PWM参数测量仪
用PIC16F877A单片机制作的PWM参数测量仪用PIC16F877A单片机制作的PWM参数测量仪一、测量原理电路如上图(电源电路略)。
外部频率信号从单片机CCP1(RC2)脚输入,测量结果显示在液晶屏上。
PIC16F877A单片机内部有2个CCP模块。
当它工作在PWM方式时。
可以产生周期和电平宽度均可由编程决定的PWM波形;当它工作在捕捉方式时。
可以捕捉外部输入脉冲的上升沿或下降沿,当输入信号发生边沿跳变时,CCP模块立即把当时TMR1的16位计数值放入CCPRxH和CCPRxL寄存器。
并产生相应的中断。
利用CCP 模块的捕捉功能,可以很容易地完成。
PWM信号的周期、频率、脉宽、占空比等参数的测量。
PWM信号参数的测量以周期测频法为基础。
原理如右图所示。
把单片机的CCP1模块设置为捕捉模式,先把CCP1设置为捕捉脉冲的上升沿。
当脉冲信号上升沿到来时。
触发CCP中断,并在中断服务程序中记录下此时TMR1寄存器中16位的值T1:然后把CCP1模块设置成捕捉脉冲下降沿,当脉冲信号下降沿到来时,再次触发CCP中断。
并在中断服务程序中记录下此时TMR1寄存器中16位的值T2;最后把CCP1模块设置成捕捉脉冲上升沿,当脉冲信号上升沿到来时,触发CCP 中断,并在中断服务程序中记录下此时TMR1寄存器中16位的值T3,这样就完成了PWM信号一个周期的测量。
示例程序如下:通过T1~T3可算出PWM信号的周期、频率、脉宽、占空比等。
当PIC16F877A使用4MHz晶振时。
时钟周期=1/4MHz=250ns,指令周期=1μs,TMR1寄存器中16位数值的单位就是μs。
PWM信号各参数的计算方法如下:信号周期:T=(T3-T1)μs;信号频率:F=1000000/T;脉冲宽度:P=(T2-T1)μs;占空比:R=P/T×100%。
为了提高准确性。
可以重复测量多个周期的PWM信号参数,以平均值为最终测量结果。
基于PIC16F877A控制boostbuckDCDC变换器
输出电压可设置的升降压DC-DC变换器如下图,设计一个DC-DC变换电路:要求:1)当输入电压Ui 在14V~16V变化时,输出电压Uo恒压输出,Uo稳态相对误差不超过2%,Uo可通过键盘设置为10~20V间的任意电压,电压步进长度0.1V;2)要求用液晶屏显示输出电压和输出电流,电压显示精度到0.1V,电流显示精度到50mA;要求带4*43)输出负载电流I2范围0~1A;4)试计算电源效率。
<一>电路部分:设计原理:主电路boost-buck电路,驱动电路,控制电路(pic单片机控制)。
原理概述:boost-buck电路利用开关管的开关,输出电压的平均值Uo=ton/(T-ton)×Ui=D/(1-D)*ui。
D为占空比。
用单片机输出PWM方波(经过驱动电路放大后)控制MOS 管的开关,来调节输出电压。
将输出电压送回PIC单片机模数转换模块,通过反馈调节PWM 占空比调节电压,使输出稳定。
利用差分运放电路,检测出输出电压与输出电流的关系。
键盘输入设置电压。
外接液晶屏显示输出电压和输出电流和输出电流。
主电路:驱动电路:控制电路:液晶外围电路:键盘电路模块:用multisim仿真如下结果:设计小结:输出电流与输出电压的关系U=RI。
在程序设计中,通过电压的输出在液晶屏上显示电流的输出。
〈二〉程序部分:输出pwm:#include<pic.h>unsigned int DRE;__CONFIG(0x2001);void PWM(){PR2=39; //频率25KHzTRISC|=0x04; //RC2置为输入CCP1CON=0X0c; //PWM输出CCPR1L=0X01; //占空比25%T2CON=0X04; //开定时器TMR2,预分频1:1TMR2IF=0; //清除TMR2中断标志位}void main(){while(1){PWM();DRE=40; //高电平寄存器的值CCPR1L=DRE/4; //装入高8位CCP1CON<5>=(DRE/2)%2; //装入次低位CCP1CON<4>=DRE%2; //装入最低位while(TMR2IF==0);TRISC=0x00;}}AD转换:#include<pic.h>__CONFIG(FOSC_XT&WDTE_OFF&LVP_OFF);void AD(){TRISA0=1; //RA1设置为模拟输入ADCON1=0x00; //参考电压电源电压VDD AD转换周期Fosc/4 ADCON0=0x40; //}void delayms(int xms){int i,j ;for(i=0;i<xms;i++)for(j=0;j<150;j++) ;}void main(){unsigned int x,y,z,A,B,C;unsigned int Result,Result1,ADRES;while(1);{ delayms(5); //采样采样电压充电延时GO=1;}while(GO==1);{}Result=ADRES;x=(Result*5)/256; //取个位十分位百分位y=((Result*50)/256)%10;z=((Result*500)/256)%10;Result1=Result/1.2-1.5;A=(Result*5)/256; //取个位十分位百分位B=((Result*50)/256)%10;C= ((Result*500)/256)%10;}液晶屏与键盘:#include<pic.h>#define LCD_EN RC7#define LCD_RW RC6#define LCD_RS RC5unsigned int x,y,z,A,B,C;unsigned char dis0[]="voltage:";unsigned char dis1[]={'0','1','2','3','4','5','6','7','8','9','.'}; unsigned char dis2[]="current:";unsigned char dis3[]={'0','1','2','3','4','5','6','7','8','9','.'}; unsigned char dis4[3], dis5[3];__CONFIG(FOSC_XT&WDTE_OFF&LVP_OFF);void delay (int xms){int i,j;for(i=0;i<xms;i++){for(j=0;j<150;j++);}}void write_com(){unsigned char com ; //声明写指令LCD_RS=0;LCD_RW=0;LCD_EN=0;PORTD=com;delay(5);LCD_EN=1;delay(5);LCD_EN=0;}void write_date(){unsigned char date;LCD_RS=1;LCD_RW=0;LCD_EN=0;PORTD=date;delay(5);LCD_EN=1;delay(5);LCD_EN=0;}void init(){ TRISD=0x00;TRISC&=0x1f;write_com(0x38);delay(5);write_com(0x0c);delay(5);write_com(0x06);delay(5);write_com(0x01);delay(5);}void display(){unsigned char j; dis4[0]=dis1[x];dis4[1]=dis1[10]; dis4[2]=dis1[y];dis4[3]=dis1[z]; write_com(0xc8); for(j=0;j<=3;j++) {write_date(dis5[j]);delay(1);}unsigned char k; dis5[0]=dis3[A];dis5[1]=dis3[10]; dis5[2]=dis3[B];dis5[3]=dis3[C]; write_com(0xc8); for(k=0;k<=3;k++) {write_date(dis4[k]);delay(1);}}void main(){unsigned char i;init();write_com(0x80); //显示第1行for(i=0;i<=8;i++){write_date(dis0[i]);delay(1);}write_com(0x80+0x40);//显示第2行for(i=0;i<=8;i++){write_date(dis2[i]);delay(1);}}#include<pic.h>#include<pic.h>#define LCD_EN RC7#define LCD_RW RC6#define LCD_RS RC5unsigned int x,y,z,A,B,C;unsigned char dis0[]="voltage:";unsigned char dis1[]={'0','1','2','3','4','5','6','7','8','9','.'}; unsigned char dis2[]="current:";unsigned char dis3[]={'0','1','2','3','4','5','6','7','8','9','.'}; unsigned char dis4[3], dis5[3];__CONFIG(FOSC_XT&WDTE_OFF&LVP_OFF);void delay (int xms){int i,j;for(i=0;i<xms;i++){for(j=0;j<150;j++);}}void write_com(){unsigned char com ; //声明写指令LCD_RS=0;LCD_RW=0;LCD_EN=0;PORTD=com;delay(5);LCD_EN=1;delay(5);LCD_EN=0;}void write_date(){unsigned char date;LCD_RS=1;LCD_RW=0;LCD_EN=0;PORTD=date;delay(5);LCD_EN=1;delay(5);LCD_EN=0;}void init(){ TRISD=0x00;TRISC&=0x1f;write_com(0x38);delay(5);write_com(0x0c);delay(5);write_com(0x06);delay(5);write_com(0x01);delay(5);}void display(){unsigned char j;dis4[0]=dis1[x];dis4[1]=dis1[10];dis4[2]=dis1[y];dis4[3]=dis1[z]; write_com(0xc8);for(j=0;j<=3;j++) {write_date(dis5[j]);delay(1);}unsigned char k;dis5[0]=dis3[A];dis5[1]=dis3[10];dis5[2]=dis3[B];dis5[3]=dis3[C];write_com(0xc8);for(k=0;k<=3;k++){write_date(dis4[k]);delay(1);}}void main(){unsigned char i;init();write_com(0x80); //显示第1行for(i=0;i<=8;i++){write_date(dis0[i]);delay(1);}write_com(0x80+0x40);//显示第2行for(i=0;i<=8;i++){write_date(dis2[i]);delay(1);}} #define KEYBOARD_PORT_DIR TRISB //键盘扫描方向端口#define KEYBOARD_PORT PORTB //键盘扫描端口#define NO_KEY 0xFF //无按键__CONFIG(0x3FFF);unsigned char L,O;char scankeypad(); //获取4×4键盘值char getkeyvalue(); //获取某按键的值void delay(int xms){int i,j;for(i=0;i<xms;i++)for(j=0;j<150;j++);}const char ccode[16][2]={{0xEE,1},{0xED,2},{0xEB,3},{0xE7,'L'},{0xDE,4},{0xDD,5},{0xDB,6}, {0xD7,'+'},{0xBE,7},{0xBD,8}, {0xBB,9}, {0xB7,'-'},{0x7E,'.'},{0x7D,0},{0x7B,'*'}, {0x77,'O'}};char scankeypad() //获取4*4键盘扫描码{char key4H=0,key4L=0,scancode=0;TRISD=0xF0; //低四位输出,高四位输入PORTD=0x00; //低四位输出0asm("nop");asm("nop"); //待输出信号稳定key4H=PORTD; //读取高四位key4H=key4H&0xF0; //将低四位屏蔽if(key4H!=0xF0) //有按键按下{delay(20);key4H=PORTD; //重读if(key4H!=0xF0){TRISD=0x0F;PORTD=0x00;asm("nop");asm("nop");key4L=PORTD; //读取高四位key4L=key4H&0x0F; //将高四位屏蔽if(key4L!=0x0F) //有按键按下{scancode=key4H|key4L;//高四位与低四位组成键盘扫描码while(PORTD!=0x0F); //按键未松开等待return(scancode);}}}return NO_KEY;}char Getkeyvalue() //获取扫描码{ char keyvalue=0,c=0;keyvalue=scankeypad();if(keyvalue!=NO_KEY){while(keyvalue!=ccode[c][0]){ //比较描码与当前数组元素是否相等c++;}return(ccode[c][1]);//返回序号对应值}return(NO_KEY);}void main(){int i=0,Num[2]={0,0},Numindex=0;while(1){i=Getkeyvalue(); //获得键值if(i!=NO_KEY) //有按键{if(i>=0&&i<=9){Num[2]=Numindex*10+i; //新数值}else{switch(i){case'L':Num[0]=0;Num[1]=0;Numindex=0;break;case'.':break;case'O': Num[2]=Numindex*10+i;break;default:break; };}}}}电源输出效率:。
基于PIC16F877A的混沌信号发生器的设计.
基于PIC16F877A的混沌信号发生器的设计混沌科学得到广泛研究应该得益于20世纪60年代洛伦兹(Lorenz)的“蝴蝶效应”。
混沌信号具有初值敏感性、内随机性、遍历性和有界性等特点,近几年得到深入的研究和探索,并开始广泛应用于信号处理、保密通信、生物医学等领域,特别是在医疗器械的应用,有着重大的突破。
科学研究表明:生物体是一个高度的非线性系统,而非线性系统的运动通常表现出混沌现象,人体的生理活动呈现众多的混沌现象。
所以,研究混沌信号源的产生对生物医学混沌科学得到广泛研究应该得益于20世纪60年代洛伦兹(Lorenz)的“蝴蝶效应”。
混沌信号具有初值敏感性、内随机性、遍历性和有界性等特点,近几年得到深入的研究和探索,并开始广泛应用于信号处理、保密通信、生物医学等领域,特别是在医疗器械的应用,有着重大的突破。
科学研究表明:生物体是一个高度的非线性系统,而非线性系统的运动通常表现出混沌现象,人体的生理活动呈现众多的混沌现象。
所以,研究混沌信号源的产生对生物医学的研究有着极其重要的意义。
1 混沌信号产生的数学建模与仿真1.1 混沌信号系统数学模型的选用该设计中,考虑到人体生理活动本身也是一个混沌系统,主要是要产生一个具有混沌特性的信号源,来调节人体的生理活动,因此,该设计采用最经典的Lorenz混沌模型来产生信号。
其数学模型如式(1)所示。
当σ=10,b=8/3,r=28时系统进入混沌状态。
此时Lorenz方程可表示为式(2)。
代入数值得:1.2 基于Matlab/Simulink的Lorenz混沌系统仿真Simulink是Matlab软件的一个附加组件,为用户提供了一个建模和仿真的工作平台,它采用模块组合的方法来创建动态系统的计算机模型,其重要的特点是快速、准确。
对于比较复杂的非线性系统,效果更为明显。
其用户交互接口是基于Windows的模型化图形输入,即用户只需要知道这些模块的输入/输出和模块的功而不必考察模块内部是如何实现的,通过对这些基本模块的调用,再将它们接起来就可以构成所需要的系统模型(以.mdl文件进行存取),进而进行仿真与分析。
基于PIC16F877A单片机的SPWM波调制方法
基于PIC16F877A单片机的SPWM波调制方法陈毅光;何卫彬;徐凯【摘要】本文介绍了用PIC16F877A单片机作为控制器,进行SPWM波调制的方法.详细分析了面积等效法原理以及单片机产生SPWM波脉宽数据的过程,并通过逆变电路进行了相关验证.实验结果表明,采用PIC单片机作为正弦波逆变器的核心控制器件生成SPWM波,简单有效,性能可靠;逆变输出电压稳定,总谐波含量THD 低,波形失真少.【期刊名称】《电子世界》【年(卷),期】2016(000)020【总页数】2页(P178-179)【关键词】PIC16F877A;SPWM;面积等效法【作者】陈毅光;何卫彬;徐凯【作者单位】杭州应用声学研究所;杭州应用声学研究所;杭州应用声学研究所【正文语种】中文当前,正弦波逆变器有多种实施方案,采用PIC单片机作为控制器能有效减少外围电路,降低产品成本[1]。
SPWM波形产生的方法有很多种,例如自然采样法、规则采样法和面积等效法等,目前面积等效算法与其它算法相比,具有谐波失真小、程序量少、动态在线进行实时运算等优点,采用此算法设计的正弦波逆变器,输出电压波形接近正弦程度更高,谐波更小[2]。
面积等效法是根据PWM的基本原理即面积(冲量)相等,效果相同提出的,它的原理如图1所示。
将一个正弦半波平均分为N等分,每一等分的正弦曲线与横轴所包围的面积均能用一个与此面积相等的等高矩形脉冲代替,矩形脉冲的中点与正弦波每一等分的中点重合,这样,由N个等幅而不等宽的矩形脉冲所构成的波形就与正弦半波等效,可以看出,这一系列脉冲波形的宽度和对应开关管的开关时刻都可以严格地用数学方法计算得到。
若M为调制度,Ud为直流侧的直流电压,则有Usin=M×Ud,第K份正弦波面积,即S1所对应的第K个SPWM脉冲面积S2为:S2=μk×Ud又由S1和S2相等,可得:由上式可知,当给定调制度、正弦调制波频率和载波比后,便可求出脉冲宽度占空比μk。
基于PIC16F877A的方波信号发生器电路设计
&b:C+
0^@V-/
’<b&.
0^@$/
"端口 . 的地址
&b:C.
0^@V$/
&Ib#+
0^@ X\%U-\ X\(%U\
"定义 &Ib#初值
b’#
0^@U/
"’ ’ ’ ’ ’ ’ ’ ’ ’ 主 程 序 ’ ’ ’ ’ ’ ’ ’ ’ ’ ’ ’ ’
<bA###/
I;:1! !1<’
+C[! ! ! ! !C&;&@C!b’#
X$ b+’@
图 (! 硬 件 电 路 工 作 原 理 示 意 图
X:1&0XA
XU
X! X" X% X( X#
&#.C &#C0 ’C; ’C% ’C( ’C#
当其第U位 ’&#.C(置 ( 时!&Ib# 模 块 被 设 置 为 计 数器模式!其分 频 比 由 <’&:<1 b0A 的 X%&X#’’C%! ’C#(决 定 !分 别 为 (j%!(j!!(jV!(j(-!(j"%!(j-!! (j(%V!(j%U-!由此可产生V种 分 频 信 号!即 V 种 方 波 信 号 $ 其 源 程 序 采 用 汇 编 编 语 言 编 写 !如 下 &
利用 ’b<&0Y**C0 制 作 电 路 ’.+ 板 $图 U!进 行 安 装焊接"C?("C?% 选用按纽 开 关"C?( 为 循 环 切 换 控 制 开关"C?% 为复位开 关"’<?0b 接 U W 电 源"@( 在 安 装 时要采用:. 座"便于更新或更换:."YC(可连接到 压 电 蜂 鸣器"X#为发 光 二 极 管"有 输 出 时 X# 点 亮"<@& 为 输 出 端"用可示波 器 进 行 观 察# 调 试 完 成 之 后"方 波 信 号 发 生 器的设计就全部完成了#
基于pic单片机的信号发生器的设计
基于PIC单片机的低频信号发生器的设计[摘要] 信号发生器是一种经常使用的信号源,普遍地应用于电子电路、自动操纵系统和教学实验等领域。
目前利用的信号发生器大部份是函数信号发生器,且特殊波形发生器的价钱昂贵。
本设计采纳PIC16F87X系列单片机作为逻辑操纵单元,利用芯片DAC0832转换单片机发出的数据,在放大器的配合下产生相应正弦波、三角波、锯齿波和方波信号。
通过外部键盘,可选择输出的波形,并利用相应的按键能够调整输出波形的频率大小。
本设计利用液晶显示芯片1602作为显示单元,能够显示输出波形的名称及其频率大小,且其亮度可通过扩展的外部按键进行调剂。
本设计具有电路简单靠得住,易于操作等优势。
[关键词] 信号发生器;PIC单片机;数模转换;液晶显示Design of Low Frequency Signal GeneratorBase on PIC SCMElectrical Engineering and Automation Specialty ZHANG Shou-tian Abstract:Signal generator is a common source and it is used widely in electronic circuits, automatic control system and teaching experiment and so on. Function signal generator is used mostly in the signal generator in currently for the price of special waveform generator is expensive. The low frequency signal generating device is introduced, taking the pic16f877 monolithic circuit as the host controller, which is composed of the digital –analog conversion circuit, the reshaping circuit and operational amplifier circuit and so on. In the system, the perfect of save wave,triangle wave, saw tooth wave and square wave can be showed. The wave can be observed by digital oscilloscope and its’ name a nd frequency can be watched by 1602 liquid crystal scope at the same time. The wave cycle can be controlled through the external keyboard, but its number of the highest is not varied. The electric circuit of the system is simple and can be learned quickly.Keyword: signal generator; pic16f877; digital-analog conversion; 1602目录1引言.................................................... 错误!未定义书签。
基于PIC16F877A的方波信号发生器电路设计
基于PIC16F877A的方波信号发生器电路设计在数字电路系统中,方波是经常使用的信号源,具有非常广泛的应用范围。
在普通的电路设计中,经常利用555 定时器构成多谐振荡器产生方波信号,虽然比较简单,但频率准确精度不高,若要产生不同频率的方波信号,更换电阻和电容又比较麻烦。
基于这个出发点,本文采用单片机进行电路设计,利用软件编程控制代替硬件的更换,可灵活简单地产生不同频率的方波信号,而且电路更为简单、频率更准确、性能更稳定。
1 软件平台及芯片介绍目前的单片机有很多种型号,有Intel 公司的8051 系列、Motorola 公司的M68 系列、ATMEL 公司的AT 系列、Microchip 公司的PIC 系列等等。
本文主要介绍Microchip 公司开发的基于MPLAB-IDE 6.62 集成开发环境的PIC 单片机的电路设计。
MPLAB-IDE 集成开发软件是专门设计对PIC 系列单片机进行文本编辑,在线调方式及编译的开发工具。
PIC 芯片采用PIC16F877A,40 脚封装、具有5 个输入/输出端口,每个端口中的每条引脚由用户按需要单独编程,设定为输出引脚或输入引脚。
2 方波信号发生器电路设计2.1 硬件电路分析利用PIC16F877A 中的定时器/计数器TMR0 模块作为硬件定时器控制端口引脚RC0 上产生不同频率的方波。
由于TMR0 为8 位宽,有一个可选的预分频器,故可产生8 种方波信号;同时通过设置不同的初始值,可产生不同的频率。
本设计初始值设为131,计数125 个指令周期产生溢出,即TMR0 从计数到开始溢出需要125us。
通过改变分频比,来达到产生不同频率的目的。
TMR0 溢出一次就使端口引脚RC0 的输出电平反转一次,每反转两次引脚电平就形成方波信号的一个周期。
当分频比为1:256 时,TMRO 的延时为125 us×256=32000us,方波信号周期为32000 us×2=64000us=64 ms,对应的方波信号频率为最低档的15.625 Hz;当分频比为1:2 时,TMR0 的延时为125 us×2=250us,方波信号周期为250 us×2=500 us=0.5 ms,对应的方波信号频率为最高档的2000 Hz。
基于PIC16F877A的超低频脉冲调制高频信号的实现
2009年7月第28卷 第7期研究与开发中国科技核心期刊基于PIC16F877A 的超低频脉冲调制高频信号的实现李 涛 张华锋(中国人民解放军92957部队 舟山 316000)摘 要:实现了一种用低频率或超低频率的窄脉冲对正弦波高频信号进行调制的方法。
该方法在PICC 语言平台上设计程序,控制PIC16F877A 单片机的PWM 功能产生超低频脉冲调制的高频脉冲信号;设计串联谐振电路高频滤波器对高频脉冲进行滤波,把高频脉冲变成纯度较高的高频正弦波;设计衰减器和功率放大器,控制信号幅度。
经过测试表明:该方法设计实现的超低频脉冲调制高频信号具有高准确度、高稳定度的优点,满足使用要求。
关键词:PIC16F877A ;脉冲调制;超低频;高频中图分类号:TN761.2 文献标识码:AR ealization of ultralow frequency pulse modulated high frequencysignal based on PIC16F877ALi Tao Zhang Huafeng(PLA Units :92957,Zhoushan 316000,China )Abstract :A kind of low or ultralow frequency narrow pulse modulated high frequency sine wave signal method is realized in this paper.This method programmes on PICC platform ,and controls PWM mode of PIC16F877A MCU to produce high frequency signal modulated by ultralow frequency pulse ,and designs high frequency filter with series 2wound syntonic electrocircuit to filter out impurity from high frequency pulse and change high frequency pulse to pure high frequency sine wave ,and designs attenuator and power amplifier to modulate amplitude.Experimental results show that ultralow frequency pulse modulated high frequency signal produced by this method is high 2exact and steady 2state and satisfies use requirements.K eyw ords :PIC16F877A ;PWM ;ultralow frequency ;high frequency 作者简介:李涛,博士,高级工程师,从事军事计量管理和计量测试工作。
基于pic16f877a的方波信号发生器电路设计
基于pic16f877a的方波信号发生器电路设计本文介绍了基于PIC16F877A的方波信号发生器电路设计,并详细讲解了电路设计的原理和步骤。
方波信号是一种具有等周期的电信号,可以应用于很多领域,如音频信号处理、测试仪器等。
而PIC16F877A则是一款功能强大的控制器,可以实现各种控制和信号发生的功能。
一、电路设计的原理基于PIC16F877A的方波信号发生器电路设计原理是通过控制PWM的占空比来实现方波信号的发生。
PWM是脉冲宽度调制信号,可以通过改变信号的占空比来控制信号的强度和开启时间。
在一个固定的周期内,占空比越大,信号的强度越强,开启时间越长。
因此,我们可以通过改变PWM 的占空比来实现方波信号的发生,也就是通过控制方波信号的高电平和低电平时间来控制PWM的占空比。
具体实现时,我们可以通过一个计时器来控制PWM的占空比,定时器产生固定的时间间隔,定时结束后启动PWM 输出,同时改变PWM的占空比,实现对方波信号的控制。
同时,我们需要通过一个稳压电路提供稳定的电源,以保证电路的正常运行。
二、电路设计步骤1. 选择合适的元器件:根据电路设计原理,我们需要选择合适的元器件,包括PIC16F877A控制器、晶振、电容、电阻、三极管等。
2. 进行电路连线:根据原理图和元器件型号进行电路连线,注意正确连接元器件的各个引脚,避免连接错误。
3. 编写程序:通过PIC16F877A控制器进行方波信号的控制,需要编写相应的程序,包括定时器计数、PWM控制等。
4. 修改占空比:测试程序,通过修改PWM的占空比,可以改变方波信号的高电平和低电平的时间,控制信号的输出频率和强度。
5. 调整波形形状:通过修改PWM占空比的大小和时间,可以改变方波信号的形状,调整波形的周期和占空比,实现更多种类的波形输出。
三、电路设计的应用基于PIC16F877A的方波信号发生器电路设计可以应用于很多领域,如音频信号处理、测试仪器等。
基于PIC16F877A的方波信号发生器电路设计
基于PIC16F877A的方波信号发生器电路设计
林若波
【期刊名称】《现代电子技术》
【年(卷),期】2006(29)12
【摘要】方波信号是数字电路中非常重要的信号源,其产生方法有很多途径.本设计是基于MPLAB-IDE 平台通过对方波信号发生器的电路分析,介绍了方波信号的产生原理和软件实现过程,并利用PIC单片机的定时器/计数器技术对PIC16F877A进行编程;通过对TMR0模块进行设置,使其分频比改变,产生8种不同频率的方波信号,同时改变初始值,产生任意频率的方波信号.
【总页数】3页(P24-26)
【作者】林若波
【作者单位】汕头市林百欣科技中专,广东,汕头,515041
【正文语种】中文
【中图分类】TN7
【相关文献】
1.基于AD9834的高频方波信号发生器设计 [J], 甘永进;吴学思;韦善于;蔡承海;莫海林;杨桂静;梁火层
2.基于PIC16F877A的小信号采集电路设计 [J], 何源;张娟;任志平;范照晋
3.基于PIC16F877A的混沌信号发生器的设计 [J], 林若波
4.基于STM32的方波信号发生器的设计与检测 [J], 海涛;陆代泽;韦文;吴宗霖;海蓝天
5.基于STM32的方波信号发生器的设计与检测 [J], 海涛;陆代泽;韦文;吴宗霖;海蓝天
因版权原因,仅展示原文概要,查看原文内容请购买。
基于PIC16F877A的小信号采集电路设计
基于PIC16F877A的小信号采集电路设计
何源;张娟;任志平;范照晋
【期刊名称】《电子测试》
【年(卷),期】2010(000)010
【摘要】在感应测井中,所接收到的信号本身会很小,受到噪声的干扰非常明显.因此,本文设计出了一种基于单片机的小信号采集电路,首先通过滤波电路,并从中提取出有用信号,然后再对信号进行放大,之后再通过采用PIC单片机为主控芯片来控制16位的A/D974对信号进行采集、编码处理,从而便于后续电路的处理.本文详细描述了硬件电路的设计,以及通过单片机软件编程与电路相配合,从而实现了小信号的采集过程,并且经过多次实验,验证了电路的稳定性、可靠性.
【总页数】4页(P1-4)
【作者】何源;张娟;任志平;范照晋
【作者单位】光电油气测井与检测教育部重点实验室西安石油大学,陕西,西
安,710065;西安石油大学电子工程学院,陕西,西安,710065;光电油气测井与检测教育部重点实验室西安石油大学,陕西,西安,710065;光电油气测井与检测教育部重点实验室西安石油大学,陕西,西安,710065
【正文语种】中文
【中图分类】TP216
【相关文献】
1.基于PIC16F877A的方波信号发生器电路设计 [J], 林若波
2.基于FPGA的双A/D高精度小信号采集系统 [J], 靳鹏飞;王振华;贺渊明;郭震
3.基于STM32的电流小信号采集系统设计与实现 [J], 吴旷;周虎成
4.基于sbRIO的多通道多类微弱小信号采集与处理 [J], 谢刚;陈源宝;黄双
5.基于AD7715模数转换器的小信号采集系统 [J], 高峰;肖甲
因版权原因,仅展示原文概要,查看原文内容请购买。
基于PIC16F877A控制boost-buckDC-DC变换器
输出电压可设置的升降压DC-DC变换器如下图,设计一个DC-DC变换电路:要求:1)当输入电压Ui 在14V~16V变化时,输出电压Uo恒压输出,Uo稳态相对误差不超过2%,Uo可通过键盘设置为10~20V间的任意电压,电压步进长度0.1V;2)要求用液晶屏显示输出电压和输出电流,电压显示精度到0.1V,电流显示精度到50mA;要求带4*43)输出负载电流I2范围0~1A;4)试计算电源效率。
<一>电路部分:设计原理:主电路boost-buck电路,驱动电路,控制电路(pic单片机控制)。
原理概述:boost-buck电路利用开关管的开关,输出电压的平均值Uo=ton/(T-ton)×Ui=D/(1-D)*ui。
D为占空比。
用单片机输出PWM方波(经过驱动电路放大后)控制MOS管的开关,来调节输出电压。
将输出电压送回PIC单片机模数转换模块,通过反馈调节PWM 占空比调节电压,使输出稳定。
利用差分运放电路,检测出输出电压和输出电流的关系。
键盘输入设置电压。
外接液晶屏显示输出电压和输出电流和输出电流。
主电路:驱动电路:控制电路:液晶外围电路:键盘电路模块:用multisim仿真如下结果:设计小结:输出电流和输出电压的关系U=RI。
在程序设计中,通过电压的输出在液晶屏上显示电流的输出。
〈二〉程序部分:输出pwm:#include<pic.h>unsigned int DRE;__CONFIG(0x2001);void PWM(){PR2=39; //频率25KHzTRISC|=0x04; //RC2置为输入CCP1CON=0X0c; //PWM输出CCPR1L=0X01; //占空比25%T2CON=0X04; //开定时器TMR2,预分频1:1TMR2IF=0; //清除TMR2中断标志位}void main(){while(1){PWM();DRE=40; //高电平寄存器的值CCPR1L=DRE/4; //装入高8位CCP1CON<5>=(DRE/2)%2; //装入次低位CCP1CON<4>=DRE%2; //装入最低位while(TMR2IF==0);TRISC=0x00;}}AD转换:#include<pic.h>__CONFIG(FOSC_XT&WDTE_OFF&LVP_OFF);void AD(){TRISA0=1; //RA1设置为模拟输入ADCON1=0x00; //参考电压电源电压VDD AD转换周期Fosc/4 ADCON0=0x40; //}void delayms(int xms){int i,j ;for(i=0;i<xms;i++)for(j=0;j<150;j++) ;}void main(){unsigned int x,y,z,A,B,C;unsigned int Result,Result1,ADRES;while(1);{ delayms(5); //采样采样电压充电延时GO=1;}while(GO==1);{}Result=ADRES;x=(Result*5)/256; //取个位十分位百分位y=((Result*50)/256)%10;z=((Result*500)/256)%10;Result1=Result/1.2-1.5;A=(Result*5)/256; //取个位十分位百分位B=((Result*50)/256)%10;C= ((Result*500)/256)%10;}液晶屏和键盘:#include<pic.h>#define LCD_EN RC7#define LCD_RW RC6#define LCD_RS RC5unsigned int x,y,z,A,B,C;unsigned char dis0[]="voltage:";unsigned char dis1[]={'0','1','2','3','4','5','6','7','8','9','.'}; unsigned char dis2[]="current:";unsigned char dis3[]={'0','1','2','3','4','5','6','7','8','9','.'}; unsigned char dis4[3], dis5[3];__CONFIG(FOSC_XT&WDTE_OFF&LVP_OFF);void delay (int xms){int i,j;for(i=0;i<xms;i++){for(j=0;j<150;j++);}}void write_com(){unsigned char com ; //声明写指令LCD_RS=0;LCD_RW=0;LCD_EN=0;PORTD=com;delay(5);LCD_EN=1;delay(5);LCD_EN=0;}void write_date(){unsigned char date;LCD_RS=1;LCD_RW=0;LCD_EN=0;PORTD=date;delay(5);LCD_EN=1;delay(5);LCD_EN=0;}void init(){ TRISD=0x00;TRISC&=0x1f;write_com(0x38);delay(5);write_com(0x0c);delay(5);write_com(0x06);delay(5);write_com(0x01);delay(5);}void display(){unsigned char j;dis4[0]=dis1[x];dis4[1]=dis1[10];dis4[2]=dis1[y];dis4[3]=dis1[z];write_com(0xc8);for(j=0;j<=3;j++){write_date(dis5[j]);delay(1);}unsigned char k;dis5[0]=dis3[A];dis5[1]=dis3[10];dis5[2]=dis3[B];dis5[3]=dis3[C];write_com(0xc8);for(k=0;k<=3;k++){write_date(dis4[k]);delay(1);}}void main(){unsigned char i;init();write_com(0x80); //显示第1行for(i=0;i<=8;i++){write_date(dis0[i]);delay(1);}write_com(0x80+0x40);//显示第2行for(i=0;i<=8;i++){write_date(dis2[i]);delay(1);}}#include<pic.h>#include<pic.h>#define LCD_EN RC7#define LCD_RW RC6#define LCD_RS RC5unsigned int x,y,z,A,B,C;unsigned char dis0[]="voltage:";unsigned char dis1[]={'0','1','2','3','4','5','6','7','8','9','.'}; unsigned char dis2[]="current:";unsigned char dis3[]={'0','1','2','3','4','5','6','7','8','9','.'}; unsigned char dis4[3], dis5[3];__CONFIG(FOSC_XT&WDTE_OFF&LVP_OFF);void delay (int xms){int i,j;for(i=0;i<xms;i++){for(j=0;j<150;j++);}}void write_com(){unsigned char com ; //声明写指令LCD_RS=0;LCD_RW=0;LCD_EN=0;PORTD=com;delay(5);LCD_EN=1;delay(5);LCD_EN=0;}void write_date(){unsigned char date;LCD_RS=1;LCD_RW=0;LCD_EN=0;PORTD=date;delay(5);LCD_EN=1;delay(5);LCD_EN=0;}void init(){ TRISD=0x00;TRISC&=0x1f;write_com(0x38);delay(5);write_com(0x0c);delay(5);write_com(0x06);delay(5);write_com(0x01);delay(5);}void display(){unsigned char j;dis4[0]=dis1[x];dis4[1]=dis1[10]; dis4[2]=dis1[y];dis4[3]=dis1[z]; write_com(0xc8); for(j=0;j<=3;j++) {write_date(dis5[j]);delay(1);}unsigned char k;dis5[0]=dis3[A];dis5[1]=dis3[10]; dis5[2]=dis3[B];dis5[3]=dis3[C]; write_com(0xc8); for(k=0;k<=3;k++) {write_date(dis4[k]);delay(1);}}void main(){unsigned char i;init();write_com(0x80); //显示第1行for(i=0;i<=8;i++){write_date(dis0[i]);delay(1);}write_com(0x80+0x40);//显示第2行for(i=0;i<=8;i++){write_date(dis2[i]);delay(1);}} #define KEYBOARD_PORT_DIR TRISB //键盘扫描方向端口#define KEYBOARD_PORT PORTB //键盘扫描端口#define NO_KEY 0xFF //无按键__CONFIG(0x3FFF);unsigned char L,O;char scankeypad(); //获取4×4键盘值char getkeyvalue(); //获取某按键的值void delay(int xms){int i,j;for(i=0;i<xms;i++)for(j=0;j<150;j++);}const char ccode[16][2]={{0xEE,1},{0xED,2},{0xEB,3},{0xE7,'L'},{0xDE,4},{0xDD,5},{0xDB,6}, {0xD7,'+'},{0xBE,7},{0xBD,8}, {0xBB,9}, {0xB7,'-'},{0x7E,'.'},{0x7D,0},{0x7B,'*'}, {0x77,'O'}};char scankeypad() //获取4*4键盘扫描码{char key4H=0,key4L=0,scancode=0;TRISD=0xF0; //低四位输出,高四位输入PORTD=0x00; //低四位输出0asm("nop");asm("nop"); //待输出信号稳定key4H=PORTD; //读取高四位key4H=key4H&0xF0; //将低四位屏蔽if(key4H!=0xF0) //有按键按下{delay(20);key4H=PORTD; //重读if(key4H!=0xF0){TRISD=0x0F;PORTD=0x00;asm("nop");asm("nop");key4L=PORTD; //读取高四位key4L=key4H&0x0F; //将高四位屏蔽if(key4L!=0x0F) //有按键按下{scancode=key4H|key4L;//高四位和低四位组成键盘扫描码while(PORTD!=0x0F); //按键未松开等待return(scancode);}}}return NO_KEY;}char Getkeyvalue() //获取扫描码{ char keyvalue=0,c=0;keyvalue=scankeypad();if(keyvalue!=NO_KEY){while(keyvalue!=ccode[c][0]){ //比较描码和当前数组元素是否相等c++;}return(ccode[c][1]);//返回序号对应值}return(NO_KEY);}void main(){int i=0,Num[2]={0,0},Numindex=0;while(1){i=Getkeyvalue(); //获得键值if(i!=NO_KEY) //有按键{if(i>=0&&i<=9){Num[2]=Numindex*10+i; //新数值}else{switch(i){case'L':Num[0]=0;Num[1]=0;Numindex=0;break;case'.':break;case'O': Num[2]=Numindex*10+i;break;default:break;};}}}}电源输出效率:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于PIC16F877A的方波信号发生器电路设计
在数字电路系统中,方波是经常使用的信号源,具有非常广泛的应用范
围。
在普通的电路设计中,经常利用555 定时器构成多谐振荡器产生方波信号,
虽然比较简单,但频率准确精度不高,若要产生不同频率的方波信号,更换电
阻和电容又比较麻烦。
基于这个出发点,本文采用单片机进行电路设计,利用
软件编程控制代替硬件的更换,可灵活简单地产生不同频率的方波信号,而且
电路更为简单、频率更准确、性能更稳定。
1 软件平台及芯片介绍目前的单片机有很多种型号,有Intel 公司的8051 系列、Motorola 公司的M68 系列、ATMEL 公司的AT 系列、Microchip 公司的
PIC 系列等等。
本文主要介绍Microchip 公司开发的基于MPLAB-IDE 6.62 集成
开发环境的PIC 单片机的电路设计。
MPLAB-IDE 集成开发软件是专门设计对
PIC 系列单片机进行文本编辑,在线调方式及编译的开发工具。
PIC 芯片采用
PIC16F877A,40 脚封装、具有5 个输入/输出端口,每个端口中的每条引脚由
用户按需要单独编程,设定为输出引脚或输入引脚。
2 方波信号发生器电路设计2.1 硬件电路分析利用PIC16F877A 中的定时器
/计数器TMR0 模块作为硬件定时器控制端口引脚RC0 上产生不同频率的方波。
由于TMR0 为8 位宽,有一个可选的预分频器,故可产生8 种方波信号;同时
通过设置不同的初始值,可产生不同的频率。
本设计初始值设为131,计数
125 个指令周期产生溢出,即TMR0 从计数到开始溢出需要125us。
通过改变
分频比,来达到产生不同频率的目的。
TMR0 溢出一次就使端口引脚RC0 的输
出电平反转一次,每反转两次引脚电平就形成方波信号的一个周期。
当分频比
为1:256 时,TMRO 的延时为125 us×256=32000us,方波信号周期为32000 us×2=64000us=64 ms,对应的方波信号频率为最低档的15.625 Hz;当分频比。