PIC单片机应用开发典型模块第四章程序_第1页
PIC单片机应用开发典型模块第四章程序_第2页
PIC单片机应用开发典型模块第四章程序_第3页
PIC单片机应用开发典型模块第四章程序_第4页
PIC单片机应用开发典型模块第四章程序_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

集团文件发布号:(9816-UATWW-MWUB-WUNN-INNUL-DQQTY-19882)集团文件发布号:(9816-UATWW-MWUB-WUNN-INNUL-DQQTY-19882)PIC单片机应用开发典型模块第四章程序(1)多功能波形信号发生模块程序应用#INCLUDE<P16F877.INC>RTCC EQU 01HPC EQU 02HPCLATH EQU 0AHTEMP0TIME EQU 20H ;方波次数TEMP0CONST EQU 21H ;方波常数TEMO0DOT EQU 22H ;方波点数TEMP0OUT EQU 23H ;方波输出值TEMP1TIME EQU 30H ;锯齿波次数TEMP1CONST EQU 31H ;锯齿波常数TEMP1DOT EQU 32H ;锯齿波点数TEMP1OUT EQU 33H ;锯齿波输出值TEMP2TIME EQU 40H ;三角波次数TEMP2CONST EQU 41H ;三角波常数TEMP2DOT EQU 42H ;三角波点数TEMP2OUT EQU 43H ;三角波输出值OPTION_R EQU 81H WBU EQU 2FH ;W暂存SBU EQU 2EH ;STATUS暂存RCC EQU 0FAH ;最大频率常数;------------------------------------------------------------------------------------------------------ORG 0SYS_RESETGOTO START;------------------------------------------------------------------------------------------------------ORG 4 ;中断程序MOVWF WBUSWAPF WB0,0SWAPF STATUS,0MOVWF SBUCALL SERV_INTSWAPF SBU,0MOVWF STATUSSWAPF WBU,0RETFIE;------------------------------------------------------------------------------------------------------ORG 40HNOPSTARTCALL INTCALL INTPORTCALL INTTMOLOOP ;延时NOPNOPGOTO LOOP;------------------------------------------------------------------------------------------------------INTCLRF TEMP0DOTCLRF TEMP1DOTCLRF TEMP2DOTCLRF TEMP0OUTCLRF TEMP1OUTCLRF TEMP2OUTMOVLW 03HMOVWF TEMP0TIMEMOVWF TEMP0CONSTMOVWF TEMP2TIMEMOVWF TEMP2CONSTMOVLW 06HMOVWF TEMP1TIMEMOVWF TEMP1CONSTRETURN;------------------------------------------------------------------------------------------------------INTPORT ;端口初始化BCF STATUS,0BCF STATUS,1BCF STATUS,5CLRF PORTCCLRF PORTDBSF PORTE,1BSF STATUS,5MOVLW 00HMOVWF TRISDMOVLW OF4HMOVWF TRISC ;定义RE1为输出,其他为输入MOVWF TRISEBCF STATUS,5RETURN;------------------------------------------------------------------------------------------------------INTTM0 ;定时器初始化BSF STATUS,5MOVLW 80HMOVWF OPTION_RBCF STATUS,5MOVLW 0A0 ;开放定时器中断MOVLW RCC ;RCC=最大频率延时常数MOVWF RTCCRETURN;;------------------------------------------------------------------------------------------------------SERY_INT ;中断服务程序BTFSC INTCON,2GOTO SERVRTCCCLRF INTCONBSF INTCON,5RETURNSERVRTCCMOVLW RCCMOVWF RTCCBCF INTCON,2CALL OUTPUTRETFIE;------------------------------------------------------------------------------------------------------OUTPUT ;输出波形BCF STATUS,5FBODECFSZ TEMP0TIME,1 ;方波GOTO JBOCALL FANGBOJBODECFSZ TEMP1TIME,1 ;锯齿波GOTO SJBOCALL JUCBOSJBODECFSZ TEMP2TIME,1 ;三角波RETURNCALL SJIAOBORETURN;------------------------------------------------------------------------------------------------------FANGBOBCF PORTS,1 ;为低BCF PORTC,0BCF PORTC,1 ;选择输出通道,0通道为方波INCF TEMP0DOT,1MOVF TEMP0CONST,0MOVWF TEMP0TIMEBTFSC TEMP0DOT,7GOTO GAOGOTO DIGAOMOVLW OFFHMOVWF PORTDBSF PORTE,1RETURNDI M0VLW 00HMOVWF PORTDBSF PORTE,1RETURN;------------------------------------------------------------------------------------------------------JUCBOBCF PORTE,1BCF PORTC,0 ;选择输出通道,1通道为锯齿波MOVF TEMP1CONST,0MOVWF TEMP1TIMEINCFSZ TEMP1DOT,1GOTO JUBO1MOVF TEMP1OUT,0MOVWF PORTDINCF TEMP1OUT,1RETURNJUBO1MOVLW 00HMOVWF TEMPlOUTRETURN;------------------------------------------------------------------------------------------------------SJIAOBOBCF PORTE,1BCF PORTC,1 ;选择输出通道,2通道为三角波MOVF TEMP2CONST,0MOVWF TEMP2TIMEINCFSZ TEMP2DOT,1GOTO SJBO2CALL SJBO0SJB02MOVF TEMP2OUT,0MOVWF PORTDBSF PORTE,1MOVLW 02HBTFSS TEMP2DOT,7GOTO SJBO1ADDWF TEMP2OUT,1RETURNSJBO1SUBWF TEMP2OUT,1RETURNSJBO0CLRF TEMP2OUTRETURNEND(2)PWM信号发生模块程序应用#include<pic.h>/*CCP1模块的PWM工作方式初始化子程序*/voidINIT_CCP1(){PR2=0XFF; /*设置PWM周期*/CCPR1L=0X7F; /*设置工作循环的高8bit为01111111*/CCP1CON=0X3C; /*设置CCP1为PWM工作方式,且工作循环的低bit2为11*/INTCON=0X00; /*禁止总中断和外围中断*/TRISC=0XFB; /*设置RC2/CCP1为输出*/}/*主程序*/main(){INIT_CCP1(); /*CCP1模块的PWM工作方式初始化*/T2CON=0X03; /*前分频比为16,打开TMR2,同时输出PWM信号*/}(3)正弦信号发生模块程序应用#include<pic.h>//本程序将通过PIC16F877的I2C方式驱动D/A转换器MAX518,使其D/A0//一个连续的正弦波形constchartable[]={0X80,0X86,0X8D,0X93,0X99,0X9F,0XA5,0XAB,0XB1,0XB7,0XBC,0XC2,0XC7,0XCC,0XD1,0XD6,0XDA,0XDF,0XE3,0XE7,0XEA,0XEE,0XF1,0XF4,0XF6,0XF8,0XFA,0XFC,0XFD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0XFD,0XFB,0XF9,0XF7,0XF5,0XF2,0XEF,0XEC,0XE9,0XE5,0XE1,0XDD,0XD8,0XD4,0XCF,0XCA,0XC5,0XBF,0XBA,0XB4,0XAE,0XA8,0XA2,0X9C,0X96,0X90,0X89,0X83,0X80,0X79,0X72,0X6C,0X66,0X60,0X5A,0X55,0X4E,0X48,0X43,0X3D,0X38,0X33,0X2E,0X29,0X25,0X20,0X1C,0X18,0X15,0X11,0X0E,0X0B,0X09,0X07,0X05,0X03,0X02,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X02,0X04,0X06,0X08,0X0A,0X0D,0X10,0X13,0X16,0X1A,0X1E,0X22,0X27,0X2B,0X30,0X35,0X3A,0X40,0X45,0X4C,0X51,0X57,0X5D,0X63,0X69,0X6F,0X76,0X7C};//以上的数组用于存放正弦表,在定义数组时,前面应该加上const,//使数组存放于ROM中,而不至于占用太多的RAMunsignedchari;unsignedcharj;unsignedcharn;//I2C初始化子程序voidi2cint(){SSPCON=0X08; //初始化SSPCON寄存器TRISC3=1; //设置SCL为输入口TRISC4=1; //设置SDA为输入口TRISA4=0;SSPSTAT=0X80; //初始化SSPSTAT寄存器SSPADD=0X02; //设定I2C时钟频率SSPCON2=0X00; //初始化SSPCON2寄存器di(); //关闭总中断SSPIF=0; //清SSP中断标志RA4=0; //关掉74HC165的移位时钟使能,以免74HC165//移位数据输出与I2C总线的数据线发生冲突SSPEN=1; //SSP模块使能}//I2C总线输出数据子程序voidi2cout(){SEN=1; //产生I2C启动信号for(n=0x02;--n;)continue; //给予一定的延时,保证启动do{RSEN=1; //产生I2C启动信号}while(SSPIF==0); //如果没能启动,则反复启动,直到启动为止SSPIF=0; //SSPIF标志清0SSPBUF=0X58; //I2C总线发送地址字节do{;}while(SSPIF==0); //等待地址发送完毕SSPIF=0; //SSPIF标志清0SSPBUF=0X01; //I2C总线发送命令字节do{;}while(SSPIF==0); //等待命令发送完毕SSPIF=0; //SSPIF标志清0SSPBUF=j; //I2C总线发送数据字节do{;}while(SSPIF==0); //等待数据发送完毕SSPIF=0; //SSPIF标志清0PEN=1; //产生停止条件do{;}while(SSPIF==0); //等待停止条件产生SSPIF=0; //SSPIF标志清0}//主程序main(){i2cint(); //I2C初始化while(1){for(i=0x00;i<=127;++i){j=table[i]; //从数组中得到需要传输的数据量i2cout(); //利用I2C总线方式送出数据}}(4)简易频率计模块程序#include<pic.h>#include<stdio.h>#include<math.h>bank3intcp1z[11]; //定义一个数组,用于存放各次的捕捉值unioncp1{inty1;unsignedcharcp1e[2];}cp1u;//定义一个共用体unsignedcharCOUNTW,COUNT;//测量脉冲个数寄存器unsignedcharCOUNTER,data,k;unsignedchars1[4]; //定义4个显示缓冲数组unsignedchars2[4];unsignedchars3[4];unsignedchars4[4];intT5,uo;doubleRE5;doublepuad5;//CCP模块工作于捕捉方式初始化子程序voidccpint(){CCP1CON=0X05; //首先设置CCP1捕捉每个脉冲的上升沿T1CON=0X00; //关闭TMR1震荡器PEIE=1; //外围中断允许(此时总中断关闭)CCP1IE=1; //允许CCP1中断TRISC2=1; //设置RC2为输入}//系统其它部分初始化子程序voidinitial(){COUNT=0X0B; //为保证测试精度,测试5个脉冲的参数后//求平均值,每个脉冲都要捕捉其上升、下降沿,故需要有11次中断}//中断服务程序voidinterruptcp1int(void){CCP1IF=0; //清除中断标志cp1u.cp1e[0]=CCPR1L;cp1u.cp1e[1]=CCPR1H;cp1z[data]=cp1u.y1; //存储1次捕捉值CCP1CON=CCP1CON^0X01;//把CCP1模块改变成捕捉相反的脉冲沿data++;COUNT--;}//周期处理子程序voidPERIOD(){T5=cp1z[10]-cp1z[0]; //求得5个周期的值RE5=(double)T5; //强制转换成双精度数RE5=RE5/5; //求得平均周期,单位为μs}//频率处理子程序voidFREQUENCY(){PERIOD(); //先求周期RE5=1000000/RE5; //周期值求倒数,再乘以1000000,得频率,单位为Hz}//脉宽处理子程序voidPULSE(){intpu;for(data=0,puad5=0;data<=9;data++){pu=cp1z[data+1]-cp1z[data];puad5=(double)pu+puad5;data=data+2;}//求得5个脉宽的和值RE5=puad5/5;//求得平均脉宽}//占空比处理子程序voidOCCUPATIONAL(){PULSE(); //先求脉宽puad5=RE5; //暂存脉宽值PERIOD(); //再求周期RE5=puad5/RE5; //求得占空比}precision(RE5) //为了保证小数点的精度,对RE5进行处理{k=5;if(RE5<1){RE5=RE5*1000;//若RE5<1,则乘以1000,保证小数点的精度k=0x00;}elseif(RE5<10){RE5=RE5*1000;//若RE5<10,则乘以1000,保证小数点的精度k=0x00;}elseif(RE5<100){RE5=RE5*100;//若RE5<100,则乘以100,保证小数点的精度k=0x01;}elseif(RE5<1000){RE5=RE5*10;//若RE5<1000,则乘以10,保证小数点的精度k=0x02;}elseRE5=RE5;}//主程序main(){ccpint(); //CCP模块工作于捕捉方式初始化initial(); //系统其它部分初始化data=0x00; //存储数组指针赋初值TMR1H=0;TMR1L=0; //定时器1清0CCP1IF=0; //清除CCP1的中断标志,以免中断一打开就进入//中断ei(); //中断允许TMR1ON=1; //定时器1开while(1){if(COUNT==0)break;}//等待中断次数结束di(); //禁止中断TMR1ON=0; //关闭定时器//进行下面的数值转换和显示工作PERIOD(); //进行周期处理precision(RE5);uo=(int)RE5;sprintf(s1,"%4d",uo); //把周期数据转换成4位ASII码,且放入数组S1中FREQUENCY(); //进行频率处理precision(RE5);uo=(int)RE5;sprintf(s2,"%4d",uo); //把频率数据转换成4位ASII码,且放入数组S2中OCCUPATIONAL(); //进行占空比处理precision(RE5);uo=(int)RE5;sprintf(s2,"%4d",uo); //把占空比数据转换成4位ASII码,且放入数组S3中PULSE(); //进行脉宽处理precision(RE5);uo=(int)RE5;sprintf(s2,"%4d",uo); //把脉宽数据转换成4位ASII码,且放入数组S4中}(5)交流电压测量模块程序#include<pic.h>#include<math.h>#include<stdio.h>

unionadres

{

inty1;

unsignedcharadre[2];

}adresult;//定义一个共用体

bank3intre[40]; //定义存放A/D转换结果的数组,在bank3中

unsignedchark,data; //定义几个通用寄存器

doublesqu,squad; //平方寄存器和平方和寄存器,squ又通用为存储其它数值

intuo;

bank1unsignedchars[4]; //此数组用于存储需要显示的字符的ASII码

//A/D转换初始化子程序

voidadinitial()

{

ADCON0=0x41; //选择A/D通道为RA0,且打开A/D转换器

//在工作状态,使A/D转换时钟为8Tosc

ADCON1=0X8E; //转换结果右移,及ADRESH寄存器的高6位为"0"

//把RA0口设置为模拟量输入方式

ADIE=1; //A/D转换中断允许

PEIE=1; //外围中断允许

TRISA0=1; //设置RA0为输入方式

}

//系统其它初始化子程序

voidinitial()

{

CCP2IE=0; //禁止CCP中断

SSPIE=0; //禁止SSP中断

CCP2CON=0X0B; //初始化CCP2CON,CCP2为特别事件触发方式

CCPR2H=0X01;

CCPR2L=0XF4; //初始化CCPR2寄存器,设置采样间隔500μs,

//一个周期内电压采40个点

}

//中断服务程序

voidinterruptadint(void)

{

CCP2IF=0;

ADIF=0; //清除

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论