標題: 單片機驅(qū)動液晶顯示屏的控制系統(tǒng)設(shè)計(資料) [打印本頁]
作者: gzyixian 時間: 2014-5-22 11:07
標題: 單片機驅(qū)動液晶顯示屏的控制系統(tǒng)設(shè)計(資料)
介紹單片機驅(qū)動控制液晶顯示器(帶觸摸屏)的控制系統(tǒng)設(shè)計實例,支持modbus通訊協(xié)議,采用的是51單片機,驅(qū)動控制19寸液晶顯示器(可以是15寸,17寸,19寸,30寸,52寸,55寸顯示器或電視機)。支持單片機TTL電平串口,RS232串口,RS485串口,以太網(wǎng)連接. 液晶顯示控制器系統(tǒng)軟件使用人機界面組態(tài)軟件HMImaker開發(fā),主要有操作畫面、參數(shù)設(shè)置畫面、參數(shù)修改、系統(tǒng)登錄畫面、狀態(tài)監(jiān)控畫面等功能,界面可以自由設(shè)計開發(fā),組態(tài)軟件開發(fā)顯示與操作界面,“0”編程、"所見即所得"、"0"代碼、如"制作PPT"一樣簡單,快速!。
本設(shè)計以51單片機作為LCD液晶顯示系統(tǒng)控制器為主線,基于單片機8051,采用單片機的C語言來進行軟件設(shè)計,指令的執(zhí)行速度快,節(jié)省存儲空間。為了便于擴展和更改,軟件的設(shè)計根據(jù)單片機的串口通信協(xié)議(易顯單片機協(xié)議),支持modbus通訊協(xié)議。采用模塊化結(jié)構(gòu),使程序設(shè)計的邏輯關(guān)系更加簡潔明了。使硬件在軟件的控制下協(xié)調(diào)運作。其次闡述了部分程序的流程圖和實現(xiàn)過程。本文撰寫的主導思想是軟、硬件相結(jié)合,以硬件為基礎(chǔ),來進行各功能模塊的編寫。以下對所開發(fā)的用單片機實現(xiàn)LCD液晶顯示器控制原理的設(shè)計思想和軟、硬件調(diào)試作了詳細的論述。
VGA控制板視頻圖片a.JPG (87.35 KB, 下載次數(shù): 162)
下載附件
2014-5-22 11:05 上傳
以下是單片機8051的通訊協(xié)議和程序介紹:
#include<Atmel/AT89x52.H>
//定義數(shù)據(jù)類型(可以是數(shù)據(jù)結(jié)構(gòu))
//*************************************************************
void InitUART(void) //串口初始化使用22.1184M晶體
{
SCON= 0x50; //選擇模式1,8位數(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. QQ:252631158 /////////
//////////////////////////////////////////////////////////////////////////////////
//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ù)源的的指針,指針所指向的內(nèi)容就是在HMI變量的將要被設(shè)置成的內(nèi)容
//小技巧:有的時候希望通過調(diào)用一次SetVariable一次性設(shè)置3個int變量的HMI變量,只要這3個int變量的地址是連續(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;//命令校驗
UART_SendByte(0x81); //開始,固定,一個字節(jié)
UART_SendByte(0x0); //命令類型,設(shè)置變量
UART_SendByte(0x2); //接收方的設(shè)備號
m_CheckCRC=0x81+0x0+0x2;//前面三個字節(jié)的校驗和
temp=adr&0xff;
UART_SendByte(temp); //地址1
m_CheckCRC=m_CheckCRC+temp;//每發(fā)送一個字節(jié),計算一次校驗和
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一次性讀取3個int變量的HMI變量,只要這3個int變量的地址是連續(xù)的,那么只要讓nBytes=3*4=12個字節(jié)就OK
void ReadVariable(unsignedint adr,unsigned short nBytes)
{
unsigned char temp;
unsigned short m_CheckCRC;//命令校驗
UART_SendByte(0x81); //開始,固定,一個字節(jié)
UART_SendByte(0x1); //命令類型,查詢變量
UART_SendByte(0x2); //接收方的設(shè)備號
m_CheckCRC=0x81+0x1+0x2;//前面三個字節(jié)的校驗和
temp=adr&0xff;
UART_SendByte(temp); //地址1
m_CheckCRC=m_CheckCRC+temp; //每發(fā)送一個字節(jié),計算一次校驗和
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)容,因為該變量是4個字節(jié)的int變量
unsigned charmHmiVarCheck[2];
unsigned charmReceiveFlag=0; //串口中斷成功接收到一個HMI變量設(shè)置命令標志
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) //進入不斷循環(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,就進入階段1
{
mState=1;
}
else mState=0;//接收錯誤,跳回階段0
}
else if(mState==1)//階段1,等待接收0x0,是否是工控機發(fā)過來的“設(shè)置變量命令”
{
mCheckHe=mCheckHe+bufcom1;
if(bufcom1==0x0)// 是工控機發(fā)過來的“設(shè)置變量命令”,就進入階段2
{
mState=2;
}
else mState=0;//接收錯誤,跳回階段0
}
else if(mState==2) //階段2,等待接收0x2,是否是工控機發(fā)過來的設(shè)備號
{
mCheckHe=mCheckHe+bufcom1;
if(bufcom1==0x2)
{
mState=3;
mIndex=0;// 先清0索引,為階段3做準備
}
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做準備
}
}
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做準備
}
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做準備
}
}
else if(mState==6) //階段6,接收2個數(shù)據(jù)校驗和
{
mHmiVarCheck[mIndex]=bufcom1;
mIndex++;
if(mIndex==2) //已經(jīng)接完2個字節(jié)
{
mState=0; //接收完畢,從頭開始
if(mHmiVarCheck[0]==(mCheckHe%256)) //比較校驗和低字節(jié)
if(mHmiVarCheck[1]==(mCheckHe/256)) //比較校驗和高字節(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;//如果地址和校驗和沒問題,表示已經(jīng)成功讀到了工控機的m_ReadVarAdr變量
}
}
}
else mState=0;
}
HMImaker工程屬性.jpg (184.63 KB, 下載次數(shù): 139)
下載附件
2014-5-22 11:06 上傳
HMImaker監(jiān)控畫面.JPG (518.77 KB, 下載次數(shù): 156)
下載附件
2014-5-22 11:06 上傳
HMImaker操作畫面.JPG (520.24 KB, 下載次數(shù): 127)
下載附件
2014-5-22 11:06 上傳
HMImaker登錄畫面.JPG (425.51 KB, 下載次數(shù): 126)
下載附件
2014-5-22 11:06 上傳
HMImaker參數(shù)畫面.JPG (470.12 KB, 下載次數(shù): 136)
下載附件
2014-5-22 11:06 上傳
作者: 娃娃魚翅膀 時間: 2014-6-20 13:53
厲害。
作者: ddyy2266 時間: 2014-9-28 11:30
謝謝樓主!!
作者: 邊緣人 時間: 2014-11-1 17:08
流程圖及電路連接圖?
作者: 4258036 時間: 2014-12-2 11:25
謝謝分享
作者: abczzy2012 時間: 2015-1-10 23:21
學習了。。。。。
作者: 101寢室長 時間: 2015-4-26 21:52
很給力
作者: 101寢室長 時間: 2015-4-26 21:52
不錯的
作者: 一只菜鳥2015 時間: 2015-6-5 09:11




