久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8557|回復(fù): 14
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)驅(qū)動液晶顯示屏的控制系統(tǒng)設(shè)計(資料)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:62138 發(fā)表于 2014-5-22 11:07 | 只看該作者 |只看大圖 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
介紹單片機(jī)驅(qū)動控制液晶顯示器(帶觸摸屏)的控制系統(tǒng)設(shè)計實(shí)例,支持modbus通訊協(xié)議,采用的是51單片機(jī),驅(qū)動控制19寸液晶顯示器(可以是15寸,17寸,19寸,30寸,52寸,55寸顯示器或電視機(jī))。支持單片機(jī)TTL電平串口,RS232串口,RS485串口,以太網(wǎng)連接. 液晶顯示控制器系統(tǒng)軟件使用人機(jī)界面組態(tài)軟件HMImaker開發(fā),主要有操作畫面、參數(shù)設(shè)置畫面、參數(shù)修改、系統(tǒng)登錄畫面、狀態(tài)監(jiān)控畫面等功能,界面可以自由設(shè)計開發(fā),組態(tài)軟件開發(fā)顯示與操作界面,“0”編程、"所見即所得"、"0"代碼、如"制作PPT"一樣簡單,快速!。
本設(shè)計以51單片機(jī)作為LCD液晶顯示系統(tǒng)控制器為主線,基于單片機(jī)8051,采用單片機(jī)的C語言來進(jìn)行軟件設(shè)計,指令的執(zhí)行速度快,節(jié)省存儲空間。為了便于擴(kuò)展和更改,軟件的設(shè)計根據(jù)單片機(jī)的串口通信協(xié)議(易顯單片機(jī)協(xié)議),支持modbus通訊協(xié)議。采用模塊化結(jié)構(gòu),使程序設(shè)計的邏輯關(guān)系更加簡潔明了。使硬件在軟件的控制下協(xié)調(diào)運(yùn)作。其次闡述了部分程序的流程圖和實(shí)現(xiàn)過程。本文撰寫的主導(dǎo)思想是軟、硬件相結(jié)合,以硬件為基礎(chǔ),來進(jìn)行各功能模塊的編寫。以下對所開發(fā)的用單片機(jī)實(shí)現(xiàn)LCD液晶顯示器控制原理的設(shè)計思想和軟、硬件調(diào)試作了詳細(xì)的論述。

