CH32V103C8T6 与ht7038 SPI通讯

使用CH32V103C8T6的SPI与ht7038通讯。

 

 

 波形

 必须获取rChipID数据才能确信SPI通讯成功。

 

  ht7038.h

/*
 * HT7038.h
 *
 *  Created on: 2022年5月20日
 *      Author: armxu
 */

#ifndef USER_HT7038_H_
#define USER_HT7038_H_
#include "stdint.h"
#include "ch32v10x_spi.h"
#define CS_PIN_PORT  GPIOA
#define CS_PIN       GPIO_Pin_4
#define CS(X)        GPIO_WriteBit(CS_PIN_PORT, CS_PIN, X)
//===================================================
//          定义HT7038的数据寄存器
//===================================================
#define rDeviceID   0x00    //7038 Device ID
#define rPa         0x01    //A相有功功率
#define rPb         0x02    //B相有功功率
#define rPc         0x03    //C相有功功率
#define rPt         0x04    //合相有功功率

#define rQa         0x05    //A相无功功率
#define rQb         0x06    //B相无功功率
#define rQc         0x07    //C相无功功率
#define rQt         0x08    //合相无功功率

#define rSa         0x09    //A相视在功率
#define rSb         0x0A    //B相视在功率
#define rSc         0x0B    //C相视在功率
#define rSt         0x0C    //合相视在功率

#define rUaRms          0x0D    //A相电压有效值
#define rUbRms          0x0E    //B相电压有效值
#define rUcRms          0x0F    //C相电压有效值

#define rIaRms          0x10    //A相电流有效值
#define rIbRms          0x11    //B相电流有效值
#define rIcRms          0x12    //C相电流有效值
#define rItRms          0x13    //ABC相电流矢量和的有效值

#define rPfa        0x14    //A相功率因数
#define rPfb        0x15    //B相功率因数
#define rPfc        0x16    //C相功率因数
#define rPft        0x17    //合相功率因数

#define rPga        0x18    //A相电流与电压相角
#define rPgb        0x19    //B相电流与电压相角功率因数
#define rPgc        0x1a    //C相电流与电压相角

#define rINTFlag    0x1b    //中断标志,读后清零 ☆

#define rFreq       0x1C    //线频率
#define rEFlag      0x1d    //电能寄存器的工作状态,读后清零☆

#define rEpa        0x1e    //A相有功电能
#define rEpb        0x1f    //B相有功电能
#define rEpc        0x20    //C相有功电能
#define rEpt        0x21    //合相有功电能

#define rEqa        0x22    //A相无功电能
#define rEqb        0x23    //B相无功电能
#define rEqc        0x24    //C相无功电能
#define rEqt        0x25    //合相无功电能

#define rYUaUb      0x26    //Ua与Ub的电压夹角            ☆
#define rYUaUc      0x27    //Ua与Uc的电压夹角            ☆
#define rYUbUc      0x28    //Ub与Uc的电压夹角            ☆

#define rTPSD       0x2a    //温度传感器的输出
#define rURmst      0x2b    //ABC电压矢量和的有效值

#define rS_Flag     0x2c    //存放断相、相序、SIG信号的有效值

#define rBackReg      0x2d  //通讯数据备份寄存器☆
#define rComChksum  0x2e    //通讯校验和寄存器☆
#define rSampleIA   0x2f    //A相电流通道ADC采样数据☆
#define rSampleIB   0x30    //B相电流通道ADC采样数据☆
#define rSampleIC   0x31    //C相电流通道ADC采样数据☆

#define rSampleUA   0x32    //A相电压通道ADC采样数据☆
#define rSampleUB   0x33    //B相电压通道ADC采样数据☆
#define rSampleUC   0x34    //C相电压通道ADC采样数据☆

#define rEsa    0x35    //A相视在电能☆
#define rEsb    0x36    //B相视在电能☆
#define rEsc    0x37    //C相视在电能☆
#define rEst    0x38    //合相视在电能☆

#define rFstCntA        0x39    //A相快速脉冲计数☆
#define rFstCntB        0x40    //B相快速脉冲计数☆
#define rFstCntC        0x40    //C相快速脉冲计数☆
#define rFstCntT        0x41    //合相快速脉冲计数☆

