1、AT89X52.H#include /XBYTE函数INTRINS.H/_nop_函数#define uchar unsigned char #define uint unsigned int#define DAADR XBYTE0x8000 /ad0809的0通道地址uchar dd8,m=0; /转换结果在dd8中uchar *ad_adr;/全局变量void main(void) uchar i=0; ad_adr=&DAADR;/给指针赋初值 DAADR=0x00;/采样IN0通道,并启动采样/避开EOC未变化的10s IE=0x81;/开中断 while(1) / disp1(0);
2、在此可以显示,处理数据 void ad0809int(void) interrupt 0 using 1 /中断程序 IE=0X00;/关中断 ddm=*ad_adr;/ 存贮转换结果 ad_adr+;/指向下一个通道 ad_adr=0;/开始下一次转换 m+;/指向下一个数组元素 _nop_();/根据晶振频率调整时间 if(m=8) m=0; IE=0X81;(0809采样)例2 I2C总线A/D转换(TLC0831)TLC0831是8位逐次逼近电压型I2C总线A/D转换器,支持单信道输入串口输出,极性设置固定,不需寻址。其内部有一采样数据比较器将输入的摸拟信号微分比较后转换为数字信号。模
3、拟电压的差分输入方式有利于抑制共模信号和减少或消除转换的偏移误差。电压基准输入可调,使得小范围模拟电压信号转化时的分辨率更高。由标准移位寄存器或微处理器将时间变化的数字信号分配到串口输出,当IN-接地时为单端工作,此时IN+为输入,也可将信号差分后输入到IN+与IN-之间,此时器件处于双端工作状态。主要特点如下:(1) 8位分辨率;(2) 单信道差分输入;(3) 5V的电源提供0-5V可调基准电压;(4) 输入输出可与TTL和MOS兼容;(5) 总失调误差为1SB。(6)串行时钟在250KHz时,转换时间为32s。典型的应用电路如下图:TLC0831共8个引脚, CS:为片选,低电平有效,并启
4、动转换,在转换过程中必须保持低电平;DO:为数据输出端;CLK:时钟信号。IN:模拟信号输入正极;IN:模拟信号输入负极。 在转换过程中,转换数据同时从DO口输出。TLC0831时序图如下: 按照时序图和电路图,可以编写出如下的应用程序,调用该程序一次可以完成一次转换,并将转换结果读入单片机A中:编写的C51应用程序: #include stdio.htypedef unsigned int uuint;typedef unsigned char uchar;sbit adcdo=P1_0; /定义TLC0831的数据线D0sbit adccs=P1_2; /定义TLC0831的时能线CSsb
5、it adcclk=P1_1; /定义TLC0831的时钟线CLKvoid delay(uchar x); /定义廷时函数uchar readadc(void); /定义读数据函数void adcck(void); /定义时钟函数void delay1(uchar x)uchar i;for(i=0;x;i+);void adcck(void) /时钟函数adcclk=1;delay1(2);adcclk=0;uchar readadc(void) /读出TLC0831转换数据函数 uchar ch;adccs=0;adcck();ch=0;for(;adcdo=1;)adcck();for(
6、i=0;8; adcck();ch=(chintrins.h/函数声明 ,次序安排好不用声明/void i2c_send8bit(unsigned char);/unsigned char i2c_receive8bit(void);sbit SDA=P10;/数据接口sbit SCL=P11;/时钟脉冲接口/时钟脉冲为高电平时,数据从高变低,为开始信号 void i2c_start(void) SDA = 1;SCL = 1;SDA = 0;SCL = 0;return;/时钟脉冲为高电平时,数据从低变高,为结束信号 void i2c_stop(void) /发送8位数据,数据保持稳定不变,
7、SCL给一个脉冲 void i2c_send8bit(unsigned char b) unsigned char a; /数据移位控制变量for(a=0;aa+) if (b a ) & 0x80) /取最高位,先发送最高位 /最高位为1发送高电平else /最高位为0发送低电平 /产生时钟脉冲/接收8位数据 ,时序同写,保持SCL为高电平,读SDAunsigned char i2c_receive8bit(void) /读的位数unsigned char b=0; /保持SCL为高电平b=b# define uint unsigned int void dlms( void )void k
8、bscan( void ) ;void main ( void )uchar key ;while( 1 ) key =kbscan ( ) ; dlms( ) ; uchar i ; for ( i=200;i0;i- -) uchar kbscan ( void ) / 键扫描函数 uchar scode ,recode ; P1=oxf0 ; if ( (P1 & 0xf0 ) ! =0xf0 ) / 若有键按下 dlms ( ) ; / 延时去抖动 if ( P1 & 0xf0 )! = 0xf0 ) scode =0xfe ; / 逐行扫描初值 while ( scode & 0x10 ) !=0 ) P1=scode ; / 输出扫描码 if ( P1 & =0xf0 ) / 本行有键按下 recode= ( P1 & 0xf0 ) | 0x0f ; return ( scode ) + ( recode ) ) ; /返回特征字节码 else scode = ( scode reg51.h #define uchar unsigned char# define COM8155 XBYTE 0xfff0 #
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2