以下是單片機(jī)8051的通訊協(xié)議和程序介紹:
#include<Atmel/AT89x52.H>
//定義數(shù)據(jù)類型(可以是數(shù)據(jù)結(jié)構(gòu))
//*************************************************************
void InitUART(void)         //串口初始化使用22.1184M晶體
{
       SCON= 0x50;                 //選擇模式18位數(shù)據(jù)格式,使能UART
      PCON|= 0x80;                 //波特率加倍
      TMOD=TMOD| 0x20;                //定時器1:模式2 ,自動裝載初值      
         //波特率計算公式:TH1=TL1=256-(2*22.1184*1000000)/(32*12*baud)
         //若選115200波特率則TH1=TL1=256-(2*22.1184*1000000)/(32*12*115200)=0xff
         //若選19200波特率則TH1=TL1=256-(2*22.1184*1000000)/(32*12*19200)=0xfa
      TH1= 0xfa;                     
      TL1= 0xfa;
         TR1 = 1;                          //定時器1計數(shù)使能
         REN = 1;                //允許串口接受使能
}
/*
******************************************************************
* 名稱:    write_byte()
* 功能:    向串口發(fā)送一個字節(jié)的數(shù)據(jù)
* 入口參數(shù):i為待發(fā)送的字節(jié)數(shù)據(jù)
******************************************************************
*/
voidUART_SendByte(unsigned char i)
{
         SBUF=i;          //發(fā)送本次數(shù)據(jù)
         while(TI==0){}//等待發(fā)送完畢
    TI=0;
}
#define   m_ReadVarAdr       48          //類型:unsignedint   初始值:40   解釋:待讀 變量地址
#define   m_WriteAdr         52          //類型:unsignedint   初始值:28   解釋:待寫變量地址
/////////////////////////////////本文件如有不明白的地方,咨詢熱線:13829764765. QQ252631158 /////////
//////////////////////////////////////////////////////////////////////////////////
//unsigned int adr表示需要設(shè)置的HMI變量的地址,
//unsigned shortnBytes表示需要設(shè)置的HMI變量占一個字節(jié)的空間,如果是int變量就占4個字節(jié),如果是short變量就占2個字節(jié),如果是char變量就占1個字節(jié)
//unsigned char*m_VarP表示你要設(shè)置的HMI變量數(shù)據(jù)源的的指針,指針?biāo)赶虻膬?nèi)容就是在HMI變量的將要被設(shè)置成的內(nèi)容
//小技巧:有的時候希望通過調(diào)用一次SetVariable一次性設(shè)置3int變量的HMI變量,只要這3int變量的地址是連續(xù)的,那么只要讓nBytes=3*4=12個字節(jié)就OK
voidSetVariable(unsigned int adr,unsigned short nBytes,unsigned char *m_VarP)
{
    unsigned char temp;
    unsigned short m_CheckCRC;//命令校驗(yàn)
         UART_SendByte(0x81);       //開始,固定,一個字節(jié)
         UART_SendByte(0x0);                  //命令類型,設(shè)置變量
         UART_SendByte(0x2);                  //接收方的設(shè)備號
         m_CheckCRC=0x81+0x0+0x2;//前面三個字節(jié)的校驗(yàn)和
         temp=adr&0xff;
         UART_SendByte(temp);      //地址1
         m_CheckCRC=m_CheckCRC+temp;//每發(fā)送一個字節(jié),計算一次校驗(yàn)和
         temp=(adr>>8)&0xff;
         UART_SendByte(temp);      //地址2
         m_CheckCRC=m_CheckCRC+temp;
         temp=0;
         UART_SendByte(temp);      //地址3      固定為0
         m_CheckCRC=m_CheckCRC+temp;
         temp=0;
         UART_SendByte(temp);      //地址4      固定為0
         m_CheckCRC=m_CheckCRC+temp;     
         temp=(nBytes)&0xff;
         UART_SendByte(temp);      //個數(shù)低8
         m_CheckCRC=m_CheckCRC+temp;                        
         temp=(nBytes>>8)&0xff;
         UART_SendByte(temp);      //個數(shù)高8
         m_CheckCRC=m_CheckCRC+temp;     
         while(nBytes!=0)
         {
            temp=*m_VarP;
                   UART_SendByte(temp);      
                   m_CheckCRC=m_CheckCRC+temp;     
            nBytes--;
            m_VarP++;
         }
         UART_SendByte(m_CheckCRC);
         UART_SendByte(m_CheckCRC>>8);
}
//unsigned int adr表示需要查詢的HMI變量的地址,
//unsigned shortnBytes表示需要查詢的HMI變量占多少個字節(jié)的空間,如果是int變量就占4個字節(jié),如果是short變量就占2個字節(jié),如果是char變量就占1個字節(jié)
//小技巧:有的時候希望通過調(diào)用一次ReadVariable一次性讀取3int變量的HMI變量,只要這3int變量的地址是連續(xù)的,那么只要讓nBytes=3*4=12個字節(jié)就OK
void ReadVariable(unsignedint adr,unsigned short nBytes)
{
    unsigned char temp;
    unsigned short m_CheckCRC;//命令校驗(yàn)
         UART_SendByte(0x81);       //開始,固定,一個字節(jié)
         UART_SendByte(0x1);                  //命令類型,查詢變量
         UART_SendByte(0x2);                  //接收方的設(shè)備號
         m_CheckCRC=0x81+0x1+0x2;//前面三個字節(jié)的校驗(yàn)和
         temp=adr&0xff;
         UART_SendByte(temp);      //地址1
         m_CheckCRC=m_CheckCRC+temp;     //每發(fā)送一個字節(jié),計算一次校驗(yàn)和
         temp=(adr>>8)&0xff;
         UART_SendByte(temp);      //地址2
         m_CheckCRC=m_CheckCRC+temp;
         temp=0;
         UART_SendByte(temp);      //地址3       固定為0
         m_CheckCRC=m_CheckCRC+temp;
         temp=0;
         UART_SendByte(temp);      //地址4       固定為0
         m_CheckCRC=m_CheckCRC+temp;     
         temp=(nBytes)&0xff;
         UART_SendByte(temp);      //個數(shù)低8
         m_CheckCRC=m_CheckCRC+temp;                        
         temp=(nBytes>>8)&0xff;
         UART_SendByte(temp);      //個數(shù)高8
         m_CheckCRC=m_CheckCRC+temp;     
         UART_SendByte(m_CheckCRC);
         UART_SendByte(m_CheckCRC>>8);
}
unsigned charmIndex=0;           //定義一個數(shù)據(jù)索引
unsigned charmCmdAdrBuf[4];    //定義一個緩沖區(qū)用于緩沖HMI變量地址
unsigned charmCmdnBytesBuf[2]; //定義一個緩沖區(qū)用于緩沖HMI變量字節(jié)數(shù)量
unsigned charmHmiVarBuf[4];    //定義一個緩沖區(qū)用于緩沖HMI變量m_ReadVarAdr內(nèi)容,因?yàn)樵撟兞渴?/font>4個字節(jié)的int變量
unsigned charmHmiVarCheck[2];
unsigned charmReceiveFlag=0;   //串口中斷成功接收到一個HMI變量設(shè)置命令標(biāo)志
unsigned charmState=0;                //命令接收狀態(tài)
unsigned shortmCheckHe;
unsigned intdelay=0;//延時變量
void main(void)
{
     InitUART();
          EA=1; //打開中斷總開關(guān),
          ES=1; //打開串口中斷
          //ET0=1;//打開定時器中斷,每隔50MS中斷一次
          while(1) //進(jìn)入不斷循環(huán)
          {
            delay++;
                   if(delay>=65535)//延時一段時間(300MS)
                   {
                       delay=0;
                            ReadVariable(m_ReadVarAdr,4);//讀取HMI變量命令發(fā)出去。本例子中m_ReadVarAdr的地址是48,是一個unsigned int 變量,占4個字節(jié)
                   }
                   if(mReceiveFlag==1)//如果接收到數(shù)據(jù)
                   {
                            mReceiveFlag=0;
                            SetVariable(m_WriteAdr,4,mHmiVarBuf);
                   }
          }
}
unsigned charbufcom1;
void uart(void)interrupt 4
{
         if(RI==0)    return;
                    RI=0;
                    bufcom1=SBUF;//讀串口一的上的數(shù)據(jù)
                    if(mState==0)//階段0,等待接收0x81,命令開始
                    {     
                       mCheckHe=0x81;
                            if(bufcom1==0x81)//如果收到0x81,就進(jìn)入階段1
                            {
                               mState=1;
                            }
                            else mState=0;//接收錯誤,跳回階段0
                    }
                    else if(mState==1)//階段1,等待接收0x0,是否是工控機(jī)發(fā)過來的“設(shè)置變量命令”
                    {
                       mCheckHe=mCheckHe+bufcom1;
                            if(bufcom1==0x0)// 是工控機(jī)發(fā)過來的“設(shè)置變量命令”,就進(jìn)入階段2
                            {
                               mState=2;
                            }
                            else mState=0;//接收錯誤,跳回階段0
                    }
                    else if(mState==2)      //階段2,等待接收0x2,是否是工控機(jī)發(fā)過來的設(shè)備號
                    {
                       mCheckHe=mCheckHe+bufcom1;
                            if(bufcom1==0x2)
                            {
                               mState=3;
                               mIndex=0;// 先清0索引,為階段3做準(zhǔn)備
                            }
                            else mState=0; //接收錯誤,跳回階段0
                    }
                    else if(mState==3)      //階段3,等待接收地址,4個字節(jié)
                    {
                           mCheckHe=mCheckHe+bufcom1;
                            mCmdAdrBuf[mIndex]=bufcom1;
                            mIndex++;
                            if(mIndex==4)  //已經(jīng)接完4個字節(jié)的地址
                            {
                               mState=4;
                               mIndex=0;// 先清0索引,為階段4做準(zhǔn)備
                            }
                    }
                    else if(mState==4)      //階段4,等待接收字節(jié)數(shù),2個字節(jié)
                    {
                       mCheckHe=mCheckHe+bufcom1;
                            mCmdnBytesBuf[mIndex]=bufcom1;
                            mIndex++;
                            if(mIndex==2)  //已經(jīng)接完2個字節(jié)
                            {
                              if((mCmdnBytesBuf[0]==4)&&(mCmdnBytesBuf[1]==0))//如果收到的是4個字節(jié)數(shù)據(jù)
                               {
                                        mState=5;
                                        mIndex=0;// 為階段5做準(zhǔn)備
                               }
                               else mState=0; //接收錯誤,跳回階段0
                            }
                    }
                    else if(mState==5)      //階段5,等待接收4個數(shù)據(jù)
                    {
                       mCheckHe=mCheckHe+bufcom1;
                            mHmiVarBuf[mIndex]=bufcom1;
                            mIndex++;
                            if(mIndex==4)  //已經(jīng)接完4個字節(jié)
                            {
                                     mState=6;
                                     mIndex=0;//為階段6做準(zhǔn)備
                            }
                    }
                    else if(mState==6)      //階段6,接收2個數(shù)據(jù)校驗(yàn)和
                    {
                            mHmiVarCheck[mIndex]=bufcom1;
                            mIndex++;
                            if(mIndex==2)  //已經(jīng)接完2個字節(jié)
                            {
                                     mState=0;  //接收完畢,從頭開始
                                     if(mHmiVarCheck[0]==(mCheckHe%256))      //比較校驗(yàn)和低字節(jié)
                                        if(mHmiVarCheck[1]==(mCheckHe/256))  //比較校驗(yàn)和高字節(jié)
                                          if(mCmdAdrBuf[0]==m_ReadVarAdr%256)  //比較HMI變量地址第0個字節(jié)
                                                    if(mCmdAdrBuf[1]==(m_ReadVarAdr/256))  //比較HMI變量地址第1個字節(jié)
                                                           if(mCmdAdrBuf[2]==0x0)       //比較HMI變量地址第2個字節(jié)
                                                              if(mCmdAdrBuf[3]==0x0) //比較HMI變量地址第3個字節(jié)
                                                                  {
                                                                       mReceiveFlag=1;//如果地址和校驗(yàn)和沒問題,表示已經(jīng)成功讀到了工控機(jī)的m_ReadVarAdr變量
                                                              }
                            }
                    }
                    else mState=0;

}





