




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
(1)多功能波形信号发生模块程序应用#INCLUDERTCC EQU01HPCEQU02HPCLATHEQU0AHTEMP0TIME EQU20H;方波次数TEMP0CONSTEQU21H;方波常数TEMO0DOTEQU22H;方波点数TEMP0OUTEQU23H;方波输出值TEMP1TIME EQU30H;锯齿波次数TEMP1CONSTEQU31H;锯齿波常数TEMP1 DOTEQU32H;锯齿波点数TEMP1OUTEQU33H;锯齿波输出值TEMP2TIME EQU40H;三角波次数TEMP2CONSTEQU41H;三角波常数TEMP2 DOTEQU42H;三角波点数TEMP2OUTEQU43H;三角波输出值OPTION_REQU81HWBUEQU2FH;W暂存SBUEQU2EH;STATUS暂存RCCEQU0FAH;最大频率常数;- ORG0SYS_RESETGOTOSTART;- ORG4;中断程序 MOVWFWBUSWAPFWB0, 0SWAPFSTATUS, 0MOVWF SBUCALLSERV_INTSWAPF SBU, 0MOVWFSTATUSSWAPF WBU, 0RETFIE;- ORG40H NOPSTARTCALL INTCALLINTPORT CALL INTTMOLOOP;延时NOPNOPGOTOLOOP;- INTCLRFTEMP0DOTCLRFTEMP1DOTCLRF TEMP2DOTCLRF TEMP0OUTCLRF TEMP1OUTCLRF TEMP2OUTMOVLW 03HMOVWF TEMP0TIMEMOVWF TEMP0CONSTMOVWF TEMP2TIMEMOVWF TEMP2CONSTMOVLW 06HMOVWF TEMP1TIMEMOVWF TEMP1CONSTRETURN;- INTPORT;端口初始化BCF STATUS, 0BCF STATUS, 1BCF STATUS, 5CLRF PORTCCLRF PORTDBSFPORTE,1BSFSTATUS, 5MOVLW 00HMOVWF TRISDMOVLW OF4HMOVWF TRISC ;定义RE1为输出,其他为输入MOVWF TRISEBCF STATUS, 5RETURN;-INTTM0;定时器初始化BSF STATUS, 5MOVLW 80HMOVWF OPTION_ RBCF STATUS, 5MOVLW 0A0H;开放定时器中断MOVLW RCC;RCC=最大频率延时常数MOVWFRTCCRETURN;;-SERY_ INT;中断服务程序BTFSC INTCON,2GOTO SERVRTCCCLRF INTCONBSF INTCON, 5RETURNSERVRTCCMOVLW RCCMOVWF RTCCBCFINTCON,2CALL OUTPUTRETFIE;-OUTPUT;输出波形BCF STATUS,5FBO DECFSZTEMP0TIME,1;方波GOTO J BOCALL FANGBOJBO DECFSZTEMP1TIME,1;锯齿波GOTO SJ BOCALL JUCBOSJBO DECFSZ TEMP2 TIME,1;三角波RETURNCALL SJIAOBORETURN;-FANGBOBCF PORTS, 1;为低BCFPORTC, 0 BCFPORTC, 1;选择输出通道, 0通道为方波INCF TEMP0DOT,1MOVF TEMP0CONST, 0MOVWFTEMP0TIMEBTFSC TEMP0DOT,7 GOTO GAOGOTO DIGAO MOVLW OFFHMOVWFPORTDBSF PORTE, 1RETURNDIM0VLW 00HMOVWF PORTDBSFPORTE, 1RETURN;-JUCBOBCFPORTE, 1BCF PORTC,0 ;选择输出通道, 1通道为锯齿波MOVFTEMP1CONST,0 MOVWF TEMP1TIMEINCFSZ TEMP1DOT, 1GOTOJUBO1MOVF TEMP1OUT, 0MOVWF PORTDINCFTEMP1OUT, 1RETURNJUBO1 MOVLW 00HMOVWF TEMPlOUTRETURN;-SJIAOBOBCF PORTE, 1BCF PORTC, 1;选择输出通道, 2通道为三角波MOVFTEMP2CONST, 0MOVWF TEMP2TIMEINCFSZ TEMP2DOT, 1 GOTO SJBO2 CALL SJBO0 SJB02 MOVF TEMP2OUT, 0MOVWF PORTDBSF PORTE, 1MOVLW 02H BTFSS TEMP2DOT,7GOTOSJBO1ADDWF TEMP2OUT, 1RETURNSJBO1SUBWFTEMP2OUT,1 RETURNSJBO0 CLRF TEMP2OUTRETURNEND(2)PWM信号发生模块程序应用#include /*CCP1模块的PWM工作方式初始化子程序*/void INIT_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 /本程序将通过PIC16F877的I2C方式驱动D/A 转换器MAX518,使其D/A0 通道输出/一个连续的正弦波形const char table = 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 中,而不至于占用太多的RAMunsigned char i;unsigned char j;unsigned char n;/I2C 初始化子程序void i2cint()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 总线输出数据子程序void i2cout()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=tablei; /从数组中得到需要传输的数据量i2cout(); /利用I2C 总线方式送出数据(4)简易频率计模块程序#include #include #include bank3 int cp1z11; /定义一个数组,用于存放各次的捕捉值union cp1int y1;unsigned char cp1e2;cp1u; /定义一个共用体unsigned char COUNTW,COUNT; /测量脉冲个数寄存器unsigned char COUNTER,data,k;unsigned char s14;/定义4个显示缓冲数组unsigned char s24;unsigned char s34;unsigned char s44;int T5,uo;double RE5;double puad5;/CCP 模块工作于捕捉方式初始化子程序void ccpint( )CCP1CON=0X05; /首先设置CCP1 捕捉每个脉冲的上升沿T1CON=0X00; /关闭TMR1 震荡器PEIE=1; /外围中断允许(此时总中断关闭)CCP1IE=1; /允许CCP1 中断TRISC2=1; /设置RC2 为输入/系统其它部分初始化子程序void initial( )COUNT=0X0B; /为保证测试精度,测试5 个脉冲的参数后/求平均值,每个脉冲都要捕捉其上升、下降沿,故需要有11 次中断/中断服务程序void interrupt cp1int(void)CCP1IF=0; /清除中断标志cp1u.cp1e0=CCPR1L;cp1u.cp1e1=CCPR1H;cp1zdata=cp1u.y1; /存储1 次捕捉值CCP1CON=CCP1CON0X01; /把CCP1 模块改变成捕捉相反的脉冲沿data+;COUNT-;/周期处理子程序void PERIOD( )T5=cp1z10-cp1z0; /求得5 个周期的值RE5=(double)T5; /强制转换成双精度数RE5=RE5/5; /求得平均周期,单位为s/频率处理子程序void FREQUENCY( )PERIOD( ); /先求周期RE5=1000000/RE5;/周期值求倒数,再乘以1000000,得频率,单位为Hz/脉宽处理子程序void PULSE( )int pu;for(data=0,puad5=0;data=9;data+) pu=cp1zdata+1-cp1zdata;puad5=(double)pu+puad5;data=data+2; /求得5 个脉宽的和值RE5=puad5/5; /求得平均脉宽/占空比处理子程序void OCCUPATIONAL( )PULSE( ); /先求脉宽puad5=RE5; /暂存脉宽值PERIOD(); /再求周期RE5=puad5/RE5; /求得占空比precision(RE5) /为了保证小数点的精度,对RE5进行处理k=5;if(RE51)RE5=RE5*1000; /若RE51,则乘以1 000,保证小数点的精度k=0x00;else if(RE510)RE5=RE5*1000; /若RE510,则乘以1 000,保证小数点的精度k=0x00;else if(RE5100)RE5=RE5*100; /若RE5100,则乘以100,保证小数点的精度k=0x01;else if(RE51000)RE5=RE5*10; /若RE51000,则乘以10,保证小数点的精度k=0x02;else RE5=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 码,且放入数组S中FREQUENCY(); /进行频率处理precision(RE5);uo=(int)RE5;sprintf(s2,%4d,uo);/把频率数据转换成4 位ASII 码,且放入数组S中OCCUPATIONAL();/进行占空比处理precision(RE5);uo=(int)RE5;sprintf(s2,%4d,uo); /把占空比数据转换成4 位ASII 码,且放入数组S中PULSE(); /进行脉宽处理precision(RE5);uo=(int)RE5;sprintf(s2,%4d,uo); /把脉宽数据转换成4 位ASII 码,且放入数组S中(5)交流电压测量模块程序#include #include #include union adres inty1; unsigned charadre2; adresult;/定义一个共用体 bank3 int re40;/定义存放A/D转换结果的数组,在bank3中 unsigned char k,data;/定义几个通用寄存器 double squ,squad;/平方寄存器和平方和寄存器,squ又通用为存储其它数值 int uo; bank1 unsigned char s4;/此数组用于存储需要显示的字符的ASII码 /A/D转换初始化子程序 void adinitial() 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;/清除中断标志 adresult.adre0=A
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 苯胺装置操作工节假日前安全考核试卷含答案
- 石质文物修复师节假日前安全考核试卷含答案
- 学生迟到管理与处罚记录模板
- 煤气化工节假日前安全考核试卷含答案
- 保温成棉控制工节假日前安全考核试卷含答案
- 炼焦煤制备工节假日前安全考核试卷含答案
- 煤制油生产工国庆节后复工安全考核试卷含答案
- 煤层气排采工节假日前安全考核试卷含答案
- 网版制版员节假日前安全考核试卷含答案
- 外企跨文化管理策略分析报告
- 电缆沟及盖板作业指导书培训课件
- GB/T 19867.6-2016激光-电弧复合焊接工艺规程
- GB/T 19478-2018畜禽屠宰操作规程鸡
- 三级教育考试卷(焊工)答案
- 无生上课课堂教学评价标准
- 深圳低压电工作业-实际操作培训课件-科目四-作业现场应急处理
- 中控岗位培训课件
- 宾馆酒店前台责任书
- 2.2 第2课时 基本不等式的综合应用(课件)高一数学(人教A版2019必修第一册)
- 勿忘国耻教学课件
- 《中国音乐发展简史》PPT课件
评论
0/150
提交评论