PIC单片机C语言编程实例六利用CCP模块设计频率计

上传人:ss****gk 文档编号:209185545 上传时间:2021-11-09 格式:DOC 页数:10 大小:125.94KB
返回 下载 相关 举报
PIC单片机C语言编程实例六利用CCP模块设计频率计_第1页
第1页 / 共10页
PIC单片机C语言编程实例六利用CCP模块设计频率计_第2页
第2页 / 共10页
PIC单片机C语言编程实例六利用CCP模块设计频率计_第3页
第3页 / 共10页
PIC单片机C语言编程实例六利用CCP模块设计频率计_第4页
第4页 / 共10页
PIC单片机C语言编程实例六利用CCP模块设计频率计_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《PIC单片机C语言编程实例六利用CCP模块设计频率计》由会员分享,可在线阅读,更多相关《PIC单片机C语言编程实例六利用CCP模块设计频率计(10页珍藏版)》请在金锄头文库上搜索。

1、第10章利用CCP模块设计频率计10.5程序设计10.5.4程序清单#include#include#includemath.h/本程序利用CCP1模块实现一个“简易数字频率计”的功能const char tablel 1=0xc0,0xf9,0xa4,OxbO, 0x99,0x92, 0x82,0XD8, 0x80,0x90, OxFF;/不带小数点的显示段码表const char table0ll=0X40, 0X79, 0X24, 0X30, 0X19, 0X12, 0X02, 0X78, 0X00, 0X10, OxFF;/带小数点的显示段码表bank3 int cplzl 1J;/定

2、义一个数组,用于存放各次的捕捉值unioncplintyl;unsigned char cple2:cplu;/定义一个共用体unsigned char COUNTW, COUNT; /测量脉冲个数寄存器unsigned char COUNTER, data,k;unsigned char FLAG 0XEF;#defme FLAGIT(adr, bit) (unsigned)(&adr)*8+(bit) /绝对寻址位操作指令staticbit FLAG 1FLAGIT(FLAG, 0);staticbit FLAG2 FLAG1T(FLAG, 1);staticbit FLAG3 FLAGI

3、T(FLAG, 2);unsigned char s4;/定义一个显示缓冲数组int T5,uo;double RE5;double puad5;/spi方戎显示初姑化子程序void SPIINIT0PIR1=0;SSPCON=0x30;SSPSTAT=OxCO;/设置SP1的控制方式,允许SSP方式,并且时钟下降沿发送,与74HC595,当其 /SCLk从低到髙跳变时,申行输入寄存器的特点相对应TRISC=0xD7;/SDO引脚力输出,SCK引脚为输出TRISA5=0;/RA5引脚设置为输岀,以输出显示锁存信号FLAG 1=0;FLAG2=0;FLAG3=0;COUNTER=0X01;/CC

4、P模块工作于捕捉方式初始化子程序void ccpint()CCP1CON=OX()5;T1CON=OXOO;PEIE=1;CCP1IE=1;TRISC2=1;/系统其它部分初始化f程序void initial()COUNT=OXOB;/首先设置CCPl捕捉每个脉冲的上升沿 /关闭TMR1震荡器?/外围中断允许(此时总中断关闭)/允许CCP1中断 /设置RC2力输入/为保证测试精度,测试5个脉冲的参数后 /求平均位,每个脉冲都要捕捉其上升、下降沿, /故需要有11次中断TRISB1 =0; PORTB=OXFB; TRISB2=0; PORTB=OXFD ; TRISB4=1;TRISB5=1;