#define rPFlag      0x3d    //有功和无功功率方向,正向为0,负向为1

#define rChkSum 0x3e    //校表数据校验寄存器(三相四线模式下是0x01D4CD;三相三线模式下是0x01E0CD;)


#define rVrefgain       0x5c    //Vref自动补偿系数
#define rChipID       0x5d  //芯片版本指示器0X7026E0
#define rChkSum1        0x5e    //新增校表寄存器校验和

//==================================================================
//              HT7038校表寄存器定义
//==================================================================
#define w_ModeCfg           0X01    //模式相关控制
#define w_PGACtrl           0X02    //ADC增益选择
#define w_EMUCfg                0X03    //EMU模块配置寄存器
#define w_PgainA                0X04    //A相有功功率增益
#define w_PgainB                0X05    //B相有功功率增益
#define w_PgainC                0X06    //C相有功功率增益
#define w_QgainA                0X07    //A相无功功率增益
#define w_QgainB                0X08    //B相无功功率增益
#define w_QgainC                0X09    //C相无功功率增益
#define w_SgainA                0X0A    //A相视在功率增益
#define w_SgainB                0X0B    //B相视在功率增益
#define w_SgainC                0X0C    //C相视在功率增益
#define w_PhSregApq0        0X0D    //A相相位校正0
#define w_PhSregBpq0        0X0E    //B相相位校正0
#define w_PhSregCpq0        0X0F    //C相相位校正0
#define w_PhSregApq1        0X10    //A相相位校正1
#define w_PhSregBpq1        0X11    //B相相位校正1
#define w_PhSregCpq1        0X12    //C相相位校正1
#define w_PoffsetA          0X13    //A相有功功率offset校正
#define w_PoffsetB          0X14    //B相有功功率offset校正
#define w_PoffsetC          0X15    //C相有功功率offset校正
#define w_QPhscal           0X16    //无功相位校正
#define w_UgainA                0X17    //A相电压增益
#define w_UgainB                0X18    //B相电压增益
#define w_UgainC                0X19    //C相电压增益
#define w_IgainA                0X1A    //A相电流增益
#define w_IgainB                0X1B    //B相电流增益
#define w_IgainC                0X1C    //C相电流增益
#define w_Istarup           0X1D    //起动电流阈值设置
#define w_Hfconst           0X1E    //高频脉冲输出设置
#define w_FailVoltage   0X1F    //失压阈值设置

#define w_QoffsetA          0X21    //A相无功功率offset校正
#define w_QoffsetB          0X22    //B相无功功率offset校正
#define w_QoffsetC          0X23    //C相无功功率offset校正
#define w_UaRmsoffse        0X24    //A相电压有效值offset校正
#define w_UbRmsoffse        0X25    //B相电压有效值offset校正
#define w_UcRmsoffse        0X26    //C相电压有效值offset校正
#define w_IaRmsoffse        0X27    //A相电流有效值offset校正
#define w_IbRmsoffse        0X28    //B相电流有效值offset校正
#define w_IcRmsoffse        0X29    //C相电流有效值offset校正
#define w_UoffsetA          0X2A    //A相电压通道ADC offset校正
#define w_UoffsetB          0X2B    //B相电压通道ADC offset校正
#define w_UoffsetC          0X2C    //C相电压通道ADC offset校正
#define w_IoffsetA          0X2D    //A相电流通道ADC offset校正
#define w_IoffsetB          0X2E    //B相电流通道ADC offset校正
#define w_IoffsetC          0X2F    //C相电流通道ADC offset校正
#define w_EMUIE                 0X30    //中断使能
#define w_ModuleCFG         0X31    //电路模块配置寄存器
#define w_AllGain           0X32    //全通道增益,用于校正ref自校正
#define w_HFDouble          0X33    //脉冲常数加倍选择
#define w_LineGain          0X34    //基波增益校正
#define w_PinCtrl           0X35    //数字pin上下拉电阻选择控制
#define w_Pstartup          0X36    //起动功率阈值设置
#define w_Iregion0          0X37    //相位补偿区域设置寄存器
#define w_Iregion1          0X60    //相位补偿区域设置寄存器1
#define w_PhSregApq2        0X61    //A相相位校正2
#define w_PhSregBpq2        0X62    //B相相位校正2
#define w_PhSregCpq2        0X63    //C相相位校正2
#define w_PoffsetAL         0X64    //A相有功功率offset校正低字节
#define w_PoffsetBL         0X65    //B相有功功率offset校正低字节
#define w_PoffsetCL         0X66    //C相有功功率offset校正低字节
#define w_QoffsetAL         0X67    //A相无功功率offset校正低字节
#define w_QoffsetBL         0X68    //B相无功功率offset校正低字节
#define w_QoffsetCL         0X69    //C相无功功率offset校正低字节
#define w_ItRmsoffset       0X6A    //电流矢量和offset校正寄存器
#define w_TPSoffset         0X6B    //TPS初值校正寄存器
#define w_TPSgain           0X6C    //TPS斜率校正寄存器
#define w_TCcoffA           0X6D    //Vrefgain的二次系数
#define w_TCcoffB           0X6E    //Vrefgain的一次系数
#define w_TCcoffC           0X6F    //Vrefgain的常数项
#define w_EMCfg             0X70    //新增算法控制寄存器


