完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
回复本帖可获得 1 分积分奖励! 每人限 1 次 |
小弟是个菜鸟,有些问题比较低级,还望看帖的各位见谅。我在一家微波炉工厂上班,现想用PIC16F887的CCP1及TMR1模块制作一个频率测试的方案,用于对微波炉电脑板的频率进行测试。要求不高,能测到10K以内就可以。下面是我的程序,麻烦哪位大神帮忙解决。 我在proteus中仿真,数码管输出全是0.
#include #include #include #define uchar unsigned char #define uint unsigned int #define ulint unsigned long int uint cycle; uchar const bit_tab[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//位选 uchar const seg_data[]={0x5b,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};/0~9 uchar disp_buf[8]; //显示缓冲单元 ulint change=1000000; //周期转频率分子 uint Ccpbuf[2]; void convert(uint dispnum) { disp_buf[4]=dispnum/1000; //千位 dispnum=dispnum%1000; disp_buf[5]=dispnum/100; //百位 dispnum=dispnum%100; disp_buf[6]=dispnum/10; //十位 disp_buf[7]=dispnum%10; //个位 } void display() { uchar tmp; //显示暂存 static uchar disp_sel=0; //位选计数 tmp=bit_tab[disp_sel]; PORTB=tmp; //点亮数码管 tmp=disp_buf[disp_sel]; tmp=seg_data[tmp]; //取显示码 PORTD=tmp; //输出数字 disp_sel++; //循环加1扫描 if(disp_sel==8) disp_sel=0; } void main() { TRISB= 0x00; TRISD= 0x00; TRISC2= 1; CCP1IE= 1; //CCP1中断允许 TMR1ON=1; //TMR1中断允许 CCP1CON= 0x05; //捕捉每个上升沿 PEIE= 1; //外围中断允许 GIE= 1; //总中断允许 for(;;) { convert(1000); display(); } } void interrupt CCP1ZD() { uint Ccpcnt=0; uint tmp; if(CCP1IF) { CCP1IF=0; tmp=CCPR1H; tmp*=256; tmp+=CCPR1L; Ccpbuf[Ccpcnt]=tmp; Ccpcnt++; if(Ccpcnt==2) { Ccpcnt=0; if(Ccpbuf[1]>Ccpbuf[0]) cycle=Ccpbuf[1]-Ccpbuf[0]; else {cycle=0xffff-Ccpbuf[0]+Ccpbuf[1];} } CCP1IF=0; } }
|
|
相关推荐
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
在只有一个电子负载仪的情况下,如何持续监控并记录太阳能充电板的全程充电电流?
1366 浏览 1 评论
5752 浏览 1 评论
9399 浏览 1 评论
8756 浏览 1 评论
1338 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 17:18 , Processed in 0.942319 second(s), Total 73, Slave 54 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号