2017-10-25 00:19:00 weixin_30616969 阅读数 58
  • MFC上位机与STM32下位机通讯精讲

    本课程主要介绍C++类库MFC上位机与STM32单片机的RS232、RS422、RS485、USB、LWIP以太网、CAN等接口进行稳定通信。课程主要从MFC和STM32基础开始,以编写上位机以及下位机为主,非常注重实践。

    9317 人正在学习 去看看 王凯杰

8位、16位、32位是指单片机的“字长”,也就是一次运算中参与运算的数据长度,这个位是指二进制位。以8位为例,8位二进制的表达范围是0000,0000~1111,1111即十进制的0~255,即每次参与运算的数据最大不能超过255。而16位机的字长是16位,其数据表达范围是0~65535,即每次参与运算的数据最大不能超过65535;32位单片机的字长是32位,其数据表达范围是0~4294967295,即每次参与运算的数据最大不能超过4294967295。

8位、16位、32位与单片机的性能密切相关,通常32位机的性能要高于16位机,而16位机的性能又要高于8位机。为什么会这样呢?这要从2个方面来分析。第一,位数不同,运算效率不同。对于8位机而言,由于在一次运算中的每一个数都不能超过8位,因此即便如100+200=300这样的运算,它也不能一次完成,因为300已超过了8位所能表达的最大范围(255),因此,要对这样的一个式子进行运算,就要编写一段程序,将运算分步完成,最后合成起来得到一个正确的结果。而如果采用16位单片机来运算的话,那么一次运算就够了,显然分步完成所需要的时间要远远大于单步完成所需要的时间。同样道理,当某个运算的结果或者中间值大于65535时,16位机也不能一次运算,要分步实现它,而32位机则可以一次运算完成。第二,商业因素。通常运算能力越高,表示这个单片机性能越强,当然,价格高一些人们也可以接受,有了价格空间,生产商通常都会在这些芯片中提供更多的其他的功能,使得芯片的整体性能得到更大的提升。

典型的单片机中,80C51系列,PIC系列,AVR系列都是8位单片机;80C196、MSP430系列是16位机;而目前非常热门的ARM系列则是32位机。

 

另外在CSDN的讨论中的一些比较好的回答:
=================================
8位单片机,典型的是51系列的,再高级点用AVR、pic的,功能方面,似乎都不会很复杂,一般可能是控制类的多一下。一般不跑嵌入式OS。
16位的单片机,我接触的主要是MSP430,感觉16位的单片机比较尴尬,高不成低不就,要求低一点,8位MCU就够,高级点不如用32位MCU。一般不跑嵌入式OS。16位就不说了
32位的,就高级点了,一般能跑嵌入式OS,例如ucos2,ucos3,uclinux等等,能做更多复杂的功能。用OS和不用OS的话,编程的思路差异比较大。功能一般有面向控制的,也有简单消费类电子的。
================================
8位16位32位的区别就在于地址位和数据位位宽不同。其实都一样。比如8位的51单片,网上同样有人在上面移植ucos。16位的如430就更不用说了。32位的目前大多数是arm架构的,与前面的8位、16位的指令集不同。除掉前面的boot会用一小段汇编(主要是来clear寄存器,初使化堆栈--有些书上也叫栈)其它大多用C.只要用对应架构和平台的编译器就可以了。故而作为一个c的RD,不需要考虑太多。
=================================
都玩过,单纯C写代码没啥区别,一般编译器把初始化都做了,需要改的不多。汇编或者调试的时候会有区别,指令集不一样,寄存器也会有点差异(尤其是跟汇编的时候),参数传递时会有差异(因编译器而异),8位51单片机是(R0-R7),32位ARM是R0-R15(PC),然后就是int类型,8/16位通常是16bit,32位下是32bit(最蛋疼的是64位下int还是32bit)
=================================
学嵌入式的网友,接触到的 32 位机往往是 ARM 内核的,运行 Linux。

但实际上,32 位的微处理器远不止这一类。有些就是增强版本的微处理器,例如 M*Core 内核的微处理器。

