最近在公司开发一个关于钢琴的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 < 9 ; 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 > 0 ; 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) ;
}

这样也是对的。

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

  1. C#一个16进制数用二进制数表示是几位?

    1个字节是8位,二进制8位:xxxxxxxx 范围从00000000-11111111,表示0到255.一位16进制数(用二进制表示是xxxx) 最多只表示到15(即对应16进制的F),要表示到255 ...

  2. C语言:将16进制字符串转化为int类型值

    将16进制字符串值转换为 int 整型值 此例中用 "1de" 作为测试字符串,实现代码如下: #include <stdio.h> #include <stdl ...

  3. 原生JS代码实现随机产生一个16进制的颜色值

    封装一个函数 function getColor() { var str = "#"; //一个十六进制的值的数组 var arr = ["0", " ...

  4. JS一行代码,生成一个16进制随机颜色,简单粗暴。

    var color = '#'+ Math.random().toString(16).substr(-6); document.body.style.backgroundColor = color; ...

  5. C语言版的16进制与字符串互转函数

    http://www.cnblogs.com/nio-nio/p/3309367.html /* // C prototype : void StrToHex(BYTE *pbDest, BYTE * ...

  6. iOS开发时间戳与时间NSDate,时区的转换,汉字与UTF8,16进制的转换

    http://blog.sina.com.cn/s/blog_68661bd80101njdo.html 标签: ios时间戳 ios开发时间戳 ios16进制转中文 ios开发utf8转中文 ios ...

  7. java标签(label)求16进制字符串的整数和 把一个整数转为4个16进制字符表示

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #4f76cb } p.p2 { margin: 0.0px 0. ...

  8. Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录

    一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...

  9. 使用Jquery+EasyUI进行框架项目开发案例解说之中的一个---员工管理源代码分享

    使用Jquery+EasyUI 进行框架项目开发案例解说之中的一个 员工管理源代码分享 在開始解说之前,我们先来看一下什么是Jquery EasyUI?jQuery EasyUI是一组基于jQuery ...

随机推荐

  1. 使用Fresco实现简单的显示一张图片

    使用Fresco实现显示一张图片 仅仅是下载一张图片,在下载完之前,先显示一张站位图 效果图 源码 下载地址(Android Studio工程):http://download.csdn.net/de ...

  2. 剑指Offer——网易校招内推笔试题+模拟题知识点总结

    剑指Offer--网易校招内推笔试题+模拟题知识点总结 前言 2016.8.2 19:00网易校招内推笔试开始进行.前天晚上利用大约1小时时间完成了测评(这个必须做,关切到你能否参与面试).上午利用2 ...

  3. Hibernate初体验及简单错误排除

    Hibernate是什么,有多少好处,想必查找这类博文的都知道,所以就不多说了.下面是我对Hibernate简单使用的一个小小的总结.与君(主要是刚入门的)共勉吧! 创建的顺序 创建Hibernate ...

  4. HTML5中 基本用法及属性 韩俊强的博客

    从今天开始更新H5相关学习:希望大家能一起学习,多学习一门语言,多一门乐趣! 了解Html5: Html5基本属性: <!DOCTYPE html> <html lang=" ...

  5. 解析JSON的三种方式

    JSONObject   JSONObject jsonObject = new JSONObject(strJson); JSONArray jsonArray = jsonObject.getJS ...

  6. Android开发学习之路--UI之初体验

    之前都是学习Activity,对于布局都没有做过学习,这里就简单学习下吧.下面看下Android Studio下有哪些控件: 这里分为Widgets,Text Fields,Containers,Da ...

  7. Cocos2D:塔防游戏制作之旅(十)

    最终,draw方法显示这些路径点被放置在哪里,并且绘制出路径点之间的连线,它们仅仅被用作调试.一个成品游戏不应该绘制敌人的路径 - 那对于玩家来说太过容易了! 创建路径点的列表.打开HelloWorl ...

  8. Chapter 2 User Authentication, Authorization, and Security(3):保护服务器避免暴力攻击

    原文出处:http://blog.csdn.net/dba_huangzj/article/details/38756693,专题目录:http://blog.csdn.net/dba_huangzj ...

  9. Ubuntu安装JDK与环境变量配置

    Ubuntu安装JDK与环境变量配置 一.getconf LONG_BIT 查看系统位数,并下载相应的jdk.我的系统是32位的,所以下载的jdk是:jdk-8u77-linux-i586.gz.并且 ...

  10. ubuntu更改用户密码

    在安装ubuntu时使用了主目录加密的功能( 登入时需要密码并加密我的主目录), 设此时密码为abcd1234, 如果修改了用户的密码(passwd=>abcde12345),那么在下次启动时, ...