5、RB1=O;RB2=0;/SPI传送数据子程序 voidSPILED(data)B=1011D=1101/设置与键盘有关的各口的输入、输岀方式/建立键盘扫描的初始条件do while(SSPIF=O);SSPIF=0;/显示子程序,示4位数void display()RA5=0;/准备锁存for(COUNTW=(); COUNTW4; COUNTW+)data=sCOUNTW;data=data&OxOF;if(COUNTW=k) data=tableOfdatal; /第二位需要显示小数点 else data=tabledata;SPILED(data);/发送显示段码)for(COUNTW

6、=0; C0UNTW4) COUNTER=()x()l ; /若 COUNTER 超过 4,则又从 1 计起if(data=0x02) COUNTER=COUNTER-1;/若按下 S11 键,则 COUNTER 减 1if(COUNTERl) COUNTER=0x04; /若 COUNTER 小于 1,则又循环从 4 计起if(data=OxO3) FLAG2=1 ; if(data=0x04) FLAG2=0;/中断月K务程序void interrupt cp 1 int(void)CCP1IF=O;cp 1 u.cpl ef01=CCPRlL; cplu.cplel=CCPRlH; cp

7、lzdata=cplu.yl ;CCP1 CON:CCP 1 CON 八 0X01; data+;COUNT-;/周期处理子程序void PERIOD()T5=cplzl 0-cpl z01; RE5=(double)T5 ;RE5=RE5/5;/频率处理子程序/若按下S10键,则建立标志FLAG2 /若按下S12键,则清除标志FLAG2/清除中断标志/存储1次捕捉值/把CCP1模块改变成捕捉相反的脉冲沿/求得5个周期的值?/ /强制转换成双精度数 /求得平均周期,单位为us/先求周期/周期值求倒数,再乘以1000 000(P S转换),得频void FREQUENCY。PERIOD();RE

8、5=1000000/RE5;率,/单位为HZ/脉宽处理子程序void PULSE()int pu;for(data=0; puad5=0; data=9; data+)pu=cpl zdata+l -cpl zdata; puad5=(double)pu+puad5 ; data=data+2;RE5=puad5/5 ;/占空比处理子程序void OCCUPATIONAL()PULSE(); puad5=RE5;PERIODO;RE5=puad5/RE5 ;主辦main()SPIINIT(); while(l) ccpint();initial();if(FLAG2=0) s0二 COUNTE

9、R; sllJ=OXOA; sf21=0X0A; s3=0X0A;display(); keyscan();/求得5个脉宽的和值 /求得平均脉宽/先求脉宽 /哲存脉宽值 /再求周期 /求得占空比/SPI方式显示初始化/CCP模块工作于捕捉方式初始化 /系统其它部分初始化/第一个存储COUNTER的值/后谢的LED将显示DARK”/调用显示子程序 /键盘扫描data=0x00;/存储数组指针赋初值TMR1H 二 0;TMR1L=O;/定时器1淸0CCP1IF=O;/清除CCP1的中断标志,以免中断一打开就进入 /中断ei();/中断允许TMR1ON=1;while(l)if(COUNT=0)br

10、eak;/定时器1开/等待中断次数结束di();/禁止中断TMR10N=0;/关闭定时器keyscan();/键盘扫描if(FLAG 1=1) keyserve();/若确实有键按下,则调用键服务程序if(FLAG2=0) continue;/如果没有按下确定键,则终止此次循环,/继续进行测量/如果按下丫确定键,则进行下面的数值转换和显示工作if(COUNTER=0x01) FREQUENCY();/COUNTER=1,则需要进行频率处理if(COUNTER=0x02) PERIODO;/COUNTER=2,则盂要进行周期处理if(COUNTER=0x03) OCCUPATIONAL(); /

11、COUNTERS,则需要进行占空比处理if(COUNTER=0x04) PULSE();k=5;if(RE5l)/COUNTERS,则需要进行脉宽处理RE5=RE5*1000;k=0x(X);/若RE51,则乘以1000,保证小数点的精度Jelse if(RE510)RE5=RE5*1OOO;k=0x00;/若RE510,则乘以1000,保证小数点的精度ielse if(RE5 100)(RE5=RE5*100;/若RE5100,则乘以100,保证小数点的精度k=0x01;/若RE51000,则乘以10,保证小数点的精度else if(RE5 1000)( RE5=RE5*10; k=0x02;else RE5=RE5; uo=(int)RE5:sprintf(s, ”4dn, uo);/把ST要显示的数据转换成4位ASII码,且放入数组S中displayO;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号