计算机控制课程设计报告(直流电机转速闭环控制)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

微型计算机控制技术课程设计直流电机转速闭环控制(单片机)
学院名称:自动化学院
专业:自动化专业班级: *****
学号: 2011**** 姓名: ****
学号: 2011**** 姓名: *******
学号: 2011**** 姓名: ******
学号: 2011**** 姓名: ****
评分:教师: ****
摘要
在运动控制系统中,电机转速控制占有至关重要的作用,其控制算法和手段有很多,模拟PID控制是最早发展起来的控制策略之一,长期以来形成了典型的结构,并且参数整定方便,能够满足一般控制的要求,但由于在模拟PID控制系统中,参数一旦整定好后,在整个控制过程中都是固定不变的,而在实际中,由于现场的系统参数、温度等条件发生变化,使系统很难达到最佳的控制效果,因此采用模拟PID控制器难以获得满意的控制效果。

随着计算机技术与智能控制理论的发展,数字PID技术渐渐发展起来,它不仅能够实现模拟PID所完成的控制任务,而且具备控制算法灵活、可靠性高等优点,应用面越来越广。

本设计以上面提到的数字PID为基本控制算法,以51单片机为控制核心,产生占空比受数字PID算法控制的PWM脉冲实现对直流电机转速的控制。

同时利用霍尔传感器将电机速度转换成脉冲频率反馈到单片机中,实现转速闭环控制,达到跟踪校正速度漂移的目的。

关键字:计算机技术、运动控制、PID
目录
摘要 (I)
目录 (II)
序言...................................................................................................................................... - 1 - 1 设计原理.................................................................................................................................. - 2 -
1.1 单片机直流电机调速.................................................................................................. - 2 -
1.2 PWM波的产生............................................................................................................... - 2 -
1.21定时器产生pwm ................................................................................................ - 2 -
1.22 注意事项............................................................................................................ - 2 -
1.3 系统控制原理.............................................................................................................. - 3 -
2 硬件电路设计.......................................................................................................................... -
3 -
2.1 系统总结构................................................................................................................ - 3 -
2.2 硬件电路接线.............................................................................................................. - 4 -
2.3单片机........................................................................................................................... - 5 -
2.4 直流电机驱动电路...................................................................................................... - 7 -
2.5 霍尔传感器测速电路.................................................................................................. - 7 -
3 软件设计.................................................................................................................................. - 7 -
3.1 主程序设计.................................................................................................................. - 7 -
3.2中断计时器设计流程图............................................................................................... - 9 -
4 设计分析................................................................................................................................ - 10 - 5心得体会................................................................................................................................. - 11 -
5.1心得体会().............................................................................................................. - 11 -
5.2心得体会().............................................................................................................. - 11 -
5.3 心得体会()............................................................................................................. - 12 -
5.4 心得体会()............................................................................................................. - 13 -
6 参考文献................................................................................................................................ - 14 -
7 附录................................................................................................................................ - 15 -
序言
微型计算机控制技术在工业领域中得到了广泛的应用。

工业控制微型计算机(简称工控机)可靠性高,实时性好,且具有标准化、模块化、组合化和开放式结构,能适应千差万别的工业控制对象,因而成为现代工业自动化中不可缺少的工具。

PID控制自从20世纪30年代末期出现以来,已成为模拟控制系统中技术最成熟、应用最广泛的一种控制方式。

PID控制技术结构简单,参数调整方便,其实质是根据输入的偏差值,按比例、积分、微分的函数关系进行运算运算结果用以输出进行控制。

它是在长期的工程实践中总结出来的一套控制方法,实际运行经验和理论分析都表明,对许多工业过程进行控制时,这种方法都能得到比较满意的结果。

在计算机用于工业控制之前,模拟PID控制器占有垄断地位。

由于在模拟PID控制系统中,参数一旦整定好后,在整个控制过程中都是固定不变的,而在实际中,由于现场的系统参数、温度等条件发生变化,使系统很难达到最佳的控制效果,因此采用模拟PID控制器难以获得满意的控制效果。

