视频讲解
简介
STC8G 系列单片机是不需要外部晶振和外部复位的单片机,是以超强抗干扰/超低价/高速/低功耗 为目标的 8051 单片机,在相同的工作频率下,STC8G 系列单片机比传统的 8051 约快 12 倍(速度快 11.2~13.2 倍),依次按顺序执行完全部的 111 条指令,STC8G 系列单片机仅需 147 个时钟,而传统 8051 则需要 1944 个时钟。STC8G 系列单片机是 STC 生产的单时钟/机器周期(1T)的单片机,是宽电压/高速/ 高可靠/低功耗/强抗静电/较强抗干扰的新一代 8051 单片机,超级加密。指令代码完全兼容传统 8051。
宽工作电压 :1.9~5.5V(工作电压很宽的)
GPIO四种工作模式:
- 准双向口/弱上拉(标准 8051 输出口模式)
- 推挽输出/强上拉
- 高阻输入(电流既不能流入也不能流出)
- 开漏输出
ADC采集模块采用的是IIC的通信方式,因此只需要掌握IIC的通信协议即可轻松的使用ADC采集模块,具体的IIC讲解请看【IIC】IIC通信协议-51单片机程序分析 - 电子校园网
软件流程图
程序分析
AD_Converter.c
/**********************************
作者:特纳斯电子
网站:https://www.mcude.com
联系方式:46580829(QQ)
淘宝店铺:特纳斯电子
**********************************/
/**********************************
包含头文件
**********************************/
#include "AD_Converter.h"
/**********************************
函数定义
**********************************/
/****
*******延时函数
*****/
void AD_Delay(void)
{
uchar i;
i=10;
while(i--);
}
static void AD_Delay1(uchar x)
{
unsigned int i;
for(i=0;i<x;i++);
}
/****
*******总线初始化,拉高释放总线函数
*****/
void AD_Init(void)
{
AD_SCL=1;
AD_Delay();
AD_SDA=1;
AD_Delay();
}
/****
*******开始信号,上升沿
*****/
void AD_Start(void)
{
AD_SDA=1; //发送起始条件的数据信号
AD_Delay();
AD_SCL=1; //发送起始条件的时钟信号
AD_Delay();
AD_SDA=0; //发送起始信号
AD_Delay();
AD_SCL=0; //钳住IIC总线,准备发送或接收数据
AD_Delay();
}
/****
*******结束信号,下降沿
*****/
void AD_Stop(void)
{
AD_SDA=0; //发送结束条件的数据信号
AD_Delay();
AD_SCL=1; //发送结束条件的时钟信号
AD_Delay();
AD_SDA=1; //发送结束信号
AD_Delay();
}
/****
*******IIC总线时钟或应答信号
*****/
void AD_Clock(void)
{
uchar i=0;
AD_SCL=1;
AD_Delay();
while ((AD_SDA==1)&&(i<255))
i++;
AD_SCL=0;
AD_Delay();
}
/****
*******写一个字节
*****/
void AD_Writex(uchar j)
{
uchar i,temp;
temp=j;
for (i=0;i<8;i++)
{
temp=temp<<1;
AD_SCL=0;
AD_Delay();
AD_SDA=CY; //最高位移入PSW寄存器CY位中
AD_Delay();
AD_SCL=1;
AD_Delay();
}
AD_SCL=0;
AD_Delay();
AD_SDA=1;
AD_Delay();
}
/****
*******读取一个字节
*****/
uchar AD_Readx(void)
{
uchar i,j,k=0;
AD_SCL=0;
AD_Delay();
AD_SDA=1;
for (i=0;i<8;i++)
{
AD_Delay();
AD_SCL=1;
AD_Delay();
if (AD_SDA==1)
j=1;
else
j=0;
k=(k<<1)|j; //将8个独立的位放在一个字节中
AD_SCL=0;
}
AD_Delay();
return(k);
}
/****
*******向地址address中写入一个字节的数据info
*****/
void AD_Write_Add(uchar address,uchar info)
{
AD_Start();
AD_Writex(0x1a);
AD_Clock();
AD_Writex(address);
AD_Clock();
AD_Writex(info);
AD_Clock();
AD_Stop();
AD_Delay1(50);
}
/****
*******从地址address中读取一个字节的数据
*****/
uchar AD_Read_Add(uchar address)
{
uchar i;
AD_Start();
AD_Writex(0x1a);
AD_Clock();
AD_Writex(address);
AD_Clock();
AD_Start();
AD_Writex(0x1a | 0x01);
AD_Clock();
i=AD_Readx();
AD_Stop();
AD_Delay1(10);
return(i);
}
/****
*******从CH通道中读取AD值(10位)
*****/
uint AD_ReadValue(uchar CH)
{
int AD_Value;
if(CH == 0)
AD_Value = ((unsigned int)AD_Read_Add(0) << 8) | AD_Read_Add(1);
else if(CH == 1)
AD_Value = ((unsigned int)AD_Read_Add(2) << 8) | AD_Read_Add(3);
return AD_Value;
}
AD_Converter.h
/**********************************
作者:特纳斯电子
网站:https://www.mcude.com
联系方式:46580829(QQ)
淘宝店铺:特纳斯电子
**********************************/
#ifndef _AD_CONVERTER_H_
#define _AD_CONVERTER_H_
/**********************************
包含头文件
**********************************/
#include "main.h"
/**********************************
PIN口定义
**********************************/
sbit AD_SCL=P3^6; //时钟引脚
sbit AD_SDA=P3^7; //数据引脚
/**********************************
函数声明
**********************************/
void AD_Init(void); //AD初始化函数
void AD_Write_Add(uchar address,uchar info); //AD写入数据函数
uchar AD_Read_Add(uchar address); //AD读取数据函数
uint AD_ReadValue(uchar CH); //AD转换
#endif