因为你打开串口后程序里的延时改变了,造成屏幕时序不匹配
你如果是调用了串口子程序造成的,那么建议你重新写一下那个子程序,用非延时的方法。
建议下载个串口监视软件,参数设置里port选好端口,软件会记录下该端口所有收发数据,看数据对不对。数据对的话,说明串口调试助手有问题;数据错的话,说明单片机有问题。
#include<reg51h>
#define uchar unsigned char
uchar code ledtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//共阳级数码管码表0-9
uchar time,scanled;
uchar disdat[2];
bit flag=0;
void dischg() //显示码转换
{
disdat[0]=s_dat/10; //秒转换
disdat[1]=s_dat%10;
}
void t0isr() interrupt 1 //秒计时
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
time++;
if(time>=20)
{
time=0;
s_dat++;
flag=1;
}
}
void t1isr() interrupt 3 //显示控制
{
TH1=(65536-4000)/256;
TL1=(65536-4000)%256;
duan=1;
P0=0xff; //消隐
duan=0;
wei=1;
P0=1<<scanled; //位码
wei=0;
duan=1;
P0=disdat[scanled];
duan=0;
scanled++;
scanled%=2; //共8位显示
}
main()
{
TMOD=0x21; //定时器0和1都为模式1
TH0=(65536-50000)/256; //定时器0,50毫秒中断一次
TL0=(65536-50000)%256;
TH1=0xfd;
TL1=0xfd;
SCON=0x40;
TR1=1;
TR0=0;
ET0=1;
EA=1;
scanled=0;
time=0;
dischg();
while(1)
{
if(flag)
{
flag=0;
SBUF=s_dat;
while(TI==0);
TI=0;
}
}
}
给你一个DS18B20温度采集程序吧
// 温度采集DS18B20 程序代码
#include<reg52h>
#include<stdioh>
#define uchar unsigned char
#define uint unsigned int
#define jump_ROM 0xCC
#define start 0x44
#define read_EEROM 0xBE
sbit DQ = P2^3; //DS18B20数据口
sbit beep=P1^2; //蜂鸣器
uint warn_l=5; //定义温度下限值
uint warn_h=17; //定义温度上限值
unsigned char TMPH,TMPL;
uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/
名称 : delay()
功能 : 延时,延时时间大概为140US。
输入 : 无
输出 : 无
/
void delay_1()
{
int i,j;
for(i=0; i<=10; i++)
for(j=0; j<=2; j++)
;
}
/
名称 : delay()
功能 : 延时函数
输入 : 无
输出 : 无
/
void delay(uint N)
{
int i;
for(i=0; i<N; i++)
;
}
/
名称 : Delay_1ms()
功能 : 延时子程序,延时时间为 1ms x
输入 : x (延时一毫秒的个数)
输出 : 无
/
void Delay_1ms(uint i)//1ms延时
{
uchar x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
/
名称 : Reset()
功能 : 复位DS18B20
输入 : 无
输出 : 无
/
uchar Reset(void)
{
uchar deceive_ready;
DQ = 0;
delay(29);
DQ = 1;
delay(3);
deceive_ready = DQ;
delay(25);
return(deceive_ready);
}
/
名称 : read_bit()
功能 : 从DS18B20读一个位值
输入 : 无
输出 : 从DS18B20读出的一个位值
/
uchar read_bit(void)
{
uchar i;
DQ = 0;
DQ = 1;
for(i=0; i<3; i++);
return(DQ);
}
/
名称 : write_bit()
功能 : 向DS18B20写一位
输入 : bitval(要对DS18B20写入的位值)
输出 : 无
/
void write_bit(uchar bitval)
{
DQ=0;if(bitval==1)
DQ=1;
delay(5);
DQ=1;
}
/
名称 : read_byte()
功能 : 从DS18B20读一个字节
输入 : 无
输出 : 从DS18B20读到的值
/
uchar read_byte(void)
{
uchar i,m,receive_data;
m = 1;
receive_data = 0;
for(i=0; i<8; i++)
{
if(read_bit())
{
receive_data = receive_data + (m << i);
}
delay(6);
}
return(receive_data);
}
/
名称 : write_byte()
功能 : 向DS18B20写一个字节
输入 : val(要对DS18B20写入的命令值)
输出 : 无
/
void write_byte(uchar val)
{
uchar i,temp;
for(i=0; i<8; i++)
{
temp = val >> i;
temp = temp & 0x01;
write_bit(temp);
delay(5);
}
}
/
名称 : warn()
功能 : 蜂鸣器报警
输入 :beep
输出 :蜂鸣器
/
void warn(uint s)
{
uchar i;i=s;
beep=0;
while(i--);
beep=1;
i=s;
while(i--);
}
/
名称 : deal()
功能 : 根据温度上下限控制蜂鸣器间隔
输入 : temp
输出 : 无
/
void deal(uint t)
{
if(t<warn_l)
{
warn(20);
}
else if(t>warn_h)
{
warn(10);
}
}
/
名称 : Main()
功能 : 主函数
输入 : 无
输出 : 无
/
void main()
{
uint temp;
P2 = 0x00;
while(1)
{
Reset();
write_byte(jump_ROM);
write_byte(start);
Reset();
write_byte(jump_ROM);
write_byte(read_EEROM);
TMPL = read_byte();
TMPH = read_byte();
temp = TMPL / 16 + TMPH 16;
printf("%d",temp); //通过串口发送到PC
deal(temp);
P0 = table[temp/10%10];
P2 = 6;
Delay_1ms(5);
P0 = table[temp%10];
P2 = 7;
Delay_1ms(5);
}
}
首先检查你要打开的串口号是不是在你
设备管理器
中,然后一般是初始化端口,设置接收和发送缓冲区,设置
波特率
(9600,n,8,1)9600:波特率,n:有无
奇偶校验位
,8:传输数据位数
1:停止位数
程序烧不进去,可能是硬件原因。
烧进去后,当单片机工作时,你是不是发送一串字符串,收到不完整,或者丢失部分字母?
如果是,问题可能出在中断。
if(RI) //判断是接收中断产生
{
RI=0; //标志位清零
Temp=SBUF; //读入缓冲区的值
P1=Temp; //把值输出到P1口,用于观察
SBUF=Temp; //把接收到的值再发回电脑端
}
这段程序,会把接收到的字符马上发送回去,而不是把一串字符串发送回去。
由于字符串太长,单片机会把部分字符与反馈的字符发生碰撞而丢失。
以上就是关于单片机串行口通信为什么刚下载的时候不显示要关后再开才显示全部的内容,包括:单片机串行口通信为什么刚下载的时候不显示要关后再开才显示、基于stc15单片机的串口通信,发送数据用数码管显示(源程序)、我需要用sht10采集温湿度信息送入单片机,然后通过串口显示到PC上。程序该怎么写等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)