随着计算机技术与智能控制理论的发展,数字PID技术渐渐发展起来,它不仅能够实现模拟PID 所完成的控制任务,而且具备控制算法灵活、可靠性高等优点,应用面越来越广。

在工业控制领域中,直流电机是常见的机电装置,以单片机为控制器对电机进行控制,运用串口通信技术实现电机的远程测控。

通过采用周期测量法测量电机的转速,运用PWM技术实现对电机的驱动控制,为直流电机的控制提供了一种低成本高精度的测控方案。

1 设计原理
1.1 单片机直流电机调速
单片机直流调速系统可实现对直流电动机的平滑调速。

PWM是通过控制固定电压的直流电源开关频率,从而改变负载两端的电压,进而达到控制要求的一种电压调整方法。

在PWM驱动控制的调整系统中,按一个固定的频率来接通和断开电源,并根据需要改变一个周期内“接通”和“断开”时间的长短。

通过改变直流电机电枢上电压的“占空比”来改变平均电压的大小,从而控制电动机的转速。

因此,PWM又被称为“开关驱动装置”。

本系统以SST89E554RC单片机为核心,通过单片机控制,C语言编程实现对直流电机的调速。

1.2 PWM波的产生
如果要用51来产生PWM波就必须要用软件编程的方法来模拟。

方法大概可以分为软件延时和定时器产生两种方法。

本次课程设计我们采用定时器产生PWM方波。

1.21定时器产生pwm
这种方法利用了定时器溢出中断,在中断服务程序改变电平的高低,在程序较复杂、多操作时仍能输出较准确的pwm波形。

1.22 注意事项
1) 中断服务程序的内容。

一般来说中断服务程序只完成改变标志位、转换高低电平的功能,如果中断服务程序中有太多的操作会影响pwm波的输出,尤其是除法、取余、浮点数运算会占用大量的机器周期,应在中断外完成运算。

2) 定时器装入初值的问题。

装入初值不能太接近于定时器的溢出值。

如我们使用定时器方式1,最多能计65536个数,假设我们转入的初值为65534,那么定时器计两个数就会进入中断,这样会使程序紊乱而其他功能无法正常地执行,所以一般要留50-100个数的裕量。

3) 定时器初值的计算
设占空比为α,频率为f
产生高电平时装入定时器高8位的值应为
TH0=[65535−(106*α)/f]/256
产生高电平时装入定时器低8位的值应为
TL0= (65535−106*α) %256
显然,产生低电平时的公式只要把α换成(1-α)就行了。

然而在51单片机中,浮点数运算需要消耗cpu很长的时间,为了提高程序效率,通常用100倍的占空比来计算。

同时,要注意数据类型,避免超出范围,影响计算结果
1.3 系统控制原理
本直流电机调速系统以单片机系统为依托,根据PWM调速的基本原理,通过PI控制以直流电机电枢上电压的占空比来改变平均电压的大小,从而控制电动机的转速为依据,实现对直流电动机的平滑调速,并通过单片机控制速度的变化。

本设计的直流电机调速系统主要是由硬件和软件两大部分组成。

硬件部分是前提,是整个系统执行的基础,它主要为软件提供程序运行的平台。

而软件部分,是对硬件端口所体现的信号,加以采集、分析、处理,最终实现控制器所要实现的各项功能,达到控制器自动对电机速度的有效控制。

2 硬件电路设计
2.1 系统总结构
硬件电路由电源模块、单片机控制单元、电机驱动电路、LCD12864显示电路、霍尔传感器电路构成。

系统结构总图如图1
1)电源模块:为整个系统提供电源
2)单片机控制单元:整个系统的核心,对数据进行处理,使用PID算法,实现电机转速的闭环控制。

3)电机驱动电路:根据单片机的输出来控制驱动电机。