單片機(jī)驅(qū)動液晶顯示屏的控制系統(tǒng)設(shè)計(資料).zip (966.77 KB, 下載次數(shù): 90)

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:59400 發(fā)表于 2014-6-20 13:53 來自觸屏版 | 只看該作者
厲害。
回復(fù)

使用道具 舉報

板凳
ID:66741 發(fā)表于 2014-9-28 11:30 | 只看該作者

謝謝樓主!!
回復(fù)

使用道具 舉報

地板
ID:68230 發(fā)表于 2014-11-1 17:08 來自觸屏版 | 只看該作者
流程圖及電路連接圖?
回復(fù)

使用道具 舉報

5#
ID:67697 發(fā)表于 2014-12-2 11:25 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報

6#
ID:70708 發(fā)表于 2015-1-10 23:21 | 只看該作者
學(xué)習(xí)了。。。。。
回復(fù)

使用道具 舉報

7#
ID:78086 發(fā)表于 2015-4-26 21:52 | 只看該作者
很給力
回復(fù)

使用道具 舉報

8#
ID:78086 發(fā)表于 2015-4-26 21:52 | 只看該作者
不錯的
回復(fù)

使用道具 舉報

9#
ID:80089 發(fā)表于 2015-6-5 09:11 | 只看該作者
回復(fù)