//===================================================================================
extern void HT7038_init();                          //初始化HT7038
extern uint32_t Read7038(uint8_t rCmd);        //读HT703824位寄存器
extern void Write7038(uint8_t wCmd,uint32_t Dat);//写HT703824位寄存器


//====================================================================================


#endif /* USER_HT7038_H_ */

 ht7038.c

/*
 * HT7038.C
 *
 *  Created on: 2022年5月20日
 *      Author: armxu
 */


#include "HT7038.h"


//=================================================================
/*******************************************************************************
* Function Name  : SPI1_ReadWriteByte
* Description    : SPI1 read or write one byte.
* Input          : TxData: write one byte data.
* Return         : Read one byte data.
*******************************************************************************/
uint8_t SPI1_ReadWriteByte(uint8_t TxData)
{
    u8 i=0;
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET)
    {
        i++;
        if(i>50)return 0;
    }
    SPI_I2S_SendData(SPI1, TxData);
    i=0;
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET)
    {
        i++;
        if(i>50)return 0;
    }
    return SPI_I2S_ReceiveData(SPI1);
}
void HT7038_init()
{
   Write7038(0xD3,0X000000);//软件复位
   Delay_Us(100);           //100us的低电平
}
//=================================================================
//名称: long Read7038(Cmd)
//说明: 读ATT7022B24位寄存器
//注意:
//=================================================================
uint32_t Read7038(uint8_t rCmd)
{
    uint8_t Dat[3];//
    u32 iRet=0;
    CS(0);
    SPI1_ReadWriteByte(rCmd);
    Dat[0]=SPI1_ReadWriteByte(0xff);
    Dat[1]=SPI1_ReadWriteByte(0xff);
    Dat[2]=SPI1_ReadWriteByte(0xff);
    iRet= (Dat[0]<<16)|(Dat[1]<<8)|(Dat[2]);
    CS(1);

    return iRet;                //返回数据
}
//=================================================================
//名称: Write7038(unsigned char wCmd,long Dat)
//说明: 写ATT7022B 24位寄存器
//注意:
//=================================================================
void Write7038(uint8_t wCmd,uint32_t Dat)
{
    uint8_t Ddat[2];
    //提前拆分数据
    Ddat[1]=(Dat >> 16) & 0xff;
    Ddat[0]=(Dat >> 8) & 0xff;
    CS(0);

    SPI1_ReadWriteByte(wCmd);
    //32位拆分成3个8字节数据发送
    SPI1_ReadWriteByte(Ddat[1]);//高位先发送
    SPI1_ReadWriteByte(Ddat[0]);
    SPI1_ReadWriteByte(Dat);

    CS(1);
}


main.c

/********************************** (C) COPYRIGHT *******************************
 * File Name          : main.c
 * Author             : WCH
 * Version            : V1.0.0
 * Date               : 2020/04/30
 * Description        : Main program body.
 * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
 * SPDX-License-Identifier: Apache-2.0
 *******************************************************************************/

/*
 *@Note
 串口打印调试例程:
 USART1_Tx(PA9)。
 本例程演示使用 USART1(PA9) 作打印调试口输出。

*/