4)LCD12864:实时显示vs(设定转速)、vt(实测转速)、dt(占空比)5)霍尔传感器电路:将实时测得转速输入到单片机和LCD12864中
图1 系统结构总图
2.2 硬件电路接线
单片机的P0口接LCD12864的数据口D口,P2.3、P2.4、P2.5、P2.6、P2.7分别接LCD12864的CS2、CS1、RW、RS、EN口,P1.7为单片机PWM波输出口,接电机驱动电路,+12V为电机驱动电源,接+12v,HR为霍尔传感器转速输出口,接单片机P3.4口,其单片机和LCD12864接口电连线图如下图,图2,、图3
图2 单片机接口连线图
图3 LCD12864接口连线图
2.3单片机
本次设计中采用的是STC AT89C51单片机,其引脚封装图如下
图4 C51引脚封装图
其功能如下:
·8位CPU·4kbytes程序存储器(ROM) (52为8K)
·128bytes的数据存储器(RAM) (52有256bytes的RAM)
·32条I/O口线·111条指令,大部分为单字节指令
·21个专用寄存器
·2个可编程定时/计数器·5个中断源,2个优先级(52有6个)
·一个全双工串行通信口
·外部数据存储器寻址空间为64kB
·外部程序存储器寻址空间为64kB
·逻辑操作位寻址功能·双列直插40PinDIP封装
·单一+5V电源供电
CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器;
RAM:用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;
ROM:用以存放程序、一些原始数据和表格;
I/O口:四个8位并行I/O口,既可用作输入,也可用作输出;
T/C:两个定时/记数器,既可以工作在定时模式,也可以工作在记数模式;
五个中断源的中断控制系统;
一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信;
片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。

最高振荡频率为12M。

2.4 直流电机驱动电路
图5 直流电机驱动电路
2.5 霍尔传感器测速电路
工作原理:霍尔开关集成电路中的信号放大器将霍尔元件产生的幅值随磁场强度变化的霍尔电压UH放大后再经信号变换器、驱动器进行整形、放大后输出幅值相等、频率变化的方波信号。

信号输出端每输出一个周期的方波,代表转过了一个齿。

单位时间内输出的脉冲数N,因此可求出单位时间内的速度V=NT。

3 软件设计
3.1 主程序设计
主程序是一个循环程序,其主要思路是,先设定好速度初始值,这个初始值与测速电路送来的值相比较得到一个误差值,然后用PID增量式算法输出控制系数给PWM发生电路改变波形的占空比,进而控制电机的转速。

主程序流程图如下:
图6 主程序流程图
3.2中断计时器设计流程图
图7 计时器中断子程序
4 设计分析
1 本次课程设计为直流电机转速闭环控制(采用单片机教学实验系统),设计要求如下:
1)使用LED/LCD 实时显示电机转速。

2)要求在3秒内使用PID 算法实现速度漂移。

2直流电机转速闭环控制硬件基本参数为:
1)电机旋转一周输出一个脉冲;
2)电机转速最大值,即满占空比状态为70r/s ;(由示波器测出) 3 设计完成后所得数据:
1)本设计采用LCD12864实现电机转速的实时显示,如图8
图8 LCD12864实时显示屏
2)稳态误差2≤ss e r/min 3)调节时间s t s 3≤ 4误差分析:
由于霍尔元件测速输出脉冲为1个/r,所以当计数时间较短时,存在较大的误差;若计数时间较长时,虽准确性提高,但将牺牲整个调节的响应时间;在经过工程实验之后,选择测速时间为500ms ,能够在准确性和响应速度之间基本达到要求;
5心得体会
5.1心得体会()
计算机控制技术的课程设计相比硬件的课程设计,简直难了不止一个档次,作为主要的编程人员,当我实际要去控制一个物体的时候,我才知道自己以前学的知识有多么的不牢固,不过真真正正的去做一个实物控制程序的时候,才能真切的体会到以前书本上学的知识是如何运用到实际的。

比如说这次我们做PID 控制的时候运用到的PID算式,我们采用了增量式的PID计算。

