找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

帖子
查看: 2455|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)串口通信程序問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
#
ID:290141 發(fā)表于 2018-12-13 10:54 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |正序?yàn)g覽 |閱讀模式
20黑幣
我寫的一個(gè)程序,用串口助手向單片機(jī)發(fā)送三個(gè)10進(jìn)制數(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í)函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
unsigned char 是定義無符號(hào)字符變量,其值的范圍是
0~255 這里使用晶振12M,精確延時(shí)請(qǐng)使用匯編
------------------------------------------------*/
void DelayMs(unsigned char t)
{

while(t--)
{
     //大致延時(shí)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);    /*顯示模式設(shè)置*/
   DelayMs(5);
   LCD_Write_Com(0x38);
   DelayMs(5);
   LCD_Write_Com(0x38);
   DelayMs(5);
   LCD_Write_Com(0x38);  
   LCD_Write_Com(0x08);    /*顯示關(guān)閉*/
   LCD_Write_Com(0x01);    /*顯示清屏*/
   LCD_Write_Com(0x06);    /*顯示光標(biāo)移動(dòng)設(shè)置*/
   DelayMs(5);
   LCD_Write_Com(0x0C);    /*顯示開及光標(biāo)設(shè)置*/
   }


void UartConfiguration()
{
        
        SCON = 0x50;                //8位數(shù)據(jù),可變波特率
        AUXR |= 0x40;                //定時(shí)器1時(shí)鐘為Fosc,即1T
        AUXR &= 0xFE;                //串口1選擇定時(shí)器1為波特率發(fā)生器
        TMOD &= 0x0F;                //設(shè)定定時(shí)器1為16位自動(dòng)重裝方式
        TL1 = 0xE0;                //設(shè)定定時(shí)初值
        TH1 = 0xFE;                //設(shè)定定時(shí)初值
        ET1 = 0;                //禁止定時(shí)器1中斷
        TR1 = 1;                //啟動(dòng)定時(shí)器1
        }
void main()
{
        cmg88();//關(guān)數(shù)碼管,點(diǎn)陣函數(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

最佳答案

查看完整內(nèi)容

unsigned char date[3]; bit flag=0; /***************************/ void main() { ......... while(1) { if(flag==1) { ES=0; //關(guān)串口中斷 flag=0; value=date[2]*100+date[1]*10+date[0]; ...
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:348408 發(fā)表于 2018-12-18 23:19 | 只看該作者
LCD1602有顯示 ?是亂碼還是?
回復(fù)

使用道具 舉報(bào)

樓主
ID:213173 發(fā)表于 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;                        //關(guān)串口中斷
                        flag=0;
                        value=date[2]*100+date[1]*10+date[0];
                        ...........
                        ES=1;                //開串口中斷


/******************************/
void Uart() interrupt 4
{
        static unsigned char num=0;//靜態(tài)計(jì)數(shù)變量
        RI=0;                                        //接收中斷請(qǐng)求標(biāo)志位清0        
        date[num]=SBUF;                //接收到的數(shù)據(jù)串保存在緩存數(shù)組
        num++;
        if(num>=3)
        {
                flag=1;                                //接收完成標(biāo)志置1
                num=0;                                //計(jì)數(shù)變量清0
        }
}

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表