完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
编译没有错。用480000000去除是将其转换为转速R/min 例如频率是50HZ应该显示3000 但有时候会变为2100多 频率变大的时候数码管现实的数据就在几个值之间跳动了。我估计是那个yichu有问题。求指导
#include unsigned long speed1,speed; unsigned char flag=0,flag1=0,flag2=0,j=0; unsigned char duanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; unsigned char weima[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; unsigned char speeddata[5]={0}; unsigned int yichu=0,count[2]={0}; void init(void) { P4DIR=0xff;//P4数码管数据端 P1SEL|=BIT1;//P11捕获口 P6DIR|=BIT3;//WEI P6DIR|=BIT4;//DUAN TACTL=TASSEL1+MC1+TAIE; TACCTL0|=CM0+SCS+CAP+CCIE; } void Clock_Init() { unsigned char i; BCSCTL1&=~XT2OFF; //打开XT2振荡器 BCSCTL2|=SELM1+SELS; //MCLK为8MHZ,SMCLK为8MHZ do{ IFG1&=~OFIFG; //清楚振荡器错误标志 for(i=0;i<100;i++) _NOP(); } while((IFG1&OFIFG)!=0); //如果标志位1,则继续循环等待 IFG1&=~OFIFG; } void delayus(unsigned int i) //误差 0us { unsigned char a,b; while(i--) { for(b=1;b>0;b--) for(a=1;a>0;a--); } } void delayms(unsigned int i) //误差 0us { unsigned char a,b,c; while(i--) { for(c=11;c>0;c--) for(b=4;b>0;b--) for(a=89;a>0;a--); } } void process(void) { speeddata[4]=duanma[speed/10000]; speeddata[3]=duanma[speed%10000/1000]; speeddata[2]=duanma[speed%10000%1000/100]; speeddata[1]=duanma[speed%10000%1000%100/10]; speeddata[0]=duanma[speed%10000%1000%100%10]; } void display(unsigned char firstbit,unsigned char num) { unsigned char j; for(j=0;j P4OUT=0xff; //清空数据,防止有交替重影 P6OUT|=BIT4; //段锁存 P6OUT&=~BIT4; P4OUT=~weima[firstbit+j]; //取位码 P6OUT|=BIT3; //位锁存 P6OUT&=~BIT3; P4OUT=speeddata[j]; //取显示数据,段码 P6OUT|=BIT4; //段锁存 P6OUT&=~BIT4; delayms(1); } } void main() { unsigned long hh=480000000,hl; WDTCTL=WDTPW+WDTHOLD;//关看门狗 Clock_Init(); init(); _EINT();//开中中断 while(1) { if(flag2==1) { flag2=0; speed=speed1; process(); } display(0,5); if(flag==1) { count[flag-1]=TACCR0; } if(flag==2) { count[flag-1]=TACCR0; _DINT(); hl=(count[1]-count[0]+yichu*65536); speed1=hh/hl; yichu=0; flag=0; flag1=0; _EINT(); } } } #pragma vector=tiMERA0_VECTOR __interrupt void Timer_buhuo(void) { flag++; flag1++; } #pragma vector=TIMERA1_VECTOR __interrupt void Timer_A(void) { switch(TAIV) { case 10: { if(flag1==1) { yichu++; //有捕获发生且定时器发生溢出 } j++; if(j==60)//定时器溢出60次大约0.5秒及每0.5秒更换一次显示数据防止重影 { j=0; flag2=1; } }break; default:break; } } |
|
相关推荐
1 个讨论
|
|
只有小组成员才能发言,加入小组>>
2937个成员聚集在这个小组
加入小组2680 浏览 1 评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3003 浏览 2 评论
请问怎么把下面51单片机的代码改成msp430 g2 pocket的代码,还有改下时间变成30秒
2273 浏览 1 评论
4703 浏览 1 评论
2484 浏览 1 评论
952浏览 3评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3004浏览 2评论
2681浏览 1评论
1082浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-2 02:31 , Processed in 1.182845 second(s), Total 45, Slave 38 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191