如何将增量与上一次的控制量结合在一起,又如何在程序语句中表达,以前我基本上可以说是为了应付考试勉勉强强学了一些,这次实际做到项目设计后,才理解其真正的含义。

另外,这次另外一个感受就是在自控原理中提及到的,各种参数对系统动态和静态性能的影响,因为我们的采样时间和PID的参数调整不当,都可能使系统发散,要么响应时间过慢,要么超调过大。

所以如何采样,如何进行PID参数设定也是本次课程设计一大值得思考的问题。

还有就是,本次项目,我们采用了LCD显示屏作为显示单元,比LED数码管复杂就是,LCD液晶显示屏需要对其进行字库的建立,还有分屏,分行列的处理,这也是以前没有运用到过的,所以总体来说,这次课程设计带给我的不仅仅是旧知识的复习,还有新的探索。

5.2心得体会()
这次计控课程设计中,我们小组的任务是做一个直流电机的转速的PID控制,并且是基于单片机运行的;这次课程设计中,我的任务是进行程序的调试以及修改。

在这次课程设计的调试过程中,由于使用的是单片机,需要将程序下载到开发板中进行运行。

在调试过程中曾经出现过,由于给开发板供电的电源不够稳定导致了程序无法正常运行的情况,而且这个情况不易发觉,曾一度给调试工作带来了一定的困难。

程序中所用的PID控制,由于要求的精度不是很高,而且为
了程序的编写方便,我们采用的是增量式的PID,并且基于理论与实际之间存在的误差以及程序中的所给电机的PWM波的输出频率较低,PID的参数主要是依据实际的测试获得的,故而并不是最优的参数,但也是基本能够达到目标要求。

在PID的参数调节中采用的是试凑法,先确定比例系数和积分系数,使得系统不产生过大超调并能最终稳定,再根据响应速度的要求适当的加入微分环节,调节微分系数的大小,使得最终满足快速性和稳定性的要求。

在这次课程设计中,我学到了很多关于计控的实际应用,巩固了计控的相关知识,以及巩固了单片机编程的相关知识,对今后的学习有着很大的帮助。

5.3 心得体会()
这一次我们组做的是用单片机构建直流电机转速闭环控制系统。

在任务指导书中,参数和设计要求已经写得非常清楚了,而且这次的课程实际要求在一周内完成,所以拿到课题之后,马上就开始查找相关资料。

PWM波的特点、如何用单片机产生PWM方波以及PID算法。

这些知识点在前面的学习中都有了解,现在又把它们温习一遍。

硬件部分除了使用到单片机教学实验箱之外,还有上学期课程设计时自己焊接的电路板。

程序部分最麻烦的是LCD液晶显示部分,还好网上有相应的例子可以用作参考。

总的来说这一次的课程设计还是比较紧张的,不论从时间上还是精力上都是一次不小的挑战。

这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。

不仅要将理论很好地应用到实际当中去,而且还要学会如何去培养我们的创新精神,从而不断地战胜自己,超越自己。

创新,是要我们学会将理论很好地联系实际,并不断地去开动自己的大脑,做自己力所能及的,别人却没想到的事。

更重要的是,我在这一设计过程中,学会了坚持不懈,不轻易言弃。

设计过程,也好比是我们人类成长的历程,常有一些不如意,也许这就是在对我们提出了挑战,勇敢过,也战胜了,胜利的钟声也就一定会为我们而敲响。

通过这次课程设计,我们巩固和加强了计算机控制技术知识,体现出了设计开发系统的能力以及综合运用知识的能力,体会了学以致用、突出自己劳动成果的喜悦心情,从中发现自己平时学习的不足和薄弱环节,从而加以弥补。

在今后的学习中,我们应该发现自己的不足然后虚心学习,更加完善自己,为今后步入社会参加工作打下足够的基础。

在这次设计过程中,我们发现做事情需要综合运用知识,要体会到学以致用,从中发现自己平时学习的不足和薄弱环节,从而加以弥补。

