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

📄 ad.c

📁 手把手教你单片机
💻 C
字号:
/*
 * AD PCF8591
 *
 * 旋转电位器,串口助手将收到不同的数据
*/

#include <reg51.h>
#include <intrins.h>

typedef unsigned char uint8;
typedef unsigned int uint16;

#define SLAVEADDR  0x90
#define nops()  do{_nop_();_nop_();_nop_();_nop_();_nop_();} while(0) //定义空指令


sbit SCL = P3^7;       //I2C  时钟 
sbit SDA = P3^6;       //I2C  数据 

void delay(uint16 n)
{
	while (n--);
}
/**
 * 函数: i2c_start()
 * 功能: 启动i2c
*/
void i2c_start()
{
	SCL = 1;
	nops();
	SDA = 1;
	nops();
	SDA = 0;
	nops();
	SCL = 0;
}

/**
 * 函数: i2c_stop()
 * 功能: 停止i2c
*/
void i2c_stop()
{
	SCL = 0;
	nops();
	SDA = 0;
	nops();
	SCL = 1;
	nops();
	SDA = 1;
	nops();
}

/**
 * 函数: i2c_ACK(bit ck)
 * 功能: ck为1时发送应答信号ACK,
 *       ck为0时不发送ACK
*/
void i2c_ACK(bit ck)
{
    if (ck)
		SDA = 0;
    else
		SDA = 1;
    nops();
    SCL = 1;
    nops();
    SCL = 0;
	nops();
    SDA = 1;
    nops();
}

/**
 * 函数: i2c_waitACK()
 * 功能: 返回为0时收到ACK
 *       返回为1时没收到ACK
*/
bit i2c_waitACK()
{
	SDA = 1;
	nops();
	SCL = 1;
	nops();
	if (SDA)
	{   
		SCL = 0;
		i2c_stop();
		return 1;
	}
	else
	{  
		SCL = 0;
		return 0;
	}
}

/**
 * 函数: i2c_sendbyte(uint8 bt)
 * 功能: 将输入的一字节数据bt发送
*/
void i2c_sendbyte(uint8 bt)
{
    uint8 i;
    
    for(i=0; i<8; i++)
    {  
        if (bt & 0x80) 
			SDA = 1;
        else 
			SDA = 0;
        nops();
        SCL = 1;
        bt <<= 1;
        nops();       
        SCL = 0;
    }
}

/**
 * 函数: i2c_recbyte( )
 * 功能: 从总线上接收1字节数据
*/
uint8 i2c_recbyte()
{
	uint8 dee, i;
	
	for (i=0; i<8; i++)
	{
		SCL = 1;    
		nops();
		dee <<= 1;
		if (SDA) 
			dee = dee | 0x01;
		SCL = 0;
		nops();
	}
	
	return dee;
}

/**
 * 函数: i2c_readbyte
 * 输入: addr
 * 功能: 读出一字节数据
 * 返回值: 0->成功  1->失败
*/
bit i2c_readbyte(uint8 com, uint8 *dat)
{	
	i2c_start();
	i2c_sendbyte(SLAVEADDR);    //地址
    if (i2c_waitACK())
		return 1;
	i2c_sendbyte(com);        //控制字节
    if (i2c_waitACK())
		return 1;
	i2c_start();
	i2c_sendbyte(SLAVEADDR+1); //地址
    if (i2c_waitACK())
		return 1;
	*dat = i2c_recbyte();      //读数据
	i2c_ACK(0);                //因为只读一字节数据,不发送ACK信号
	i2c_stop();   
	
	return 0;
}

/**
 * UART初始化
 * 波特率:9600
*/
void uart_init(void)
{
    ET1=0;
    TMOD = 0x21;        // 定时器1工作在方式2(自动重装)
    SCON = 0x50;        // 10位uart,允许串行接受

    TH1 = 0xFD;
    TL1 = 0xFD;

    TR1 = 1;
}

/**
 * UART 发送一字节
*/
void UART_Send_Byte(uint8 dat)
{
	SBUF = dat;
	while (TI == 0);
	TI = 0;
}


main()
{
	uint8 ans;

	uart_init();

	while(1)
	{

		i2c_readbyte(0x40, &ans);
	    
		UART_Send_Byte(ans);
		delay(50000);
	}
}

⌨️ 快捷键说明

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