APT32F1023H8S6(SSOP-24封装)MCU是由爱普特微电子推出的基于平头哥半导体RISC-V内核开发的32位高性能、低成本单片机,现特将基于APT32F1023H8S6单片机的HX711_H720称重传感器原理图和源代码(3位数码管显示)分享给大家,方便大家学习、使用!
制作出来的实物图如下:电路原理图如下:
单片机源程序如下:
/*******************************************************************************文件名: HX711/HX720称重显示模块主控程序 编 写: 李工/Michael Lee 修 改: 版 本: V1.0 备 注: 1.时钟选择MCU内部48M RC振荡器; 2.接口说明: APT32F1023-24PIN ----- 外部设备 ****************** 轻触按键 ****************** PB0.3(Key_1) ----- 清零键 PA0.0(Key_2) ----- 设置键 PA0.15(Key_3) ----- 去皮键 PA0.1(Key_4) ----- 加键 ****************** 3位共阴数码管 ****************** PA0.5 ----- SG12(SEG1_COM) PA0.12 ----- SG9(SEG2_COM) PA0.13 ----- SG8(SEG3_COM) PB0.4 ----- SG11(SEG_A) PA0.14 ----- SG7(SEG_B) PA0.8 ----- SG4(SEG_C) PA0.10 ----- SG2(SEG_D) PA0.11 ----- SG1(SEG_E) PB0.5 ----- SG10(SEG_F) PB0.2 ----- SG5(SEG_G) PA0.9 ----- SG3(SEG_DP) ****************** HX720 ****************** PB0.1 ----- HX720_SCK PB0.0 ----- HX720_DOT 3.免费申请APT32系列单片机/MCU下载仿真器、学习板及FAE技术支持、软硬件 *******************************************************************************/ //加载头文件 #include "sys_clk.h" #include "iostring.h" #include "ifc.h" #include "csp.h" #include <string.h> #include <drv/gpio.h> #include <drv/pin.h> #include <drv/adc.h> #include <drv/bt.h> #include "led_display_weight.h" //加载LED数码管显示称重数值头文件 #include "hx720_drive.h" //加载24位ADC称重芯片HX720驱动程序头文件 //宏定义 /*** 变量类型 ***/ #define uchar unsigned char #define uint unsigned int #define ushort unsigned short #define ulong unsigned long /*** 按键IO口 ***/ #define Key1_Input csi_gpio_port_read(GPIOB0,0x0008)//读取PB0.3端口高低电平值(Key1/清零键输入) //外部函数 /*** 系统启动 ***/ extern void system_init(void); extern void board_init(void); //外部变量 //主函数标志位 //主函数变量 float Weight_Test = 0; //定义、保存测得的重量值(大于0) ulong Weight_24Bit_ADC_Now = 0; //定义、保存当前读取到的HX720称重芯片24位ADC转换值 ulong Weight_24Bit_ADC_Zero = 0; //定义、保存零点重量24位 ADC转换值(实测大约为8752222左右) /********** GPIO口初始化操作 ***********/ /******************************************************************************* 函数名: GPIO_Init() 功 能: GPIO口初始化 参 数: 无 返回值: 无 *******************************************************************************/ void GPIO_Init(void) { //按键 csi_pin_set_mux(PB03, PB03_INPUT); //配置PB0.3端口为输入模式(Key_1键) csi_pin_pull_mode(PB03, GPIO_PULLUP); //上拉输入 //HX720称重芯片 csi_pin_set_mux(PB01, PB01_OUTPUT); //配置PB0.1端口为输出模式(HX720_SCK) csi_pin_output_mode(PB01, GPIO_PUSH_PULL); //推挽输出 csi_pin_set_mux(PB00, PB00_INPUT); //配置PB0.0端口为输入模式(HX720_DOT) csi_pin_pull_mode(PB00, GPIO_PULLNONE); //浮空输入 /*** 数码管 ***/ //SG12(SEG1_COM) csi_pin_set_mux(PA05, PA05_OUTPUT); //配置PA0.5端口为输出模式 csi_pin_output_mode(PA05, GPIO_PUSH_PULL); //推挽输出 //SG9(SEG2_COM) csi_pin_set_mux(PA012, PA012_OUTPUT); //配置PA0.12端口为输出模式 csi_pin_output_mode(PA012, GPIO_PUSH_PULL); //推挽输出 //SG8(SEG3_COM) csi_pin_set_mux(PA013, PA013_OUTPUT); //配置PA0.13端口为输出模式 csi_pin_output_mode(PA013, GPIO_PUSH_PULL); //推挽输出 //SG11(SEG_A) csi_pin_set_mux(PB04, PB04_OUTPUT); //配置PB0.4端口为输出模式 csi_pin_output_mode(PB04, GPIO_PUSH_PULL); //推挽输出 //SG7(SEG_B) csi_pin_set_mux(PA014, PA014_OUTPUT); //配置PA0.14端口为输出模式 csi_pin_output_mode(PA014, GPIO_PUSH_PULL); //推挽输出 //SG4(SEG_C) csi_pin_set_mux(PA08, PA08_OUTPUT); //配置PA0.8端口为输出模式 csi_pin_output_mode(PA08, GPIO_PUSH_PULL); //推挽输出 //SG2(SEG_D) csi_pin_set_mux(PA010, PA010_OUTPUT); //配置PA0.10端口为输出模式 csi_pin_output_mode(PA010, GPIO_PUSH_PULL); //推挽输出 //SG1(SEG_E) csi_pin_set_mux(PA011, PA011_OUTPUT); //配置PA0.11端口为输出模式 csi_pin_output_mode(PA011, GPIO_PUSH_PULL); //推挽输出 //SG10(SEG_F) csi_pin_set_mux(PB05, PB05_OUTPUT); //配置PB0.5端口为输出模式 csi_pin_output_mode(PB05, GPIO_PUSH_PULL); //推挽输出 //SG5(SEG_G) csi_pin_set_mux(PB02, PB02_OUTPUT); //配置PB0.2端口为输出模式 csi_pin_output_mode(PB02, GPIO_PUSH_PULL); //推挽输出 //SG3(SEG_DP) csi_pin_set_mux(PA09, PA09_OUTPUT); //配置PA0.9端口为输出模式 csi_pin_output_mode(PA09, GPIO_PUSH_PULL); //推挽输出 //主频CLO输出 // csi_pin_set_mux(PA02, PA02_CLO); //设置主频输出引脚为PA0.2脚 // csi_clo_config(CLO_SYSCLK, CLO_DIV8); //CLO分频系数为8,输出频率=主频48MHz/8=6MHz } //主函数 int main() { uint i; //定义临时变量,方便后续程序使用 //系统、GPIO口等初始化 system_init(); //系统时钟、TICK等配置(系统时钟48MHz 1分频) // board_init(); //UART2硬件串口配置(系统参数、信息打印用) GPIO_Init(); //GPIO口初始化 //主循环 while(1) { //按下“清零”键,标定零点重量ADC转换值,并对称重值清零 if(Key1_Input==0x0000) //按下“清零”键 { Weight_24Bit_ADC_Now = HX720_Read();//读取当前HX720称重芯片24位ADC转换值 Weight_24Bit_ADC_Zero = Weight_24Bit_ADC_Now;//赋值零点重量24位ADC转换值 Weight_Test = 0; } //当前没有按下“清零”键 else { //获取当前重量24位ADC转换值 Weight_24Bit_ADC_Now = HX720_Read();//先读取当前HX720称重芯片24位ADC转换值 //计算重量值 if(Weight_24Bit_ADC_Now<Weight_24Bit_ADC_Zero)//当前ADC转换值比零点重量ADC转换值小(电子秤被抬起,传感器反方向形变) { //空操作,称重出现错误(也可以做负数显示处理,本案则不显示负数称重) } else //当前ADC转换值大于等于零点重量ADC转换值 { Weight_Test = (Weight_24Bit_ADC_Now - Weight_24Bit_ADC_Zero)/106.5;//单位:g //(106.5数值和使用的传感器线性度有关,可以多次用标准砝码测量、计算获取) Weight_Test = Weight_Test/1000; //单位:Kg } } //延时并显示称重值 for(i=0;i<100;i++) //循环多次显示重量值,并延时 { Display_Weight(Weight_Test); //数码管显示当前称重值 } } return 0; }
复制代码