32 位机的功能模块寄存器可以是 32-bit 的(当然也可以是 8-/16-bit),而且存取都是单时钟周期。CPU 的算逻单元也是 32 位的,当然,运算会更快。

32 位机的一个重要注意事项是 32-bit 字的自然边界问题,也就是字对齐问题。例如,要从 RAM 中将一个 32-bit 的字写入一个 32-bit 寄存器,那么,这个字在 RAM 中的地址必须是 32-bit 对齐的,也就是说地址最低十六进制位是 0, 4, 8, c。如果不是这样(比如数据类型是 char,又恰好其起始地址未 4 字节对齐),需要先将此字复制到一个 32-bit 对齐的缓存,再赋值。

还有一个比较麻烦的事,就是用户定义的结构中各个成员的对齐。如果在一个 32-bit 类型的成员前面,有 char 及 short 类型成员,且没有凑齐到 32-bit 自然边界,那么编译器将会自动补 NULL 来填充。有不少从 8 位向 32 位机移植代码的朋友,都在取成员长度的时候发生疑惑。问题往往是出在 32-bit 对齐上。

在有就是不同编译器的规约差异。

不过,用过两种微处理器之后,就会渐渐熟悉起来,相互移植也不会有很大困难。

=============================

数据总线的宽度为8、16、32。同时寄存器也达到相同位数。
============================
多少位宽不是指总线宽度,也不是存储器的宽度,像51单片机的地址总线是16位的,但是它是8位机。像ARM的存储器也有八位的,但是它是32位机。而是指CPU处理的数据的宽度,也就是CPU一次数据的吞吐量。比如同一条指令:MOV R0 R2
在51单片机里面,R0和R2都是8位的,所以51的CPU一次只能处理8位数据。
在ARM里面,R0和R2是32位的,所以ARM的CPU一次能处理32位数据。这就是区别

 

转载于:https://www.cnblogs.com/qsyll0916/p/7726595.html

2018-01-25 00:00:00 DP29syM41zyGndVF 阅读数 3379
  • MFC上位机与STM32下位机通讯精讲

    本课程主要介绍C++类库MFC上位机与STM32单片机的RS232、RS422、RS485、USB、LWIP以太网、CAN等接口进行稳定通信。课程主要从MFC和STM32基础开始,以编写上位机以及下位机为主,非常注重实践。

    9317 人正在学习 去看看 王凯杰

位数指CPU处理的数据的宽度,参与运算的寄存器的数据长度。


如果总线宽度与CPU一次处理的数据宽度相同,则这个宽度就是所说的单片机位数。


如果总线宽度与CPU一次处理的数据宽度不同:


(1)总线宽度小于CPU一次处理的数据宽度,则以CPU的数据宽度定义单片机的位数,但称为准多少位。比如著名的Intel 8088,CPU是16位但总线是8位,所以它是准16位。


(2)总线宽度小于CPU一次处理的数据宽度,则以CPU的数据宽度定义单片机的位数。


少位宽不是指总线宽度,也不是存储器的宽度,像51单片机的地址总线是16位的,但是它是8位机。像ARM的存储器也有八位的,但是它是32位机。而是指CPU处理的数据的宽度,也就是CPU一次数据的吞吐量。比如同一条指令:MOV R0 R2

在51单片机里面,R0和R2都是8位的,所以51的CPU一次只能处理8位数据。


在ARM里面,R0和R2是32位的,所以ARM的CPU一次能处理32位数据。这就是区别。


有啥复杂的, 一句话:参与运算的寄存器的数据长度。


8位单片机的数据总线宽度为8位,通常直接只能处理8位数据;


16位单片机的数据总线宽度为16位,通常可直接处理8位或16位数据。


最本质的区别是内部CPU的字长不同,即CPU处理数据的最大位数不同,有8位和16位CPU的区别,你可以认为是ALU、寄存器的字长等。有的32位DSP芯片其外部接口数据总线是16位的,根据这个来判断是不行的


