登录
|
注册会员
开启辅助访问
设为首页
收藏本站
扫一扫关注官方微信
论坛
BBS
M币充值
M currency prepaid phone
M币获取
附件中心
搜索
search
全新论坛MCU智学网上线,欢迎访问新论坛!稀缺资源、技术干货、参考设计、原厂资料尽在MCU智学网
MCU资讯论坛
»
论坛
›
单片机论坛
›
51单片机论坛
›
单片机驱动液晶显示屏的控制系统设计(资料)
更新自动建库工具PCB Footprint Expert 2023.13 Pro / Library Expert 破解版
单片机驱动液晶显示屏的控制系统设计(资料)
[复制链接]
6024
1
gzyi***
新手上路
发表于 2014-5-22 09:23:10
|
查看全部
|
阅读模式
本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要
登录
才可以下载或查看,没有帐号?
注册会员
x
介绍
单片机
驱动控制液晶显示器(带触摸屏)的控制系统设计实例,支持modbus通讯协议,采用的是51单片机,驱动控制19寸液晶显示器(可以是15寸,17寸,19寸,30寸,52寸,55寸显示器或电视机)。支持单片机TTL电平串口,RS232串口,RS485串口,以太网连接. 液晶显示控制器系统软件使用人机界面组态软件HMImaker开发,主要有操作画面、参数设置画面、参数修改、系统登录画面、状态监控画面等功能,界面可以自由设计开发,组态软件开发显示与操作界面,“0”编程、"所见即所得"、"0"代码、如"制作PPT"一样简单,快速!。
本设计以51单片机作为LCD液晶显示系统控制器为主线,基于单片机8051,采用单片机的C语言来进行软件设计,指令的执行速度快,节省存储空间。为了便于扩展和更改,软件的设计根据单片机的串口通信协议(易显单片机协议),支持modbus通讯协议。采用模块化结构,使程序设计的逻辑关系更加简洁明了。使硬件在软件的控制下协调运作。其次阐述了部分程序的流程图和实现过程。本文撰写的主导思想是软、硬件相结合,以硬件为基础,来进行各功能模块的编写。以下对所开发的用单片机实现LCD液晶显示器控制原理的设计思想和软、硬件调试作了详细的论述。
以下是单片机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为待发送的字节数据
******************************************************************
*/
void UART_SendByte(unsigned char i)
{
SBUF=i; //发送本次数据
while(TI==0){}//等待发送完毕
TI=0;
}
#define m_ReadVarAdr 48 //类型:unsigned int 初始值:40 解释:待读 变量地址
#define m_WriteAdr 52 //类型:unsigned int 初始值:28 解释:待写变量地址
/////////////////////////////////本文件如有不明白的地方,咨询热线:13829764765. QQ:252631158 /////////
//////////////////////////////////////////////////////////////////////////////////
//unsigned int adr表示需要设置的HMI变量的地址,
//unsigned short nBytes表示需要设置的HMI变量占一个字节的空间,如果是int变量就占4个字节,如果是short变量就占2个字节,如果是char变量就占1个字节
//unsigned char *m_VarP表示你要设置的HMI变量数据源的的指针,指针所指向的内容就是在HMI变量的将要被设置成的内容
//小技巧:有的时候希望通过调用一次SetVariable一次性设置3个int变量的HMI变量,只要这3个int变量的地址是连续的,那么只要让nBytes=3*4=12个字节就OK
void SetVariable(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 short nBytes表示需要查询的HMI变量占多少个字节的空间,如果是int变量就占4个字节,如果是short变量就占2个字节,如果是char变量就占1个字节
//小技巧:有的时候希望通过调用一次ReadVariable一次性读取3个int变量的HMI变量,只要这3个int变量的地址是连续的,那么只要让nBytes=3*4=12个字节就OK
void ReadVariable(unsigned int 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 char mIndex=0; //定义一个数据索引
unsigned char mCmdAdrBuf[4]; //定义一个缓冲区用于缓冲HMI变量地址
unsigned char mCmdnBytesBuf[2]; //定义一个缓冲区用于缓冲HMI变量字节数量
unsigned char mHmiVarBuf[4]; //定义一个缓冲区用于缓冲HMI变量m_ReadVarAdr内容,因为该变量是4个字节的int变量
unsigned char mHmiVarCheck[2];
unsigned char mReceiveFlag=0; //串口中断成功接收到一个HMI变量设置命令标志
unsigned char mState=0; //命令接收状态
unsigned short mCheckHe;
unsigned int delay=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 char bufcom1;
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;
}
液晶显示屏
,
控制系统
,
单片机
相关帖子
求单片机数at89c52,控制无刷电机的正反转和调速
基于单片机的电子彩灯控制系统设计
PLC与单片机的本质区别是什么?
怎么可以使51单片机和STC11系列的程序兼容呢
云龙51单片机视频教程,目前国内公认的最好的入门视频教程
求助!TX-1C开发板51串行中断 if 语句无法执行问题(看起来很简单,但不知为何总调不过去
求助
关于51单片机处理串口所接收到的数据的判断
国产单片机推荐:无锡矽杰微电子XC8P8600
举报
回复
1 个评论
晶犀***
实习版主
发表于 2014-6-16 17:38:57
|
显示全部楼层
指令的执行速度快,节省存储空间
举报
回复
支持
反对
返回列表
*
滑块验证:
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册会员
本版积分规则
发表回复
回帖后跳转到最后一页
回复
转播
评分
分享
打开支付宝扫一扫,最高立得1212元红包
搜索
本版
帖子
用户
热搜:
传感器
51串口程序
电子管放大器
夾式電表
夾式電流
Mentor论坛
打印机
版块推荐
百宝箱
My 布拉格
无边框Z9
Z9Max
Z9mini
nubia动态
问题 & 建议
资源分享
爱拍
同城会
牛仔生活
查看论坛所有版块>>
每日签到
论坛任务
摄影技巧
跳蚤市场
互助问答
论坛导读
申请内测
红包中心
每日摇一摇
活动中心
网站地图
官方旗舰店
图文热点
低成本、高性能、带EEPROM了解一下
无锡矽杰微电子的XCE855E 是一颗带 EEPROM 的 8 位单片机,专为多 IO 产品的应用而设
工控仪表/水电气表LCD驱动/抗干扰液晶段码
产品品牌:永嘉微电/VINKA 产品型号:VK2C21A 封装形式:SOP28 概述 VK2C21是一
为什么电动车会着火?原因是什么?电动车充
其实电动车起火的新闻我们也不是第一次看到了,让很多人对电动车的安全性产生质疑,但
性价比超高的国产单片机了解一下
hello大家好,我是无锡矽杰微电子的马甲小号 今天给大家介绍一颗单片机,我们的
上手简单,开发资料齐全的触摸单片机了解一
hello,各位工程师大大们新年快乐 我是无锡矽杰微电子的马甲号。 我司新推出了
更多
精华推荐
低成本、高性能、带EEPROM了解一下
工控仪表/水电气表LCD驱动/抗干扰液晶段码
软件模拟2812通信协议导致的种种问题,你遇
适用于电子鞭炮、电子蜡烛灯等方案的单片机
为什么电动车会着火?原因是什么?电动车充
性价比超高的国产单片机了解一下
国产单片机推荐I 低功耗、强驱动、极具性价
上手简单,开发资料齐全的触摸单片机了解一
更多
社区学堂
低成本、高性能、带EEPROM了解一下
工控仪表/水电气表LCD驱动/抗干扰液晶
低成本、高性能、带EEPROM了解一下
无锡矽杰微电子的XCE855E 是一颗带 EEPROM 的 8 位单片机,专为多 IO 产品的应用而设
工控仪表/水电气表LCD驱动/抗干扰液晶段码
产品品牌:永嘉微电/VINKA 产品型号:VK2C21A 封装形式:SOP28 概述 VK2C21是一
为什么电动车会着火?原因是什么?电动车充
其实电动车起火的新闻我们也不是第一次看到了,让很多人对电动车的安全性产生质疑,但
更多
客服中心
QQ:187196467
服务时间:周一至周日 8:30-20:30
在线客服
客服微博
产品咨询
售后中心
关注我们
关于我们
关于我们
友情链接
联系我们
帮助中心
网友中心
购买须知
支付方式
服务支持
资源下载
售后服务
定制流程
关注我们
官方微博
官方空间
官方微信
QQ:187196467
周一到周日 8:30-22:00 (全年无休)
7 x 24小时在线客服
手机版
Powered by
MCUZX!
X3.4 © 2008-2015
MCU资讯论坛
版权所有
京ICP备18035221号-2
客服QQ: 187196467
技术支持:
MCU资讯论坛
|
网站地图
快速回复
返回顶部
返回列表