#include "debug.h"
#include "HT7038.h"
/* Global typedef */

/* Global define */
uint32_t result;
/* Global Variable */
/*******************************************************************************
* Function Name  : SPI_FullDuplex_Init
* Description    : Configuring the SPI for full-duplex communication.
* Input          : None
* Return         : None
*******************************************************************************/
void SPI_Master_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    SPI_InitTypeDef SPI_InitStructure;

    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1, ENABLE );

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_SetBits(GPIOA, GPIO_Pin_4);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init( GPIOA, &GPIO_InitStructure );

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init( GPIOA, &GPIO_InitStructure );

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init( GPIOA, &GPIO_InitStructure );


    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;;
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
    SPI_InitStructure.SPI_NSS =  SPI_NSS_Soft;
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_Init( SPI1, &SPI_InitStructure );
//    SPI_SSOutputCmd( SPI1, DISABLE );
    SPI_Cmd( SPI1, ENABLE );
}

/*********************************************************************
 * @fn      main
 *
 * @brief   Main program.
 *
 * @return  none
 */
int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    Delay_Init();
    USART_Printf_Init(115200);
    SPI_Master_Init();
    HT7038_init();
    printf("SystemClk:%d\r\n", SystemCoreClock);

    printf("This is sssprintf example\r\n");

    while(1)
    {

        result=Read7038(rChipID);
        printf("  rChipID=0x%lx\r\n",result);
        result=Read7038(rDeviceID); //0x00
        printf("rDeviceID=0x%lx\r\n",result);
        Delay_Ms(160);
    }

}

====================================================================

电压增益设置

 51读取电压例程

/*
本程序为HT7038测量3相3线电压,通过电阻分压方式
*/

#include <intrins.h>
#include <string.h>
#include <config.h>
#include <STC15Fxxxx.h>

#include <HT7038.h>
#include <att7022Data.h>
#include <delay.h>

#include "stdio.h"

//#define _DEBUG
#define  SendBytes    28

uchar  buf_r[SendBytes];//{0x00}; //	ATT7022B的4个字节读缓冲区;

#define StrLen 6

	union UN_RMS{
				uchar   volChar[4]; //电压字节数组
				unsigned long  volFloat;  //电压浮点数
		};
union UN_RMS U_rms; 	
unsigned long  date;
const unsigned char FormaDot2f[]="%.2f";
const unsigned char FormaDot3f[]="%.3f";
unsigned char *strFormatUab;
unsigned char *strFormatUac;
unsigned char *strFormatUbc;
void Uart1_SendChar(unsigned char Udat) ;
void Uart1Init(void);
//=================================================================

