- 打卡等级:初来乍到
- 打卡总天数:6
- 最近打卡:2026-04-27 18:35:57
已绑定手机
新手上路
- 积分
- 34
|
利用STC8H4K64TL,显示TVOC传感器发出的数据,为什么通讯不上?
传感器的RX接了单片机的P3.1, TX接了单片机的P3.0,
并且是统一供电与接地。以下是测试程序
//<<AICUBE_USER_HEADER_REMARK_BEGIN>>
////////////////////////////////////////
// 文件名称: main.c
// 文件描述: TVOC传感器数据显示
////////////////////////////////////////
//<<AICUBE_USER_HEADER_REMARK_END>>
#include "config.h"
//<<AICUBE_USER_INCLUDE_BEGIN>>
//<<AICUBE_USER_INCLUDE_END>>
//<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
// 共阴数码管段码表
code unsigned char SEG_CODE[] = {
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F
};
code unsigned char SEG_CODE_DOT[] = {
0xBF, 0x86, 0xDB, 0xCF, 0xE6, 0xED, 0xFD, 0x87, 0xFF, 0xEF
};
#define FRAME_HEADER 0x2C
#define FRAME_LENGTH 6
// 变量
unsigned char rxBuffer[6];
unsigned char rxIndex = 0;
unsigned int tvoc_value = 0;
unsigned char comm_ok = 0;
unsigned int display_value = 0;
unsigned char timeout_flag = 0;
// 函数声明
void UpdateDisplay(void);
void SetDisplayNumber(unsigned int num);
void SetDisplayError(void);
void ProcessTVOCData(void);
void LED_Display_Init(void);
void Timer0_Init(void);
//<<AICUBE_USER_GLOBAL_DEFINE_END>>
////////////////////////////////////////
// 项目主函数
////////////////////////////////////////
void main(void)
{
SYS_Init();
EA = 1;
SetDisplayNumber(0);
while (1)
{
if(comm_ok)
{
comm_ok = 0;
timeout_flag = 0;
SetDisplayNumber(tvoc_value);
}
if(timeout_flag == 1)
{
SetDisplayError();
}
}
}
////////////////////////////////////////
// 系统初始化函数
////////////////////////////////////////
void SYS_Init(void)
{
EnableAccessXFR();
IAP_SetTimeBase();
// === P3口初始化(直接配置)===
P3M0 &= ~0x03; // P3.0/P3.1 准双向口
P3M1 &= ~0x03;
// === LED数码管显示初始化 ===
COMEN |= 0x07;
SEGENL = 0xFF;
SEGENH = 0x00;
LEDCKS = 0x07;
LEDCTRL = 0x80;
// === 串口1初始化 (9600, 24MHz) ===
#define BAUDRATE (9600UL)
#define T2_RELOAD (65536 - (SYSCLK / BAUDRATE + 2) / 4)
AUXR |= 0x01; // 定时器2开始运行
AUXR |= 0x04; // 定时器2为1T模式
T2L = (unsigned char)(T2_RELOAD);
T2H = (unsigned char)(T2_RELOAD >> 8);
SCON = 0x50; // 模式1, 8位UART, 允许接收
// === 定时器0初始化 ===
AUXR &= ~0x80; // 12T模式
TMOD &= 0xF0;
TMOD |= 0x01; // 16位模式
TL0 = 0x00;
TH0 = 0x4C; // 50ms初值
TF0 = 0;
TR0 = 1;
// === 使能中断 ===
ES = 1;
ET0 = 1;
}
////////////////////////////////////////
// 定时器0中断 - 50ms
////////////////////////////////////////
void Timer0_ISR(void) interrupt 1
{
static unsigned char count_50ms = 0;
TL0 = 0x00;
TH0 = 0x4C;
count_50ms++;
if(count_50ms >= 60) // 3秒
{
count_50ms = 0;
timeout_flag = 1;
}
}
////////////////////////////////////////
// 处理TVOC传感器数据
////////////////////////////////////////
void ProcessTVOCData(void)
{
unsigned int raw_value;
if(rxBuffer[0] != FRAME_HEADER) return;
raw_value = (unsigned int)(rxBuffer[1] << 8) | rxBuffer[2];
tvoc_value = raw_value;
if(tvoc_value > 999) tvoc_value = 999;
comm_ok = 1;
}
////////////////////////////////////////
// 串口1中断服务程序
////////////////////////////////////////
void UART1_ISR(void) interrupt 4
{
unsigned char ch;
if(RI)
{
RI = 0;
ch = SBUF;
if(rxIndex == 0 && ch == FRAME_HEADER)
{
rxBuffer[rxIndex++] = ch;
}
else if(rxIndex >= 1 && rxIndex < FRAME_LENGTH)
{
rxBuffer[rxIndex++] = ch;
if(rxIndex == FRAME_LENGTH)
{
ProcessTVOCData();
rxIndex = 0;
}
}
else
{
rxIndex = 0;
}
}
if(TI)
{
TI = 0;
}
}
////////////////////////////////////////
// 数码管显示函数
////////////////////////////////////////
void UpdateDisplay(void)
{
unsigned int num = display_value;
unsigned char hundreds, tens, units;
if(num > 999) num = 999;
hundreds = num / 100;
tens = (num % 100) / 10;
units = num % 10;
COM0_DC_L = SEG_CODE_DOT[hundreds];
COM1_DC_L = SEG_CODE[tens];
COM2_DC_L = SEG_CODE[units];
}
void SetDisplayNumber(unsigned int num)
{
display_value = num;
UpdateDisplay();
}
void SetDisplayError(void)
{
COM0_DC_L = SEG_CODE[1];
COM1_DC_L = SEG_CODE[2];
COM2_DC_L = SEG_CODE[3];
}
//<<AICUBE_USER_FUNCTION_IMPLEMENT_BEGIN>>
//<<AICUBE_USER_FUNCTION_IMPLEMENT_END>>
|
|