介紹單片機驅動控制液晶顯示器(帶觸摸屏)的控制系統設計實例,支持modbus通訊協議,采用的是51單片機,驅動控制19寸液晶顯示器(可以是15寸,17寸,19寸,30寸,52寸,55寸顯示器或電視機)。支持單片機TTL電平串口,RS232串口,RS485串口,以太網連接. 液晶顯示控制器系統軟件使用人機界面組態軟件HMImaker開發,主要有操作畫面、參數設置畫面、參數修改、系統登錄畫面、狀態監控畫面等功能,界面可以自由設計開發,組態軟件開發顯示與操作界面,“0”編程、"所見即所得"、"0"代碼、如"制作PPT"一樣簡單,快速!。 本設計以51單片機作為LCD液晶顯示系統控制器為主線,基于單片機8051,采用單片機的C語言來進行軟件設計,指令的執行速度快,節省存儲空間。為了便于擴展和更改,軟件的設計根據單片機的串口通信協議(易顯單片機協議),支持modbus通訊協議。采用模塊化結構,使程序設計的邏輯關系更加簡潔明了。使硬件在軟件的控制下協調運作。其次闡述了部分程序的流程圖和實現過程。本文撰寫的主導思想是軟、硬件相結合,以硬件為基礎,來進行各功能模塊的編寫。以下對所開發的用單片機實現LCD液晶顯示器控制原理的設計思想和軟、硬件調試作了詳細的論述。
VGA控制板視頻圖片a.JPG (87.35 KB, 下載次數: 162)
下載附件
2014-5-22 11:05 上傳
以下是單片機8051的通訊協議和程序介紹: #include<Atmel/AT89x52.H> //定義數據類型(可以是數據結構) //************************************************************* void InitUART(void) //串口初始化使用22.1184M晶體 { SCON= 0x50; //選擇模式1,8位數據格式,使能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計數使能 REN = 1; //允許串口接受使能 } /* ****************************************************************** * 名稱: write_byte() * 功能: 向串口發送一個字節的數據 * 入口參數:i為待發送的字節數據 ****************************************************************** */ voidUART_SendByte(unsigned char i) { SBUF=i; //發送本次數據 while(TI==0){}//等待發送完畢 TI=0; } #define m_ReadVarAdr 48 //類型:unsignedint 初始值:40 解釋:待讀 變量地址 #define m_WriteAdr 52 //類型:unsignedint 初始值:28 解釋:待寫變量地址 /////////////////////////////////本文件如有不明白的地方,咨詢熱線:13829764765. QQ:252631158 ///////// ////////////////////////////////////////////////////////////////////////////////// //unsigned int adr表示需要設置的HMI變量的地址, //unsigned shortnBytes表示需要設置的HMI變量占一個字節的空間,如果是int變量就占4個字節,如果是short變量就占2個字節,如果是char變量就占1個字節 //unsigned char*m_VarP表示你要設置的HMI變量數據源的的指針,指針所指向的內容就是在HMI變量的將要被設置成的內容 //小技巧:有的時候希望通過調用一次SetVariable一次性設置3個int變量的HMI變量,只要這3個int變量的地址是連續的,那么只要讓nBytes=3*4=12個字節就OK voidSetVariable(unsigned int adr,unsigned short nBytes,unsigned char *m_VarP) { unsigned char temp; unsigned short m_CheckCRC;//命令校驗 UART_SendByte(0x81); //開始,固定,一個字節 UART_SendByte(0x0); //命令類型,設置變量 UART_SendByte(0x2); //接收方的設備號 m_CheckCRC=0x81+0x0+0x2;//前面三個字節的校驗和 temp=adr&0xff; UART_SendByte(temp); //地址1 m_CheckCRC=m_CheckCRC+temp;//每發送一個字節,計算一次校驗和 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); //個數低8位 m_CheckCRC=m_CheckCRC+temp; temp=(nBytes>>8)&0xff; UART_SendByte(temp); //個數高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變量占多少個字節的空間,如果是int變量就占4個字節,如果是short變量就占2個字節,如果是char變量就占1個字節 //小技巧:有的時候希望通過調用一次ReadVariable一次性讀取3個int變量的HMI變量,只要這3個int變量的地址是連續的,那么只要讓nBytes=3*4=12個字節就OK void ReadVariable(unsignedint adr,unsigned short nBytes) { unsigned char temp; unsigned short m_CheckCRC;//命令校驗 UART_SendByte(0x81); //開始,固定,一個字節 UART_SendByte(0x1); //命令類型,查詢變量 UART_SendByte(0x2); //接收方的設備號 m_CheckCRC=0x81+0x1+0x2;//前面三個字節的校驗和 temp=adr&0xff; UART_SendByte(temp); //地址1 m_CheckCRC=m_CheckCRC+temp; //每發送一個字節,計算一次校驗和 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); //個數低8位 m_CheckCRC=m_CheckCRC+temp; temp=(nBytes>>8)&0xff; UART_SendByte(temp); //個數高8位 m_CheckCRC=m_CheckCRC+temp; UART_SendByte(m_CheckCRC); UART_SendByte(m_CheckCRC>>8); } unsigned charmIndex=0; //定義一個數據索引 unsigned charmCmdAdrBuf[4]; //定義一個緩沖區用于緩沖HMI變量地址 unsigned charmCmdnBytesBuf[2]; //定義一個緩沖區用于緩沖HMI變量字節數量 unsigned charmHmiVarBuf[4]; //定義一個緩沖區用于緩沖HMI變量m_ReadVarAdr內容,因為該變量是4個字節的int變量 unsigned charmHmiVarCheck[2]; unsigned charmReceiveFlag=0; //串口中斷成功接收到一個HMI變量設置命令標志 unsigned charmState=0; //命令接收狀態 unsigned shortmCheckHe; unsigned intdelay=0;//延時變量 void main(void) { InitUART(); EA=1; //打開中斷總開關, ES=1; //打開串口中斷 //ET0=1;//打開定時器中斷,每隔50MS中斷一次 while(1) //進入不斷循環 { delay++; if(delay>=65535)//延時一段時間(300MS), { delay=0; ReadVariable(m_ReadVarAdr,4);//讀取HMI變量命令發出去。本例子中m_ReadVarAdr的地址是48,是一個unsigned int 變量,占4個字節 } if(mReceiveFlag==1)//如果接收到數據 { mReceiveFlag=0; SetVariable(m_WriteAdr,4,mHmiVarBuf); } } } unsigned charbufcom1; void uart(void)interrupt 4 { if(RI==0) return; RI=0; bufcom1=SBUF;//讀串口一的上的數據 if(mState==0)//階段0,等待接收0x81,命令開始 { mCheckHe=0x81; if(bufcom1==0x81)//如果收到0x81,就進入階段1 { mState=1; } else mState=0;//接收錯誤,跳回階段0 } else if(mState==1)//階段1,等待接收0x0,是否是工控機發過來的“設置變量命令” { mCheckHe=mCheckHe+bufcom1; if(bufcom1==0x0)// 是工控機發過來的“設置變量命令”,就進入階段2 { mState=2; } else mState=0;//接收錯誤,跳回階段0 } else if(mState==2) //階段2,等待接收0x2,是否是工控機發過來的設備號 { mCheckHe=mCheckHe+bufcom1; if(bufcom1==0x2) { mState=3; mIndex=0;// 先清0索引,為階段3做準備 } else mState=0; //接收錯誤,跳回階段0 } else if(mState==3) //階段3,等待接收地址,4個字節 { mCheckHe=mCheckHe+bufcom1; mCmdAdrBuf[mIndex]=bufcom1; mIndex++; if(mIndex==4) //已經接完4個字節的地址 { mState=4; mIndex=0;// 先清0索引,為階段4做準備 } } else if(mState==4) //階段4,等待接收字節數,2個字節 { mCheckHe=mCheckHe+bufcom1; mCmdnBytesBuf[mIndex]=bufcom1; mIndex++; if(mIndex==2) //已經接完2個字節 { if((mCmdnBytesBuf[0]==4)&&(mCmdnBytesBuf[1]==0))//如果收到的是4個字節數據 { mState=5; mIndex=0;// 為階段5做準備 } else mState=0; //接收錯誤,跳回階段0 } } else if(mState==5) //階段5,等待接收4個數據 { mCheckHe=mCheckHe+bufcom1; mHmiVarBuf[mIndex]=bufcom1; mIndex++; if(mIndex==4) //已經接完4個字節 { mState=6; mIndex=0;//為階段6做準備 } } else if(mState==6) //階段6,接收2個數據校驗和 { mHmiVarCheck[mIndex]=bufcom1; mIndex++; if(mIndex==2) //已經接完2個字節 { mState=0; //接收完畢,從頭開始 if(mHmiVarCheck[0]==(mCheckHe%256)) //比較校驗和低字節 if(mHmiVarCheck[1]==(mCheckHe/256)) //比較校驗和高字節 if(mCmdAdrBuf[0]==m_ReadVarAdr%256) //比較HMI變量地址第0個字節 if(mCmdAdrBuf[1]==(m_ReadVarAdr/256)) //比較HMI變量地址第1個字節 if(mCmdAdrBuf[2]==0x0) //比較HMI變量地址第2個字節 if(mCmdAdrBuf[3]==0x0) //比較HMI變量地址第3個字節 { mReceiveFlag=1;//如果地址和校驗和沒問題,表示已經成功讀到了工控機的m_ReadVarAdr變量 } } } else mState=0;
}
HMImaker工程屬性.jpg (184.63 KB, 下載次數: 139)
下載附件
2014-5-22 11:06 上傳
HMImaker監控畫面.JPG (518.77 KB, 下載次數: 156)
下載附件
2014-5-22 11:06 上傳
HMImaker操作畫面.JPG (520.24 KB, 下載次數: 127)
下載附件
2014-5-22 11:06 上傳
HMImaker登錄畫面.JPG (425.51 KB, 下載次數: 126)
下載附件
2014-5-22 11:06 上傳
HMImaker參數畫面.JPG (470.12 KB, 下載次數: 136)
下載附件
2014-5-22 11:06 上傳
|