zl程序教程

您现在的位置是:首页 >  后端

当前栏目

实战项目开发细节:C语言分离一个16进制数取出相应的位1或0

C语言项目开发 一个 实战 16 分离 细节
2023-09-27 14:28:47 时间
最近在公司开发一个关于钢琴的PCBA项目,项目大概是这样的,完成各种功能的测试,准备去工厂量产的时候可以通过软件快速甄别硬件是否短路,断路等问题。       其中,甄别好坏的方法是通过比如按键,或者其它的操作然后响应音频信号的输出来甄别的,那到底原理是怎么样的呢?       音频信号定制为如果是0则输出1000hz,如果是1则输出3000hz。

最近在公司开发一个关于钢琴的PCBA项目,项目大概是这样的,完成各种功能的测试,准备去工厂量产的时候可以通过软件快速甄别硬件是否短路,断路等问题。

      其中,甄别好坏的方法是通过比如按键,或者其它的操作然后响应音频信号的输出来甄别的,那到底原理是怎么样的呢?

      音频信号定制为如果是0则输出1000hz,如果是1则输出3000hz。

      音频信号是一个16进制数,比如0xfd----- 1111 1101 

      那么它的输出应该是这样的,从左边最高位开始,输出3000hz ,3000hz ,3000hz, 3000hz , 3000hz , 3000hz , 1000hz , 3000hz .

     如果要求改一下,从右边最低位到最高位输出也是可以的,这个具体可以通过示波器来测量相应的信号输出波形。

      原理我们搞明白了,就这么简单,于是我们就可以用C语言位运算来实现这个操作,由于公司保密特权,我不方便公开我的项目的详细细节,这样,我只能写个模拟的C语言测试程序来模仿这个过程,好了,我们开始写代码:

     

#include stdio.h 

void pri() ; 

void pri1() ;

int play_sound_lowtohigh(unsigned int num) ;

int bit0o1(int it,int position) ;

int play_sound_hightolow(unsigned int num) ;

int main() 

 unsigned int num = 0xfd ; //1111 1101

 play_sound_lowtohigh(num);

 putchar(\n);

 play_sound_hightolow(num);

return 0; 

//从低位往高位 

int play_sound_lowtohigh(unsigned int num)

 int i = 0;

 int bit = 0 ;

 for(i = 1 ; i i++)

 bit = bit0o1(num,i);

 if(bit == 0)

 pri();

 else if(bit == 1)

 pri1() ;

//从高位往低位 

int play_sound_hightolow(unsigned int num)

 int i = 0;

 int bit = 0 ;

 for(i = 8 ; i i--)

 bit = bit0o1(num,i);

 if(bit == 0)

 pri();

 else if(bit == 1)

 pri1() ;

//it 表示数据

//position 表示第几位 

int bit0o1(int it,int position)

 int oc=1;

 oc =(position-1);

 return (oc it)!=0?1:0;

void pri()

 printf("1000hz\n") ; 

void pri1()

 printf("3000hz\n") ;

}

运行结果:


或者更简单一点:

#include stdio.h 

int test_bit(int num)

 int i ; 

 for(i = 7 ; i = 0 ; i--)

 if(num (1 i))

 printf ("3000hz\n") ; 

 else 

 printf ("1000hz\n") ; 

int main(void) 

 test_bit(0xfd) ; 

这样也是对的。


morixinguan ITGEGE在线教育嵌入式开发讲师。 CSDN博客专家、CSDN-Linux特邀编辑、CSDN博乐、CSDN学院讲师,目前从事嵌入式开发领域,从事与单片机,Linux,android相关的产品开发。