精华内容
下载资源
问答
  • 51单片机的位地址和字节地址

    千次阅读 2013-09-17 15:51:00
    51单片机的20H-2FH为位地址区,共16个字节,每字节有8位共128位,每位有个编号称为位地址,...而MOV A,20H 将字节地址为20H的内容送至累加器A。 可见20H是位地址还是字节地址要看另一个操作数的类型。 /*----------...

    51单片机的20H-2FH为位地址区,共16个字节,每字节有8位共128位,每位有个编号称为位地址,位地址的范围为00H-7FH。

    该区既可位寻址又可字节寻址。例如:MOV C,20H 这里C是进位标志位,该指令将位地址为20H的单元内容送至C;而MOV A,20H 将字节地址为20H的内容送至累加器A。

    可见20H是位地址还是字节地址要看另一个操作数的类型。

    /*----------------------------------------------------------*/
    ;program name:  r8051xC2 -->Port0 Test Input or  Output
    ;program versions: v1
    ;program date: 2013.7.15
    ;use : test
    ;compiler: eng-12
    /*-----------------------------------------------------------*/
    $NOMOD51                //取消使用51内部默认SFR
    #include "REG8F301.INC"
    
    Key1        equ        P0.0
    F_1SSet        bit        20h.0
    F_KeyOne    bit        20h.1
    F_KeyOpen    bit        20h.2
    dseg    at      30h          //通用RAM字节段从30H开始
    TimerCnt:    ds            1
    TimerCnt1:    ds            1
    KeyBuf:        ds            1
    KeyValue:    ds            1  
    P0_1:        ds            1
    P0_2:        ds            1
    P0_3:        ds            1
    P0_4:        ds            1
    P0_5:        ds            1
    P0_6:        ds            1
    P0_7:        ds            1
    P0_8:        ds            1
    IO_ModeCnt:    ds            1
    DelCnt:        ds            1
    
    iseg    at      80h     //0-ffh地址的RAM段     80h-ffh段RAM只能用间接寻址进行操作
    
    cseg    at      0
            org            0000h
            jmp            Start
            org            0030h
    ;------------------------------------------------------------
    start:                        
            mov            ckcon,#01h
            mov            r0,#0x7f
    ClrRam:                              //清内部256Byte RAM
            mov            @r0,#0
            djnz        r0,ClrRam    
            mov            dptr,#0x00      //清外部768Byte RAM
        //    mov            dph,#0x03
        //    mov            dpl,#0x00
    ClrOutRam:
            mov            a,#0x00         //给外部RAM全部写0x00
            movx        @dptr,a
            inc            dpl
            mov            a,dpl
            cjne        a,#0,ClrOutRam
            inc            dph
            mov            a,dph
            cjne        a,#3,ClrOutRam
            mov            P0_OE,#0ffh                    //设置P0位输出模式
            mov            P0,#00H                        //P0输出0
                                                                    
    ;-------------------------------------------------------------
    main:
            mov            a,P0                        //IO口状态快速翻转,翻转正常,在时钟25Mhz下
            CPL            a
            mov            P0,a
            ljmp            main
    ;-------------------------------------------------------------
            end

    转载于:https://www.cnblogs.com/yuqilihualuo/p/3326428.html

    展开全文
  • STC单片机 字节类型

    2019-10-28 08:53:35
    在keil C51或者iar for c8051...int 占两个字节 范围:-32768~+32767 long占四个字节 范围:-2147483648~+2147483647 float占四个字节 范围:3.40E+38 ~ +3.40E+38 double占8个字节 范围:-1.79E+308 ~ +1.79E+308 ...

    在keil C51或者iar for c8051编译器下:
    int 占两个字节 范围:-32768~+32767
    long占四个字节 范围:-2147483648~+2147483647
    float占四个字节 范围:3.40E+38 ~ +3.40E+38
    double占8个字节 范围:-1.79E+308 ~ +1.79E+308

    展开全文
  • 工作了一年多,写了不少单片机串口程序。感觉串口多字节接收部分的逻辑相对于配置寄存器跟串口回复来说,是有点难度的——寄存器配置基本上都是死的,串口回复多字节跟回复一字节只是多了一个循环。
  • 此软件包是对PHILIPS P89C668 单片机(或I2C 总线接口兼容机如8xC552)的字节方式硬件I2C 而设计的,用户通过调用软件包可实现I2C 总线的单主/多主系统。硬件I2C 的总线竞争和同步逻辑,是软件无法模拟的,且它还...
  • 工作了一年多,写了不少单片机串口程序。感觉串口多字节接收部分的逻辑相对于配置寄存器跟串口回复来说,是有点难度的——寄存器配置基本上都是死的,串口回复多字节跟回复一字节只是多了一个循环。
  • (1) 标号: BCDA 功能:多字节BCD码加法入口条件:字节数在R7中,被加数在[R0]中,加数在[R1]中。出口信息:和在[R0]中,最高位进位在CY中。影响资源:PSW、A、R2 堆栈需求: 2字节BCDA: MOV A,R7 ;取...
  • 单片机字节乘除法

    2011-12-26 15:10:47
    简单的单片机字节乘除,主要是针对51单片机
  • 单片机字节发送与接受 带缓存单元 单片机字节发送与接受 带缓存单元 单片机字节发送与接受 带缓存单元
  • 字节乘单字节的51单片机asm文件双字节乘单字节的51单片机asm文件双字节乘单字节的51单片机asm文件
  • 单片机字节乘法实验报告,汇编版~~~~
  • 单片机字节乘法

    2008-01-23 11:22:19
    字节乘法 <br>(R1:R0)*(R3:R2 )-->(R7:R6:R1:R0 )
  • 单片机串口多字节接受处理!希望可以帮到大家!
  • 51单片机串口多字节接收
  • 单片机字节数值最小组筛选的汇编语言算法.pdf
  • 本文主要为单片机eeprom多字节读写程序源代码,一起来学习吧
  • 基于单片机at89c51的双字节乘法汇编程序语言代码
  • keil c51,单片机串口接收多字节.
  • 该文档包含P89C66X系列单片机在进行硬件I2C通信的时候,处于从方式工作模式下所需使用的C语言函数包,并带有注释
  • 指针类型所占字节地址总线宽度有关系,8位机器的话就是1个字节 stm32单片机(32位): char 1 short 2 int 4 long 4 float 4 double 8 指针类型所占字节地址总线宽度有关系,32位机器的话就是4个字节 .....

    51单片机(8位):

    char 1

    int 2

    long 4

    float 4

    double 8

    指针类型所占字节和地址总线宽度有关系,8位机器的话就是1个字节

    stm32单片机(32位):

    char 1

    short 2

    int 4

    long 4

    float 4

    double 8

    指针类型所占字节和地址总线宽度有关系,32位机器的话就是4个字节

    展开全文
  • 这是一个单片机串口收发的设计理念,按照这种理念设计出的程序,稳定性很好,适用于产品级别的程序开发,此种理念不局限于某一种单片机
  • 单片机内部FLASH的字节操作

    千次阅读 2019-12-16 10:36:14
    一般32位单片机的内部FALSH是不支持字节操作的,有的可以按字节读取,但是不能按字节写入。 而且,一般单片机内部FALSH擦除的最小单位都是页,如果向某页中的某个位置写入数据,恰好这个位置的前面存了其他数据,...

    一般32位单片机的内部FALSH是不支持字节操作的,有的可以按字节读取,但是不能按字节写入。

    而且,一般单片机内部FALSH擦除的最小单位都是页,如果向某页中的某个位置写入数据,恰好这个位置的前面存了其他数据,那么就必须把这页擦除,存的其他数据也会丢失。

    实际上就是说内部的FALSH不好做改写的操作,如果有很多数据需要存放,最好是分页存储。这也是FALSH与E2PROM最大的区别,后者支持按字节操作且无需擦除,即使某一个地址写坏了,也不影响其他地址。

    下面介绍一种方法让内部FLASH"支持"字节操作,且同一页的其他数据不受影响。

    方法原理很简单,下面简单介绍下原理:

    1.根据要写入地址,计算出该地址位于哪一页;

    2.读出整个页,存入缓存BUF;

    3.将要写入的数据按位置更新到BUF中;

    4.擦除该页;

    5.写入整个BUF。

    可以看出这种方法弊端很明显:

    1.耗时长  每次写都要读整个BUF,然后还要先把数据存到BUF里,然后再写入整个BUF;

    2.FALSH擦写次数增加,降低使用寿命;

    下面给出测试代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>//C语言标准库
    #include "flash.h"
    
    #define USER_FLASH_START_ADDR   0x01070000   //FLASH最后两个扇区  供用户使用
    
    
    u32tou8 u32data;//定义一个联合体
    
    //==================================================================================
    // 获取某个地址所在的页首地址
    // addr:FLASH地址
    // 返回:该地址所在的页 共128页(0~127)
    //==================================================================================
    unsigned int FLASH_GetFlashPage(unsigned int addr)
    {
    	  if (IS_FLASH_ADDRESS(addr))
    		{
    		   return  (addr&(~0xFFF));//清0低12位就是该页的起始地址
      	} 
    }
    //==================================================================================
    // 从FLASH中读取 一个字(32位)
    // addr:读取地址
    // 返回: 读到的字数据
    //备注: 地址为4字节对齐
    //==================================================================================
    unsigned int FLSAH_ReadWord(unsigned int addr)
    {
        return (*(unsigned int *)addr);
    }
    
    
    //==================================================================================
    //从FLASH指定地址 读取数据
    //备注: 读取数据类型为32位  读取地址为4字节对齐
    //==================================================================================
    void  FLASH_Read(unsigned int	ReadAddr,unsigned char *pBuffer,unsigned int NumToRead)
    {
        unsigned int i;
    	  u32tobyte cache;
        for(i=0; i<NumToRead; i+=4)
        {
                cache.u32data=FLSAH_ReadWord(ReadAddr+i);
    				    pBuffer[i]=cache.buf[0];
       					pBuffer[i+1]=cache.buf[1];
    					  pBuffer[i+2]=cache.buf[2];
    					  pBuffer[i+3]=cache.buf[3];
        }
    }
    
    //==================================================================================
    // 向FLASH指定地址 写入大量数据
    // WriteAddr:写入首地址
    // pBuffer:数据首地址
    // NumToWrite:需要写入数据的大小
    // 返回: 4=成功  1,2,3,5=失败
    // 备注:
    //==================================================================================
    FLASH_Status  FLASH_Write(unsigned int	WriteAddr,unsigned char *pBuffer,unsigned int NumToWrite)
    {
    
        FLASH_Status status = FLASH_COMPLETE;
    	  u32tobyte cache;//联合体定义
        unsigned int startaddr,endaddr,pageaddr=0;
    	  unsigned char buffer[4096];//4K缓冲区 对应FALSH 1页
    	  unsigned int i;
    	  unsigned int index,remain;
        startaddr = WriteAddr;
        endaddr = startaddr+NumToWrite;//结束地址
    	
        FLASH_Unlock();
        FCU->RO = 0;//去掉所有扇区写保护
        //==================================================================================
        // 判断写入地址是否非法  起始地址或者结束地址不在FALSH范围内则退出
        //==================================================================================
        if(!(IS_FLASH_ADDRESS(startaddr)&& IS_FLASH_ADDRESS(endaddr))) return FLASH_ERROR_PG;
       
    	   while(startaddr < endaddr)
    		 {
    			 
    		//==================================================================================
        //1.计算起始地址在FALSH哪一页,并获取该页的首地址
    		//2.计算起始地址在该页的偏移量
        //3.计算该页还剩余多少字节没写入数据			 
        //==================================================================================
    			  pageaddr = FLASH_GetFlashPage(startaddr);//获取起始地址所在页的页首地址
    			  index = startaddr-pageaddr;//4K缓冲区内偏移地址
    			  remain=4096-index;//缓存区剩余大小
        //==================================================================================
        // 将该页数据读入4K缓冲数组,后面读写都是对该缓冲数组操作
        //==================================================================================			 
    		    for(i=0;i<4096;i+=4)//读取一页到缓冲buff
    			  {
    				    cache.u32data=FLSAH_ReadWord(pageaddr+i);
    				    buffer[i]=cache.buf[0];
       					buffer[i+1]=cache.buf[1];
    					  buffer[i+2]=cache.buf[2];
    					  buffer[i+3]=cache.buf[3];
    				} 
        //==================================================================================
        // 擦除FALSH对应的页,FLASH只能按页擦除,
    		// 这一页数据已经被读到缓冲数组中了 之前的数据也保留下来了 		
        //==================================================================================				
    				status = FLASH_ErasePage(startaddr);
            if(status != FLASH_COMPLETE) return status;//擦除1页 4K字节					
        //==================================================================================
        //1.判断要写入的数据是否大于该页剩余容量(即计算写入的数据长度是否跨多页) 
    		//2.将需要写入的数据转存到缓冲数据		
        //==================================================================================				
    				if(NumToWrite > remain)//需要写入的数据量大于缓冲buf剩余字节数
    				{
    					for(i=index;i<4096;i++)//将需要写入FALSH的数据写入缓冲buff
    					{
    							 buffer[i]=*(pBuffer++);				
    					}
    					NumToWrite-=remain;//需要写入的数据长度-本次已经写入的数据长度	
              startaddr+=remain;//地址向后偏移本次写入的字节数					
    			  }
    				else
    				{
    				  for(i=index;i<NumToWrite+index;i++)//将需要写入FALSH的数据写入缓冲buff
    					{
    							 buffer[i]=*(pBuffer++);				
    					} 
              startaddr+=NumToWrite;//地址向后偏移本次写入的字节数								
    				}	
        //==================================================================================
        // 将缓冲数组(4K)写入FLASH 对应的页
    		// 此处必须从页首写入,因为缓冲数组正好4K,对应FALSH 1页	
        //==================================================================================				
    				for(i=0;i<4096;i+=4)//将缓冲buffer写入 FALSH
    			  {
    				    cache.buf[0]=buffer[i];
       					cache.buf[1]=buffer[i+1];
    					  cache.buf[2]=buffer[i+2];
    					  cache.buf[3]=buffer[i+3];
    					
    					  if((status=FLASH_ProgramWord(pageaddr+i,cache.u32data))!= FLASH_COMPLETE)
    						{
    								FLASH_Lock();
    								return status;//写入失败 FLASH上锁 
    						}	             						
    				}			
    		 }
        FLASH_Lock();
    }
    
    
    
    
    
    
    
    
    
    
    
    

    其中还有个联合体的定义: 

    typedef union
    {
        unsigned int  data;
        unsigned char buf[4];
    }
    u32tou8;

    FLASH_ErasePage、FLASH_ProgramWord、IS_FLASH_ADDRESS 这三个都是单片机FLASH的库函数

    各家单片机不同,但功能基本相同,这里不再提供源码。

    最后提供以下两个FLASH接口即可:

    FLASH_Write(unsigned int    WriteAddr,unsigned char *pBuffer,unsigned int NumToWrite);
    
    FLASH_Read(unsigned int    ReadAddr,unsigned char *pBuffer,unsigned int NumToRead)

    演示:

    1.为方便查看结果,测试从0x1070FFC的位置开始写入数据,FLASH地址分布如下图所示:

    这里展示了FLASH连续两页的地址,首先将这两页全部擦除。

     

    2.接着从1070FFC的位置开始写入56个1,这样就保证了数据跨越了1页。 

    unsigned char write[]= {"1111111111111111111111111111111111111111111111111111111111111111111111111111111111111"};
    FLASH_Write(0x01070FFC,write,sizeof(write));

     

     注意:最后的00是因为字符串的结尾字符是“\0”

    3.紧接着,在0x1070FFE位置写入新的字符串,也要保证写入长度跨越1页

    unsigned char write2[]={"23456789"};
    FLASH_Write(0x01070FFE,write2,sizeof(write2));

     

    可以看出,0x1070FFE~0x1071006的位置被写入了新的字节,但这两页的其他位置数据保持不变。

     

    总结:

    1.实际使用时,如果不是受限于成本或者FLASH大小,不建议这样读写内部FLASH,以为stm32内部FLASH也就

    10W次寿命,这样频繁擦写会大大降低FLASH寿命。

    2.如果保存的数据不多,建议每个数据都单独存1页,这样不用考虑擦除时会把其他数据也一并擦除。

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 单片机串口接收多字节数据

    千次阅读 2019-05-02 23:05:48
    单片机串口接收多字节数据 2017年07月14日 16:52:13Phenixyf阅读数:7123 http://bbs.elecfans.com/jishu_409918_1_1.html 各位大侠看一下,我下面的程序为什么不能接收两个字节的数据呢? #include<reg51.h&...
  • 8051单片机字节BCD码加法程序,包括加法子程序
  • 本文为实现多字节无符号数减法的程序。
  • 在数据手册上,BSRR的偏移地址为0X18,然后手册讲完BSRR后直接讲LCKR了,并且LCKR的偏移地址是 OX1C 。所以根据 OX1C-0X18=0X04 就知道BSRR是32位寄存器了...32位单片机 一个32位地址代表一个字节而不是4个字节(32位)
  • 两个关于51单片机的数值计算的问题与解答。
  • 51单片机中常用的多字节二进制码转压缩BCD码的示例代码(含清晰的注释),后3页使用代码编辑器重排版(对齐、美观)。 需要doc版本的可通过邮件zjyzfn@139.com联系。
  • 51单片机汇编指令字节数与周期数,统计介绍51单片机汇编指令的字节数与周期数

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 34,043
精华内容 13,617
关键字:

单片机字节地址