蓝桥开发板(CT107D)学习记录————15.电压信号测量(IIC协议)

本文介绍了一个使用STM32微控制器通过I2C通信协议与pcf8591芯片交互的项目。代码实现从pcf8591获取电压数据,经过转换后在数码管上显示。主要涉及I2C总线操作、A/D转换以及数码管显示技术。
摘要由CSDN通过智能技术生成

题意:使用竞赛板上RB2电位器输出测试电压信号,信号输出范围为0V-5V,使用数码管显示电压值。
在这里插入图片描述
用开发板上的rb2,控制输出电压,用pcf8591,进行A/D转换并且显示在数码管上
IIC.h

#ifndef __IIC_h
#define __IIC_h

void IIC_Delay(unsigned char i);//延时
void IIC_Start(void);//开始
void IIC_Stop(void);//启动
void IIC_SendAck(bit ackbit);//发送应答
bit IIC_WaitAck(void);//等待等待应答
void IIC_SendByte(unsigned char byt);//发送数据
unsigned char IIC_RecByte(void);//从I2C总线上接收数据
#endif
#include <STC15F2K60S2.H>
#include "intrins.h"
#define DELAY_TIME 5
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1
//总线引脚定义
sbit SDA = P2^1;  /* 数据线 */
sbit SCL = P2^0;  /* 时钟线 */

void IIC_Delay(unsigned char i)
{
    do{_nop_();}
    while(i--);        
}
//总线启动条件
void IIC_Start(void)
{
    SDA = 1;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 0;
    IIC_Delay(DELAY_TIME);
    SCL = 0;	
}
//总线停止条件
void IIC_Stop(void)
{
    SDA = 0;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 1;
    IIC_Delay(DELAY_TIME);
}

//发送应答
void IIC_SendAck(bit ackbit)
{
    SCL = 0;
    SDA = ackbit;  					// 0:应答,1:非应答
    IIC_Delay(DELAY_TIME);
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SCL = 0; 
    SDA = 1;
    IIC_Delay(DELAY_TIME);
}

//等待应答
bit IIC_WaitAck(void)
{
    bit ackbit;
	
    SCL  = 1;
    IIC_Delay(DELAY_TIME);
    ackbit = SDA;
    SCL = 0;
    IIC_Delay(DELAY_TIME);
    return ackbit;
}

//通过I2C总线发送数据
void IIC_SendByte(unsigned char byt)
{
    unsigned char i;

    for(i=0; i<8; i++)
    {
        SCL  = 0;
        IIC_Delay(DELAY_TIME);
        if(byt & 0x80) SDA  = 1;
        else SDA  = 0;
        IIC_Delay(DELAY_TIME);
        SCL = 1;
        byt <<= 1;
        IIC_Delay(DELAY_TIME);
    }
    SCL  = 0;  
}

//从I2C总线上接收数据
unsigned char IIC_RecByte(void)
{
    unsigned char i, da;
    for(i=0; i<8; i++)
    {   
    	SCL = 1;
			IIC_Delay(DELAY_TIME);
			da <<= 1;
			if(SDA) da |= 1;
			SCL = 0;
			IIC_Delay(DELAY_TIME);
    }
    return da;    
}

主程序:

#include <STC15F2K60S2.H>
#include"IIC.h"
#define uchar unsigned char
#define uint unsigned int
uchar code adress[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//位选,从左向右
uchar code display_num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xf9,0xbf,0xff};//0-9共阳数码管编码表
uint i=0,count=0,flag=0;
long num=0;
uchar buff[8];
void init()
{
	P2=0xa0;P0=0x00;P2=0x00;//关蜂鸣器,继电器
	P2=0x80;P0=0xff;P2=0x00;//关led
}
void Timer0Init(void)		//1ms@11.0592MHz,stc生成
{
	EA=1;
	ET0=1;//开总中断,定时器中断
	AUXR |= 0x80;		//定时器1t模式
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		
	TL0 = 0xCD;		//赋初值
	TH0 = 0xD4;		
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//启动定时器
}
void write_PCF8591(uchar add)
{
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(add);
	IIC_WaitAck();
	IIC_Stop();
}
uint read_PCF8591(uchar add)
{
	uint temp;
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(add);
	IIC_WaitAck();
	
	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	temp=IIC_RecByte();
	IIC_WaitAck();
	IIC_Stop();
	return temp;
}
void inter_timer0() interrupt 1
{
	TL0 = 0xCD;		//赋初值
	TH0 = 0xD4;
	count++;
	if(count==200)
	{
		  num=read_PCF8591(0x01);//读取pcf8591,
			num=num*5000/255;//把num 5/255 等分之后乘1000,显示mv
		  count=0;
	}
	buff[0]=10;
	buff[1]=11;
	buff[2]=12;
	buff[3]=13;
	//显示-2-
	buff[4]=num/1000;
	buff[5]=num/100%10;
	buff[6]=num/10%10;
	buff[7]=num%10;
			
	P2=0xc0;P0=adress[i];P2=0x00;
	P2=0xe0;P0=display_num[buff[i]];P2=0x00;
	i++;
	if(i==8)
		i=0;
	
}
void main()
{
	init();//初始化
	Timer0Init();//初始化定时器
	write_PCF8591(0x01);//写pcf8591,注意是0x01;
	while(1);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值