⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 8051和ds1820接口程序.txt

📁 c51源程序总结
💻 TXT
字号:
C51编程:c51与汇编的混合编程 [bwlkf] [72次] 01-8-17 下午 09:51:03
我喜欢用汇编写mcu程序。最近发觉c来写些算法很有效。
本菜鸟对混合编程极为头疼。汇编子程序中使用的固定编址。
c51的存储器地址分配是不可操作的。那样在混合编程中如何避免存储器的冲突
请指点。!!!!1 

Look 一 look ! [exdata] [70次] 01-8-17 下午 10:06:59 
我喜欢用汇编写mcu程序。最近发觉c来写些算法很有效。
本菜鸟对混合编程极为头疼。汇编子程序中使用的固定编址。
c51的存储器地址分配是不可操作的。//好象可以,到老古主叶找找!!!!!
                                 //“变量绝对定位”主题
那样在混合编程中如何避免存储器的冲突 //编译器为你解决问题,放心用吧!!!!!
请指点。!!!!1


继续 [bwlkf] [16次] 01-8-18 上午 09:00:47 
能举个例程吗?老古那里没找到 

这是从“雨沐春风单片机”那找到的,看看! [exdata] [57次] 01-8-18 下午 02:24:35 
3.2 在C51中调用汇编程序

下面以8051和DS1820接口程序为例来说明在C中调用汇编程序的方法。Dallas公司的DS1820
是一种数字式温度计,它与微控制器接口只需一根I/O线,所有的命令、状态和9位温度读数
均通过单线双向传送。虽然该器件的硬件接口十分简单,但对读/写时序中的时间片精度要
求严格,因而,本例接口程序采用汇编语言编写,主程序及修正温度值的计算部分用C语言
编写。本例假定读者对DS1820有所了解,不然请参阅Dallas公司有关DS1820的数据资料。

以下是8051微控制器与DS1820接口的C源程序,本程序要求8051的P1.0与DS1820连接,工作
频率12MHz。清单中error(char)和display(char *)分别是错误处理和LCD显示处理函
数,限于篇幅未给出。

#include <reg51.h> 

#include <stdio.h> 

#include <math.h>

extern WDS1820(unsigned char x);

/* 写DS1820命令外部函数声明 */

extern RDS1820(unsigned char *pt);

/* 读DS1820数据外部函数声明 */

extern bit RTDS1820(void);

/* 复位DS1820外部函数声明 */

extern Delay15(unsigned char n);

/* 延时15μs外部函数声明 */

sbit P1_0=P1^0; /* sbit对象P1.0声明 */

void main (void) /* 主函数 */

{

unsigned data int i;

float data tempF;

unsigned char data temp[10],disbuf[10];

/* 存放温度数据和显示数据的局部数组变量声明 */

if(RTDS1820()!=1) error(0x3);

/* 复位并判DS1820是否存在 */

Delay15(0xff); /* 延时约15×255μs */

WDS1820(0xcc); WDS1820(0x44);

/* 向DS1820发跳读ROM和启动温度变换命令 */

P1_0=1; /* P1.0口置线高电平 */

do{ Delay15(0xff);i++;}while(i<=400); 

/* 延时约1.5秒钟 */

if(RTDS1820()!=1) error(0x3);

/* 复位并判DS1820是否存在 */

Delay15(0xff); /* 延时约15×255μs */

WDS1820(0xcc); WDS1820(0xbe);

/* 向DS1820发跳读ROM和读9字节数据命令 */

RDS1820(&temp); 

/* 9字节数据读入数组temp */

tempF=(((temp[1]<<8)+temp[0])>>1)-0.25

+((temp[7]-temp[6])/temp[7]);

/* 温度值修正计算 */

sprintf(&disbuf,"T=%+4.1f%c",tempF,'C');

/* 按T=±XXX.X C格式组织数据送disbuf */

display(&temp); /* 数据送LCD显示 */

}

以下是用A51宏汇编编写的DS1820接口源程序清单,共有4个子程序,其中 RTDS 1820无参数
传递,但具有bit对象的返回值,DELAY15和WDS1820带有一个经R7传递的无符号char类参
数,RDS1820带有一个经R7传递的1字节指针类参数。

NAME RW1820 ;定义模块名

?PR?RDS1820?RW1820 SEGMENT CODE 

;RDS1820子程序代码段声明

?PR?WDS1820?RW1820 SEGMENT CODE

;WDS1820子程序代码段声明

?PR?RTDS1820?RW1820 SEGMENT CODE

;RTDS1820子程序代码段声明

?PR?DELAY15?RW1820 SEGMENT CODE

;DELAY15子程序代码段声明

PUBLIC RTDS1820,_WDS1820,_RDS1820,_DELAY15

;公开函数名以便C模块可调用它们

RSEG ?PR?RDS1820?RW1820

_RDS1820: 

;RDS1820代码段起始,完成9字节温度数据的读取

MOV R1,#9 

;置9字节数据计数器初值
MOV A,R7

;取经R7传递的数组temp首址(C中定义)

MOV R0,A

RD18201:MOV R2,#8 

;置1字节位移位计数器初值

RD18202:SETB P1.0 ;P1.0置为高电平

NOP

NOP

CLR P1.0 ;P1.0置为低电平

NOP

NOP

SETB P1.0 

;P1.0置为高电平,准备输入数据

MOV R7,#1 ;延时15μs

LCALL DELAY15

MOV C,P1.0 

;P1.0状态读入位累加器

RRC A ;累加器A右移

DJNZ R2,RD18202 

;判一个字节是否读完

MOV @R0,A ;保存结果

INC R0 ;地址指针加1

DJNZ R1,RD18201 

;判9字节是否读完

RET ;返回

RSEG ?PR?WDS1820?RW1820

_WDS1820: 

;WDS1820代码段起始,完成1字节命令的写入 

MOV R1,#8 

;置1字节位移位计数器初值

CLR C ;清位累加器

MOV A,R7 

;取经R7传递的命令参数

WR18201:CLR P1.0 ;P1.0置为低电平

MOV R7,#1 ;延时15μs

LCALL DELAY15

RRC A 

;累加器A右移1位

MOV P1.0,C 

;发送1位数据给DS1820

MOV R7,#1 ;延时15μs

LCALL DELAY15

SETB P1.0 ;P1.0置为高电平

NOP

DJNZ R1,WR18201 

;判1字节数据是否发送完毕

SETB P1.0 ;P1.0置为高电平

RET ;返回



变量的绝对定位 "@" "_at_" 好像!!!!!自己再用心去找一下吧!!!!! 

 
点击这里回复这篇贴子>>
_____________________________________________________________________________
Copyright?,C51BBS论坛 2000-2001 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -