本帖最后由 fly1974 于 2019-10-17 08:51 编辑
C的定义格式一般如下,定义全局变量外加各自独立地驱动函数:
float Temper=0;
float Temper2=0;
float Temper3=0;
float Temper4=0;
C++的定义格式一般如下,定义一个统一的类,所有驱动函数公用,因此C++在代码复用上比C++更简洁,更容易扩展:
class Ds18B20
{
public:
Ds18B20(GPIO_TypeDef* GPIOx,uchar Pos);
void GetT_SnrA(void); //运行整个测温及读取温度过程
void SetPar18B20A(void); //设置DS18B20测温分辨率和转换时间
uint16_t CurT; //读取的当前温度,形式为0xXXXX,前三个数字XXX表示当前温度,最后一个X为小于1度的部分(十进制0~9)
uint8_t TaskID;
uchar Step;
uchar PhaseTInit;
uchar temp_low,temp_high; //错误设为char 类型时某些温度范围输出异常
uint temperature,GetTCounter;
uchar ReadTStep;
uchar GetTPhase; //
private:
void SetDir_PortSensorA_IN(void);
void SetDir_PortSensorA_Out(void);
void delay_us(uint DlyInt32); //短延时使用,为uS量级
uchar CRC_OK1(uchar *p1,uchar num); //CRC校验,查表法
void Write_18B20(unsigned char n); //往DS18B20中写一个字节
unsigned char Read_18B20(void); //从DS18B20读取一个字节
uchar Init (void); //18B20总线初始化
uchar Skip(void); //18B20跳过内部ROM匹配
uchar Convert (void); //启动18B20温度转换
uchar ReadDo (void); //发送读取18B20寄存器指令
uchar ReadTemp (void); //传感器出错后返回100度,Error=8,传感器测得温度低于零下25度时返回100度,Error=0;
uchar GetStatus_SnrPort(void); //读取温度传感器信号线输入信号,1为高电平,0为低电平
unsigned long CntTOK;
unsigned long CntTNG;
unsigned long CntInitNG;
uint16_t LastT;
uint16_t EverT; //?
uchar BoxTPol; //温度正负判断辅助变量
uchar LastTPol;
uchar EverTPol;
uchar Error; //传感器出错次数,用来控制干扰滤除
uchar Buf18B20A[9];
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_TypeDef* MyGPIOx;
uint16_t MyGPIOxPin;
uchar MyPinPos;
uint32_t MyGpioMode,MyGpioMode_0;
};
Ds18B20 Ds18B20A(GPIOC,6);
Ds18B20 Ds18B20B(GPIOC,7);
Ds18B20 Ds18B20C(GPIOC,8);
Heater HeaterA(GPIOB,12);
Heater HeaterB(GPIOB,13);
Heater HeaterC(GPIOB,14);
Motor MotorX(GPIOA,0,GPIOB,0,GPIOA,8);
Motor MotorY(GPIOB,8,GPIOC,4,GPIOA,9);
Motor MotorZ(GPIOA,3,GPIOC,3,GPIOA,7);
Motor MotorD(GPIOB,7,GPIOB,1,GPIOA,10);
18B20 C 驱动的常规写法是每个传感器一套函数,如下:
void Write_18B20(unsigned char n)
{
unsigned char i;
for(i=0;i<8;i++)
{
P4DIR|=0X20;
DQ0;
_NOP();_NOP(); //==延时5us===
_NOP();_NOP();_NOP();
if((n&0X01)==0X01)
DQ1;
else DQ0;
n=n>>1;
delay_us(640); //==延时50us 以上===
DQ1;
}
}
void Write_18B202(unsigned char n)
{
unsigned char i;
for(i=0;i<8;i++)
{
P4DIR|=0X10;
DQ20;
_NOP();_NOP(); //==延时5us===
_NOP();_NOP();_NOP();
if((n&0X01)==0X01)
DQ21;
else DQ20;
n=n>>1;
delay_us(640); //==延时50us 以上===
DQ21;
}
}
而18B20 C++ 驱动的常规写法是共用一套函数:
Ds18B20::Ds18B20(GPIO_TypeDef* GPIOx,uchar Pos)
{
uint16_t GPIOxPin;
uint32_t RCC_AHBPeriphGPIOx;
GPIOxPin=(1<<Pos);
if(GPIOx==GPIOA) RCC_AHBPeriphGPIOx=RCC_APB2Periph_GPIOA;
else if(GPIOx==GPIOB) RCC_AHBPeriphGPIOx=RCC_APB2Periph_GPIOB;
else if(GPIOx==GPIOC) RCC_AHBPeriphGPIOx=RCC_APB2Periph_GPIOC;
else if(GPIOx==GPIOD) RCC_AHBPeriphGPIOx=RCC_APB2Periph_GPIOD;
else if(GPIOx==GPIOF) RCC_AHBPeriphGPIOx=RCC_APB2Periph_GPIOF;
GPIO_InitStruct.GPIO_Pin = GPIOxPin;
RCC_APB2PeriphClockCmd(RCC_AHBPeriphGPIOx, ENABLE);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOx, &GPIO_InitStruct);
MyGPIOx=GPIOx;
MyGPIOxPin=GPIOxPin;
MyPinPos=Pos;
Step=0xff;
PhaseTInit=0xff;
GetTCounter=0;
ReadTStep=0xff;
GetTPhase=0xff;
}
void Ds18B20::Write_18B20(unsigned char n)
{
unsigned char i;
for(i=0;i<8;i++)
{
SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk; //关systick中断
SetDir_PortSensorA_Out();
SA_DQ0; delay_us(7); //==延时0us---25us===
if((n&0X01)==0X01)
{
SetDir_PortSensorA_IN();
if(ParSeting==0) SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk; //开systick中断
delay_us(100); //64us delay_us(192)
}
else
{
if(ParSeting==0) SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk; //开systick中断
delay_us(100); //60uS delay_us(160);
SetDir_PortSensorA_IN();
delay_us(16); //10uS delay_us(32);
}
n=n>>1;
}
}
|