作者: 黃士兵 時間: 2015-12-2 17:53
厲害,來學習一下
作者: 牛牛塞納 時間: 2017-3-26 23:33
不錯,謝謝樓主!
作者: cdh44 時間: 2017-9-1 14:51
真是很及時
作者: cdh44 時間: 2017-9-1 14:52
回復好像沒好處
作者: cdh44 時間: 2017-9-1 14:52
厲害了 來學習一下
作者: 楊瑞華 時間: 2017-11-11 18:17
下載!!!!!!!!!!!!!
歡迎光臨 (http://www.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
中文字幕 视频一区
|
亚洲欧美视频
|
蜜桃av人人夜夜澡人人爽
|
天天综合永久
|
色婷婷一区
|
超碰在线免费公开
|
91色视频在线观看
|
中文字幕在线一区
|
日韩精品欧美精品
|
国产亚洲网站
|
伊人精品国产
|
99pao成人国产永久免费视频
|
久久久久精
|
日韩欧美国产精品一区
|
人成在线
|
亚洲欧美国产一区二区三区
|
精品国产免费一区二区三区演员表
|
亚洲免费av一区
|
国产精品视频在线观看
|
成年人黄色一级毛片
|
99久久久久国产精品免费
|
毛色毛片免费看
|
亚洲激情综合
|
亚洲久视频
|
久久久久久久久蜜桃
|
亚洲国产精品福利
|
日本五月婷婷
|
黄色一级大片视频
|
中文字幕在线一区
|
国产精品日韩欧美一区二区三区
|
久久神马|
91精品国产乱码久久久久久
|
永久精品
|
av黄色在线
|
国产精品免费一区二区三区四区
|
6080yy精品一区二区三区
|
久久久久国产精品午夜一区
|
自拍偷拍亚洲一区
|
国产精品成人国产乱一区
|
久草视频在线播放
|
波多野吉衣在线播放
|