📄 adc0809.txt
字号:
指针:可对内存地址直接操作
基于存贮器的指以贮器类为参量,它在编译时才被确定。因此为指针选择存贮器的方法可以省掉,以这些指针的长度可为1个字节(idata *,data *,pdata *)或2个这节(code *,xdata *)。
char xdata *address;
ADC0809具有8个模拟量输入通道,采用中断方式,在中断函数中读取8个通道的A/D转换值,分别存储在外部RAM的1000H~1007H单元。ADC0809端口地址为00F0H。
程序定义了两个指针变量* ADC和* ADCdata,分别指向ADC0809端口地址(00F0H)和外部RAM单元地址(1000H~1007H)
由*ADC=I送入通道数,启动ADC0809进行A/D转换,转换结束时产生INT1中断。在中断服务函数int1()中通过temp=*ADC和*ADCdata=temp;读取A/D转换结果并存到外部RAM中。
#include<reg51.h>
unsigned int xdata *ADC; /*定义ADC0809端口指针*/
unsigned int xdata *ADCdata; /*定义ADC0809数据缓冲器指针*/
unsigned char I;
void main( )
{
ADC=0x00f0; /*定义端口地址和数据缓冲器地址*/
ADCdata=0x1000;
I=8; /* ADC0809有8个模拟输入通道*/
EA=1; EX1=1;IT1=1; /*开中断*/
*ADC=I; /*启动ADC0809*/
WHILE(I); /*等待8个通道A/D转换完*/
}
void int1() interrupt 2
{
unsigned char tmp;
temp=*ADC; /*读取A/D转换结果*/
*ADCdata=temp; /*结果值存到数据缓冲区*/
ADCdata++; /*数据缓冲区地址加1*/
i—;
*ADC=I; /*启动下一个模拟输入通道A/D转换*/
}
除了用指针变量来实现对内存地址的直接操作外,c51编译器还提供一组宏,该宏定义文件为:“absacc.h”,利用它可十分方便地实现对任何内存空间的直接操作,改写上面的程序:
#include<reg51.h>
#include<absacc.h> /*包含绝对地址操作预定义头文件*/
#define ADC 0x00f0; /*定义ADC0809端口地址*/
#define ADCdata 0X1000 /*定义数据缓冲器地址*/
unsigned char I;
void main( )
{
I=8; / *ADC0809有8个模拟输入通道*/
EA=1;ex1=1;it1=1; / *开中断*/
XBYTE[ADC]=I; /*启动0809 */
While(i); /*等待8个通道转换完毕*/
}
void int1() interrupt2 {
unsigned char tmp;
tmp=XBYTE[ADC]; /*读取A/D转换结果*/
i--;
XBYTE[ADCdata+I]=tmp; /**结果值存储到数据缓冲器*/
XBYTE[ADC]=I; /*启动下一个模拟输入通道A/D转换*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -