• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >嵌入式开发 > 89C52串口传输不成功

89C52串口传输不成功

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-05

佚名通过本文主要向大家介绍了89c52串口通信,89c52串口,89c52单片机串口,89c52串口程序,89c52引脚图等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 89C52串口传输不成功
描述:

51串口

我用的是89C52RC,加了两个DS18B20和一个DS1302,目的是要测出两路温度,还要在DS1302储存日期和时间。程序中我用LCD1602显示,同时把温度和日期时间通过串口传输到电脑。但是运行后,LCD1602显示正常,传输到电脑的数据就有问题了,都是乱码。我传输的是字符串,波特率9600,串口助手上也都设置使用字符接收,但就是不能得到正确结果。我用SST89E516来仿真,运行过程的数据都是正确的,所有字符都是用ASCII码来表示的,但传输后也不是ASCII码。程序如下:
//用串口把温度、日期和时间发送到电脑上,同时1602显示这些量
#include <reg52.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "18b20.h"
#include "18b20a.h"
#include "1602.h"
#include "delay.h"
#include "ds1302.h"
#define uchar unsigned char
#define uint unsigned int
volatile unsigned char sending;
//DS18B20
bit ReadTempFlag;//定义读时间标志
//DS1302
bit ReadTimeFlag;//定义读时间标志
bit SetFlag;     //更新时间标志位
unsigned char idata time_buf2[16];
void Init_Timer0(void);//定时器初始化
void UART_Init(void);
void UART_send_byte(unsigned char dat);
void UART_send_string(unsigned char *buf);
/*------------------------------------------------
              串口通讯初始化
------------------------------------------------*/
void UART_Init(void)
{
    
TMOD=0x20;     //定时器T1使用工作方式2
TH1=0xfd;      //设置初值
TL1=0xfd;
TR1=1;       //开始计时
PCON=0x00;      //SMOD=0;
SCON=0x50;      //工作方式1,波特率9600bit/s,允许接收
//TI=1;
EA=1;
ES=1; 
}
//发送一字节
void UART_send_byte(unsigned char dat)
{
SBUF=dat;
sending=1;  //设置发送标志
while(sending); //等待发送完毕
}
//发送字符串
void UART_send_string(unsigned char *buf)
{
while((*buf)!='\0')
{
//UART_send_byte(*buf++);
UART_send_byte(*buf);
buf++;
}
}
/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
 TMOD |= 0x01;   //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响      
 EA=1;            //总中断打开
 ET0=1;           //定时器中断打开
 TR0=1;           //定时器开关打开
}
/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 
{
 static unsigned int num;
 TH0=(65536-2000)/256;   //重新赋值 2ms
 TL0=(65536-2000)%256;
 
 num++;
 if(num==50)        //大致100ms
   {
    num=0;
    ReadTempFlag=1; //读DS18B20标志位置1
  ReadTimeFlag=1; //读DS1302标志位置1
}
}
/*------------------------------------------------
                  串口中断程序
------------------------------------------------*/
void UART_SER (void) interrupt 4 //串行中断服务程序
{
    unsigned char Temp;          //定义临时变量 
    unsigned char i;
    if(RI)                        //判断是接收中断产生
     {
  RI=0;                      //标志位清零   
 }
   
 else      //发送完一字节数据
 {
  TI=0;
  sending=0;  //清正在发送标志
 }
} 
void main (void)
{                  
unsigned char idata i;
int idata temp,temp_a;
float idata temperature,temperature_a;
unsigned char idata temp_DS18B20[16],temp_DS1302[16];//定义显示区域临时存储数组
LCD_Init();           //初始化液晶
DelayMs(20);          //延时有助于稳定
LCD_Clear();          //清屏
Init_Timer0();
Ds1302_Init();
UART_Init();
Lcd_User_Chr();       //写入自定义字符,这个是18B20中用到的
Ds1302_Read_Time();   //首次读取时间
if((time_buf1[2]+time_buf1[7])==0) //如果所有参数都为0,写入一个初始值
   Ds1302_Write_Time();
while (1)         //主循环
{
//双DS18B20部分
if(ReadTempFlag==1)
{
 ReadTempFlag=0;
 temp=ReadTemperature();
 temperature=(float)temp*0.0625;
 
 temp_a=ReadTemperature_a();
 temperature_a=(float)temp_a*0.0625;
 
 sprintf(temp_DS18B20,"%7.3f  %7.3f",temperature,temperature_a);//打印温度值
 LCD_Write_String(0,0,temp_DS18B20);//两个温度值都显示在第一行
 
 UART_send_string(temp_DS18B20);    
}
//DS1302部分
if(SetFlag)     //如果接收到串口信息则更新时钟,发送过来的数据格式是2015032313382402
  {
for(i=0;i<8;i++)
{
time_buf1[i]=time_buf2[2*i]*10+time_buf2[2*i+1]; //此时time_buf1格式为{20,15,03,23,13,38,24,02}
}//数据整合,如2个数 1和5整合成15
Ds1302_Write_Time();
SetFlag=0;       //时钟信息更新后标志位清零
   }
   
if(ReadTimeFlag==1)
{
ReadTimeFlag=0;
Ds1302_Read_Time();  
//修改一下,将日期时间显示在1602的第二行,格式是150324  10:51:16
sprintf(temp_DS1302,"%02d%02d%02d  %02d:%02d:%02d",(int)time_buf1[1],(int)time_buf1[2],(int)time_buf1[3],(int)time_buf1[4],(int)time_buf1[5],(int)time_buf1[6]);
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 89C52串口传输不成功
  • STC89C52串口读回数据的问题

相关文章

  • 2017-06-05 4412开发板上的开发环境
  • 2017-06-05 声音输入入门问题,请高手指教
  • 2017-06-05 pic18f24k22+旋转编码器
  • 2017-06-05 windows开机密码为什么可以绕过,求详细原理
  • 2017-06-05 cc2530无线点对点通信,不用协议栈,直接操作寄存器实现。
  • 2017-06-05;"无法拨语音电话!!" target="_blank"> ZTE中兴AD3812模块+联通SIM卡,AT指令"ATD<电话号>;"无法拨语音电话!!
  • 2017-06-05 Tornado
  • 2017-06-05 各位老大,你们是从哪些方面改进网卡驱动程序的效率,欧现在写了一个lan91c嵌入式网卡的驱动,需要帮助
  • 2017-06-05 STM32加上LCM12864R串行连接液晶显示问题。。急求解答。。急
  • 2017-06-05 在线等待:ndis截获发送的数据的问题?

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 高分求ifsddk
    • ALLJOYN支持跨网关通讯么
    • 68013A50p固件搞过的求指点
    • 异步非阻塞I/O的运行时间
    • wince数据库读写与CAN读写是否有影响
    • php与lua的关联?nginx与lua的关联?
    • 移植μC/OS-II
    • 智能控制与嵌入式系统智能家居控制系统研究与设计
    • AcrylicDNSProxy怎么配置!
    • bootloader程序与中断向量表偏移之间的关系

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有