微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STC89C52单片机UART AD DA测试实验

STC89C52单片机UART AD DA测试实验

时间:11-21 来源:互联网 点击:

函数名称:Stop_IIC
函数功能:IIC总线的终止条件
参数介绍:无
返回值:
注意事项:具体请参考相关的文档
///////////////////////////////////////////////////////////////////////////

void Stop_IIC()
{
sda=0;
DelayUs();
scl=1;
DelayUs();
sda=1;
DelayUs();
}
///////////////////////////////////////////////////////////////////////////

函数名称:Response_IIC
函数功能:IIC总线的应答条件
参数介绍:cNumber: 定义一个延时的变量
返回值:
注意事项:具体请参考相关的文档
///////////////////////////////////////////////////////////////////////////
void Response_IIC()//
{
uchar cNumber=0;
scl=1;
DelayUs();
while((sda==1)&&(cNumber<255))
cNumber++; //加一个等待时间防止程序一直处在检测状态
scl=0;//这个是应答和非应答综合的应答条件
DelayUs();
}
///////////////////////////////////////////////////////////////////////////

函数名称:Write_byte
函数功能:通过IIC总线向PCF8591写入一个字节
参数介绍:cData:要写入的字节的值
cNumber: 定义for语句中用到的变量,因为IIC总线是一位一位写入的,所
以需要循环8次
cTempValue: 临时的一个变量
返回值:
注意事项:具体请参考相关IIC文档
///////////////////////////////////////////////////////////////////////////
void Write_byte(uchar cData)
{
uchar cNumber,cTempValue;
cTempValue=cData;
for(cNumber=0;cNumber<8;cNumber++) //循环8次,完成一个字节的写入
{
cTempValue=cTempValue<1; //CY=cTempValue^7;
scl=0;
DelayUs();
sda=CY; //CY 进位标志位
DelayUs();
scl=1;
DelayUs();
}
scl=0;
DelayUs();
sda=1;
DelayUs();
}
///////////////////////////////////////////////////////////////////////////

函数名称:Read_byte
函数功能:通过IIC总线,从器件里读取一个字节,因为必须是一位一位读,所以需要
循环8次
参数介绍:cNumber:for句用到的循环变量
返回值: cValue:返回读取到的字节
注意事项:请参考相应的文档
///////////////////////////////////////////////////////////////////////////

uchar Read_byte()
{
uchar cNumber=0,cValue=0;
scl=0;
DelayUs();
sda=1;
DelayUs();
for(cNumber=0;cNumber<8;cNumber++) //完成对一个字节的读取
{
scl=1;
DelayUs();
cValue=(cValue<1)|sda; //通过循环得到一个字节
scl=0;
DelayUs();
}
return cValue; //返回读取到的字节
}
///////////////////////////////////////////////////////////////////////////

函数名称:Read_channel
函数功能:选取PCF8591的AD输入通道,然后再读出采集到数值,即电压值
参数介绍:无
返回值: cValue:返回采集到的数据
注意事项:无
///////////////////////////////////////////////////////////////////////////
uchar Read_channel(uchar cChannel)//PCF通道选择函数
{
uchar cValue; //从这个通道读出数据是大多数学习者
Start_IIC(); //比较模糊的地方
Write_byte(0x90); //这个时序请按照AT24C02的任意读时序图进行操作
Response_IIC();
Write_byte(0x40|cChannel);
Response_IIC();
Start_IIC();
Write_byte(0x91); //给IIC器件写入相应的命令
Response_IIC();
cValue=Read_byte(); //读取采集到的数据
Stop_IIC();

return cValue; //返回采集到的数据
}
///////////////////////////////////////////////////////////////////////////

函数名称:Write_Data
函数功能:把要写入的数据写入PCF8591,让其开始转换,然后输出相应的模拟值
参数介绍:cData:要写入PCF8591的数据
返回值:
注意事项:无
///////////////////////////////////////////////////////////////////////////
void Write_Data(uchar cData)
{
Start_IIC();//以下严格按照PCF8591写时序图
Write_byte(0x90);//进行操作
Response_IIC();
Write_byte(0x40);
Response_IIC();
Write_byte(cData);
Response_IIC();
Stop_IIC();
}
///////////////////////////////////////////////////////////////////////////

函数名称:Init_UART
函数功能:设定UART的波特率,配置定时器0每一毫秒钟中断一次,打开相应的中断
定时器1产生波特率,让定时器0开始中断计时
参数介绍:无
返回值:
注意事项:无
///////////////////////////////////////////////////////////////////////////
void Init_UART()
{
TMOD=0x21;//定时器1工作方式2,8位自动充装
TH1=0xfd; //通信波特率定为9600bps
TL1=0xfd; //晶振为11.0592M的

TL0=TIMS;
TH0=TIMS>>8; //定时1秒所要装的初值
SM0=0; //选择串行口工作方式1
SM1=1;

EA=1; //打开全局中断
ET0=1; //打开定时器0中断
TR0=1; //让定时器0开始工作
TR1=1; //波特率的产生依靠是定时器1的溢出率
}
///////////////////////////////////////////////////////////////////////////

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top