理论结合实际,思想依靠操作。

我们学习的理论知识需要加以运用到实际才算学成。

5.4 心得体会()
为期一周的课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。

在设计过程中,与同学分工设计,和同学们相互探讨,相互学习,相互监督。

学会了合作,学会了运筹帷幄,学会了宽容,学会了理解,也学会了做人与处世。

课程设计是我们专业课程知识综合应用的实践训练,着是我们迈向社会,从事职业工作前一个必不少的过程.”千里之行始于足下”,通过这次课程设计,我深深体会到这句千古名言的真正含义.我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在社会大潮中奔跑打下坚实的基础。

在课程设计中,通过应用本专业所学理论知识,将学科之间连起来,并应用于实践生活之中,从而培养和提高学生的实践能力。

通过复习及查阅资料,我对51单片机的功能更加熟悉,掌握了霍尔元件测转速的原理,LCD12864的接口电路以及其应用,提高了对问题的分析能力,更加了解了实践和理论的差距。

在此,感谢对我帮助过的同学们,谢谢你们对我的帮助和支持,让我感受到同学的友谊。

由于本人的设计能力有限,在设计过程中出力较少,唯有尽己之力,在报告中充分详尽地展示出我们的设计。

如有瑕疵或纰漏,还望老师多多指教!学生感激不尽!
6 参考文献
1、单片机原理及应用(清华大学出版社,黄勤主编,李楠副主编)
2、计算机硬件技术基础实验教程(重庆大学出版社,黄勤主编,高富强副主编)
3、微型计算机控制技术(机械工业出版社,黄勤主编,李楠副主编)
7 附录
程序清单:
-------------------------------------------------------------------------------------------------------主程序
------------------------------------------------------------------------------------------------------- #include<reg52.h>
#include<stdio.h>
#include"Display.h"
#include "delay.h"
#define unchar unsigned char
#define unint unsigned int
sbit p37=P3^7; //赋电机初速按钮
sbit p36=P3^6; //改变占空比按钮(人为给一个速度漂移)
sbit p17=P1^7; //PWM波输出端口
int ek0=0,ek1=0,ek2=0; //设置初始偏差量
unchar duty=50;//设置初始占空比
unchar speed_set=0; //设置初始速度
unchar speed_real=0; //设置测量速度
void speed_set_key(void);//初始速度设定按键
void Timing_counter(void);//定时器计数器程序初始化
void change_duty(void);//改变占空比程序初始化
void speed_test(void);//速度测试程序初始化
unchar counter_flag=0; //计数器溢出标志
unchar time_flag=0;//定时标志位
unchar PID_c(); //PID控制程序定义
float pp=1.6; //设置PID各参数
float ii=1.2;
float dd=0.15;
void main()
{ p17=1; //让1.7口为PWM波输出口
Init_Display();
speed_set_key(); //调用判键程序并赋转速初值
Timing_counter(); //调用定时器计数器
while(1)
{ change_duty(); //调用干扰程序(改占空比)
speed_test(); //调用速度测试程序
Disp_lay();
duty=PID_c(); //调用PID程序
if(duty<0)
duty=10;
if(duty>100)
duty=100;
}
}
void Timing_counter(void) //定时器,计数器初始化子程序
{
TMOD=0x15; //定时器0用于电机测速计数,定时器1用于定义周期10ms TH0=0X00; //计数器初值设置为0
TL0=0X00;
TH1=0XD8; //定时器1设置10ms
TL1=0XF0;
ET0=1; //允许T0中断
ET1=1; //允许T1中断
EA=1; //开系统中断
TR1=1; //启动定时器1
}
void speed_set_key(void) //赋电机初速度子程序
{ while(p37)
;
if(p37==0)
{ speed_set=50;
} //判断P10对应按键是否按下和弹起,如果按下弹起,就给电机初速500
}
void change_duty(void) //改变占空比子程序,若按下弹起P1,就让初始占空比50%变为80%
{ if(p36==0)
duty=40;
}
unchar PID_c() // PID 算法
{ static unchar a;
ek0=speed_set-speed_real;
a=duty+pp*(ek0-ek1)+ii*ek0+dd*(ek0-2*ek1+ek2);
ek2=ek1;
ek1=ek0;
return a;
}
void speed_test(void)
{ static unchar a;
static unchar b;
TR0=1; //开起测试记数
counter_flag=1; //准许测速(记数脉冲)
while(time_flag==0) //等待测试完成
;
time_flag=0;
a=TL0; //测试数值低位给a
b=TH0*256; //高位给b
TH0=0;
TL0=0;
speed_real=2*(a+b); //测速总值给speed_real
}
void INT_timer_0(void) interrupt 1
{ TH0=0x00;
TL0=0X00;
}
void INT_timer_1(void) interrupt 3
{ static unchar c; //控制技术100次,即100ms 给一次speed_real static unchar d; //PWM发波
TH1=0XD8;
TL1=0XF0;
if(d<duty)
{
p17=0;
}
else
{ p17=1;
}
d++;
if(d==100) //1秒计时到
{
d=0;
}
if (counter_flag)
{ c++;
if(c==50)
{ TR0=0;
c=0;
time_flag=1;
counter_flag=0;
}
}
}
-------------------------------------------------------------------------------------------------------显示程序
------------------------------------------------------------------------------------------------------- #include <reg52.h>
#include <intrins.h>
#include"Display.h"
#include "delay.h"
#define uint unsigned int
#define uchar unsigned char
#define nop _nop_()
#define LCD_data P0 //数据口
sbit LCD_RS = P2^6; //寄存器选择输入
sbit LCD_RW = P2^5; //液晶读/写控制
sbit LCD_EN = P2^7; //液晶使能控制
sbit LCD_CS1 = P2^4; //低电平有效控制左半屏
sbit LCD_CS2 = P2^3; //低电平有效控制右半屏
//sbit LCD_RST = P3^4; //液晶复位端口
unsigned char i,i1,i2,j,j1,j2,k,k1,k2;
extern unsigned char speed_set;
extern unsigned char speed_real;
extern unsigned char duty;
uchar code maohao[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00};/*":",4*/
uchar code she[]={0x40,0x40,0x42,0xCC,0x00,0x40,0xA0,0x9E,0x82,0x82,0x82,0x9E,0xA0,0x 20,0x20,0x00,0x00,0x00,0x00,0x3F,0x90,0x88,0x40,0x43,0x2C,0x10,0x28,0x46,0x4 1,0x80,0x80,0x00};
uchar code su[]={0x40,0x40,0x42,0xCC,0x00,0x04,0xF4,0x94,0x94,0xFF,0x94,0x94,0xF4,0x04, 0x00,0x00,0x00,0x40,0x20,0x1F,0x20,0x48,0x44,0x42,0x41,0x5F,0x41,0x42,0x44,0 x48,0x40,0x00};
uchar code shi[]={0x10,0x0C,0x04,0x84,0x14,0x64,0x05,0x06,0xF4,0x04,0x04,0x04,0x04,0x14, 0x0C,0x00,0x04,0x84,0x84,0x44,0x47,0x24,0x14,0x0C,0x07,0x0C,0x14,0x24,0x44, 0x84,0x04,0x00};
uchar code zhan[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x08,0x08,0x08,0x08,0x08,0x0 8,0x08,0x00,0x00,0x00,0xFF,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0xFF, 0x00,0x00,0x00};
uchar code kong[]={0x10,0x0C,0x44,0x24,0x14,0x04,0x05,0x06,0x04,0x04,0x14,0x24,0x44,0x 14,0x0C,0x00,0x00,0x40,0x40,0x41,0x41,0x41,0x41,0x7F,0x41,0x41,0x41,0x41,0x4 0,0x40,0x00,0x00};
uchar code shuzi[10][32]=
{
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0
x0F,0x00,},/*"0"*/
{0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0 x00,0x00,},/*"1"*/
{0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0 x30,0x00,},/*"2"*/
{0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0 x0E,0x00,},/*"3"*/
{0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0 x24,0x00,},/*"4"*/
{0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0 x0E,0x00,},/*"5"*/
{0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0 x0E,0x00,},/*"6"*/
{0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0 x00,0x00,},/*"7"*/
{0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0 x1C,0x00,},/*"8"*/
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0 x0F,0x00,},/*"9"*/
};
void delay(uchar a) //延时
{
uchar x,y;
for(x=0;x<a;x++)
for(y=0;y<10;y++);
}
/*void LCD_busy() //忙检测函数
{
LCD_data=0x00;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
while( LCD_data & 0x80 );
LCD_EN = 0;
LCD_RS = 0;
LCD_RW = 1;
}*/
void LCD_write_cmmand(uchar cmd) //写指令函数{
// LCD_busy();
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
LCD_data = cmd;
// nop;
// nop;
delay(2);
LCD_EN = 1;
// nop;
// nop;
delay(2);
LCD_EN = 0;
}
void LCD_write_data(uchar dat) //写数据函数
{
// LCD_busy();
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
LCD_data = dat;
delay(2);
LCD_EN = 1;
delay(2);
LCD_EN = 0;
}
void set_page(uchar page)//设置页,要那一页直接是那个数字就行了
{ //总共有8页,一页是8行点阵点,即128*8
page=0xb8|page; //页得首地址为0xB8 1011 1XXX
LCD_write_cmmand(page);
}
void set_line(uchar startline) //设置显示的起始行
{
startline=0xc0|startline; //起始行地址为0xc0
LCD_write_cmmand(startline); //设置从哪一行开始,共0--63 11XX XXXX }
void set_column(uchar column) //设置显示的列
{
column=column&0x3f; //列的最大值为64,因为分成两个屏了
column=0x40|column; //列的首地址为0x40; 01XX XXXX
LCD_write_cmmand(column); //设置列位置
}
void setonoff(uchar onoff) //显示开关函数,1为开,0为关
{
onoff=0x3e|onoff; //0x3e是关显示,0x3f是开显示0011 111X onoff只能为0或者1;
LCD_write_cmmand(onoff);
}
void selectscreen(uchar screen) //选屏
{
switch(screen)
{
case 0:LCD_CS1=0;LCD_CS2=0;break; //全屏
case 1:LCD_CS1=0;LCD_CS2=1;break; //选左半屏
case 2:LCD_CS1=1;LCD_CS2=0;break; //选右半屏
default:break;
}
}
void clearscreen(uchar screen) //清屏
{
uchar in,jn;
selectscreen(screen);
LCD_write_cmmand((0xb8)+0);
LCD_write_cmmand((0x40)+0);
for(in=0;in<8;in++) //控制页数0--7,共8页
{
set_page(in);
// set_column(0);
for(jn=0;jn<64;jn++) //控制列数0-63,共64列
{
LCD_write_data(0x00); //写入0,地址指针自加1
}
}
}
void LCD_init() //lcd的初始化
{
// LCD_busy(); //忙检测
delay(100);
selectscreen(0); //两个屏都选
setonoff(0); //关显示
selectscreen(0); //选屏
setonoff(1); //开显示
clearscreen(0); //清屏
set_line(0); //开始行为0
// set_column(0); //开始列为0
// set_page(0); //开始页为0
}
void display(uchar ss,uchar page,uchar column,uchar *p) //显示数字{
uchar in;
selectscreen(ss); //选屏
delay(2);
set_page(page); //写上半页
set_column(column); //控制列
for(in=0;in<8;in++) //控制16列的数据输出,因为一个汉字是16*16点阵的{
LCD_write_data(p[in]); //汉字的上半部分
}
set_page(page+1); //写下半页
set_column(column); //控制列
for(in=0;in<8;in++) //控制16列数据的输出
{
LCD_write_data(p[in+8]);//汉字的下半部分
}
}
void display2(uchar ss,uchar page,uchar column,uchar *p) //显示汉字
{
uchar in;
selectscreen(ss); //选屏
delay(2);
set_page(page); //写上半页
set_column(column); //控制列
for(in=0;in<16;in++) //控制16列的数据输出,因为一个汉字是16*16点阵的{
LCD_write_data(p[in]); //汉字的上半部分
}
set_page(page+1); //写下半页
set_column(column); //控制列
for(in=0;in<16;in++) //控制16列数据的输出
{
LCD_write_data(p[in+16]);//汉字的下半部分
}
}
void Init_Display()
{
LCD_init(); //lcd初始化
set_line(0);
LCD_init(); //lcd初始化
set_line(0);
Char_string(speed_set,speed_real,duty); clearscreen(0);
display2(1,0,4,she);
display2(1,0,24,su);
display2(1,0,40,maohao);
display2(1,2,4,shi);
display2(1,2,24,su);
display2(1,2,40,maohao);
display2(1,4,4,zhan);
display2(1,4,24,kong);
display2(1,4,40,maohao);
display(2,0,4,shuzi[i]);
display(2,0,24,shuzi[j]);
display(2,0,40,shuzi[k]);
display(2,2,4,shuzi[i1]);
display(2,2,24,shuzi[j1]);
display(2,2,40,shuzi[k1]);
display(2,4,4,shuzi[i2]);
display(2,4,24,shuzi[j2]);
display(2,4,40,shuzi[k2]);
}
void Disp_lay()
{
//clearscreen(2);
Char_string(speed_set,speed_real,duty); /*display(1,0,4,v); //v
display(1,0,24,s); //s
display(1,0,40,maohao); //:
display(1,2,4,v); //v
display(1,2,24,t); //t
display(1,2,40,maohao); //:
display(1,4,4,d); //d
display(1,4,24,t); //t
display(1,4,40,maohao); //:
*/
display(2,0,4,shuzi[i]);
display(2,0,24,shuzi[j]);
display(2,0,40,shuzi[k]);
display(2,2,4,shuzi[i1]);
display(2,2,24,shuzi[j1]);
display(2,2,40,shuzi[k1]);
display(2,4,4,shuzi[i2]);
display(2,4,24,shuzi[j2]);
display(2,4,40,shuzi[k2]);
}
void Char_string(unsigned char data0,unsigned char data1,unsigned char data2)
{
i = data0/100;
j = (data0%100)/10;
k = data0%10;
i1 = data1/100;
j1 = (data1%100)/10;
k1 = data1%10;
i2 = data2/100;
j2 = (data2%100)/10;
k2 = data2%10;
}
-------------------------------------------------------------------------------------------------------延时程序
------------------------------------------------------------------------------------------------------- #include "delay.h"
/*------------------------------------------------
uS延时函数
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延时函数
------------------------------------------------*/
void DelayMs(unsigned char t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
-------------------------------------------------------------------------------------------------------H头文件
------------------------------------------------------------------------------------------------------- #ifndef __DISP_H__
#define __DISP_H__
void delay(uchar a); //延时
void LCD_busy(); //忙检测函数
void LCD_write_cmmand(uchar cmd); //写指令函数
void LCD_write_data(uchar dat); //写数据函数
void set_page(uchar page);//设置页,要那一页直接是那个数字就行了
void set_line(uchar startline); //设置显示的起始行
void set_column(uchar column); //设置显示的列
void setonoff(uchar onoff); //显示开关函数,1为开,0为关
void selectscreen(uchar screen); //选屏
void clearscreen(uchar screen); //清屏
void LCD_init(); //lcd的初始化
void display(uchar ss,uchar page,uchar column,uchar *p); //显示数字
void display2(uchar ss,uchar page,uchar column,uchar *p); //显示汉字
void Init_Display();
void Disp_lay();
void Char_string(unsigned char data0,unsigned char data1,unsigned char data2);
#endif。

相关文档
最新文档