本帖最后由 jinwe 于 2020-3-3 21:33 编辑
用的是877A,往串口发送一组数据。在调试的过程中发现一个问题,单片机发送数据后,如果上位机没运行,过一会后,可能十几分钟,上位机运行连接串口时会出现连不上串口 的提示,显示没有此串口或此串口被占用。这时单片机应该还在正常工作,因为的的LCD1602还能正常显示AD转换的数值。如果将单片机关闭后再开,就能正常连接。上位机能显示正确的数值。上位机如果一直运行的话好像没问题,请问这个问题应该从哪方面入手查错?谢谢了,用的是USB转串口线。// PIC16F877A 配制字设置
// CONFIG
#pragma config FOSC = HS // 高速晶振4M以上
#pragma config WDTE = OFF // 看门狗关闭
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
#include <xc.h>
#include "LCD1602.h"
#include "Uasrt.h"
//发送的数据
unsigned char Data_Buf[10] = {0xAA, 0x44, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA};
/---------------------------------------
//A/D转换用寄存器设置
unsigned int ADbuf = 0; //10位A/D转换,设置16位的unsigend int型寄存器用来暂存A/D转换结果
//---------------------------------------
//A/D中断函数
void __interrupt() ISR(void)
{
if (ADIE && ADIF)
{
ADIF = 0;
Data_Buf[3] = ADRESH;
Data_Buf[4] = ADRESL;
ADbuf = ADRESH * 256 + ADRESL; //将10位A/D转换结果暂存在ADbuf
}
}
//名称: 主函数
void main(void) //主函数,单片机开机后就是从这个函数开始运行
{
TRISA = 0B11111111; //初始化RA5-RA0的输入输出方向
TRISB = 0B11000111; //初始化RB7-RB0的输入输出方向
TRISD = 0B00000000; //初始化RD7-RD0的输入输出方向
PORTA = 0B00000000; //初始化RA5-RA0数值
PORTB = 0B00000000; //初始化RB7-RB0的数值
PORTD = 0B00000000; //初始化RD7-RD0的数值
RC7 = 0;
TRISC7 = 0;
LCD1602_init(); //调用1602液晶初始化函数
LCD1602_DispString(2, 0, "--AN0 TEST--");
LCD1602_DispString(2, 1, " AD=");
//A/D参数设置
ADCON1 = 0B10000000; //设置数据右对齐
ADCON0 = 0B00000001; //选择AN0通道准备进行A/D转换,启动A/D模块
ADIE = 1; //允许产生AD中断
ADIF = 0; //A/D标志位清零
PEIE = 1; //允许外设中断
GIE = 1; //打开总中断
InitUSART();
while (1) //死循环,单片机初始化后,将一直运行这个死循环
{
GO_DONE = 1;
ADbuf =Data_Buf[3] * 256 + Data_Buf[4];
//***1602液晶显示0-255***
LCD1602_Disp(8, 1, (ADbuf / 1000) + '0'); //在第2行的第9列显示仟位
LCD1602_Disp(9, 1, ((ADbuf % 1000) / 100) + '0'); //在第2行的第10列显示百位
LCD1602_Disp(10, 1, (ADbuf % 100) / 10 + '0'); //在第2行的第11列显示十位
LCD1602_Disp(11, 1, ADbuf % 10 + '0'); //在第2行的第12列显示个位
for (char i = 0; i < 10; i++)
{
Send_Char(Data_Buf[i]);
}
|