Chinaunix首页 | 论坛 | 博客
  • 博客访问: 348759
  • 博文数量: 88
  • 博客积分: 1695
  • 博客等级: 上尉
  • 技术积分: 1380
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-06 15:48
个人简介

喜欢美食, 旅行..

文章分类

全部博文(88)

文章存档

2014年(2)

2013年(12)

2012年(14)

2010年(8)

2009年(52)

我的朋友

分类: 嵌入式

2009-10-31 11:37:08

.  C51热启动代码的编制

void main()

{

      char data *HotPoint=(char *)0x7f;

      if((*HotPoint==0xaa)&&(*(--HotPoint)==0xaa))

      {

            /*热启动的处理 */

      }

      else

      {

           HotPoint=0x7e; /*冷启动的处进

           *HotPoint=0xaa;

           *(++HotPoint)=0xaa;

      }

 

      /*正常工作代码*/

}

如果你的程序包含startup.a51,则需要对startup.a51进行修改。

对于startup.a51的修改,根据自已的需要进行,如将IDATALEN EQU 80H中的80H改为70H,就可以使6F7F16字节内存不被清零。

 

.直接调用EPROM中已固化的程序

void main(void)

{

void (*DispBuffer)(); /*定义指向函数指针*/

DispBuffer=0xde00; /*赋值*/

for(;;)

{

Key();

DispBuffer();

}

}

原理:利用指向函数的指针来实现的 (*指针变量名)();

 

. 将浮点数转化为字符数组

#define uchar unsigned char

#define uint unsigned int

 

void FtoC(void)

{

float a;

uchar i,*px

uchar x[4]; /*定义字符数组,准备存储浮点数的四个字节*

void *pf;

 

px=x; /*px指针指向数组x*/

pf=&a; /*void 型指针指向浮点数首地址*/

a=34.526;

for(i=0;i<4;i++)

{

*(px+i)=*((char *)pf+i); /*强制void 型指针转成char,因为*/

} /*void型指针不能运算*/

}

如果已将数存入EEPROM,要将其取出合并,方法也是一样,可参考下面的程序。

void CtoF(void)

{

float a;

uchar i,*px

uchar x[4]={56,180,150,73};

void *pf;

 

px=x;

pf=&a;

for(i=0;i<4;i++)

{

*((char *)pf+i)=*(px+i);

}

      }

.绝对存储器访问

1       绝对存储器访问宏

#define CBYTE ((unsigned char volatile code *)0)

#define DBYTE ((unsigned char volatile data *)0)

#define XBYTE ((unsigned char volatile xdata *)0)

#define IBYTE ((unsigned char volatile idata *)0)

#define PBYTE ((unsigned char volatile pdata *)0)

2       连接器位置控制

KeilC编译设置中,有定义

3       关键字_at_

data unsigned char aaa  _at_ 0x40;

idata unsigned char aaa  _at_ 0x40;

xdata unsigned char aaa  _at_ 0x40;

code  unsigned char aaa  _at_ 0x40;

 

. 强制函数的编译模式

void GetDataLen()small;

void GetDataLen()small

{

      ……………….

}

. C程序与汇编的接口

1.1种情况:直接嵌入汇编

#pragma asm

#paragma endasm

 

2.2种情况:文件间调用

  通过寄存器传递参数,通过固定存储区传递参数。

3.3种情况:由C生成汇编接口

#pragma SRC

#pragma SMALL

unsigned int asmfunc1 (

unsigned int arg)

{

return (1 + arg);

}

 

. volatile的使用方法及使用条件点 

第一种情况涉及到内存映射硬件(memory-mapped hardware,如图形适配器,这类设备对计算机来说就好象是内存的一部分一样);

#define XBYTE[1000]  PORTADD     //硬件口地址定义

 

第二种情况涉及到共享内存(shared memory,即被两个以上同时运行的程序所使用的内存)。

C51中中断调用的变量

 

单片机口线定义。

 

文章转自:http://blog.21ic.com/user1/3085/archives/2006/23026.html

阅读(1212) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~