使用道具 舉報

10#
ID:98045 發(fā)表于 2015-12-2 17:53 | 只看該作者
厲害,來學(xué)習(xí)一下
回復(fù)

使用道具 舉報

11#
ID:163931 發(fā)表于 2017-3-26 23:33 | 只看該作者
不錯,謝謝樓主!
回復(fù)

使用道具 舉報

12#
ID:230418 發(fā)表于 2017-9-1 14:51 | 只看該作者
真是很及時
回復(fù)

使用道具 舉報

13#
ID:230418 發(fā)表于 2017-9-1 14:52 | 只看該作者
回復(fù)好像沒好處
回復(fù)

使用道具 舉報

14#
ID:230418 發(fā)表于 2017-9-1 14:52 | 只看該作者
厲害了   來學(xué)習(xí)一下
回復(fù)

使用道具 舉報

15#
ID:216383 發(fā)表于 2017-11-11 18:17 | 只看該作者
下載!!!!!!!!!!!!!
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久久国产一区 | 欧美一级片中文字幕 | 嫩草视频在线看 | 九九久久久 | 国产福利91精品一区二区三区 | 亚洲一区久久 | 日韩精品1区2区3区 成人黄页在线观看 | 亚洲精品第一 | 国产在线播 | 夜夜爽99久久国产综合精品女不卡 | a中文在线视频 | 午夜视频在线免费观看 | 精品久久久久久久久亚洲 | 99精品99久久久久久宅男 | 超碰成人在线观看 | 天天综合网天天综合色 | 天天插天天干 | 精品久久久久久久 | 亚洲精品久 | 欧美综合久久 | 日韩成人在线电影 | 欧美高清性xxxxhdvideosex | 亚洲欧美激情精品一区二区 | 国产高清久久 | 美女黄网站视频免费 | 黄视频欧美| 国产精品久久a | 日韩和的一区二区 | 野狼在线社区2017入口 | 日韩视频在线一区 | 中文字幕高清在线 | 国产精品亚洲精品日韩已方 | 日韩精品在线播放 | 久久久www成人免费无遮挡大片 | 亚洲国产成人av好男人在线观看 | 久久影音先锋 | 国产最好的av国产大片 | 综合第一页 | 欧美日韩成人影院 | 香蕉视频在线播放 | 日韩一区二区三区在线 |