標題: 單片機串口通信程序問題 [打印本頁]

作者: Thunder.    時間: 2018-12-13 10:54
標題: 單片機串口通信程序問題
我寫的一個程序,用串口助手向單片機發(fā)送三個10進制數(shù)如圖,然后取數(shù)顯示在LCD1602上,為什么不行呢 大家?guī)臀铱聪?
#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延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
unsigned char 是定義無符號字符變量,其值的范圍是
0~255 這里使用晶振12M,精確延時請使用匯編
------------------------------------------------*/
void DelayMs(unsigned char t)
{

while(t--)
{
     //大致延時1mS
     DelayUs2x(245);
         DelayUs2x(245);
}
}
/*------------------------------------------------
              判忙函數(shù)
------------------------------------------------*/
bit LCD_Check_Busy(void)
{
DataPort= 0xFF;
RS_CLR;
RW_SET;
EN_CLR;
_nop_();
EN_SET;
return (bit)(DataPort & 0x80);
}
/*------------------------------------------------
              寫入命令函數(shù)
------------------------------------------------*/
void LCD_Write_Com(unsigned char com)
{  
while(LCD_Check_Busy()); //忙則等待
RS_CLR;
RW_CLR;
EN_SET;
DataPort= com;
_nop_();
EN_CLR;
}
/*------------------------------------------------
              寫入數(shù)據(jù)函數(shù)
------------------------------------------------*/
void LCD_Write_Data(unsigned char Data)
{
while(LCD_Check_Busy()); //忙則等待
RS_SET;
RW_CLR;
EN_SET;
DataPort= Data;
_nop_();
EN_CLR;
}

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

/*------------------------------------------------
              初始化函數(shù)
------------------------------------------------*/
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位數(shù)據(jù),可變波特率
        AUXR |= 0x40;                //定時器1時鐘為Fosc,即1T
        AUXR &= 0xFE;                //串口1選擇定時器1為波特率發(fā)生器
        TMOD &= 0x0F;                //設定定時器1為16位自動重裝方式
        TL1 = 0xE0;                //設定定時初值
        TH1 = 0xFE;                //設定定時初值
        ET1 = 0;                //禁止定時器1中斷
        TR1 = 1;                //啟動定時器1
        }
void main()
{
        cmg88();//關數(shù)碼管,點陣函數(shù)
LCD_Init();
LCD_Clear();//清屏
  UartConfiguration();
         
        while(1)                                                //死循環(huán)
        {
    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, 下載次數(shù): 58)

IMG_20181212_115421.jpg

作者: wulin    時間: 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;//靜態(tài)計數(shù)變量
        RI=0;                                        //接收中斷請求標志位清0        
        date[num]=SBUF;                //接收到的數(shù)據(jù)串保存在緩存數(shù)組
        num++;
        if(num>=3)
        {
                flag=1;                                //接收完成標志置1
                num=0;                                //計數(shù)變量清0
        }
}


作者: Vincent11499    時間: 2018-12-18 23:19
LCD1602有顯示 ?是亂碼還是?




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1