速度上有区别,取决于CPU、寄存器的字长。8位单片机不能直接处理16位数据,要按照8位数据来处理,要分几个过程来完成。而16位单片机,可直接处理16们数据,因为其ALU,寄存器等都是16位的,可一次完成8位单片机要多步完成的动作,特别是对于数据处理,16位单片机有它的优势。而且16位单片机大多数据接口都为16位。


说简单了就是16位的比8位快,8位的单片机发展时间长,且价格偏低。最重要的是在许多的应用场合能够胜任开发的任务。16位的单片机在功能上要比8位的强大很多,只在需要的场合使用。


你知道2进制吧,你是否知道单片机在进行计算的时候统统是2进制数的运算。所以8位单片机和16位单片机的最根本区别就是,8位单片机可以同时进行2个8位的2进制数相加,而16位单片机则大一倍,可以同时让2个16位的2进制数相加。


CPU能同时处理二进制数的位数是多少位,就称其是多少位的计算机。也有数据总线的位数是CPU位数的一半的情况,就称其是准多少位的计算机。比如CPU是16位,数据总线也是16位,则是16位计算机;CPU是16位,数据总线也是8位,则是准16位计算机。


原来是16位单片机想改用8位的替代是可以的,但电路及程序都要做相应改变,并且改为8位机后,在功能和速度上要能够满足你工作的需要才行。


1.Cortex-M3的一些关键概念!

2.6 个 Linux 运维典型问题,大牛告诉你解决思路!

3.4个知识点帮你理清ARM开发思路!

4.用python在树莓派上编程,你可以将项目扩展到令人难以置信的规模

5.CPU vs FPGA,图像处理谁更厉害?

6.图解 | 芯片总动员之”齐刘海“背后的秘密

免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。

2018-09-03 15:18:18 weixin_43554366 阅读数 8
  • MFC上位机与STM32下位机通讯精讲

    本课程主要介绍C++类库MFC上位机与STM32单片机的RS232、RS422、RS485、USB、LWIP以太网、CAN等接口进行稳定通信。课程主要从MFC和STM32基础开始,以编写上位机以及下位机为主,非常注重实践。

    9317 人正在学习 去看看 王凯杰
#include<reg52.h>

typedef unsigned int u16;
typedef unsigned char u8;

sbit Lna = P1^0;
sbit Inb = P1^1;  //直流电机输入端