void main()									   //HT7038测试程序
{
 
	DWord xdata rData;
//	float xdata Uab;
//  float xdata Ubc;
//  float xdata Uac;
	unsigned char count;
	float  Uab;
	float  Ubc;
	float  Uac;
	
	float  tUab=0;
	float  tUbc=0;
	float  tUac=0;
	float  Hz;
	
uchar xdata strUab[StrLen];
uchar xdata strUbc[StrLen];
uchar xdata strUac[StrLen];
	
uchar j;
P1M0=0X00;
P1M1=0X00;
P2M0=0X00;
P2M1=0X00;	

//		 IO_Init();		 		 //端口初始化 
	
	Uart1Init();
	delay_ms(50);

	EA = 1;
	
	
	HT7038_init();							//HT7038初始化                          
		 
	
// Write7038(0xC3,0x000000);					//清校表数据
//********
// Write7038(0xD3,0X000000);//软件复位
   Write7038(0xC9,0x00005A);					//设置可以写入校表寄存器的参数
//	delay_ms(1);	
//											 
// 



//		 //  delay_ms(5);	
	Write7038(w_ModeCfg,0xF954);//开启电压通道ADC	,更新速率为慢速0xF9FE
	Write7038(w_EMCfg,0x0003);//设置三相三线模式0x0111
	Write7038(w_EMUIE,0xFFFF);
	Write7038(w_ModuleCFG,0x3404);//0x3404
	//Write7038(w_ModuleCFG,0x3537);//测温度

 Write7038(w_PGACtrl,0x0000);	//ADC增益配置为三相电压通道ADC增益放大2倍 bit09和bit08为设置电压通道增益位

//  Write7038(w_UaRmsoffse,0x0062);//A相电压有效值offset校正
//  Write7038(w_UbRmsoffse,0x0062);//B相电压有效值offset校正
//	
//	Write7038(w_UcRmsoffse,0x0062);//C相电压有效值offset校正0xAa9e
	
	Write7038(w_EMUCfg,0x0201);	//EMU模块配置寄存器0x0201
	//Write7038(w_EMUCfg,0XF804);	//EMU模块配置寄存器0x0201
	//Write7038(w_FailVoltage,0x0010);//原设置好的
//	Write7038(w_FailVoltage,0xd200);
	

//	
	Write7038(w_UgainA,0x8454);//Uab电压增益0x8684
	Write7038(w_UgainC,0x845F);//Ubc电压增益0x8684
	Write7038(w_UgainB,0x845A);//Uac相电压增益需单独计算,不与A相C相相同
  
	 
 Write7038(0xC9,0x000000);	//	*********
 Write7038(0xC6,0x000000); //设置可以读计量寄存器的参数
// date= Read7038(rChkSum);	
// printf("data=%lx\r\n",date); 
// Write7038(0xD3,0X000000);//软件复位
// Write7038(0xC9,0x00005A);					//设置可以写入校表寄存器的参数
Write7038(w_EMUCfg,0x0201);	//EMU模块配置寄存器0x0201
// Write7038(w_EMCfg,0x0001);//设置三相三线模式0x0111
Write7038(w_ModeCfg,0xF954);//开启电压通道ADC	,更新速率为慢速0xF9FE
// delay_ms(100);	
	while(1)
{
	
	date= Read7038(rChkSum);
  printf("date=%lx\r\n",date); 
for(count=0;count<10;count++)
{	
rData.Long_Data = Read7038(rFreq);		//读取频率
U_rms.volChar[0]=buf_r[0] = rData.da[0];
U_rms.volChar[1]=buf_r[1] = rData.da[1];
U_rms.volChar[2]=buf_r[2] = rData.da[2];
U_rms.volChar[3]=buf_r[3] = rData.da[3];
//printf("buf_r=%d %d %d %d\r\n",buf_r[0],buf_r[1],buf_r[2],buf_r[3]);
	#ifdef _DEBUG
    printf("rFreq=%ld\r\n",rData.Long_Data);
		 #endif
    Hz=(float)(rData.Long_Data/8192);	
//	printf("Hz=%.2f\r\n",Hz);
rData.Long_Data = Read7038(rUaRms);		//读取Uab电压 
U_rms.volChar[0]=buf_r[4] = rData.da[0];
U_rms.volChar[1]=buf_r[5] = rData.da[1];
U_rms.volChar[2]=buf_r[6] = rData.da[2];
U_rms.volChar[3]=buf_r[7] = rData.da[3];
#ifdef _DEBUG	
printf("Uabrms=%ld\r\n",rData.Long_Data);
	#endif
Uab=(float)U_rms.volFloat/8192;
  
	

rData.Long_Data = Read7038(rUbRms);		//读取Uac电压 内部计算得出
U_rms.volChar[0]=buf_r[8] = rData.da[0];
U_rms.volChar[1]=buf_r[9] = rData.da[1];
U_rms.volChar[2]=buf_r[10] = rData.da[2];
U_rms.volChar[3]=buf_r[11] = rData.da[3];
#ifdef _DEBUG
printf("Uacrms=%ld\r\n",rData.Long_Data);
#endif
Uac=(float)U_rms.volFloat/8192;  //长整型强制转换成浮点型,否者液晶显示数据为0
 
 
rData.Long_Data = Read7038(rUcRms);		//读取Ubc电压
U_rms.volChar[0]=buf_r[12] = rData.da[0];
U_rms.volChar[1]=buf_r[13] = rData.da[1];
U_rms.volChar[2]=buf_r[14] = rData.da[2];
U_rms.volChar[3]=buf_r[15] = rData.da[3];
#ifdef _DEBUG
printf("Ubcrms=%ld\r\n",rData.Long_Data);
#endif
Ubc=(float)U_rms.volFloat/8192;


rData.Long_Data = Read7038(rYUaUc);		//读取UaUc之间的夹角		
buf_r[16] = rData.da[0];//&0x0f;
buf_r[17] = rData.da[1];
buf_r[18] = rData.da[2];
buf_r[19] = rData.da[3];

rData.Long_Data = Read7038(rS_Flag);		//读取标志状态寄存器,判断相序 		
buf_r[20] = rData.da[0];
buf_r[21] = rData.da[1];
buf_r[22] = rData.da[2];
buf_r[23] = rData.da[3];

	rData.Long_Data = Read7038(rDeviceID);//读HT7038校表数据检验和  rChipID    rChkSum rDeviceID
	buf_r[24] = rData.da[0];						//HT7038 三相三线制校表数据检验和为0x01e0cd
	buf_r[25] = rData.da[1];	
	buf_r[26] = rData.da[2];
	buf_r[27] = rData.da[3];
//	printf("rChipID=%lx\r\n",rData.Long_Data);	

  
if((buf_r[23]&0x05)==0x05)
{
	buf_r[0] =0x00;
	buf_r[1] =0x00;
	buf_r[2] =0x00;
	buf_r[3] =0x00;
}
//tUab=tUab+Uab;
//tUbc=tUbc+Ubc;
//tUac=tUac+Uac;
//delay_ms(460);	
}
//	Uab=tUab/(10);
//  Ubc=tUbc/(10);
//  Uac=tUac/(10);
//tUab=0;
//tUbc=0;
//tUac=0;
if(Uab< 6) strFormatUab=&FormaDot3f; 
if(Uab>=6) strFormatUab=&FormaDot2f; 

if(Ubc< 6) strFormatUbc=&FormaDot3f; 
if(Ubc>=6) strFormatUbc=&FormaDot2f;

if(Uac< 6) strFormatUac=&FormaDot3f; 
if(Uac>=6) strFormatUac=&FormaDot2f;

sprintf(strUab,strFormatUab,Uab);
sprintf(strUbc,strFormatUbc,Ubc);
sprintf(strUac,strFormatUac,Uac);
printf("\r\n");
printf("\r\n");
printf("\r\n");
printf("HT7038电阻降压测量PT电压\r\n");
printf("rChipID=%lx\r\n",rData.Long_Data);
//printf("Hz=%.2f\r\n",Hz);
printf("Uab=%s\r\n",strUab);
printf("Ubc=%s\r\n",strUbc);
printf("Uac=%s\r\n",strUac);
//		for(j=24;j<SendBytes;j++)
//		{
//			Uart1_SendChar(buf_r[j]);
//		}
// Write7038(0xC9,0x00005A);	
delay_ms(340);	
delay_ms(240);	
delay_ms(240);	
delay_ms(240);	
//delay_ms(240);	
//delay_ms(240);	
//delay_ms(240);	
//delay_ms(240);	
}
}

/***********************************************
函数名称:Uart1_Init
功    能:串口1初始化函数
入口参数:无
返 回 值:无	
备    注:STC15F2K60S2单片机串口1
					可以选择定时器1或者定时器2作为波特率发生器
************************************************/
void Uart1Init(void)		//115200bps@11.0592MHz
{
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x01;		//串口1选择定时器2为波特率发生器
	AUXR &= 0xFB;		//定时器2时钟为Fosc/12,即12T
	T2L = 0xFE;		//设定定时初值
	T2H = 0xFF;		//设定定时初值
	AUXR |= 0x10;		//启动定时器2
	ES=1;			//打开串口中断
	EA=1;
//			IE=0X90;
	TI=1;
}
/***********************************************
*函数名称:Uart1_SendChar
*功    能:串口1发送单个字符函数
*入口参数:Udat:欲发送的数据
*返 回 值:无	
*备    注:无
************************************************/
 void Uart1_SendChar(unsigned char Udat) 
 {
	EA=0;			//禁止中断,防止数据发送出错。
	SBUF=Udat;	    //将数据放入发送缓冲区
	while(!TI);		//等待发送结束
		TI=0;     		//清零TI
	EA=1;			//使能中断
 }


版权声明:本文为armcsdn原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。