使用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版权协议,转载请附上原文出处链接和本声明。