头像-81618

John0718

  • 湖北省武汉市
  • 单片机、嵌入式、DSP、FPGA/CPLD、EMC/EMI、EDA/PCB、电源技术、模拟技术、测试测量LED/显示、传感器/MEMS
  • 消费电子、汽车电子、医疗电子、工控电子、安防电子、能源电源、光电显示、科研教育、设计、制造及服务、计算机网络、测试仪器及设备

个人成就

获得 31 次赞

帮助过83人

在游戏“我的世界”中做一台计算机的可行性问题。

加减乘除,矩阵运算,不是计算机。。。。那叫计算器。。计算机的原型是图灵机。不仅仅是计算,关键的差异在判断与程序流程的控制。“图灵 机”是现代计算机的最原始的模型。计算机专业的学生做出一台计算机,其实是现实的事情。一般其实主要是指通过逻辑电路搭建一个CPU .

可不可以用两个继电器分别是正接和反接给制冷片的?实现控制

不能说可以,也不能说不可以。控制逻辑上是可以实现的,但是继电器的驱动能力有限,一般5A,最好是加接触器。控制逻辑可以参见电机正反转的电路。

用L298和L297控制步进电机只震动不转

电机的启动需要一个过程,初始频率比较低,然后逐步加到目标频率。每次步进的频率不要太大,而且需要持续一段时间。

用程序如何产生随机数

在实际编程中,我们经常需要生成随机数,例如,贪吃蛇游戏中在随机的位置出现食物,扑克牌游戏中随机发牌。在C语言中,我们一般使用 <stdlib.h> 头文件中的 rand() 函数来生成随机数,它的用法为:int rand (void);void 表示不需要传递参数。C语言中还有一个 random() 函数可以获取随机数,但是 random() 不是标准函数,不能在 VC/VS 等编译器通过,所以比较少用。rand() 会随机生成一个位于 0 ~ RAND_MAX 之间的整数。RAND_MAX 是 <stdlib.h> 头文件中的一个宏,它用来指明 rand() 所能返回的随机数的最大值。C语言标准并没有规定 RAND_MAX 的具体数值,只是规定它的值至少为 32767。在实际编程中,我们也不需要知道 RAND_MAX 的具体值,把它当做一个很大的数来对待即可。下面是一个随机数生成的实例:#include <stdio.h>#include <stdlib.h>int main(){    int a = rand();    printf("%d\n"a);    return 0;}运行结果举例:193随机数的本质多次运行上面的代码,你会发现每次产生的随机数都一样,这是怎么回事呢?为什么随机数并不随机呢?实际上,rand() 函数产生的随机数是伪随机数,是根据一个数值按照某个公式推算出来的,这个数值我们称之为“种子”。种子和随机数之间的关系是一种正态分布,如下图所示:C语言随机数和种子之间呈正态分布种子在每次启动计算机时是随机的,但是一旦计算机启动以后它就不再变化了;也就是说,每次启动计算机以后,种子就是定值了,所以根据公式推算出来的结果(也就是生成的随机数)就是固定的。重新播种我们可以通过 srand() 函数来重新“播种”,这样种子就会发生改变。srand() 的用法为:void srand (unsigned int seed);它需要一个 unsigned int 类型的参数。在实际开发中,我们可以用时间作为参数,只要每次播种的时间不同,那么生成的种子就不同,最终的随机数也就不同。使用 <time.h> 头文件中的 time() 函数即可得到当前的时间(精确到秒),就像下面这样:srand((unsigned)time(NULL));有兴趣的读者请猛击这里自行研究 time() 函数的用法,本节我们不再过多讲解。对上面的代码进行修改,生成随机数之前先进行播种:#include <stdio.h>#include <stdlib.h>#include <time.h>int main() {    int a;    srand((unsigned)time(NULL));    a = rand();    printf("%d\n" a);    return 0;}多次运行程序,会发现每次生成的随机数都不一样了。但是,这些随机数会有逐渐增大或者逐渐减小的趋势,这是因为我们以时间为种子,时间是逐渐增大的,结合上面的正态分布图,很容易推断出随机数也会逐渐增大或者减小。生成一定范围内的随机数在实际开发中,我们往往需要一定范围内的随机数,过大或者过小都不符合要求,那么,如何产生一定范围的随机数呢?我们可以利用取模的方法:int a = rand() % 10;    //产生0~9的随机数,注意10会被整除如果要规定上下限:int a = rand() % 51 + 13;    //产生13~63的随机数分析:取模即取余,rand()%51+13我们可以看成两部分:rand()%51是产生 0~50 的随机数,后面+13保证 a 最小只能是 13,最大就是 50+13=63。最后给出产生 13~63 范围内随机数的完整代码:#include <stdio.h>#include <stdlib.h>#include <time.h>int main(){    int a;    srand((unsigned)time(NULL));    a = rand() % 51 + 13;    printf("%d\n"a);    return 0;}连续生成随机数有时候我们需要一组随机数(多个随机数),该怎么生成呢?很容易想到的一种解决方案是使用循环,每次循环都重新播种,请看下面的代码:#include <stdio.h>#include <stdlib.h>#include <time.h>int main() {    int a i;    //使用for循环生成10个随机数    for (i = 0; i < 10; i++) {        srand((unsigned)time(NULL));        a = rand();        printf("%d " a);    }    return 0;}运行结果举例:8 8 8 8 8 8 8 8 8 8运行结果非常奇怪,每次循环我们都重新播种了呀,为什么生成的随机数都一样呢?这是因为,for 循环运行速度非常快,在一秒之内就运行完成了,而 time() 函数得到的时间只能精确到秒,所以每次循环得到的时间都是一样的,这样一来,种子也就是一样的,随机数也就一样了。