u8 code list[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                  0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

sbit LSA = P3^0;   //数码管的位选
sbit LSB = P3^1;
sbit LSC = P3^3;
#define DuanXaun P0  //数码管段选
#define led P2  //led灯

u8 flag=0;  //标志位

void delay(u16 n) //n=1,延时1ms
{
    u16 i,j; 
    for(i=n;i>0;i--) 
        for(j=114;j>0;j--);
}


void DigDisplay(u8 i) //数码管
{
    u8 j;
    switch(i){
        case 0: LSA=0;LSB=0;LSC=0;Lna=0;Inb=1;break;
        case 1: LSA=1;LSB=0;LSC=0;Lna=1;Inb=0;break;
        case 2: LSA=0;LSB=1;LSC=0;Lna=0;Inb=1;break;
        case 3: LSA=1;LSB=1;LSC=0;Lna=1;Inb=0;break;
        case 4: LSA=0;LSB=0;LSC=1;Lna=0;Inb=1;break;
        case 5: LSA=1;LSB=0;LSC=1;Lna=1;Inb=0;break;
        case 6: LSA=0;LSB=1;LSC=1;Lna=0;Inb=1;break;
        case 7: LSA=1;LSB=1;LSC=1;Lna=1;Inb=0;break;
    }
    for(j=0;j<10;j++){
        P0 = list[j];
        delay(100); 
    }
    flag++;//标志变化           
}

void led_Liu(u8 i)
{
    led=~(1<<i);//看最后注释
}

void main()
{   
    while(1){
        led_Liu(flag);
        DigDisplay(flag);
        if(flag==7) flag= 0;
    }   
}

//<<是按位左移运算,~是按位取反运算,=是赋值运算。
//P2=~(1<<i)的意思是把1换成二进制数,然后左移i位,再按位取非,将结果赋给P2,等价于P2=(~(1<<i))。
//比如i为3。那么P2= ~(1<<i) = ~(1<<3) 。
//先按1个字节来看,1的二进制为00000001,左移3位得到00001000。取反得到11110111,即十六进制的F7。
//如果整数为4个字节,那么P2= ~(1<<3) = 0xFFFFFFF7。
//****************************************************************************
//状态:数码管第一个亮9秒然后电机转向改变,第二个数码管再亮9秒,依次下去,电机转向每个都不一样,同时led灯会根据数码管切换



2005-12-14 10:26:00 xwqjamky 阅读数 1611
  • MFC上位机与STM32下位机通讯精讲

    本课程主要介绍C++类库MFC上位机与STM32单片机的RS232、RS422、RS485、USB、LWIP以太网、CAN等接口进行稳定通信。课程主要从MFC和STM32基础开始,以编写上位机以及下位机为主,非常注重实践。

    9317 人正在学习 去看看 王凯杰

用mege8L的PB0-PB3连接步进电机的四个接线端!该步进电机的转矩很小,强烈建议不要将其从底座上拆下!!!否则没有轴承支撑,摩擦力太大,转不起来!


#include <iom8v.h>
#define uchar unsigned char
#define uint unsigned int


uchar np;
const uchar motortb[]={0x11,0x99,0x88,0xcc,0x44,0x66,0x22,0x33};//步进电机运行数据表

void delay(uchar t)// 每步延时的子程序
{
uchar i;
uint j;
for (i=0;i<t;i++)
for (j=0;j<900;j++);
}

void a_step(uchar d,uchar t)       //步进电机走一步d=0 正转d=1 反转, t 越大走得越慢 慢                  
{
if (d&0x01)
{
if (np==0)
np=7;
else np--;
}
else
{
if (np==7)
np=0;
else np++;
}
PORTB=motortb[np];
delay(t);
}

void a_turn(uchar d,uchar t)// 步进电机走一圈
{
uchar i;
for (i=0;i<96;i++)
a_step(d,t);
}

void main(void)
{
DDRB=0xff;
PORTB=0x44;
np=4;
while (1)
a_turn(1,5);//转速可以在5-25左右的范围内调节,t太小则嗡嗡作响,转不起来
}

2018-11-02 00:40:39 qq_43280393 阅读数 70
  • MFC上位机与STM32下位机通讯精讲

    本课程主要介绍C++类库MFC上位机与STM32单片机的RS232、RS422、RS485、USB、LWIP以太网、CAN等接口进行稳定通信。课程主要从MFC和STM32基础开始,以编写上位机以及下位机为主,非常注重实践。

    9317 人正在学习 去看看 王凯杰

1.动态数码管的实现

#include "reg52.h"		    	 //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
					0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值

void delay(u16 i)
{
	while(i--);	
}

void DigDisplay()
{
	u8 i;
	for(i=0;i<8;i++)
	{
		switch(i)	 //位选,选择点亮的数码管,
		{
			case(0):
				LSA=0;LSB=0;LSC=0; break;             //显示第0位
			case(1):
				LSA=1;LSB=0;LSC=0; break;             //显示第1位
			case(2):
				LSA=0;LSB=1;LSC=0; break;             //显示第2位
			case(3):
				LSA=1;LSB=1;LSC=0; break;             //显示第3位
			case(4):
				LSA=0;LSB=0;LSC=1; break;             //显示第4位
			case(5):
				LSA=1;LSB=0;LSC=1; break;             //显示第5位
			case(6):
				LSA=0;LSB=1;LSC=1; break;             //显示第6位
			case(7):
				LSA=1;LSB=1;LSC=1; break;             //显示第7位	
		}
		P0=smgduan[i];                                //发送段码
		delay(1);                                     //间隔一段时间扫描	
		P0=0x00;           //消影,数码管函数转动太快会导致重影的出现。
	}
}

void main()
{	
	while(1)
	{	
		DigDisplay();  //数码管显示函数	
	}		
}

之后尝试能否用for循环跑数码管。

单片机学习day1

阅读数 80

没有更多推荐了,返回首页