找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1570|回复: 2
打印 上一主题 下一主题
收起左侧

单片机串口通信程序问题

[复制链接]
跳转到指定楼层
楼主
20黑币
我写的一个程序,用串口助手向单片机发送三个10进制数如图,然后取数显示在LCD1602上,为什么不行呢 大家帮我看下
#include<stc12.h>//头文件
unsigned int date[3],num;
unsigned int value;
#include<intrins.h>

sbit RS = P1^0;   //定义端口
sbit RW = P1^1;
sbit EN = P2^5;
sbit DU = P2^0;
sbit WE = P2^1;

#define RS_CLR RS=0
#define RS_SET RS=1

#define RW_CLR RW=0
#define RW_SET RW=1

#define EN_CLR EN=0
#define EN_SET EN=1

#define DataPort P0


/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{

while(t--)
{
     //大致延时1mS
     DelayUs2x(245);
         DelayUs2x(245);
}
}
/*------------------------------------------------
              判忙函数
------------------------------------------------*/
bit LCD_Check_Busy(void)
{
DataPort= 0xFF;
RS_CLR;
RW_SET;
EN_CLR;
_nop_();
EN_SET;
return (bit)(DataPort & 0x80);
}
/*------------------------------------------------
              写入命令函数
------------------------------------------------*/
void LCD_Write_Com(unsigned char com)
{  
while(LCD_Check_Busy()); //忙则等待
RS_CLR;
RW_CLR;
EN_SET;
DataPort= com;
_nop_();
EN_CLR;
}
/*------------------------------------------------
              写入数据函数
------------------------------------------------*/
void LCD_Write_Data(unsigned char Data)
{
while(LCD_Check_Busy()); //忙则等待
RS_SET;
RW_CLR;
EN_SET;
DataPort= Data;
_nop_();
EN_CLR;
}

/*------------------------------------------------
                清屏函数
------------------------------------------------*/
void LCD_Clear(void)
{
LCD_Write_Com(0x01);
DelayMs(5);
}

/*------------------------------------------------
              初始化函数
------------------------------------------------*/
void LCD_Init(void)
{
   LCD_Write_Com(0x38);    /*显示模式设置*/
   DelayMs(5);
   LCD_Write_Com(0x38);
   DelayMs(5);
   LCD_Write_Com(0x38);
   DelayMs(5);
   LCD_Write_Com(0x38);  
   LCD_Write_Com(0x08);    /*显示关闭*/
   LCD_Write_Com(0x01);    /*显示清屏*/
   LCD_Write_Com(0x06);    /*显示光标移动设置*/
   DelayMs(5);
   LCD_Write_Com(0x0C);    /*显示开及光标设置*/
   }


void UartConfiguration()
{
        
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x40;                //定时器1时钟为Fosc,即1T
        AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                //设定定时器1为16位自动重装方式
        TL1 = 0xE0;                //设定定时初值
        TH1 = 0xFE;                //设定定时初值
        ET1 = 0;                //禁止定时器1中断
        TR1 = 1;                //启动定时器1
        }
void main()
{
        cmg88();//关数码管,点阵函数
LCD_Init();
LCD_Clear();//清屏
  UartConfiguration();
         
        while(1)                                                //死循环
        {
    value=date[3]*100+date[2]*10+date[1]*1;

        //        value=500;
                 LCD_Write_Com(0x8c);
          LCD_Write_Data(        value/100+0x30) ; // 百位
                LCD_Write_Data(        value/10%10+0x30) ;//百位
                LCD_Write_Data(        value%10+0x30) ;   //十位

}
        }

void Uart() interrupt 4
{
        if(RI)
        {
               
                date[num++]=SBUF;
                if(num>=3)
                {
                num=0;
                }
                RI=0;
        }
}

IMG_20181212_115421.jpg (3.33 MB, 下载次数: 33)

IMG_20181212_115421.jpg

最佳答案

查看完整内容

unsigned char date[3]; bit flag=0; /***************************/ void main() { ......... while(1) { if(flag==1) { ES=0; //关串口中断 flag=0; value=date[2]*100+date[1]*10+date[0]; ...
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2018-12-13 10:54 | 只看该作者
本帖最后由 wulin 于 2018-12-19 16:57 编辑

unsigned char date[3];
bit flag=0;
/***************************/
void main()                                       
{
        .........
        while(1)  
        {
                if(flag==1)
                {
                        ES=0;                        //关串口中断
                        flag=0;
                        value=date[2]*100+date[1]*10+date[0];
                        ...........
                        ES=1;                //开串口中断


/******************************/
void Uart() interrupt 4
{
        static unsigned char num=0;//静态计数变量
        RI=0;                                        //接收中断请求标志位清0        
        date[num]=SBUF;                //接收到的数据串保存在缓存数组
        num++;
        if(num>=3)
        {
                flag=1;                                //接收完成标志置1
                num=0;                                //计数变量清0
        }
}

回复

使用道具 举报

板凳
ID:348408 发表于 2018-12-18 23:19 | 只看该作者
LCD1602有显示 ?是乱码还是?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表