如何将温度值转换为色阶显示?

/// 根据温度获取颜色    /// 算法如下:    /// 1.定义色阶变化范围fromColor toColor    /// 2.获取因子:factor = T / (MaxT - MinT);    /// 3.计算新的RGB    ///   R = fromColor.R * (1 - factor) + toColor.R * factor    ///   G = fromColor.G * (1 - factor) + toColor.G * factor    ///   B = fromColor.B * (1 - factor) * toColor.B * factor    /// 4.如果多个色阶,重复上面的运算    /// </summary>    public static class TemperatuerColor    {        private static Color Red = Color.FromRgb(255 0 0);        private static Color Yellow = Color.FromRgb(255 0 0);        private static Color Blue = Color.FromRgb(255 0 0);                public static SolidColorBrush GetColor(double temperature double maxtemperature double mintemperature)        {            double ratio = temperature / (maxtemperature - mintemperature);            Color result1 = Compute(Blue Yellow ratio);            Color result2 = Compute(Yellow Red ratio);            Color result =  Compute(result1 result2 ratio);            return new SolidColorBrush(result);        }        private static Color Compute(Color fromColor Color toColor double ratio)        {            byte r = (byte)(fromColor.R * (1.0f - ratio) + toColor.R * ratio);            byte g = (byte)(fromColor.G * (1.0f - ratio) + toColor.G * ratio);            byte b = (byte)(fromColor.B * (1.0f - ratio) + toColor.B * ratio);            return Color.FromRgb(r g b);        }    }

USB HUB是的原理什么?

USB HUB用于设备扩展连接,所有USB DEVICE都连接在USB HUB的端口上。一个USB HOST总与一个根HUB (USB ROOT HUB)相连。USB HUB为其每个端口提供100mA电流供设备使用。同时,USB HUB可以通过端口的电气变化诊断出设备的插拔操作,并通过响应USB HOST的数据包把端口状态汇报给USB HOST。一般来说,USB设备与USB HUB间的连线长度不超过5m,USB系统的级联不能超过5级(包括ROOT HUB)。USB Hub的原理比较复杂,USB协议规范里最复杂的部分就是Hub的章节,USB Hub与网络设备(以太网)的Hub原理相差很多,如果真要类比的话,复杂度大概相当于网络的设备里的路由器。 USB协议中有控制传输、Bulk传输、中断传输、同步传输四种模式,其中: 控制传输用于传输控制设备一级的指令; Bulk传输(中文名可能叫批传输)主要用于传输USB各种大块数据,比如U盘读写的数据; 中断传输,用于传输小块数据,鼠标键盘主要使用中断传输; 同步传输,用于传输实时性不够强的数据,也就是说不保证可靠性,部分USB音频设备使用这种传输;所以USB Hub相当于重新封装了各种数据包,类似于网络设备里的路由器,而不像交换机或者集线器(Hub)那么简单。​

STM32怎么控制电机

不同电机有不同的方式,同一种电机也有不同的方式。比如,交流异步,可以IO口控制继电器,再控制接触器,实现直接启动。也可以通过IO口,控制软起动器,实现软启动。也可以通过RS232,485,CAN等总线方式,控制软起动器,实现软启动。再比如步进电机,也可以分别通过IO口控制,组件控制,通讯控制等不同方式达到控制目的。如果是伺服电机,不仅考虑输出控制,还得考虑编码器的输入。所以,要依赖于电机类型,电机功率,使用场合等诸多因素,才能确定电机的控制方式。

燃料电池为什么没有普及

燃料电池正处于商业化的初步阶段。当前燃料电池车要实现商业化,要闯“三道关”:价格关、技术关、配套关。由于氢电池车产业不成熟,除非是走政府采购,否则以目前个人购买,会因为成本太高的原因而放弃。在技术关方面,当前中国企业在一些关键材料技术上,与国外仍有一定的差距。以催化剂为例。催化剂作为燃料电池核心材料,其综合性能与国产化直接关系到中国燃料电池技术的核心竞争力及其产业化前景。但相关知识产权一直掌握在西方少数发达国家手中,催化剂核心材料长期依赖进口的高成本现状,制约了中国氢能产业的自主发展。​​