题意:使用竞赛板上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);
}