第一篇:1602显示原理及应用(课件)
所谓1602是指显示的内容为16*2,即可以显示两行,每行16个字符。目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。
1602液晶的正面(绿色背光,黑色字体)
1602液晶背面
另一种1602液晶模块,显示屏是蓝色背光白色字体
字符型LCD1602通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,引脚定义如下表所示:
HD44780内置了DDRAM、CGROM和CGRAM。
DDRAM就是显示数据RAM,用来寄存待显示的字符代码。共80个字节,其地址和屏幕的对应关系如下表:
也就是说想要在LCD1602屏幕的第一行第一列显示一个“A”字,就要向DDRAM的00H地址写入“A”字的代码就行了。但具体的写入是要按LCD模块的指令格式来进行的,后面我会说到的。那么一行可有40个地址呀?是的,在1602中我们就用前16个就行了。第二行也一样用前16个地址。对应如下:
DDRAM地址与显示位置的对应关系
(事实上我们往DDRAM里的00H地址处送一个数据,譬如0x31(数字1的代码)并不能显示1出来。这是一个令初学者很容易出错的地方,原因就是如果你要想在DDRAM的00H地址处显示数据,则必须将00H加上80H,即80H,若要在DDRAM的01H处显示数据,则必须将01H加上80H即81H。依次类推。大家看一下控制指令的的8条:DDRAM地址的设定,即可以明白是怎么样的一回事了)
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如下表所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”
上表中的字符代码与我们PC中的字符代码是基本一致的。因此我们在向DDRAM写C51字符代码程序时甚至可以直接用P1='A'这样的方法。PC在编译时就把“A”先转为41H代码了。
字符代码0x00~0x0F为用户自定义的字符图形RAM(对于5X8点阵的字符,可以存放8组,5X10点阵的字符,存放4组),就是CGRAM了。
0x20~0x7F为标准的ASCII码,0xA0~0xFF为日文字符和希腊文字符,其余字符码(0x10~0x1F及0x80~0x9F)没有定义。
那么如何对DDRAM的内容和地址进行具体操作呢,下面先说说HD44780的指令集及其设置说明,请浏览该指令集,并找出对DDRAM的内容和地址进行操作的指令。共11条指令:
1.清屏指令
功能:<1> 清除液晶显示器,即将DDRAM的内容全部填入“空白”的ASCII码20H;
<2> 光标归位,即将光标撤回液晶显示屏的左上方;
<3> 将地址计数器(AC)的值设为0。
2.光标归位指令
功能:<1> 把光标撤回到显示器的左上方;
<2> 把地址计数器(AC)的值设置为0;
<3> 保持DDRAM的内容不变
3.进入模式设置指令
功能:设定每次写入1位数据后光标的移位方向,并且设定每次写入的一个字符是否移动。参数设定的情况如下所示:
位名
设置
I/D
0=写入新数据后光标左移
1=写入新数据后光标右移
S
0=写入新数据后显示屏不移动
1=写入新数据后显示屏整体右移1个字
4.显示开关控制指令
功能:控制显示器开/关、光标显示/关闭以及光标是否闪烁。参数设定的情况如下:
位名
设置
D
0=显示功能关
1=显示功能开
C
0=无光标
1=有光标
B
0=光标闪烁
1=光标不闪烁
5.设定显示屏或光标移动方向指令
功能:使光标移位或使整个显示屏幕移位。参数设定的情况如下:
S/C
R/L
设定情况
0
0
光标左移1格,且AC值减1
0
光标右移1格,且AC值加1
0
显示器上字符全部左移一格,但光标不动
显示器上字符全部右移一格,但光标不动
6.功能设定指令
功能:设定数据总线位数、显示的行数及字型。参数设定的情况如下:
位名
设置
DL
0=数据总线为4位
1=数据总线为8位
N
0=显示1行
1=显示2行
F
0=5×7点阵/每字符
1=5×10点阵/每字符
7.设定CGRAM地址指令
功能:设定下一个要存入数据的CGRAM的地址。
8.设定DDRAM地址指令
功能:设定下一个要存入数据的CGRAM的地址。
(注意这里我们送地址的时候应该是0x80+Address,这也是前面说到写地址命令的时候要加上0x80的原因)
9.读取忙信号或AC地址指令
功能:<1> 读取忙碌信号BF的内容,BF=1表示液晶显示器忙,暂时无法接收单片机送来的数据或指令;当BF=0时,液晶显示器可以接收单片机送来的数据或指令;
<2> 读取地址计数器(AC)的内容。
10.数据写入DDRAM或CGRAM指令一览
功能:<1> 将字符码写入DDRAM,以使液晶显示屏显示出相对应的字符;
<2> 将使用者自己设计的图形存入CGRAM。
11.从CGRAM或DDRAM读出数据的指令一览
功能:读取DDRAM或CGRAM中的内容。
基本操作时序:
读状态
输入:RS=L,RW=H,E=H
输出:DB0~DB7=状态字
写指令
输入:RS=L,RW=L,E=下降沿脉冲,DB0~DB7=指令码
输出:无
读数据
输入:RS=H,RW=H,E=H
输出:DB0~DB7=数据
写数据
输入:RS=H,RW=L,E=下降沿脉冲,DB0~DB7=数据
输出:无
这么多的指令刚开始的时候没有必要全部掌握,随着学习的深入可以再尝试去用更复杂的控制指令。
测试用的最小系统,单片机是STC89C516,晶振为12M。液晶为蓝底白字的那种1602。
当我们硬件连接错误,或者程序错误时就会出现下图这种情况,就是上排显示16的白色的块(蓝底黑字的液晶则显示的是16个黑块)。
在1602的上排显示“LCD1602 check ok”下排显示“study up”程序中没有用到忙检测,而是用延时函数来替代忙检测.#include
#define uint unsigned int //预定义一下
#define uchar unsigned char
sbit rs=P3^5;
//1602的数据/指令选择控制线
sbit rw=P3^6;//1602的读写控制线
sbit en=P3^7;//1602的使能控制线
/*P0口接1602的D0~D7,注意不要接错了顺序*/
uchar code table[]=“LCD1602 check ok”;//要显示的内容1放入数组tablel uchar code table1[]=“study up”;
//要显示的内容2放入数组table1 void delay(uint n)
//延时函数
{
uint x,y;
for(x=n;x>0;x--)
for(y=110;y>0;y--);
}
void lcd_wcom(uchar com)//1602写命令函数
{
rs=0;
//选择指令寄存器
rw=0;
//选择写
P0=com;
//把命令字送入P0
delay(5);
//延时一小会儿,让1602准备接收数据
en=1;
//使能线电平变化,命令送入1602的8位数据口
en=0;}
void lcd_wdat(uchar dat)//1602写数据函数
{
rs=1;
//选择数据寄存器
rw=0;
//选择写
P0=dat;
//把要显示的数据送入P0
delay(5);//延时一小会儿,让1602准备接收数据
en=1;
//使能线电平变化,数据送入1602的8位数据口
en=0;}
void lcd_init()
//1602初始化函数
{
lcd_wcom(0x38);
//8位数据,双列,5*7字形
lcd_wcom(0x0c);
//开启显示屏,关光标,光标不闪烁
lcd_wcom(0x06);
//显示地址递增,即写一个数据后,显示位置右移一位
lcd_wcom(0x01);
//清屏
}
void main()
//主函数
{
uchar n,m=0;
lcd_init();
//液晶初始化
lcd_wcom(0x80);
//显示地址设为80H(即00H,)上排第一位
for(m=0;m<16;m++)//将table[]中的数据依次写入1602显示
{
lcd_wdat(table[m]);
delay(200);
}
lcd_wcom(0x80+0x44);
//重新设定显示地址为0xc4,即下排第5位
for(n=0;n<8;n++)
//将table1[]中的数据依次写入1602显示
{
lcd_wdat(table1[n]);
delay(200);
}
while(1);//动态停机
}
程序写好后烧写进单片机,现在让我们看看效果吧
这就是显示的效果,你做成功了吗?
下面让我们来看看如何显示一个自定义的字符吧
我们从CGROM表上可以看到,在表的最左边是一列可以允许用户自定义的CGRAM,从上往下看着是16个,实际只有8个字节可用。它的字符码是00000000-00000111这8个地址,表的下面还有8个字节,但因为这个CGRAM的字符码规定0-2位为地址,3位无效,4-7全为零。因此CGRAM的字符码只有最后三位能用也就是8个字节了。等效为0000X111,X为无效位,最后三位为000-111共8个。
如果我们要想显示这8个用户自定义的字符,操作方法和显示CGROM的一样,先设置DDRAM位置,再向DDRAM写入字符码,例如“A”就是41H。现在我们要显示CGRAM的第一个自定义字符,就向DDRAM写入00000000B(00H),如果要显示第8个就写入00000111(08H),简单吧!
好!现在我们来看怎么向这八个自定义字符写入字模。有个设置CGRAM地址的指令大家还记得吗?赶快再找出来看看。
从这个指令可以看出指令数据的高2位已固定是01,只有后面的6位是地址数据,而这6位中的高3位就表示这八个自定义字符,最后的3位就是字模数据的八个地址了。例如第一个自定义字符的字模地址为01000000-01000111八个地址。我们向这8个字节写入字模数据,让它能显示出“℃”
地址:01000000
数据:00010000
图示:○○○■○○○○
01000001
00000110
○○○○○■■○
01000010
00001001
○○○○■○○■
01000011
00001000
○○○○■○○○
01000100
00001000
○○○○■○○○
01000101
00001001
○○○○■○○■
01000110
00000110
○○○○○■■○
01000111
00000000
○○○○○○○○
下面我们写一段程序让这8个自定义字符显示出一个心的图案:(由于上面那个显示程序已经有很详细的注释了,因此这个程序只对与上个程序不同的地方写注释)
#include
uchar code table[]={0x03,0x07,0x0f,0x1f,0x1f,0x1f,0x1f,0x1f,0x18,0x1E,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x07,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x10,0x18,0x1c,0x1E,0x1E,0x1E,0x1E,0x1E,0x0f,0x07,0x03,0x01,0x00,0x00,0x00,0x00,0x1f,0x1f,0x1f,0x1f,0x1f,0x0f,0x07,0x01,0x1f,0x1f,0x1f,0x1f,0x1f,0x1c,0x18,0x00,0x1c,0x18,0x10,0x00,0x00,0x00,0x00,0x00};//心图案
/*uchar code table1[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//字符℃ */
void delay(uint n)
{
uint x,y;
for(x=n;x>0;x--)
for(y=110;y>0;y--);}
void lcd_wcom(uchar com)
{
rs=0;
rw=0;
P2=com;
delay(5);
en=1;
en=0;}
void lcd_wdat(uchar dat)
{
rs=1;
rw=0;
P2=dat;
delay(5);
en=1;
en=0;
}
void lcd_init()
{
lcd_wcom(0x38);
lcd_wcom(0x0c);
lcd_wcom(0x06);
lcd_wcom(0x01);
}
void main(){
char m=0;
lcd_init();
lcd_wcom(0x40);
//设定CGRAM地址
for(m=0;m<64;m++)//将心型代码写入CGRAM中
{
lcd_wdat(table[m]);
}
lcd_wcom(0x85);//设定上排的显示位置
for(m=0;m<4;m++)//显示心型图案的上半部分
{
lcd_wdat(m);
}
lcd_wcom(0xc5);//将显示坐标转移到下排和上排相对应的地方
for(m=4;m<8;m++)//显示心型图案的下半部分
{
lcd_wdat(m);
}
while(1);}
让我们一起来看看显示的效果吧~~
在绿底黑字液晶模块和蓝底白字液晶模块上分别显示的效果。
下面再为大家展示几种可能出现的问题
1:通电之后,程序也烧写进去了,但是1602就是不显示,只显示一排黑块(一般都是在上排8个小黑块,记得刚开始用1602液晶的时候,被这个整怕了~~),怎么样,你郁闷了吧,其实出现这种问题的原因无非以下几种:硬件连线上的错误,这种错误一般用万用表仔细检查后很容易找出来。第二种情况就是硬件连接上是正确的,那么此时出问题最大的就是程序上了,如果你用的是忙检测,看一下忙检测函数写对了没,如果用的是延时函数,那么看看延时的时间是否够长。再就是看看时序图,这点很重要的哦。如果硬件和软件都没有错,那么就要考虑1602是否坏了,但是出现这种情况的几率很小,如果遇到这种情况,你可以考虑去买彩票了~~
下面这种情况你遇到过吗?我遇到过了的,搞得我很是郁闷~~
我做的实验是要液晶显示ABC这三个字母,并且开光标,光标闪烁。大家可以在第一排的最后几位看到ABC和光标都已经显示出来了。但是为什么其它位会显示这么多8呢?嘿嘿~~郁闷吧。出现这种情况的原因就是在初始化液晶的时候,要把清屏指令放在最后面,否则就会出现上图这种情况。怎么样,第一次听说吧~不过,我不知道其它的液晶是否也有这个问题出现,至少我用的这块就有这种情况,但是我的另一个液晶则没有这种情况出现,不管是在一开始就清屏还是最后清屏。大家注意下就可以了,万一出现了这种情况,就会处理了~~
上面这张图是用1602作为显示的温度电子钟~~上面的年月日三个字就是用自定义字符的方法显示的。呵呵,怎么样~~到此1602的驱动基本上结束了,剩下的就靠大家自己去发挥了。
LCD1602.pdf
(2010-02-05 16:03:05, Size: 579 KB, Downloads: 23)tiankai(2010-2-05 16:31:51)
晨辉教你轻松学51--------按键篇
对于一个由单片机为核心构成的系统而言。输入通道是相当重要的。可以看到几乎每一样基于单片机的产品都有人机交互的部分。如各种仪器设备上的各种按钮和开关,以及我们手机上的键盘,MP3上的按键等等。最常见的输入部分,莫非就是按键了。对于大多数初学者而言,编写一个好的按键程序是一件颇为头疼的事情。于是乎在网上乱搜一气,程序倒是找到了不少,但是看了半天依然是不明白。或者在某某论坛上面发帖“跪求XX按键程序,大虾帮忙……”如果你偶然间进了这个论坛,又偶然看到了这个帖子,而且恰好你对按键程序的写法也不是很清楚,那么我希望你能够静静的看完这个帖子。如果你觉得对你很有帮助,那么我希望你能够在以后的日子中能够坚持到这个论坛来,一起交流学习,分享自己学习过程中的喜悦或者一起探讨棘手的问题,这是我写这个帖子的最大的初衷了。OK,不能再说了,再说就变成水帖了。那么我们开始吧。
按键的种类很多。不过原理基本相似。下面我们以一种轻触开关为例讲解按键程序的写法。
这种轻触开关大家不陌生吧^_^
一般情况下,按键与单片机的连接如下面这幅图所示。
(图中电阻值一般去4.7k~10k之间,对于内部端口有上拉电阻的单片机则可省略此电阻)单片机对于按键的按下与否则是通过检测相应引脚上的电平来实现的。对于上图而言,当P17引脚上面的电平为低时,则表示按键已经按下。反之,则表明按键没有按下。我们在程序中只要检测到了P17引脚上面的电平为低了,就可以判断按键按下。呵呵,简单吧。等会,您先别乐呵,话还没说完呢。下面我们来看看,当按键按下时,P17引脚上面的波形是怎么变化的。
上图是一个理想波形图,当按键按下时,P17口的电平马上被拉低到0V了。当然理想的东西都是不现实的。所以我们还是看看现实的波形图吧。
看出什么区别来了没。呵呵,只要你不是傻子我相信都能看出其中的区别。由于按键的机械特性。当按键闭合时,并不能马上保存良好的接触,而是来回弹跳。这个时间很短,我们的手根本感觉不出来。但是对于一秒钟执行百万条指令的单片机而言,这个时间是相当的长了。那么在这段抖动的时间内,单片机可能读到多次高低电平的变化。如果不加任何处理的话,就会认为已经按下,或者松开很多次了。而事实上,我们的手一直按在按键上,并没有重复按动很多次。要想能够正确的判断按键是否按下就要避开这段抖动的时间。根据一般按键的机械特点,以及按键的新旧程度等而言,这段抖动的时间一般在5MS~20MS之间。
看到这里你明白了该如何做了吧。
看看下面的这个流程图,你应该不陌生吧。
这个流程是好多教科书上的做法。可惜,误导了好多人。为什么呢。因为它根本就没有考虑实际情况。我们根据这幅流程图来写它的代码看看。
unsigned char v_ReadKey_f(void)
{
unsigned char KeyPress;
if(P17 == 0)
{
Delay(20);//延时20MS
If(P17 == 0)
{
KeyPress = 1;
While(!P17);//等待释放
}
else
KeyPress = 0;
}
}
这样一个程序,相信对很多初学者而言都不陌生。因为好多书上基本都是这样的一个流程和写法。可是当有一天,我们想做一个数码管加按键调整的时钟,发现当我们按键按下去的时候,数码管就不亮了。为什么呢。原因就在这个键盘扫描函数。平常没有按键按下还好。一旦有键按下,它先是浪费了CPU的大部分时间(就是那个什么事情都没做的延时20MS函数)然后,又霸占CPU(就是哪个死死等在那里的while(P17);语句)直到按键释放。对于这种情况我们是忍无可忍的,那么就让我们彻底的抛弃它吧。那么到底按键扫描函数改如何写呢……..所谓众里寻她千百度,蓦然回首,那人却在灯火阑珊处。如果我们把CPU延时的那20MS拿出来去做其它事情,那么不就充分利用CPU的时间了吗。而一般情况下我们只要前沿去抖动就可以了。也就是说了,我们只需在按键按下后去抖就可以了,对于按键的释放抖动可以不必要过于关注。当然这主要和应用的场合有关。一个能有效识别按键按下并支持连发功能的按键已经能够应用到大多数的场合了。
下面以四个独立按键的处理程序为例来讲解(支持单击和连发)
#include“regx52.h”
sbit KeyOne = P1^0;
sbit KeyTwo = P1^1;
sbit KeyThree = P1^2;
sbit KeyFour = P1^3;
#define uint16 unsigned int
#define uint8 unsigned char
#define NOKEY 0xff
#define KEY_WOBBLE_TIME 500
//去抖动时间(待定)
#define KEY_OVER_TIME 15000 //等待进入连击时间(待定),该常数要比正常 //按键时间要长,防止非目的性进入连击模式
#define KEY_QUICK_TIME 1000 //等待按键抬起的连击时间(待定)
void v_KeyInit_f(void)
{
KeyOne = 1;//按键初始化(相应端口写1)
KeyTwo = 1;
KeyThree = 1;
KeyFour = 1;
}
uint8 u8_ReadKey_f(void)
{
static uint8 LastKey = NOKEY;//保存上一次的键值
static uint16 KeyCount = 0;//按键延时计数器
static uint16 KeyOverTime = KEY_OVER_TIME;//按键抬起时间
uint8 KeyTemp = NOKEY;
//临时保存读到的键值
KeyTemp = P1 & 0x0f;
//读键值
if(KeyTemp == 0x0f)
{
KeyCount = 0;
KeyOverTime = KEY_OVER_TIME;
return NOKEY;
//无键按下返回NOKEY
}
else
{
if(KeyTemp == LastKey)//是否第一次按下
{
if(++KeyCount == KEY_WOBBLE_TIME)次按下,则判断//抖动是否结束
{
return KeyTemp;
//去抖动结束,返回键值
}
else
{
if(KeyCount > KeyOverTime)
//不是第一
{
KeyCount = 0;
KeyOverTime = KEY_QUICK_TIME;
}
return NOKEY;
}
}
else //是第一次按下则保存键值,以便下次执行此函数时与读到的键值作比较
{
LastKey = KeyTemp;
//保存第一次读到的键值
KeyCount = 0;
//延时计数器清零
KeyOverTime = KEY_OVER_TIME;
return NOKEY;
}
}
}
下面是我测试用的主程序(相关头文件未列出,仅仅作测试演示用)void main(void){
uint8 KeyValue;
int16 Count;
v_LcdInit_f();
v_KeyInit_f();
CLS
LOCATE(3, 1)
PRINT(“Key Test”)
LOCATE(6, 2)
SHOW_ICON
while(1)
{
KeyValue = u8_ReadKey_f();
if(KeyValue!= NOKEY)
{ LOCATE(1, 2)
if(KeyValue == 0x0e)Count++;
if(KeyValue == 0x0d)Count--;
if(KeyValue == 0x0b)Count = 0;
if(KeyValue == 0x07)Count = 0;
HIDE_ICON
PRINTD(Count, 5)
LOCATE(6, 2)
}
else
{
//SHOW_ICON
} }
}
每次执行读键盘函数时,只是对一些标志进行判断,然后退出。因此能够充分的利用CPU的资源。同时可以处理连发按键。此按键扫描按键函数可以直接放在主函数中。如果感觉按键太过灵敏或者迟钝则改一下相关消抖动的宏定义即可。此函数也可以通过中断标志位进行定时的扫描。此时,需要添加一个定时标志位,并将相关消抖动的和连击时间的宏定义改小即可。然后在主程序类似下面这样写即可
if(KeyTime)//定时扫描时间到
{
KeyValue = u8_ReadKey_f();
} 具体的工作就交给您去完成啦。
看看效果: 按键单击
连发时候的截图
至此,关于单个按键的学习就告一段落了,您是否已经明白了。如果您还不明白,那么把这个程序好好的看看,并画下流程图,分析分析。估计您就会恍然大悟。关键是思路要转换过来。下面我们来看看多个按键的情况吧
一般情况下,如果多个按键每个都直接接在单片机的I/O上的话会占用很多的I/O资源。比较合理的一种做法是,按照行列接成矩阵的形式。按键接在每一个的行列的相交处。这样对于m行n列的矩阵,可以接的按键总数是m*n。这里我们以常见的4*4矩阵键盘来讲解矩阵键盘的编程。
上图就是矩阵键盘的一般接法。
这里我们要介绍一种快速的键盘扫描法:线反转法(或者称为行列翻转法)。具体流程如下。首先,让单片机的行全部输出0,列全部输出1,读取列的值(假设行接P3口的高四位,列接低四位)。即P3= 0x0f;此时读列的值,如果有键按下,则相应的列读回来的值应该为低。譬如此时读回来的值为 0x0e;即按键列的位置已经确定。这时反过来,把行作为输入,列作为输出,即P0 = 0xf0;此时再读行的值,如果按键仍然被按下,则相应的行的值应该为低,如果此时读回来的值为0xe0,则确定了行的位置。说到这里,您应该笑了,知道了一个按键被按下的行和列的位置,那么就可以肯定确定它的位置了。我们把读回来的行值和列值进行或运算。即 0xe0 | 0x 0e 即 0xee。那么0xee就是我们按下的按键的键值了。怎么样。只需几步就可以判断所有的键值,简单吧。下面再结合一个例子具体看看。/****************************************** * 此模块所需相关支持库
* ******************************************/ #include“regx52.h” #define uint8 unsigned char #define uint16 unsigned int
/**************************************** * 与硬件连接相关的定义及宏定义和操作宏 * *****************************************/ #define KEYBOARD P3
//键盘连接到单片机上的端口位置
#define READ_ROW_ENLABLE KEYBOARD = 0x0f;//读端口之前先把相应口置位(由基本51单片机特性决定的)#define READ_COL_ENLABLE KEYBOARD = 0xf0;// 根据实际硬件连接情况修改
/***************************************** * 模块内相关的宏定义及常数宏
* ******************************************/ #define NOKEY
0xff //定义无键按下时的返回值 #define DELAY_COUNT 2 //消抖时间常数
/***************************************** * 此模块所需的全局或者外部变量
* *****************************************/ bit bdata StartScan = 0;//此变量需放在定时中断中置位
/***************************************** * 按键扫描函数,按下去后经去抖,确定按下 * * 则返回键值0~15;无键按下则返回0xff;*
* 此函数需要定时器的支持(去抖....)
* *****************************************/ uint8 u8_KeyBoardScan_f(){
static uint8 DelayCount = 0;
uint8 KeyValueRow = 0;
uint8 KeyValueCol = 0;
uint8 KeyValue = 0;
if(StartScan)
//开始扫描,StartScan在定时中断中置位
{
StartScan = 0;//清除开始扫描标志位,避免多次重复执行扫描程序
//读入按键状态前先向相应端口写1(由基本51单片机硬件结构决定)
READ_ROW_ENLABLE
if((KEYBOARD & 0x0f)!= 0x0f)//判断是否有键按下
{
DelayCount++;
if(DelayCount <= DELAY_COUNT)//有键按下则判断延时去抖的时间是否达到
{
return NOKEY;
}
else
//消除了抖动
{
if((KEYBOARD & 0x0f)!= 0x0f)//再次判断是否按键真的按下
{
DelayCount = 0;
//确定按下后,延时去抖计时器清0
KeyValueRow = KEYBOARD & 0x0f;//取得行码
//准备读列,先向相应端口写1(由基本51单片机硬件结构决定)
READ_COL_ENLABLE
if((KEYBOARD & 0xf0)!= 0xf0)//反转,读列码
{
KeyValueCol = KEYBOARD & 0xf0;//取得列码
//合并取得的行码和列码,即是相应按键的键值
switch(KeyValueCol | KeyValueRow)
{
case 0x77 : KeyValue = 0;break;
case 0xb7 : KeyValue = 1;break;
case 0xd7 : KeyValue = 2;break;
case 0xe7 : KeyValue = 3;break;
case 0x7b : KeyValue = 4;break;
case 0xbb : KeyValue = 5;break;
case 0xdb : KeyValue = 6;break;
case 0xeb : KeyValue = 7;break;
case 0x7d : KeyValue = 8;break;
case 0xbd : KeyValue = 9;break;
case 0xdd : KeyValue = 10;break;
case 0xed : KeyValue = 11;break;
case 0x7e : KeyValue = 12;break;
case 0xbe : KeyValue = 13;break;
case 0xde : KeyValue = 14;break;
case 0xee : KeyValue = 15;break;
default : return NOKEY;
}
return KeyValue;
}
else
{
DelayCount = 0;
return NOKEY;
}
}
else
{
DelayCount = 0;
return NOKEY;
}
}
}
else
{
DelayCount = 0;
return NOKEY;
} }
}
void v_T0_Isr_f(void)interrupt INTERRUPT_TIMER2_OVERFLOW {
StartScan = 1;}
/*************************************************** *模块调试
* ***************************************************/
//主函数仅作演示用,主函数除按键扫描外的函数并没在这里给出 void v_Init_T2_f(void){
T2CON = 0x04;
T2MOD = 0x00;
TH2 = 0xd8;
RCAP2H = 0xd8;
TL2
= 0xf0;
RCAP2L = 0xf0;
ET2 = 1;
TR2 = 1;}
void main(void){
uint8 readkey = 0;
v_Init_T2_f();
v_LcdInit_f();
LOCATE(1, 1)
PRINT(“4*4KeyBoard Test”)
EA = 1;
LOCATE(3, 2)
while(1)
{
SHOW_ICON
readkey = u8_KeyBoardScan_f();
if(readkey!= NOKEY)
{
PRINTN(readkey , 2)
LOCATE(3, 2)
continue;
}
else
{
continue;
}
} }
呵呵,按键扫描程序已经注释的很详细了。我就不多费嘴舌了。如果有不清楚的地方,欢迎跟帖讨论。下面是按键测试的截图
我的自己搭建的实验板
OK,Enioy it!自此按键检测告一段落。下次如果再讲按键。将会讨论另外一种按键的写法:基于状态机的按键程序设计。欢迎讨论。tiankai(2010-2-05 16:37:53)晨辉教你轻松学51--------按键篇
对于一个由单片机为核心构成的系统而言。输入通道是相当重要的。可以看到几乎每一样基于单片机的产品都有人机交互的部分。如各种仪器设备上的各种按钮和开关,以及我们手机上的键盘,MP3上的按键等等。最常见的输入部分,莫非就是按键了。对于大多数初学者而言,编写一个好的按键程序是一件颇为头疼的事情。于是乎在网上乱搜一气,程序倒是找到了不少,但是看了半天依然是不明白。或者在某某论坛上面发帖“跪求XX按键程序,大虾帮忙……”如果你偶然间进了这个论坛,又偶然看到了这个帖子,而且恰好你对按键程序的写法也不是很清楚,那么我希望你能够静静的看完这个帖子。如果你觉得对你很有帮助,那么我希望你能够在以后的日子中能够坚持到这个论坛来,一起交流学习,分享自己学习过程中的喜悦或者一起探讨棘手的问题,这是我写这个帖子的最大的初衷了。OK,不能再说了,再说就变成水帖了。那么我们开始吧。
按键的种类很多。不过原理基本相似。下面我们以一种轻触开关为例讲解按键程序的写法。
这种轻触开关大家不陌生吧^_^
一般情况下,按键与单片机的连接如下面这幅图所示。
(图中电阻值一般去4.7k~10k之间,对于内部端口有上拉电阻的单片机则可省略此电阻)单片机对于按键的按下与否则是通过检测相应引脚上的电平来实现的。对于上图而言,当P17引脚上面的电平为低时,则表示按键已经按下。反之,则表明按键没有按下。我们在程序中只要检测到了P17引脚上
面的电平为低了,就可以判断按键按下。呵呵,简单吧。等会,您先别乐呵,话还没说完呢。下面我们来看看,当按键按下时,P17引脚上面的波形是怎么变化的。
上图是一个理想波形图,当按键按下时,P17口的电平马上被拉低到0V了。当然理想的东西都是不现实的。所以我们还是看看现实的波形图吧。
看出什么区别来了没。呵呵,只要你不是傻子我相信都能看出其中的区别。由于按键的机械特性。当按键闭合时,并不能马上保存良好的接触,而是来回弹跳。这个时间很短,我们的手根本感觉不出来。但是对于一秒钟执行百万条指令的单片机而言,这个时间是相当的长了。那么在这段抖动的时间内,单片机可能读到多次高低电平的变化。如果不加任何处理的话,就会认为已经按下,或者松开很多次了。而事实上,我们的手一直按在按键上,并没有重复按动很多次。要想能够正确的判断按键是否按下就要避开这段抖动的时间。根据一般按键的机械特点,以及按键的新旧程度等而言,这段抖动的时间一般在5MS~20MS之间。
看到这里你明白了该如何做了吧。
看看下面的这个流程图,你应该不陌生吧。
这个流程是好多教科书上的做法。可惜,误导了好多人。为什么呢。因为它根本就没有考虑实际情况。我们根据这幅流程图来写它的代码看看。
unsigned char v_ReadKey_f(void){
unsigned char KeyPress;
if(P17 == 0)
{
Delay(20);//延时20MS
If(P17 == 0)
{
KeyPress = 1;
While(!P17);//等待释放
}
else
KeyPress = 0;
}
}
这样一个程序,相信对很多初学者而言都不陌生。因为好多书上基本都是这样的一个流程和写法。可是当有一天,我们想做一个数码管加按键调整的时钟,发现当我们按键按下去的时候,数码管就不亮了。为什么呢。原因就在这个键盘扫描函数。平常没有按键按下还好。一旦有键按下,它先是浪费了CPU的大部分时间(就是那个什么事情都没做的延时20MS函数)然后,又霸占CPU(就是哪个死死等在那里的while(P17);语句)直到按键释放。对于这种情况我们是忍无可忍的,那么就让我们彻底的抛弃它吧。那么到底按键扫描函数改如何写呢……..所谓众里寻她千百度,蓦然回首,那人却在灯火阑珊处。如果我们把CPU延时的那20MS拿出来去做其它事情,那么不就充分利用CPU的时间了吗。而一般情况下我们只要前沿去抖动就可以了。也就是说了,我们只需在按键按下后去抖就可以了,对于按键的释放抖动可以不必要过于关注。当然这主要和应用的场合有关。一个能有效识别按键按下并支持连发功能的按键已经能够应用到大多数的场合了。
下面以四个独立按键的处理程序为例来讲解(支持单击和连发)
#include“regx52.h”
sbit KeyOne = P1^0;
sbit KeyTwo = P1^1;
sbit KeyThree = P1^2;
sbit KeyFour = P1^3;
#define uint16 unsigned int
#define uint8 unsigned char
#define NOKEY 0xff
#define KEY_WOBBLE_TIME 500
//去抖动时间(待定)
#define KEY_OVER_TIME 15000 //等待进入连击时间(待定),该常数要比正常 //按键时间要长,防止非目的性进入连击模式
#define KEY_QUICK_TIME 1000 //等待按键抬起的连击时间(待定)
void v_KeyInit_f(void)
{
KeyOne = 1;//按键初始化(相应端口写1)
KeyTwo = 1;
KeyThree = 1;
KeyFour = 1;
}
uint8 u8_ReadKey_f(void)
{
static uint8 LastKey = NOKEY;//保存上一次的键值
static uint16 KeyCount = 0;//按键延时计数器
static uint16 KeyOverTime = KEY_OVER_TIME;//按键抬起时间
uint8 KeyTemp = NOKEY;
//临时保存读到的键值
KeyTemp = P1 & 0x0f;
//读键值
if(KeyTemp == 0x0f)
{
KeyCount = 0;
KeyOverTime = KEY_OVER_TIME;
return NOKEY;
//无键按下返回NOKEY
}
else
{
if(KeyTemp == LastKey)//是否第一次按下
{
if(++KeyCount == KEY_WOBBLE_TIME)//不是第一次按下,则判断//抖动是否结束
{
return KeyTemp;
//去抖动结束,返回键值
}
else
{
if(KeyCount > KeyOverTime)
{
KeyCount = 0;
KeyOverTime = KEY_QUICK_TIME;
}
return NOKEY;
}
}
else //是第一次按下则保存键值,以便下次执行此函数时与读到的键值作比较
{
LastKey = KeyTemp;
//保存第一次读到的键值
KeyCount = 0;
//延时计数器清零
KeyOverTime = KEY_OVER_TIME;
return NOKEY;
}
}
}
下面是我测试用的主程序(相关头文件未列出,仅仅作测试演示用)void main(void){
uint8 KeyValue;
int16 Count;
v_LcdInit_f();
v_KeyInit_f();
CLS
LOCATE(3, 1)
PRINT(“Key Test”)
LOCATE(6, 2)
SHOW_ICON
while(1)
{
KeyValue = u8_ReadKey_f();
if(KeyValue!= NOKEY)
{ LOCATE(1, 2)
if(KeyValue == 0x0e)Count++;
if(KeyValue == 0x0d)Count--;
if(KeyValue == 0x0b)Count = 0;
if(KeyValue == 0x07)Count = 0;
HIDE_ICON
PRINTD(Count, 5)
LOCATE(6, 2)
}
else
{
//SHOW_ICON
}
}
}
每次执行读键盘函数时,只是对一些标志进行判断,然后退出。因此能够充分的利用CPU的资源。同时可以处理连发按键。此按键扫描按键函数可以直接放在主函数中。如果感觉按键太过灵敏或者迟钝则改一下相关消抖动的宏定义即可。此函数也可以通过中断标志位进行定时的扫描。此时,需要添加一个定时标志
位,并将相关消抖动的和连击时间的宏定义改小即可。然后在主程序类似下面这样写即可
if(KeyTime)//定时扫描时间到
{
KeyValue = u8_ReadKey_f();
} 具体的工作就交给您去完成啦。
看看效果: 按键单击
连发时候的截图
至此,关于单个按键的学习就告一段落了,您是否已经明白了。如果您还不明白,那么把这个程序好好的看看,并画下流程图,分析分析。估计您就会恍然大悟。关键是思路要转换过来。下面我们来看看多个按键的情况吧
一般情况下,如果多个按键每个都直接接在单片机的I/O上的话会占用很多的I/O资源。比较合理的一种
做法是,按照行列接成矩阵的形式。按键接在每一个的行列的相交处。这样对于m行n列的矩阵,可以接的按键总数是m*n。这里我们以常见的4*4矩阵键盘来讲解矩阵键盘的编程。
上图就是矩阵键盘的一般接法。
这里我们要介绍一种快速的键盘扫描法:线反转法(或者称为行列翻转法)。具体流程如下。首先,让单片机的行全部输出0,列全部输出1,读取列的值(假设行接P3口的高四位,列接低四位)。即P3= 0x0f;此时读列的值,如果有键按下,则相应的列读回来的值应该为低。譬如此时读回来的值为 0x0e;即按键列的位置已经确定。这时反过来,把行作为输入,列作为输出,即P0 = 0xf0;此时再读行的值,如果按键仍然被按下,则相应的行的值应该为低,如果此时读回来的值为0xe0,则确定了行的位置。说到这里,您应该笑了,知道了一个按键被按下的行和列的位置,那么就可以肯定确定它的位置了。我们把读回来的行值和列值进行或运算。即 0xe0 | 0x 0e 即 0xee。那么0xee就是我们按下的按键的键值了。怎么样。只需几步就可以判断所有的键值,简单吧。下面再结合一个例子具体看看。/****************************************** * 此模块所需相关支持库
* ******************************************/ #include“regx52.h” #define uint8 unsigned char #define uint16 unsigned int
/**************************************** * 与硬件连接相关的定义及宏定义和操作宏 *
*****************************************/ #define KEYBOARD P3
//键盘连接到单片机上的端口位置
#define READ_ROW_ENLABLE KEYBOARD = 0x0f;//读端口之前先把相应口置位(由基本51单片机特性决定的)#define READ_COL_ENLABLE KEYBOARD = 0xf0;// 根据实际硬件连接情况修改
/***************************************** * 模块内相关的宏定义及常数宏
* ******************************************/ #define NOKEY
0xff //定义无键按下时的返回值 #define DELAY_COUNT 2 //消抖时间常数
/***************************************** * 此模块所需的全局或者外部变量
* *****************************************/ bit bdata StartScan = 0;//此变量需放在定时中断中置位
/***************************************** * 按键扫描函数,按下去后经去抖,确定按下 * * 则返回键值0~15;无键按下则返回0xff;* * 此函数需要定时器的支持(去抖....)
* *****************************************/ uint8 u8_KeyBoardScan_f(){
static uint8 DelayCount = 0;
uint8 KeyValueRow = 0;
uint8 KeyValueCol = 0;
uint8 KeyValue = 0;
if(StartScan)
//开始扫描,StartScan在定时中断中置位
{
StartScan = 0;//清除开始扫描标志位,避免多次重复执行扫描程序
//读入按键状态前先向相应端口写1(由基本51单片机硬件结构决定)
READ_ROW_ENLABLE
if((KEYBOARD & 0x0f)!= 0x0f)//判断是否有键按下
{
DelayCount++;
if(DelayCount <= DELAY_COUNT)//有键按下则判断延时去抖的时间是否达到
{
return NOKEY;
}
else
//消除了抖动
{
if((KEYBOARD & 0x0f)!= 0x0f)//再次判断是否按键真的按下
{
DelayCount = 0;
//确定按下后,延时去抖计时器清0
KeyValueRow = KEYBOARD & 0x0f;//取得行码
//准备读列,先向相应端口写1(由基本51单片机硬件结构决定)
READ_COL_ENLABLE
if((KEYBOARD & 0xf0)!= 0xf0)//反转,读列码
{
KeyValueCol = KEYBOARD & 0xf0;//取得列码
//合并取得的行码和列码,即是相应按键的键值
switch(KeyValueCol | KeyValueRow)
{
case 0x77 : KeyValue = 0;break;
case 0xb7 : KeyValue = 1;break;
case 0xd7 : KeyValue = 2;break;
case 0xe7 : KeyValue = 3;break;
case 0x7b : KeyValue = 4;break;
case 0xbb : KeyValue = 5;break;
case 0xdb : KeyValue = 6;break;
case 0xeb : KeyValue = 7;break;
case 0x7d : KeyValue = 8;break;
case 0xbd : KeyValue = 9;break;
case 0xdd : KeyValue = 10;break;
case 0xed : KeyValue = 11;break;
case 0x7e : KeyValue = 12;break;
case 0xbe : KeyValue = 13;break;
case 0xde : KeyValue = 14;break;
case 0xee : KeyValue = 15;break;
default : return NOKEY;
}
return KeyValue;
}
else
{
DelayCount = 0;
return NOKEY;
}
}
else
{
DelayCount = 0;
return NOKEY;
}
}
}
else
{
DelayCount = 0;
return NOKEY;
}
}
}
void v_T0_Isr_f(void)interrupt INTERRUPT_TIMER2_OVERFLOW {
StartScan = 1;}
/*************************************************** *模块调试
* ***************************************************/
//主函数仅作演示用,主函数除按键扫描外的函数并没在这里给出 void v_Init_T2_f(void){
T2CON = 0x04;
T2MOD = 0x00;
TH2 = 0xd8;
RCAP2H = 0xd8;
TL2
= 0xf0;
RCAP2L = 0xf0;
ET2 = 1;
TR2 = 1;}
void main(void){
uint8 readkey = 0;
v_Init_T2_f();
v_LcdInit_f();
LOCATE(1, 1)
PRINT(“4*4KeyBoard Test”)
EA = 1;
LOCATE(3, 2)
while(1)
{
SHOW_ICON
readkey = u8_KeyBoardScan_f()
if(readkey!= NOKEY)
{
PRINTN(readkey , 2)
LOCATE(3, 2)
continue;
}
else
{
continue;
}
;
} }
呵呵,按键扫描程序已经注释的很详细了。我就不多费嘴舌了。如果有不清楚的地方,欢迎跟帖讨论。下面是按键测试的截图
我的自己搭建的实验板
OK,Enioy it!自此按键检测告一段落。下次如果再讲按键。将会讨论另外一种按键的写法:基于状态机的按键程序设计。欢迎讨论。tiankai(2010-2-05 16:39:19)晨辉教你轻松学51--------外围芯片之ds1302和ds18b20
对于市面上的大多数51单片机开发板来说。ds1302和ds18b20应该是比较常见的两种外围芯片。ds1302是具有SPI总线接口的时钟芯片。ds18b20则是具有单总线接口的数字温度传感器。下面让我们分别来认识并学会应用这两种芯片。
首先依旧是看DS1302的datasheet中的相关介绍。
上面是它的一些基本的应用介绍。下面是它的引脚的描述。
下面是DS1302的时钟寄存器。我们要读取的时间数据就是从下面这些数据寄存器中读取出来的。当我们要想调整时间时,可以把时间数据写入到相应的寄存器中就可以了。
这是DS1302内部的31个RAM寄存器。在某些应用场合我们可以应用到。如我们想要做一个带定时功能的闹钟。则可以把闹钟的时间写入到31个RAM寄存器中的任意几个。当单片机掉电时,只要我们的DS1302的备用电池还能工作,那么保存在其中的闹钟数据就不会丢失~~
由于对于这些器件的操作基本上按照数据手册上面提供的时序图和相关命令字来进行操作就可以了。因此在我们应用这些器件的时候一定要对照着手册上面的要求来进行操作。如果觉得还不够放心的话。可以到网上下载一些参考程序。对着手册看别人的程序,看别人的思路是怎么样的。
DS1302和单片机的连接很简单。只需一根复位线,一根时钟线,一根数据线即可。同时它本身还需要接一个32.768KHz的晶振来提供时钟源。对于晶振的两端可以分别接一个6PF左右的电容以提高晶振的精确度。同时可以在第8脚接上一个3.6V的可充电的电池。当系统正常工作时可以对电池进行涓流充电。当系统掉电时,DS1302由这个电池提供的能量继续工作。
下面让我们来驱动它。
sbit io_DS1302_RST = P2^0;sbit io_DS1302_IO = P2^1;sbit io_DS1302_SCLK = P2^2;
//------常数宏--//
#define DS1302_SECOND_WRITE 0x80
//写时钟芯片的寄存器位置
#define DS1302_MINUTE_WRITE 0x82
#define DS1302_HOUR_WRITE 0x84
#define DS1302_WEEK_WRITE 0x8A
#define DS1302_DAY_WRITE 0x86
#define DS1302_MONTH_WRITE 0x88
#define DS1302_YEAR_WRITE 0x8C
#define DS1302_SECOND_READ 0x81
//读时钟芯片的寄存器位置
#define DS1302_MINUTE_READ 0x83
#define DS1302_HOUR_READ 0x85
#define DS1302_WEEK_READ 0x8B
#define DS1302_DAY_READ 0x87
#define DS1302_MONTH_READ 0x89
#define DS1302_YEAR_READ 0x8D
//----操作宏---//
#define DS1302_SCLK_HIGH
io_DS1302_SCLK = 1;
#define DS1302_SCLK_LOW
io_DS1302_SCLK = 0;
#define DS1302_IO_HIGH
io_DS1302_IO = 1;
#define DS1302_IO_LOW
io_DS1302_IO = 0;
#define DS1302_IO_READ
io_DS1302_IO
#define DS1302_RST_HIGH
io_DS1302_RST = 1;
#define DS1302_RST_LOW
io_DS1302_RST = 0;
/****************************************************** * 保存时间数据的结构体
* ******************************************************/ struct {
uint8 Second;
uint8 Minute;
uint8 Hour;
uint8 Day;
uint8 Week;
uint8 Month;
uint8 Year;}CurrentTime;
/****************************************************************************** * Function: static void v_DS1302Write_f(uint8 Content)* * Description:向DS1302写一个字节的内容
* * Parameter:uint8 Content : 要写的字节
* *
* ******************************************************************************/
static void v_DS1302Write_f(uint8 Content)
{
uint8 i;
for(i = 8;i > 0;i--)
{
if(Content & 0x01)
{
DS1302_IO_HIGH
}
else
{
DS1302_IO_LOW
}
Content >>= 1;
DS1302_SCLK_HIGH
DS1302_SCLK_LOW
} }
/****************************************************************************** * Function: static uint8 v_DS1302Read_f(void)
* * Description: 从DS1302当前设定的地址读取一个字节的内容 * * Parameter:
* * Return: 返回读出来的值(uint8)
* ******************************************************************************/ static uint8 v_DS1302Read_f(void){
uint8 i, ReadValue;
DS1302_IO_HIGH
for(i = 8;i > 0;i--)
{
ReadValue >>= 1;
if(DS1302_IO_READ)
{
ReadValue |= 0x80;
}
else
{
ReadValue &= 0x7f;
}
DS1302_SCLK_HIGH
DS1302_SCLK_LOW
}
return ReadValue;}
/****************************************************************************** * Function: void v_DS1302WriteByte_f(uint8 Address, uint8 Content)* * Description: 从DS1302指定的地址写入一个字节的内容
* * Parameter: Address: 要写入数据的地址
* * Content: 写入数据的具体值
* * Return:
* ******************************************************************************/ void v_DS1302WriteByte_f(uint8 Address, uint8 Content){
DS1302_RST_LOW
DS1302_SCLK_LOW
DS1302_RST_HIGH
v_DS1302Write_f(Address);
v_DS1302Write_f(Content);
DS1302_RST_LOW
DS1302_SCLK_HIGH }
/***********************************************************************
******* * Function: uint8 v_DS1302ReadByte_f(uint8 Address)
* * Description:从DS1302指定的地址读出一个字节的内容
* * Parameter:Address: 要读出数据的地址
* *
* * Return:
指定地址读出的值(uint8)
* ******************************************************************************/ uint8 v_DS1302ReadByte_f(uint8 Address){
uint8 ReadValue;
DS1302_RST_LOW
DS1302_SCLK_LOW
DS1302_RST_HIGH
v_DS1302Write_f(Address);
ReadValue = v_DS1302Read_f();
DS1302_RST_LOW
DS1302_SCLK_HIGH
return ReadValue;} /****************************************************************************** * Function: void v_ClockInit_f(void)
* * Description:初始化写入DS1302时钟寄存器的值(主程序中只需调用一次即可)* * Parameter:
* *
* * Return:
* ******************************************************************************/ void v_ClockInit_f(void){
if(v_DS1302ReadByte_f(0xc1)!= 0xf0)
{ v_DS1302WriteByte_f(0x8e, 0x00);//允许写操作
v_DS1302WriteByte_f(DS1302_YEAR_WRITE, 0x08);//年
v_DS1302WriteByte_f(DS1302_WEEK_WRITE, 0x04);//星期
v_DS1302WriteByte_f(DS1302_MONTH_WRITE, 0x12);//月
v_DS1302WriteByte_f(DS1302_DAY_WRITE, 0x11);
//日
v_DS1302WriteByte_f(DS1302_HOUR_WRITE, 0x13);//小时
v_DS1302WriteByte_f(DS1302_MINUTE_WRITE, 0x06);//分钟
v_DS1302WriteByte_f(DS1302_SECOND_WRITE, 0x40);//秒
v_DS1302WriteByte_f(0x90, 0xa5);
//充电
v_DS1302WriteByte_f(0xc0, 0xf0);
//判断是否初始化一次标识写入
v_DS1302WriteByte_f(0x8e, 0x80);
//禁止写操作
} } /****************************************************************************** * Function: void v_ClockUpdata_f(void)
* * Description:读取时间数据,并保存在结构体CurrentTime中
* * Parameter:
* *
* * Return:
* ******************************************************************************/ void v_ClockUpdata_f(void){
CurrentTime.Second = v_DS1302ReadByte_f(DS1302_SECOND_READ);
CurrentTime.Minute = v_DS1302ReadByte_f(DS1302_MINUTE_READ);
CurrentTime.Hour = v_DS1302ReadByte_f(DS1302_HOUR_READ);
CurrentTime.Day = v_DS1302ReadByte_f(DS1302_DAY_READ);
CurrentTime.Month = v_DS1302ReadByte_f(DS1302_MONTH_READ);
CurrentTime.Week = v_DS1302ReadByte_f(DS1302_WEEK_READ);
CurrentTime.Year = v_DS1302ReadByte_f(DS1302_YEAR_READ);}
有了上面的这些函数我们就可以对DS1302进行操作了。当我们想要获取当前时间时,只需要调用v_ClockUpdata_f(void)这个函数即可。读取到的时间数据保存在CurrentTime这个结构体中。至于
如何把时间数据在数码管或者是液晶屏上显示出来我相信大家应该都会了吧^_^.看看显示效果如何~~
下面再让我们看看DS18B20吧。
DS18B20是单总线的数字温度传感器。其与单片机的接口只需要一根数据线即可。当然连线简单意味着软件处理上可能要麻烦一点。下面来看看它的优点:
看看它的靓照。外形和我们常用的三极管没有什么两样哦。
DS18B20的内部存储器分为以下几部分
ROM:存放该器件的编码。前8位为单线系列的编码(DS18B20的编码是19H)后面48位为芯片的唯一序列号。在出场的时候就已经设置好,用户无法更改。最后8位是以上56位的CRC码。
RAM:DS18B20的内部暂存器共9个字节。其中第一个和第二个字节存放转换后的温度值。第二个和第三个字节分别存放高温和低温告警值。(可以用RAM指令将其拷贝到EEPROM中)第四个字节为配置寄存器。第5~7个字节保留。第9个字节为前8个字节的CRC码。
DS18B20的温度存放如上图所示。其中S位符号位。当温度值为负值时,S = 1,反之则S = 0。我们把得到的温度数据乘上对应的分辨率即可以得到转换后的温度值。
DS18B20的通讯协议:
在对DS18B20进行读写编程时,必须严格保证读写的时序。否则将无法读取测温结果。根据DS18B20的通讯协议,主机控制DS18B20完成温度转换必须经过3个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令。这样才能对DS18B20进行预定的操作。复位要求主机将数据线下拉500us,然后释放,DS18B20收到信号后等待16~160us然后发出60~240us的存在低脉冲,主机收到此信号表示复位成功。
上图即DS18B20的复位时序图。下面是读操作的时序图
这是写操作的时序图
第二篇:LED数码管串行显示原理
LED数码管显示原理
LED数码管是通过点亮不同的段码组合来显示数字和字母的。外观如右图a所示。LED数码管从结构上可分为共阳极和共阴极两种类型。结构如图b,c所示,从图b和图c中我们可以看到共阳极和共阴极数码管的唯一区别在于公共端的极性不同,但两者的显示原理是相同的。共阴极和共阳极数码管内部都集成了8个LED发光管,这8个LED发光管分别表示段码值:A,B,C,D,E,F,G,DP。当对应的LED发光管被点亮时,对应的段码值就会亮起来,通过点亮不同的段码组合,来显示不同的数字和字母来。具体的对应关系见图d(共阳极LED数码管段码表)。
图a
图b
图c
图d
LED数码管在单片机系统中的驱动显示原理
在单片机系统中,LED数码管是怎样显示数据的呢?下面我们来深入研究一下。要想让LED数码管正确的显示数据,我们首先要了解一下LED数码管的驱动显示原理。在单片机系统中,LED数码管的驱动方式主要有动态显示和静态显示两种类型,每种类型的驱动电路各部相同。
动态显示的原理就是,把所有LED数码管相同的段码连在一起,作为数据总线,连接至单片机的I/O端口上,每个LED数码管的公共端单独留出来,作为区分LED数码管的地址线,分别连接到单片机的I/O端口上,在某一时刻,单片机发送要显示的数据到LED数码管的数据总线上,同一时刻接通需要显示数据的数码管的公共端,这样对应的数码管就亮了,而没有选通公共端的数码管,虽然数据端上有数据存在,但是公共端未接通,形不成通路,所以段码就不会亮。这样就把要显示的数据和数码管的位置就对上了,总体一句话,把待显数据放在数据总线上,同时接通某一数码管的公共端,点亮数码管后,延时几一定时间(一般5---10ms左右),然后断开刚才数码管的公共端;再向数据总线发送下一组数据,接通另一个数码管的公共端,再延时一定时间,断开数码管的公共端;用同样方法使所有的数码管都显示一遍,然后从头开始循环扫描下去,只要每个数码管在每秒内能够显示25次以上,我们看到的显示效果就是稳定的数值。这就是数码管的动态扫描驱动方式。
在分布式通讯电缆线路故障监测系统中,我们采用的是静态显示的方式。
图e 如图e所示:图中共有4位共阳极LED数码管“LED1、LED2、LED3、LED4”,它们的阳极VCC都连接在一起接到电源正极上,每个LED数码管的数据端A、B、C、D、E、F、DP分别接在IC3、IC4、IC5、IC6上,IC3、IC4、IC5、IC6是4个串入并出的移位寄存器,型号为74LS164,作用是把串行数据接口转换为并行数据接口,74LS164的Q0-Q7分别接LED数码管的A、B、C、D、E、F、DP, AB是74LS164的数据输入端,CLK是74LS164的移位脉冲输入端,第1片IC的AB接单片机的RXD, 第1片IC的Q7连接第2片IC的AB, 所有 CLK端全部连在一起接单片机的TXD,这样级联下去可以扩展许多位显示器,。其中RXD是单片机的串行通讯数据输出端,TXD是在串行通讯时移位脉冲输出端。如果要使LED4、LED3、LED2、LED1、分别显示1、2、3、4,那么单片机的RXD端就要按顺序发送1、2、3、4这4位数的二进制代码00000001、00000010、00000011、00000100,TXD的移位脉冲是自动生成的我们不用考虑,发送完毕后,LED数码管就可以显示了。这时单片机即使不用再发送数据,显示器也能自己保持显示。这种显示方式的优点是“占有单片机的端口线少、占有CPU的使用率小、显示亮度高、显示位数扩展方便等”因此这种显示方式应用比较广泛。
显示驱动程序参见程序附表。
第三篇:PLC原理及应用
《PLC原理及应用》课程设计任务书 MITSUBISHI(三菱)PLC D组
一、全自动洗衣机梯形图控制程序的设计与调试 1.控制要求:
按下启动按扭及水位选择开关,注水直到高(中、低)水位,关水
(3)2s后开始洗涤
(4)洗涤时,正转30s,停2s,然后反转30s,停2s(5)如此循环5次,总共320s后开始排水,排空后脱水30s(6)开始清洗,重复(2)~(5),清洗两遍
(7)清洗完成,报警3秒并自动停机
(8)若按下停车按扭,可手动排水(不脱水)和手动脱水(不计数)
输入点: 输出点:
启动 10001 低水位检测 10009 启动洗衣机 00001 停止 10002 手动排水 10010 进水阀 00002 高水位 10003 手动脱水 10011 正转 00003 中水位 10004 反转 00004 低水位 10005 排水 00005 排空检测 10006 脱水 00006 高水位检测 10007 报警 00007 中水位检测 10008 2.若要求启动开关分为标准洗和轻柔洗,试改变有关输入点,并在程序中加入轻柔洗功能(轻柔洗过程自定)3.I/O编址 4.编程并调试
二、PLCⅡ型教学实验箱程序的开发
要求:
1.开发实验
十一、实验十五的梯形图程序 2.写出I/O编址
3.写出梯形图程序及语句表程序并调试
三、自行设计课题
要求:设计汽车自动清洗装置的PLC梯形图控制课题及程序 1.了解汽车自动清洗过程(可网上查找资料)
设计课题:课题名称、控制要求、工作框图或时序图、I/O编址 编程并调试 c)I/O端子接线图
四、完成课程设计说明书
1.课题名称及要求
2.程序(包括注释)、框图或时序图、I/O接线图等
3.三菱PLC与MODICON PLC相关指令的比较、运行情况及调试小结等 4.课程设计的心得
《PLC原理及应用》课程设计任务书 MITSUBISHI(三菱)PLC E组
一、PLCⅡ型教学实验箱程序的开发 要求:
1.开发实验
九、实验
十二、实验十三的梯形图程序 2.写出I/O编址
3.写出梯形图程序及语句表程序并调试
二、自行设计课题
要求:设计十字路口交通灯控制课题及程序
1.观察宜山路中山西路口交通灯(包括左转弯灯和行人灯)的工作时序 2.设计课题:课题名称、控制要求、时序图、I/O编址 3.编程并借助于PLC实验箱的发光二极管(LED)进行调试 4.I/O端子接线图 三、八层电梯楼层定位及显示的梯形图控制程序设计与调试 1.控制要求:
(1)根据各楼层行程开关的状态,确定轿厢所在楼层
(2)用九段LED数码管作十进制层楼位置显示,如下图所示:
2.九段码编码示意图、真值表、I/O编址
3.编程并借助实验箱上的发光二极管进行调试(注意各层之间的显示保持)4.I/O端子接线图
四、完成课程设计说明书
1.课题名称及要求
2.程序(包括注释)、框图或时序图、I/O接线图等
3.三菱PLC与MODICON PLC相关指令的比较、运行情况及调试小结等 4.课程设计的心得
《PLC原理及应用》课程设计任务书 MITSUBISHI(三菱)PLC F组
一、PLCⅡ型教学实验箱程序的开发
要求:
1.开发实验
八、实验
九、实验十五的梯形图程序 2.写出I/O编址
3.写出梯形图程序及语句表程序并调试
二、自行设计课题
要求:设计十字路口交通灯控制课题及程序
1.观察桂林路漕宝路口交通灯(包括左转弯灯和行人灯)的工作时序 2.设计课题:课题名称、控制要求、时序图、I/O编址 3.编程并借助于PLC实验箱的发光二极管(LED)进行调试 4.I/O端子接线图
三、花式喷水池装置PLC控制梯形图的设计与调试 1.花式喷水池示意图
图a中4为中间喷水管,3为内环状喷水管,2为中环形状喷水管,1为外环形状喷水管。图b中的选择开关可有4种选择,可分别用4个开关模拟实现;单步/连续开关为“1”= 单步,“0”= 连续,其他为单一功能开关。2.控制要求:
(1)水池控制电源开关接通后,按下启动按钮,喷水装置即开始工作。按下停止按钮,则停止喷水。工作方式由“选择开关”和“单步/连续”开关来决定。
(2)“单步/连续”开关在单步位置时,喷水池只运行一个循环;在连续位置时,喷水池反复循环运行。
(3)方式选择开关用以选择喷水池的喷水花样,1~4号喷水管的工作方式选择如下:
a)选择开关在位置“1”——按下启动按钮后,4号喷水,延时2s,3号喷水,再延时1.5s,2号喷水,再延时2s,1号喷水,然后全部停止1s,接着一起喷水15s为一个循环。
b)选择开关在位置“2”——按下启动按钮后,1号喷水,延时2s,2号喷水,再延时2s,3号喷水,再延时2s,4号喷水,然后全部停止0.5s,接着一起喷水30s为一个循环。
c)选择开关在位置“3”——按下启动按钮后,1、3号同时喷水,延时3s后,2、4号同时喷水,1、3号停止喷水;交替运行5次后,1~4号同时喷水20s为一个循环。
d)选择开关在位置“4”——按下启动按钮后,喷水池1~4号水管的工作顺序为: 1→2→3→4按顺序延时2s喷水,然后一起喷水10s后,按1→1+2→2→2+3→3→3+4→4→4+1号水管以1s间隔顺序喷水,小循环3次后,一起喷水2s,再停止1s,由4→3→2→1反序分别延时2s喷水,然后再一起喷水10s为一个大循环。
(4)不论在什么工作方式,按下停止按钮,喷水池立即停止工作,所有存储器复位。
3.I/O编址 4.编程并调试 5.I/O端子接线图
四、完成课程设计说明书
1.课题名称及要求
2.程序(包括注释)、框图或时序图、I/O接线图等
3.三菱PLC与MODICON PLC相关指令的比较、运行情况及调试小结等 4.课程设计的心得
《PLC原理及应用》课程设计任务书 MITSUBISHI(三菱)PLC G组
一、PLCⅡ型教学实验箱程序的开发
要求:1.开发实验
十、实验十一的梯形图程序 2.写出I/O编址
3.写出梯形图程序及语句表程序并调试
二、自动门控制装置PLC梯形图控制程序的设计与调试 1.自动门控制装置的硬件组成:
自动门控制装置由门内光电探测开关K1、门外光电探测开关K2、开门到位限位开关K3、关门到限位开关K4、开门执行机构KM1(使直流电动机正转)、关门执行机构KM2(使直流电动机反转)等部件组成。光电探测开关为检测到人或物体时为ON,否则OFF。2.控制要求:
(1)当有人由内到外或由外到内通过光电检测开关K1或K2时,开门执行机构KM1动作,电动机正转,到达开门限位开关K3位置时,电机停止运行。
(2)自动门在开门位置停留8s后,自动进入关门过程,关门执行机构KM2被起动,电动机反转,当门移动到关门限位开关K4位置时,电机停止运行。
(3)在关门过程中,当有人员由外到内或由内到外通过光电检测开关K2或K1时,应立即停止关门,并自动进入开门程序。
(4)在门打开后的8s等待时间内,若有人员由外至内或由内至外通过光电检测开关K2或K1时,必须重新开始等待8s后,再自动进入关门过程,以保证人员安全通过。
(5)开门与关门不可同时进行 3.I/O编址
4.编程并借助于实验箱的发光二极管LED进行调试 5.I/O端子接线图
三、坐标式机械手的PLC梯形图控制程序设计与调试
1.坐标式机械手动作原理图
2.控制要求:将物体从位置A搬至位置B(1)动作顺序:机械手从原点位置起始下移到A处下限位→从A处夹紧物体后上升至上限位→右移至右限位→机械手下降至B处下限位→将物体放置在B处后→上升
至上限位→左移至左限位(原点)为一个循环。
(2)上限、A、B下限、左限、右限分别由限位开关控制;机械手设立起动和停止开关。
(3)机械手夹紧或松开的工作状态以及到达每一个工位时,均应有状态显示。
(4)机械手的夹紧和放松动作均应有1s延时,然后上升;机械手每到达一个位置均有0.5s的停顿延时,然后进行下一个动作。
(5)若机械手停止时不在原点位置,可通过手动开关分别控制机械手的上升和左移,使之回到原点。
(6)要求循环工作1小时时,判断机械手是否夹有物体,若没有,则立即自动停止工作并警铃报警;若夹有物体,则继续工作至物体放置到B位后自动停止工作并警铃报警。
3.I/O编址并画出工作框图 4.编程并调试 5.I/O端子接线图
四、完成课程设计说明书
1.课题名称及要求
2.程序(包括注释)、框图或时序图、I/O接线图等
3.三菱PLC与MODICON PLC相关指令的比较、运行情况及调试小结等 4.课程设计的心得
《PLC原理及应用》课程设计任务书 MITSUBISHI(三菱)PLC H组
一、PLCⅡ型教学实验箱程序的开发
要求:
1.开发实验十四的梯形图程序 2.写出I/O编址
3.写出梯形图程序及语句表程序并调试 二、三相六拍步进电机PLC梯形图控制程序设计与调试 1.控制要求:
(1)三相步进电动机有三个绕组:A、B、C,正转通电顺序为:A→AB→B→BC→C→CA→A
反转通电顺序为:A→CA→C→BC→B→AB→A(2)要求能实现正、反转控制,而且正、反转切换无须经过停车步骤。
(3)具有两种转速:
#1开关合上,则转过一个步距角需0.5s。#2开关合上,则转过一个步距角需0.05s。
(4)要求步进电动机转动100个步距角后自动停止运行
(5)(选)在完成上述功能的基础上,增加功能:
设置按钮K1,每按一次K1,转速增加一档(即转动一个步距角所需时间减少0.01s)设置按钮K2,每按一次K2,转速减少一档(即转动一个步距角所需时间增加0.01s)I/O编址
3.编程并借助于PLC实验箱的发光二极管(LED)进行调试
三、完成课程设计说明书
1.课题名称及要求
2.程序(包括注释)、框图或时序图、I/O接线图等
3.三菱PLC与MODICON PLC相关指令的比较、运行情况及调试小结等 4.课程设计的心得
《PLC原理及应用》课程设计任务书 MITSUBISHI(三菱)PLC I组
一、霓虹灯广告屏装置PLC控制梯形图的设计与调试 1.霓虹灯广告屏示意图
该广告屏共有8根灯管,24只流水灯,每4只灯为一组,如下图所示:
2.控制要求::
(1)该广告屏中间8根灯管亮灭的时序为:第1根亮→2亮→3亮→„„→第8根亮,时间间隔为1s,全亮后,显示10s,再反过来从8→7→„„→1按1s间隔顺序熄灭,全灭后停亮2s;再从第8根开始亮,顺序点亮7→6→„„→1,时间间隔1s,显示5s,再从1→2→„„→8按1s间隔顺序熄灭,全灭后停亮2s,然后重复运行,周而复始。
(2)24只流水灯,4个一组分成6组,从Ⅰ→Ⅱ→„„→Ⅵ按1s时间间隔依次向前移动,且点亮时每相隔1灯为亮,即从Ⅰ“①、③”亮→Ⅱ“⑤、⑦”亮,同时Ⅰ“①、③”灭→Ⅲ“、”亮,同时Ⅱ“⑤、⑦”灭„„,如此移动一段时间(如30s)后,再反过来移动一段时间:Ⅵ“、”亮 →Ⅴ“、”亮,同时Ⅵ“、”灭,„„如此循环往复。(3)系统有单步/连续控制,有起动和停止按钮。
(4)起动时,灯管和流水灯同时起动,关闭时,可同时也可分别关闭。
(5)在控制要求1中,若要求将全亮后显示10s改为以0.5s间隔同时闪烁5s,试修改程序。
(6)*要求有移位指令的应用 3.编程并模拟调试 4.画出I/O端子接线图
二、自行设计课题
要求:设计汽车自动清洗装置的PLC梯形图控制课题及程序 1.观察汽车自动清洗过程(可网上查找资料)
2.设计课题:课题名称、控制要求、工作框图或时序图、I/O编址 3.编程并调试 4.I/O端子接线图
三、完成课程设计说明书 1.课题名称及要求
2.程序(包括注释)、时序图或框图、I/O接线图
3.三菱PLC与MODICON PLC相关指令的应用比较、运行情况及调试小结等 4.课程设计的心得
《PLC原理及应用》课程设计任务书 MITSUBISHI(三菱)PLC J组
一、MODICON PLC梯形图控制程序的移植
要求:
1.将教材中五层电梯模型的梯形图控制程序三菱FX2N PLC的梯形图控制程序 I/O编址
试画出I/O端子接线图 二、五相十拍步进电动机控制程序的设计与调试 1.控制要求:
(1)五相步进电动机有五个绕组: A、B、C、D、E , 正转通电顺序: ABC→BC→BCD→CD→CDE→DE→DEA→EA→EAB→AB
反转通电顺序: ABC←BC←BCD←CD←CDE←DE←DEA←EA←EAB←AB
(2)用五个开关控制其工作:
#1开关控制其运行(启 / 停)。
#2 开关控制其低速运行(转过一个步距角需 0.5 s)。#3 开关控制其中速运行(转过一个步距角需 0.1 s)。#4 开关控制其低速运行(转过一个步距角需 0.03 s)。#5 开关控制其转向(ON 为正转,OFF 为反转)。2.I/O编址及工作框图(或时序图)
3.编程并借助于PLC实验箱的发光二极管(LED)进行调试 4.I/O端子接线图
三、PLCⅡ型教学实验箱程序的开发
要求:
1.开发实验
十、实验十一的梯形图程序 2.写出I/O编址
3.写出梯形图程序及语句表程序并调试
四、完成课程设计说明书 1.课题名称及要求
2.程序(包括注释)、时序图或框图、I/O接线图 3.三菱PLC与MODICON PLC相关指令的应用比较、运行情况及调试小结等 4.课程设计的心得
《PLC原理及应用》课程设计任务书 MITSUBISHI(三菱)PLC K组
一、PLCⅡ型教学实验箱程序的开发
要求:
1.开发实验
八、实验
九、实验十一的梯形图程序 2.写出I/O编址
3.写出梯形图程序及语句表程序并调试
二、霓虹灯广告屏装置PLC控制梯形图的设计与调试 1.霓虹灯广告屏示意图
该广告屏共有8根灯管,24只流水灯,每4只灯为一组,如下图所示:
2.控制要求::
(1)该广告屏中间8根灯管亮灭的时序为:第1根亮→2亮→3亮→„„→第8根亮,时间间隔为1s,全亮后,显示10s,再反过来从8→7→„„→1按1s间隔顺序熄灭,全灭后停亮2s;再从第8根开始亮,顺序点亮7→6→„„→1,时间间隔1s,显示3s,再从1→2→„„→8按1s间隔顺序熄灭,全灭后停亮2s,然后重复运行,周而复始。
(2)24只流水灯,4个一组分成6组,从Ⅰ→Ⅱ→„„→Ⅵ按1s时间间隔依次向前移动,且点亮时每相隔1灯为亮,即从Ⅰ“①、③”亮→Ⅱ“⑤、⑦”亮,同时Ⅰ“①、③”灭→Ⅲ“、”亮,同时Ⅱ“⑤、⑦”灭„„,如此移动一段时间(如30s)后,再反过来移动一段时间:Ⅵ“、”亮 →Ⅴ“、”亮,同时Ⅵ“、”灭,„„如此循环往复。
(3)系统有单步/连续控制,单步运行时广告屏只亮一个循环,连续运行时则循环往复运行;有起动和停止按钮。
(4)起动时,灯管和流水灯同时起动,关闭时,可同时也可分别关闭。
(5)在控制要求1中,若要求将全亮后显示10s改为以0.5s间隔同时闪烁5s,试修改程序。
(6)*要求有移位指令的应用 3.I/O编址并工作框图(或时序图)
4.编程并借助实验箱上的发光二极管模拟调试 5.画出I/O端子接线图
三、自动门控制装置PLC梯形图控制程序的设计与调试 1.自动门控制装置的硬件组成:
自动门控制装置由门内光电探测开关K1、门外光电探测开关K2、开门到位限位开关K3、关门到限位开关K4、开门执行机构KM1(使直流电动机正转)、关门执行机构KM2(使直流电动机反转)等部件组成。光电探测开关为无光导通,有光断开。2.控制要求:
(1)当有人由内到外或由外到内通过光电检测开关K1或K2时,开门执行机构KM1动作,电动机正转,到达开门限位开关K3位置时,电机停止运行。
(2)自动门在开门位置停留8s后,自动进入关门过程,关门执行机构KM2被起动,电动机反转,当门移动到关门限位开关K4位置时,电机停止运行。
(3)在关门过程中,当有人员由外到内或由内到外通过光电检测开关K2或K1时,应立即停止关门,并自动进入开门程序。
(4)在门打开后的10s等待时间内,若有人员由外至内或由内至外通过光电检测开关K2或K1时,必须重新开始等待10s后,再自动进入关门过程,以保证人员安全通过。
(5)开门与关门不可同时进行 3.I/O编址
4.编程并借助实验箱上的发光二极管模拟调试
四、完成课程设计说明书 1.课题名称及要求
2.程序(包括注释)、时序图或框图、I/O接线图 3.三菱PLC与MODICON PLC相关指令的应用比较、运行情况及调试小结等 4.课程设计的心得
《PLC原理及应用》课程设计任务书 MITSUBISHI(三菱)PLC L组
一、PLCⅡ型教学实验箱程序的开发
要求:1.开发实验九、十、十二的梯形图程序
2.写出I/O编址、写出梯形图程序及语句表程序并调试
二、大、小球分拣传送机械PLC控制梯形图的设计与调试 1.大、小球分拣传送机械示意图
2.控制要求:
(1)机械臂起始位置在机械原点(见图),为左限、上限并有显示。
(2)有起动按钮和停止按钮控制运行,设停止时机械臂必须已回到原点。
(3)起动后,机械臂动作顺序为:下降→吸球→上升(至上限)→右行(至右限)→下降→释放→上升(至上限)→左行返回(至原点)。
(4)机械臂右行时有小球右限(LS4)和大球右限(LS5)之分;下降时,当电磁铁压着大球时,下限开关LS2断开(=“0”);压着小球时,下限开关LS2接通(=“1”)。
3.I/O编址及工作框图
4.编程并借助实验箱上的发光二极管进行调试 5.I/O端子接线图
三、自行设计课题
要求:设计汽车自动清洗装置的PLC梯形图控制课题及程序(1)了解汽车自动清洗过程
(2)设计课题:课题名称、控制要求、工作框图或时序图、I/O编址(3)编程并借助实验箱上的发光二极管进行调试
四、完成课程设计说明书 1.课题名称及要求
2.程序(包括注释)、时序图或框图、I/O接线图 3.三菱PLC与MODICON PLC相关指令的应用比较、运行情况及调试小结等 4.课程设计的心得 《PLC原理及应用》课程设计任务书 MITSUBISHI(三菱)PLC M组
一、PLCⅡ型教学实验箱程序的开发
要求:
1.开发实验十、十二、十五的梯形图程序 写出I/O编址
写出梯形图程序及语句表程序并调试
二、自行设计“全自动洗衣机PLC控制”课题
要求:
1.课题名称 2.控制要求 3.工作框图.4.I/O设置
5.编程并借助实验箱上的发光二极管进行调试
三、饮料灌装生产流水线PLC梯形图控制程序设计与调试 1.控制要求:
(1)系统通过开关设定为自动操作模式,一旦启动,则传送带的驱动电机启动并一直保持到停止开关动作或灌装设备下的传感器检测到一个瓶子时停止;瓶子装满饮料后,传送带驱动电机必须自动启动,并保持到又检测到一个瓶子或停止开关动作(2)当瓶子定位在灌装设备下时,停顿1s,灌装设备开始工作,灌装过程为5s钟,灌装过程应有报警显示,5s后停止并不再显示报警;报警方式为红灯以0.5s间隔闪烁
(3)以每24瓶为一箱,记录产品箱数
(4)每隔8小时将记录产品箱数的计数器当前值转存至其他寄存器,然后对计数器自动清零,重新开始计数。(*)
(5)可以手动对计数器清零(复位)2.编程并借助实验箱上的发光二极管进行调试 3.画出I/O端子接线图
四、完成课程设计说明书 1.课题名称及要求
2.程序(包括注释)、时序图或框图、I/O接线图
3.三菱PLC与MODICON PLC相关指令的应用比较、运行情况及调试小结等 4.课程设计的心得
《PLC原理及应用》课程设计任务书 MITSUBISHI(三菱)PLC N组
一、PLCⅡ型教学实验箱程序的开发
要求: 1.开发实验八、九、十五的梯形图程序 写出I/O编址
写出梯形图程序及语句表程序并调试
二、物业供水系统水泵梯形图控制程序设计与调试
某物业供水系统有水泵4台,供水管道安装压力检测开关K1,K2和K3。K1接通,表示水压偏低;K2接通,表示水压正常;K3接通,表示水压偏高。1.控制要求:
(1)自动工作时,当用水量少,压力增高,K3接通,此时可延时30s后撤除1台水泵
工作,要求先工作的水泵先切断;当用水量多时,压力降低,K1接通,此时可延时30s后增设1台水泵工作,要求未曾工作过的水泵增加投入运行;当K2接通,表示供水正常,可维持水泵运行数量。工作时,要求水泵数量最少为1台,最多不得超出4台。
(2)各水泵工作时,均应有工作状态显示。
(3)手动工作时,要求4台水泵可分别独立操作(分设起动和停止开关),并分别具有
过载保护,可随时对单台水泵进行断电控制(若输入点不够,可用I/O扩展模块)
(4)设置“自动/手动”切换开关(ON——手动,OFF——自动),另设自动运行控制开关(ON——自动运行,OFF——自动运行停止)。2.画出运行框图,I/O编址
3.编程并借助实验箱上的发光二极管进行调试 4.画出I/O端子接线图。
三、自动门控制装置PLC梯形图控制程序的设计与调试 1.自动门控制装置的硬件组成:
自动门控制装置由门内光电探测开关K1、门外光电探测开关K2、开门到位限位开关K3、关门到限位开关K4、开门执行机构KM1(使直流电动机正转)、关门执行机构KM2(使直流电动机反转)等部件组成。光电探测开关为无光导通,有光断开。2.控制要求:
(1)当有人由内到外或由外到内通过光电检测开关K1或K2时,开门执行机构KM1动作,电动机正转,到达开门限位开关K3位置时,电机停止运行。
(2)自动门在开门位置停留8s后,自动进入关门过程,关门执行机构KM2被起动,电动机反转,当门移动到关门限位开关K4位置时,电机停止运行。
(3)在关门过程中,当有人员由外到内或由内到外通过光电检测开关K2或K1时,应立即停止关门,并自动进入开门程序。
(4)在门打开后的10s等待时间内,若有人员由外至内或由内至外通过光电检测开关K2或K1时,必须重新开始等待10s后,再自动进入关门过程,以保证人员安全通过。
(5)开门与关门不可同时进行 3.I/O编址
4.编程并借助实验箱上的发光二极管模拟调试
四、完成课程设计说明书 1.课题名称及要求
2.程序(包括注释)、时序图或框图、I/O接线图 3.三菱PLC与MODICON PLC相关指令的应用比较、运行情况及调试小结等 4.课程设计的心得
《PLC原理及应用》课程设计任务书 MITSUBISHI(三菱)PLC O组 一、八层电梯楼层定位及显示的梯形图控制程序设计与调试 1.控制要求:
(1)根据各楼层行程开关的状态,确定轿厢所在楼层
(2)用九段LED数码管作十进制层楼位置显示,如下图所示:
2.九段码编码示意图、真值表、I/O编址 3.用0作故障显示
4.编程并借助实验箱上的发光二极管模拟调试 5.I/O端子接线图 二、三相六拍步进电机PLC梯形图控制程序设计与调试 1.控制要求:
(1)三相步进电动机有三个绕组:A、B、C,正转通电顺序为:A→AB→B→BC→C→CA→A 反转通电顺序为:A→CA→C→BC→B→AB→A
(2)要求能实现正、反转控制,而且正、反转切换无须经过停车步骤。
(3)具有两种转速:
#1开关合上,则转过一个步距角需0.5s。#2开关合上,则转过一个步距角需0.05s。
(4)要求步进电动机转动100个步距角后自动停止运行 I/O编址 编程并借助实验箱上的发光二极管模拟调试
三、自行设计课题
要求:设计十字路口交通灯控制课题及程序
1.观察桂林路漕宝路口交通灯(包括左转弯灯和行人灯)的工作时序 2.设计课题:课题名称、控制要求、时序图、I/O编址 3.编程并借助实验箱上的发光二极管模拟调试
四、完成课程设计说明书 1.课题名称及要求
2.程序(包括注释)、框图(或时序图)、I/O接线图
3.三菱PLC与MODICON PLC相关指令的应用比较、运行情况及调试小结等 4.课程设计的心得
《PLC原理及应用》课程设计任务书
西门子S7-200 PLC A组 一、十字路口交通信号灯PLC控制系统设计与调试 1.控制要求:
(1)系统工作受开关控制,起动开关 ON 则系统工作;起动开关 OFF 则系统停
止工作。
(2)控制对象有八个:
东西方向红灯两个 , 南北方向红灯两个,东西方向黄灯两个 , 南北方向黄灯两个,东西方向绿灯两个 , 南北方向绿灯两个,东西方向左转弯绿灯两个,南北方向左转弯绿灯两个。
(3)控制规律:
1)高峰时段按时序图二(见附图)运行,正常时段按时序图三(见附图)运行,晚上时段按提示警告方式运行,规律为: 东、南、西、北四个黄灯全部闪亮,其余灯全部熄灭,黄灯闪亮按亮 0.4 s,暗 0.6 s的规律反复循环。高峰时段、正常时段及晚上时段的时序分配按时序图一运行(见附图)。2.编程并调试 3.I/O端子接线图
时序图一
高峰时段 7:00↘ ↙8:15 16:30↘ 正常时段
晚间时段 6:30↗
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 小时
时序图二
00004 R-EW 00001 L——SN 00002 G 00003 Y
00008 R 00005 L 00006 G 00007 Y 10 20 30 40 50 60 70 80 90 SEC 时序图三
00004 R-EW 00001 L 00002 G 00003 Y
00008 R—SN —SN —EW —EW —EW
——SN
—SN —SN
—SN —SN 00005 L—EW 00006 G—EW 00007 Y—EW 10 20 30 40 50 60 70 80 90 SEC
二、车库车辆出入库管理PLC梯形图控制程序设计与调试 1.控制要求:
(1)入库车辆前进时,经过1#传感器→2#传感器后,计数器A加1,后退时经过2#传感器→1#传感器后,计数器B减1;(计数器B的初始值由计数器A送来)只经过一个传感器则计数器不动作。
(2)出库车辆前进时,经过2#传感器→1#传感器后,计数器B减1,后退时经过1#传感器→2#传感器后,计数器A加1;只经过一个传感器则计数器不动作
(3)车辆入库或出库时,均应有警铃报警,定时3s钟(4)仓库启用时,先对所有用到的存储单元清零,并应有仓库空显示
(5)若设仓库容量为50辆车,则仓库满时应报警并显示。
(6)若同时有车辆相对入库和出库(即入库车辆经过1#传感器,出库车辆经过2#传感器),应避免误计数。2.I/O编址 编程并调试
I/O端子接线图
三、自动门控制装置PLC梯形图控制程序的设计与调试 1.自动门控制装置的硬件组成:
自动门控制装置由门内光电探测开关K1、门外光电探测开关K2、开门到位限位开关K3、关门到限位开关K4、开门执行机构KM1(使直流电动机正转)、关门执行机构KM2(使直流电动机反转)等部件组成。光电探测开关为有光导通,无光断开。2.控制要求:
(1)当有人由内到外或由外到内通过光电检测开关K1或K2时,开门执行机构KM1动作,电动机正转,到达开门限位开关K3位置时,电机停止运行。
(2)自动门在开门位置停留8s后,自动进入关门过程,关门执行机构KM2被起动,电动机反转,当门移动到关门限位开关K4位置时,电机停止运行。
(3)在关门过程中,当有人员由外到内或由内到外通过光电检测开关K2或K1时,应立即停止关门,并自动进入开门程序。
(4)在门打开后的8s等待时间内,若有人员由外至内或由内至外通过光电检测开关K2或K1时,必须重新开始等待8s后,再自动进入关门过程,以保证人员安全通过。
(5)开门与关门不可同时进行 3.I/O编址 4.编程并调试 5.I/O端子接线图
四、自行设计课题
要求:设计汽车自动清洗装置的PLC梯形图控制课题及程序 观察汽车自动清洗过程(可网上查找资料)
2.设计课题:课题名称、控制要求、工作框图或时序图、I/O编址 3.编程并调试 4.I/O端子接线图
五、完成课程设计说明书 1.课题名称及要求
程序(包括注释)、框图或时序图、I/O接线图
西门子PLC与MODICON PLC相关指令的应用比较、运行情况及调试小结等 课程设计的心得
《PLC原理及应用》课程设计任务书
西门子S7-200 PLC B组 一、五相十拍步进电动机控制程序的设计与调试 1.控制要求:
(1)五相步进电动机有五个绕组: A、B、C、D、E , 正转通电顺序: ABC→BC→BCD→CD→CDE→DE→DEA→EA→EAB→AB
反转通电顺序: ABC←BC←BCD←CD←CDE←DE←DEA←EA←EAB←AB
(2)用五个开关控制其工作:
#1开关控制其运行(启 / 停)。
#2 开关控制其低速运行(转过一个步距角需 0.5 s)。#3 开关控制其中速运行(转过一个步距角需 0.1 s)。#4 开关控制其低速运行(转过一个步距角需 0.03 s)。#5 开关控制其转向(ON 为正转,OFF 为反转)。2.I/O编址 3.编程并调试 4.I/O端子接线图
二、饮料灌装生产流水线PLC梯形图控制程序设计与调试 1.控制要求:
(1)系统通过开关设定为自动操作模式,一旦启动,则传送带的驱动电机启动并一直保持到停止开关动作或灌装设备下的传感器检测到一个瓶子时停止;瓶子装满饮料后,传送带驱动电机必须自动启动,并保持到又检测到一个瓶子或停止开关动作
(2)当瓶子定位在灌装设备下时,停顿1s,灌装设备开始工作,灌装过程为5s钟,灌装过程应有报警显示,5s后停止并不再显示报警;报警方式为红灯以0.5s间隔闪烁
(3)用两个传感器分别检测空瓶数和满瓶数,用计数器记录空瓶数和满瓶数,一旦系统启动,即开始记录空瓶数和满瓶数
(4)若每24瓶为一箱,记录产品箱数
(5)每隔8小时将空瓶及满瓶计数器的当前值转存至其他寄存器,然后对计数器自动清零,重新开始计数。
(6)可以手动对计数器清零(复位)2.编程并调试 3.画出I/O端子接线图
三、自行设计“全自动洗衣机PLC控制”课题
要求: 1.课题名称 2.控制要求 3.工作框图.4.I/O设置 5.编程并调试
四、完成课程设计说明书 1.课题名称及要求 程序(包括注释)、框图、I/O接线图
西门子PLC与MODICON PLC相关指令的应用比较、运行情况及调试小结等 课程设计的心得
《PLC原理及应用》课程设计任务书
西门子S7-200 PLC C组 一、八层电梯楼层定位及显示的梯形图控制程序设计与调试 1.控制要求:(1)根据各楼层行程开关的状态,确定轿厢所在楼层
(2)用九段LED数码管作十进制层楼位置显示,如下图所示:
2.九段码编码示意图、真值表、I/O编址 3.编程并调试 4.I/O端子接线图 二、三相六拍步进电机PLC梯形图控制程序设计与调试 1.控制要求:
(1)三相步进电动机有三个绕组:A、B、C,正转通电顺序为:A→AB→B→BC→C→CA→A
反转通电顺序为:A→CA→C→BC→B→AB→A
(2)要求能实现正、反转控制,而且正、反转切换无须经过停车步骤。
(3)具有两种转速:
#1开关合上,则转过一个步距角需0.5s。#2开关合上,则转过一个步距角需0.05s。
(4)要求步进电动机转动100个步距角后自动停止运行
(5)在完成上述功能的基础上,增加功能:
设置按钮K1,每按一次K1,转速增加一档(即转动一个步距角所需时间减少0.01s)设置按钮K2,每按一次K2,转速减少一档(即转动一个步距角所需时间增加0.01s)I/O编址 编程与调试
三、自行设计课题
要求:设计十字路口交通灯控制课题及程序
1.观察桂林路漕宝路口交通灯(包括左转弯灯和行人灯)的工作时序 2.设计课题:课题名称、控制要求、时序图、I/O编址 3.编程并调试 4.I/O端子接线图
四、完成课程设计说明书 1.课题名称及要求
2.程序(包括注释)、框图、I/O接线图
3.西门子PLC与MODICON PLC相关指令的应用比较、运行情况及调试小结等 4.课程设计的心得
《PLC原理及应用》课程设计任务书
西门子S7-200 PLC D组
一、自动门控制装置PLC梯形图控制程序的设计与调试 1.自动门控制装置的硬件组成:
自动门控制装置由门内光电探测开关K1、门外光电探测开关K2、开门到位限位开关K3、关门到限位开关K4、开门执行机构KM1(使直流电动机正转)、关门执行机构KM2(使直流电动机反转)等部件组成。光电探测开关为无光导通,有光断开。2.控制要求:
(1)当有人由内到外或由外到内通过光电检测开关K1或K2时,开门执行机构KM1动作,电动机正转,到达开门限位开关K3位置时,电机停止运行。(2)自动门在开门位置停留8s后,自动进入关门过程,关门执行机构KM2被起动,电动机反转,当门移动到关门限位开关K4位置时,电机停止运行。
(3)在关门过程中,当有人员由外到内或由内到外通过光电检测开关K2或K1时,应立即停止关门,并自动进入开门程序。
(4)在门打开后的10s等待时间内,若有人员由外至内或由内至外通过光电检测开关K2或K1时,必须重新开始等待10s后,再自动进入关门过程,以保证人员安全通过。
(5)开门与关门不可同时进行 3.I/O编址 4.编程并调试 5.I/O端子接线图
二、物业供水系统水泵梯形图控制程序设计与调试
某物业供水系统有水泵4台,供水管道安装压力检测开关K1,K2和K3。K1接通,表
示水压偏低;K2接通,表示水压正常;K3接通,表示水压偏高。1.控制要求:
(1)自动工作时,当用水量少,压力增高,K3接通,此时可延时30s后撤除1台水泵
工作,要求先工作的水泵先切断;当用水量多时,压力降低,K1接通,此时可延时30s后增设1台水泵工作,要求未曾工作过的水泵增加投入运行;当K2接通,表示供水正常,可维持水泵运行数量。工作时,要求水泵数量最少为1台,最多不得超出4台。(2)各水泵工作时,均应有工作状态显示。
(3)手动工作时,要求4台水泵可分别独立操作(分设起动和停止开关),并分别具有
过载保护,可随时对单台水泵进行断电控制(若输入点不够,可用I/O扩展模块)
(4)设置“自动/手动”切换开关(ON——手动,OFF——自动),另设自动运行控制开关(ON——自动运行,OFF——自动运行停止)。2.画出运行框图,I/O编址,编程并调试 3.画出I/O端子接线图。
三、全自动洗衣机梯形图控制程序的设计与调试 1.控制要求:
(1)按下启动按扭及水位选择开关
(2)注水直到高(中、低)水位,关水
(3)2s后开始洗涤
(4)洗涤时,正转30s,停2s,然后反转30s,停2s(5)如此循环5次,总共320s后开始排水,排空后脱水30s(6)开始清洗,重复(2)~(5),清洗两遍
(7)清洗完成,报警3s并自动停机
(8)若按下停车按扭,可手动排水(不脱水)和手动脱水(不计数)
输入点: 输出点:
启动 10001 低水位检测 10009 启动洗衣机 00001 停止 10002 手动排水 10010 进水阀 00002 高水位 10003 手动脱水 10011 正转 00003 中水位 10004 反转 00004 低水位 10005 排水 00005 排空检测 10006 脱水 00006 高水位检测 10007 报警 00007 中水位检测 10008 2.若要求启动开关分为标准洗和轻柔洗,试改变有关输入点,并在程序中加入轻柔洗功能(轻柔洗过程自定)3.I/O编址 4.编程并调试
四、MODICON PLC梯形图控制程序的移植
要求:
1.将教材中五层电梯模型的梯形图控制程序改成S7-200 PLC的梯形图控制程序
2.I/O编址:设有开关量I/O扩展模块2个,均为8×24VDC输入/8×继电器输出 3.试画出I/O端子接线图
五、完成课程设计说明书 1.课题名称及要求
2.程序(包括注释)、框图、I/O接线图
3.西门子PLC与MODICON PLC相关指令的应用比较、运行情况及调试小结等 4.课程设计的心得
《PLC原理及应用》课程设计任务书
西门子S7-200 PLC E组 一、四分频电路梯形图控制程序设计与调试
要求:
1.解读MODICON PLC的二分频电路梯形图程序,用STEP7设计四分频电路梯形图程序并调试,画出四分频时序图。2.控制要求:
输入点引入信号脉冲,输出点输出的脉冲是输入脉冲的四分频信号。
二分频时序图如下: 输入10001 输出00002 MODICON PLC二分频梯形图:
()10001 00101 00100()10001 00101()00100 00002 00102()00100 00102 00002 00002
二、自行设计课题
要求:设计汽车自动清洗装置的PLC梯形图控制课题及程序 1.观察汽车自动清洗过程(可网上查找资料)
2.设计课题:课题名称、控制要求、工作框图或时序图、I/O编址 3.编程并调试 4.I/O端子接线图
三、MODICON PLC梯形图控制程序的移植
1.将教材中五层电梯模型的梯形图控制程序改成S7-200 PLC的梯形图控制程序
2.I/O编址:设有开关量I/O扩展模块2个,均为8×24VDC输入/8×继电器输出
3.画出I/O端子接线图
4.完成PLC与电梯模型的接线并运行调试
四、完成课程设计说明书 1.课题名称及要求 2.程序(包括注释)、框图、I/O接线图
3.西门子PLC与MODICON PLC相关指令的应用比较、运行情况及调试小结等 4.课程设计的心得
《PLC原理及应用》课程设计任务书
西门子S7-200 PLC F组
一、花式喷水池装置PLC控制梯形图的设计与调试 1.花式喷水池示意图
图a)中4为中间喷水管,3为内环状喷水管,2为中环形状喷水管,1为外环形状喷水管。图b)中的选择开关可有4种选择,可分别用4个开关模拟实现;单步/连续开关为“1”= 单步,“0”= 连续,其他为单一功能开关。2.控制要求:
(1)水池控制电源开关接通后,按下启动按钮,喷水装置即开始工作。按下停止按钮,则停止喷水。工作方式由“选择开关”和“单步/连续”开关来决定。
(2)“单步/连续”开关在单步位置时,喷水池只运行一个循环;在连续位置时,喷水池反复循环运行。(3)方式选择开关用以选择喷水池的喷水花样,1~4号喷水管的工作方式选择如下:
a)选择开关在位置“1”——按下启动按钮后,4号喷水,延时2s,3号喷水,再延时1.5s,2号喷水,再延时2s,1号喷水,然后全部停止1s,接着一起喷水15s为一个循环。
b)选择开关在位置“2”——按下启动按钮后,1号喷水,延时2s,2号喷水,再延时2s,3号喷水,再延时2s,4号喷水,然后全部停止0.5s,接着一起喷水30s为一个循环。
c)选择开关在位置“3”——按下启动按钮后,1、3号同时喷水,延时3s后,2、4号同时喷水,1、3号停止喷水;交替运行5次后,1~4号同时喷水20s为一个循环。
d)选择开关在位置“4”——按下启动按钮后,喷水池1~4号水管的工作顺序为: 1→2→3→4按顺序延时2s喷水,然后一起喷水10s后,按1→1+2→2→2+3→3→3+4→4→4+1号水管以1s间隔顺序喷水,小循环3次后,一起喷水2s,再停止1s,由4→3→2→1反序分别延时2s喷水,然后再一起喷水10s为一个大循环。
(4)不论在什么工作方式,按下停止按钮,喷水池立即停止工作,所有存储器复位。
3.I/O编址 4.编程并调试 5.I/O端子接线图
二、带有显示的十字路口交通信号灯控制程序的设计与调试 1.系统框图:
2.控制要求:
(1)南北方向为主干道,绿灯亮的时间比东西方向次干道绿灯亮的时间多一倍,黄灯间隔0.5s闪烁3 s后切换到红灯,信号灯工作时序图如下,一次循环共需96s。(2)时序图:
(3)主干道的数码显示应该与红、黄及绿灯同步,且两条主、次干道应该一样显示。比如:南北方向绿灯亮时,东西方向和南北方向均应显示数字63(绿灯亮60s,黄灯亮3s),然后隔秒减1,当减到0时,换成东西方向绿灯亮,南北方向红灯亮,此时,数码管应显示33,然后隔秒减1,当减到0时,再进行切换,完成一次工作循环。
(4)*有白天/夜间操作转换开关、运行/停止开关、紧急操作开关1#、2#,其功能如下:
白天/夜间操作转换开关在“白天”位置时,按上述时序正常工作,在“夜间”位置时,两边均只有黄灯闪烁
运行开关在接通电源时,方可切换白天/夜间开关
开关在“运行”位置时,系统启动,在“停止”位置时,系统关闭
当有特殊情况(如事故)需某一方向的绿灯一直亮,则应用紧急操作开关实现次功能。比如:1#开关=“1”,则南北方向绿灯一直亮,东西方向红灯一直亮,2#开关=“1”,则东西方向绿灯一直亮,南北方向红灯一直亮,关闭紧急开关,则系统恢复正常。
3.编程并模拟调试
4.画出I/O端子接线图(用一个I/O扩展模块)
.三、完成课程设计说明书 1.课题名称及要求 2.程序(包括注释)、框图、I/O接线图
3.西门子PLC与MODICON PLC相关指令的应用比较、运行情况及调试小结等 4.课程设计的心得
《PLC原理及应用》课程设计任务书
西门子S7-200 PLC G组
一、霓虹灯广告屏装置PLC控制梯形图的设计与调试 1.霓虹灯广告屏示意图
该广告屏共有8根灯管,24只流水灯,每4只灯为一组,如下图所示:
2.控制要求::
(1)该广告屏中间8根灯管亮灭的时序为:第1根亮→2亮→3亮→„„→第8根亮,时间间隔为1s,全亮后,显示10s,再反过来从8→7→„„→1按1s间隔顺序熄灭,全灭后停亮2s;再从第8根开始亮,顺序点亮7→6→„„→1,时间间隔1s,显示5s,再从1→2→„„→8按1s间隔顺序熄灭,全灭后停亮2s,然后重复运行,周而复始。
(2)24只流水灯,4个一组分成6组,从Ⅰ→Ⅱ→„„→Ⅵ按1s时间间隔依次向前移动,且点亮时每相隔1灯为亮,即从Ⅰ“①、③”亮→Ⅱ“⑤、⑦”亮,同时Ⅰ“①、③”灭→Ⅲ“、”亮,同时Ⅱ“⑤、⑦”灭„„,如此移动一段时间(如30s)后,再反过来移动一段时间:Ⅵ“、”亮 →Ⅴ“、”亮,同时Ⅵ“、”灭,„„如此循环往复。
(3)系统有单步/连续控制,有起动和停止按钮。
(4)起动时,灯管和流水灯同时起动,关闭时,可同时也可分别关闭。
(5)要求有移位指令的应用
(6)*在控制要求1中,若要求将全亮后显示10s改为以0.5s间隔同时闪烁5s,试修改程序。3.编程并模拟调试
4.画出I/O端子接线图(用2个I/O扩展模块)
二、自行设计课题
要求:设计汽车自动清洗装置的PLC梯形图控制课题及程序 1.观察汽车自动清洗过程(可网上查找资料)
2.设计课题:课题名称、控制要求、工作框图或时序图、I/O编址 3.编程并调试 4.I/O端子接线图
三、完成课程设计说明书 1.课题名称及要求
2.程序(包括注释)、时序图或框图、I/O接线图
3.西门子PLC与MODICON PLC相关指令的应用比较、运行情况及调试小结等 4.课程设计的心得
第四篇:gps原理及应用
《gps原理及应用》
1、gps定位技术相对于其他定位技术的特点:(1)观测站之间无需通视(2)定位精度高(3)观测时间短(4)提供三维坐标(5)操作简便(6)全天候作业
2、简述gps定位系统的构成,并说明各部分的作用:由三部分组成:空间部分—GPS星座(GPS星座是由24颗卫星组成的星座,其中21颗是工作卫星,3颗是备份卫星);地面控制部分—地面监控系统;用户设备部分—GPS 信号接收机。GPS的空间部分是由24 颗工作卫星组成,它位于距地表20 200km的上空,均匀分布在6 个轨道面上(每个轨道面4 颗),轨道倾角为55°。此外,还有4 颗有源备份卫星在轨运行。卫星的分布使得在全球任何地方、任何时间都可观测到4 颗以上的卫星,并能保持良好定位解算精度的几何图象。这就提供了在时间上连续的全球导航能力。地面控制部分由一个主控站,5 个全球监测站和3 个地面控制站组成。用户设备部分即GPS 信号接收机。其主要功能是能够捕获到按一定卫星截止角所选择的待测卫星,并跟踪这些卫星的运行。
3、Wgs-84坐标是如何构建的:一种国际上采用的地心坐标系。坐标原点为地球质心,其地心空间直角坐标系的Z轴指向BIH(国际时间)1984.O定义的协议地球极(CTP)方向,X轴指向BIH 1984.0的零子午面和CTP赤道的交点,Y轴与Z轴、X轴垂直构成右手坐标系,称为1984年世界大地坐标系统。
GPS广播星历是以WGS-84坐标系为根据的
4、水准面:静止的水面称为水准面,水准面是受地球表面重力场影响而形成的,是一个处处与重力方向垂直的连续曲面,因此是一个重力场的等位面。设想一个静止的海水面扩展到陆地部分。这样,地球的表面就形成了一个较地球自然表面规则而光滑的曲面,这个曲面被称为水准面。
大地水准面:一个与静止的平均海水面重合并延伸到大陆内部的包围整个地球的封闭的重力位水准面。
高程:的是某点沿铅垂线方向到绝对基面的距离,称绝对高程。简称高程。某点沿铅垂线方向到某假定水准基面的距离,称假定高程。原子时:原子时:ATI(inernational atomic time),以物质的原子内部发射的电磁振荡频率为基准的时间计量系统[1]。原子时的初始历元规定为 1958年1月1日世界时0时,秒长定义为铯-133 原子基态的两个超精细能级间在零磁场下跃迁辐射9192631770周所持续的时间。这是一种均匀的时间计量系统。由于世界时存在不均匀性和历书时的测定精度低,1967年起,原子时已取代历书时作为基本时间计量系统。
Gps时:GPS时钟也是基于最新型GPS高精度定位授时模块开发的基础型授时应用产品。能够按照用户需求输出符合规约的时间信息格式,从而完成同步授时服务。其主要原理是通过GPS或其他卫星导航系统的信号驯服晶振,从而实现高精度的频率和时间信号输出,是目前达到纳秒级授时精度和稳定度在1E12量级频率输出的最有效方式。
5、参心坐标系和地心坐标系的区别:
参心坐标系
reference-ellipsoid-centric coordinate system
是以参考椭球的几何中心为原点的大地坐标系。通常分为:参心空间直角坐标系(以x,y,z为其坐标元素)和参心大地坐标系(以B,L,H为其坐标元素)。[1]
参心坐标系是在参考椭球内建立的O-XYZ坐标系。原点O为参考椭球的几何中心,X轴与赤道面和首子午面的交线重合,向东为正。Z轴与旋转椭球的短轴重合,向北为正。Y轴与XZ平面垂直构成右手系。
“参心”意指参考椭球的中心。在测量中,为了处理观测成果和传算地面控制网的坐标,通常须选取一参考椭球面作为基本参考面,选一参考点作为大地测量的起算点(大地原点),利用大地原点的天文观测量来确定参考椭球在地球内部的位置和方向。参心大地坐标的应用十分广泛,它是经典大地测量的一种通用坐标系。根据地图投影理论,参心大地坐标系可以通过高斯投影计算转化为平面直角坐标系,为地形测量和工程测量提供控制基础。由于不同时期采用的地球椭球不同或其定位与定向不同,在我国历史上出现的参心大地坐标系主要有BJZ54(原)、GDZ80和BJZ54等三种。
地心坐标系
geocentric coordinate system
以地球质心为原点建立的空间直角坐标系,或以球心与地球质心重合的地球椭球面为基准面所建立的大地坐标系。
以地球质心(总椭球的几何中心)为原点的大地坐标系。通常分为地心空间直角坐标系(以x,y,z为其坐标元素)和地心大地坐标系(以B,L,H为其坐标元素)。
地心坐标系是在大地体内建立的O-XYZ坐标系。原点O设在大地体的质量中心,用相互垂直的X,Y,Z三个轴来表示,X轴与首子午面与赤道面的交线重合,向东为正。Z轴与地球旋转轴重合,向北为正。Y轴与XZ平面垂直构成右手系。
6、广播星历 :卫星发播的预报一定时间内卫星轨道信息的电文信息。
精密星历:供卫星精密定位所使用的卫星轨道信息。
区别是,前者是预报星历,后者是后处理星历
7、载波相位测量的原理:载波信号量测精度优于波长的1/100,载波波长(L1=19cm, L2=24cm)比C/A码波长(C/A=293m)短得多,所以GPS测量采用载波相位观测值可以获得比伪距(C/A码或P码)定位高得多的成果精度。
伪距测量的原理:GPS接收机对测距码的量测就可得到卫星到接收机的距离,由于含有接收机卫星钟的误差及大气传播误差,故称为伪距。对C/A码测得的伪距称为C/A码伪距,精度约为20米左右,对P码测得的伪距称为P码伪距,精度约为2米左右。
8、绝对定位又称为单点定位,这是一种采用一台接收机进行定位的模式,它所确定的是接收机天线的绝对坐标。这种定位模式的特点是作业方式简单,可以单机作业。绝对定位一般用于导航和精度要求不高的应用中。相对定位又称为差分定位,这种定位模式采用两台以上的接收机,同时对一组相同的卫星进行观测,以确定接收机天线间的相互位置关系。
接收设备安置在运动的载体上的定位成为动态定位
9、Gps定位原理:GPS的基本定位原理是:卫星不间断地发送自身的星历参数和时间信息,用户接收到这些信息后,经过计算求出接收机的三维位置,三维方向以及运动速度和时间信息。
10、Gps误差来源有哪些:(1)与GPS卫星有关的因素(2)与传播路径有关的因素(3)接收机有关的因素(4)GPS控制部分人为或计算机造成的影响,数据处理软件的影响,固体潮、极潮和海水负荷的影响,相对论效应。
11、Gps控制网布点原则:(1)周围应便于安置接收设备和操作,视野开阔,视场内障碍物的高度角不宜超过15度;(2)远离大功率无线电发射源(如电视台、电台、微波站等),其距离不小于200m;远离高压输电线和微波无线电信号传送通道,其距离不小于50m;(3)附近不应有强烈反射卫星信号的物件(如大型建筑物等);(4)交通方便,并有利于其他测量手段扩展和联测;(5)地面基础稳定,易于点的保存;(6)AA、A、B级GPS点,应选在能长期保存的地点;(7)充分利用符合要求的旧有控制点;(8)选站时应尽可能使测站附近的小环境(地形,地貌,植被等)与周围的大环境保持一致,以减少气象元素的代表性误差。
12、基线:三角测量中推算三角锁、网起算边长所依据的基本长度边。
观测时段:测站上开始接收卫星信号到观测停止,连续工作的时间段,简称时段。
同步观测:两台或两台以上接收机同时对同一组卫星进行的观测。同步观测环:三台或三台以上接收机同步观测获得的基线向量所构成的闭合环,简称同步环。独立观测环:由独立观测所获得的基线向量构成的闭合环,简称独立环。
异步观测环:在构成多边形环路的所有基线向量中,只要有非同步观测基线向量,则该多边形环路叫异步观测环,简称异步环。独立基线:对于N台GPS接收机的同步观测环,有J条同步观测基线,其中独立基线数为N-1。
非独立基线:除独立基线外的其它基线叫非独立基线,总基线数与独立基线之差即为非独立基线数。
13、同步网之间的连接方式有哪些?
对于由N台GPS接收机构成的同步图形中一个时断包含的GPS基线数为:
但其中仅有N-1条是独立的GPS边,其余为非独立边。当接收机数N=2~5时所构成的同步图形
当同步观测的GPS接收机数N≥3时,同步闭合环的最少数应为:
14、Gps网形设计原则:(1)GPS网中不应存在自由基线。所谓自由基线是指不构成闭合图形的基线,由于自由基线不具备发现粗差的能力,因而必须避免出现,也就是GPS网一般应通过独立基线构成闭合图形。(2)GPS网中的闭合条件中基线数不可过多。网中各点最好有三条或更多基线分支,以保证检核条件,提高网的可靠性,使网中的精度、可靠性较均匀。(3)GPS网应以“每个点至少独立设站观测两次”的原则布网。这样不同接收 机数测量构成的网之精度和可靠性指标比较接近。(4)为了实现GPS网与地面网之间的坐标转换GPS网至少应与地面网有2个重合点。
15、数据预处理的目的:对原始数据进行编辑、加工、整理、分流并产生各种专用信息文件,为进一步平差计算做准备。
Gps测量定位技术设计及技术总结包括那些内容?
在gps测量工作完成后,应按要求编写技术总结报告,其具体内容包括外业和内业两大部分。外业技术总结内容
测区范围与位置,自然地理条件,气候特点,交通及电信、电源等情况
任务来源,测区已有测量情况,项目名称,施测目的和基本精度要求;
施测单位,施测起讫时间,技术依据,作业人员情况; 接收设备作业仪器类型与数量、精度、检验情况; 点位观测质量评价,埋石与重合点情况; 观测方法要点与补测、重测情况; 外业观测数据质量分析与野外数据检验情况 内业技术总结内容:
数据处理方案、所采用的软件、所采用的星历、起算数据、坐标系统,以及无约束、约束平差情况。误差检验及相关参数与平差结果的精度估计等。
上交成果中尚存在的问题和需要说明的其他问题、建议或改进意见 综合附表与附图
16、GPS数据预处理的目的是:①对数据进行平滑滤波检验,剔除粗差;②统一数据文件格式并将各类数据文件加工成标准化文件(如GPS卫星轨道方程的标准化,卫星时钟钟差标准化,观测值文件标准化等);③找出整周跳变点并修复观测值(整周跳变的修复见5.3.3);④对观测值进行各种模型改正。
17、Gps基线向量网平差有哪些类型:三维无约束平差法,二维约束平差,三维联合平差,二维联合平差
18、Gps信号接收机分类:按工作原理分为,码相关型接收机,平方型接收机,混合型接收机。按接收机用途分为:导航型接收机,测量型接收机,授时型接收机。按接收机接收的载波频率分为,单频接收机,双频接收机。按接收机的通道数分为,多通道接收机,序贯通道接收机,多路复用通道接收机
19、Gps信号接收机的工作原理:当GPS卫星在用户视界升起时,接收机能够捕获到按一不定期卫星高度截止角所选择的待测卫星,并能够跟踪这些卫星的运行;对所接收到的GPS信号,具有变换、放大和处理的功能,以便测量出GPS信号从卫星到接收天线的传播时间,解译出GPS卫星所发送的导航电文,实时地计算出测站的三维位置,甚至三维速度和时间。
第五篇:抽屉原理及其简单应用
抽屉原理及其应用
摘 要: 本文着重从抽屉的构造方法阐述抽屉原理,介绍了抽屉原理及其常见形式,并结合实例探讨了这一原理在高等数学和初等数论中的应用。关键词: 组合数学;抽屉原理;抽屉构造
1.引言
抽屉原理也叫鸽笼原理, 它是德国数学家狄利克雷(P.G.T.Dirichlet)首先提出来的, 因此也称作狄利克雷原理.它是数学中一个基本的原理,在数论和组合论中有着广泛的应用。在数学的学习研究中,我们也可以把它看作是一种重要的非常规解题方法,应用它能解决许多涉及存在性的数学问题。
2.抽屉原理的基本形式与构造
2.1基本形式
陈景林、阎满富编著的中国铁道出版社出版的《组合数学与图论》一书中对抽屉原理给出了比较具体的定义,概括起来主要有下面几种形式: 原理Ⅰ 把多于n个的元素按任一确定的方式分成n个集合,则一定有一个集合中含有两个或两个以上的元素。
原理Ⅱ 把m个元素任意放到n(mn)个集合里,则至少有一个集合里至少有k个元素,其中
m , 当n能整除m时,nkm 1 , 当n不能整除m时.n原理Ⅲ 把无穷个元素按任一确定的方式分成有穷个集合,则至少有一个集合中仍含无穷个元素。
2.2基本构造
利用抽屉原理解题过程中首先要注意指明什么是元素,什么是抽屉,元素进入抽屉的规则是什么,以及在同一个盒子中,所有元素具有的性质。构造抽屉是用抽屉原理解题的关键。有的题目运用一次抽屉原理就能解决,有的则需反复用多次;有些问题明显能用抽屉原理解决,但对于较复杂的问题则需经过一番剖析转化才能用抽屉原理解决。3.利用抽屉原理解题的常用方法
3.1利用划分数组构造抽屉
例1 在前12个自然数中任取七个数,那么, 一定存在两个数, 其中的一个数是另一个数的整数倍。
分析:若能把前12个自然数划分成六个集合, 即构成六个抽屉,使每个抽屉内的数或只有一个, 或任意的两个数, 其中的一个是另一个的整数倍,这样, 就可以由抽屉原理来推出结论。现在的问题是如何对这12个自然数:1,2 ,„,12 进行分组, 注意到一个自然数, 它要么是奇数, 要么是偶数。若是偶数, 我们总能把它表达为奇数与2k(k1,2,3...)的乘积的形式,这样, 如果允许上述乘积中的因子2k的指数K可以等于零, 则每一个自然数都可表达成“ 奇数2k”(k1,2,3...)的形式, 于是, 把1,2,3„,12个自然数用上述表达式进行表达, 并把式中“奇数” 部分相同的自然数作为一组, 构成一个抽屉。
证明: 把前12个自然数划分为如下六个抽屉:
A1={120,121,122,123} A2={320,321,322} A3={520,521} A4={720} A5={920} A6={1120} 显然, 上述六个抽屉内的任意两个抽屉无公共元素, 且A1+A2+...+A6={1,2,3,...,12}.于是,由抽屉原理得,对于前12个自然数不论以何种方式从其中取出七个数,必定存在两个数同在上述六个抽屉的某一个抽屉内。设x、y是这两个数,因为A4、A5、A6都是单元素集,因此,x、y不可能同在这三个抽屉中的任何一个抽屉内。可见,x、y必同在A1、A2、A3的三个抽屉中的某一个之内,这样x和y两个数中,较大的数必是较小数的整数倍。例2 学校组织1993名学生参观天安门,人民大会堂和历史博物馆,规定每人必须去一处,最多去两处参观。那么至少有多少学生参观的地方完全相同?
分析:我们可以把某学生参观某处记作“1”,没有去参观记作“0”。并用有序数组{a,b,c}表示学生去参观天安门、人民大会堂和历史博物馆的不同情况。因为规定每人必须去一处,最多去两处,所以参观的方式,只有下列六种可能:
{1、1、0} {1、0、1} {0、1、1} {1、0、0} {0、1、0} {0、0、1} 把这六种情况作为六个抽屉,根据抽屉原理,在1993名学生中,至少有(1993)+1=333人参观的地方相同。63.2利用余数构造抽屉
把所有整数按照除以某个自然数m的余数分为m类,叫做m的剩余类或同余类,用[0],[1],[2],„,[m1]表示。在研究与整除有关的问题时,常常用剩余类作为抽屉。
例3 对于任意的五个自然数,证明其中必有3 个数的和能被3 整除。
证明:任何数除以3 所得余数只能是0,1,2,不妨分别构造为3个抽屉:[0],[1],[2]
1、若这五个自然数除以3 后所得余数分别分布在这3 个抽屉中(即抽屉中分别为含有余数为0,1,2 的数),我们从这三个抽屉中各取1 个(如1到5中取3,4,5),其和(3+4+5=12)必能被3 整除。
2、若这5 个余数分布在其中的两个抽屉中,则其中必有一个抽屉,包含有3 个余数(抽屉原理),而这三个余数之和或为0,或为3,或为6,故所对应的3 个自然数之和是3 的倍数。
3、若这5 个余数分布在其中的一个抽屉中,很显然,必有3 个自然数之和能被3 整除。
3.3利用等分区间构造抽屉
所谓等分区间简单的说即是:如果在长度为1的区间内有多于n个的点,可考虑把区间n等分成n个子区间,这样由抽屉原理可知,一定有两点落在同一子
1区间,它们之间的距离不大于这种构造法常用于处理一些不等式的证明。
n例4 已知11个数x1,x2,,x11,全满足0xi1 ,i=1, 2 ,11,证明必有两个xi,xj(ij)满足xixj1.101.由抽屉原理,10证明:如图1,将实数轴上介于0与1那段(连同端点)等分为10小段(这10个小段也就是10个等分区间,即10个抽屉),每一小段长为
1111个点(数)中至少有+1=2个点落在同一条小线段上,这两点相应的数之差
10的绝对值 1.100
图1 对于给定了一定的长度或区间并要证明不等式的问题,我们常常采用等分区间的构造方法来构造抽屉,正如上面的例子,在等分区间的基础上我们便很方便的构造了抽屉,从而寻找到了证明不等式的一种非常特殊而又简易的方法,与通常的不等式的证明方法(构造函数法,移位相减法)相比,等分区间构造抽屉更简易,更容易被人接受。
3.4利用几何元素构造抽屉
在涉及到一个几何图形内有若干点时,常常是把图形巧妙地分割成适当的部分,然后用分割所得的小图形作抽屉。这种分割一般符合一个“分划”的定义,即抽屉间的元素既互不重复,也无遗漏;但有时根据解题需要,分割也可使得抽屉之间含有公共元素。
例5 如果直径为5的圆内有10个点,求证其中有某两点的距离小于2。分析:把圆等分成9个扇形而构造出9个抽屉,是最先考虑到的,但显然是不行的(虽然有两个点在某一扇形内,但不能确认它们之间的距离小于2)。转而考虑先用一个与已知圆同心,半径为1 的不包含边界的小圆作为一个抽屉,然后把圆环部分等分成八个部分,如图二所示,这样就构成了9个抽屉。
证明:先将圆分成八个全等的扇形,再在中间作一个直径d=1.8的圆(如图2),这就把已知的圆分成了9个区域(抽屉).由抽屉原理,圆内的10个点(球),必有两点落在同一区域内,只须证明每个区域中的两点的距离都小于2.显然,小圆内任两点间的距离小于2,又曲边扇形ABCD中,AB2,AD2,CD2,而任两点距离最大者AC,有
AC =OA2OC22OAOCcos45
=2.520.922.50.92=3.88<2.图2
3.5利用状态制构造抽屉
例6 设有六点,任意三点不共线,四点不共面,如果把这六个点两两用直线联系起来,并把这些直线涂以红色或者蓝色.求证:不论如何涂色,总可以找到三点,做成以它们为顶点的三角形,而这三角形三边涂有相同的颜色。
分析:设已知六点为A1,A2,A3,A4,A5,A6,由于任三点不共线,所以任三点均可作为某三角形的三个顶点。
证明:从六个点中任取一点A1,将A1与其余五点相连得到五条线段,线段如下所示: A1A2,A1A3,A1A4,A1A5,A1A6,这五条线段只有两种颜色即红色或者蓝色,由抽屉原理知,至少有三条涂有同一种颜色。颜色为抽屉,线段为元素,不妨设A1A2,A1A3,A1A4,涂有红色,这时我们考察△A2A3A4
(1)若△A2A3A4中有一条红色边,如A2A3,则△A1A2A3为三边同红的三角形;
(2)若△A2A3A4中无一条红色边,则△A2A3A4就是三边均为蓝色的三角形。4.抽屉原理的应用
4.1抽屉原理在高等数学中的应用
高等数学中一些问题抽象,复杂,解答比较困难,如果一些问题巧妙地运用抽屉原理会收到很好的效果,下列举例介绍抽屉原理在高等数学中的巧妙应用。
例7 设A为n阶方阵,证明:存在1in,使秩(Ai)=秩(Ai1)=秩(Ai2)
证明:因为n阶方阵的秩只能是0,1 , 2, ,n这n+1个一,由抽屉原理可知,存在k,l满EA0,A,A2,,An,An1,E的个数多于秩的个数,足1k 秩(Ak)= 秩(Al), 但 秩(Ak)秩(Ak1)„秩(Al), 所以 秩(Ak)=秩(Ak1), 利用此式与秩的性质得 秩(ABC)秩(AB)+秩(BC)-秩(B), 这里的A,B,C是任意三个可乘矩阵,用数学归纳法可证 秩(Akm)=秩(Akm1).其中m为非负整数,故命题的结论成立。 4.2抽屉原理在初等数论中的应用 例8(中国剩余定理)令m和n为两个互素的正整数,并令a和b为整数,且0am1以及0bn1,则存在一个正整数x,使得x 除以m 的余数是a,并且x 除以n 的余数为b,即x可以写成xpma的同时又可以写成xqnb的形式,这里p 和q 是整数。 (n1)ma,证明: 为了证明这个结论考虑n 个整数a,ma,2ma,„,这些整数中的每一个除以m都余a.设其中的两个除以n 有相同的余数r. 令这两个数为ima 和jma,其中存在两整数qi和qj,使得imaqinr及jmaqjnr,0ijn1.因此,这两个方程相减可得(ji)m(qjqi)n.于是n是(ji)m的一个因子. 由于n和m没有除1 之外的公因子,因此n是ji的因子. 然而,0ijn1意味着,0jin1,也就是说n 不可能是ji的因子. 该矛盾产生于我们的假设: n个整数a,ma,2ma,...,(n1)ma中有两个除以n会有相同的余数。 因此这n个数中的每一个数除以n 都有不同的余数。 根据抽屉原理,n个数0,1,„,n1 中的每一个作为余数都要出现,特别地,数b也是如此。令p 为整数,满足0pn1,且使数xpma 除以n余数为b. 则对于某个适当的q,有xqnb. 因此,xpma且xqnb,从而x具有所要求的性质。 5.结束语 本文对抽屉原理的常见形式及其应用结合实例做了一些探讨,为数学解题提供了一种简便的方法.应用抽屉原理解题的难点在于如何恰当的构造抽屉,而制造抽屉的办法是灵活多变的, 不能生搬硬套某个模式, 需要灵活运用。 参考文献 [1]陈景林,阎满富.组合数学与图论.北京:中国铁道出版社出版,2000.4-6 [2]曹汝成.组合数学.广州:华南理工大学出版社,2001.170-173 [3]钟颖.关于抽屉原理[J].成都教育学院学报,2003,17(7):75.[4]朱华伟,符开广.抽屉原理[J].数学通讯,2006,19(17):37.[5]忘向东,周士藩等.高等代数常用方法.山西:高校联合出版社,1989.64-66 [6]刘否南.华夏文集.太原:高校联合出版社,1995.88-90 [7]魏鸿增等.抽屉原理在高等数学中的应用.数学通报,1995,2.3-4 [8]严示健.抽屉原则及其它的一些应用.数学通报,1998,4.10-11 The Principle And Application Of The Drawer Liu Xiaoli Abstract: this article emphatically from the drawer methods of constructing this drawer principle, and introduces the drawer principle and common form, and combined with the discusses the principle in the higher mathematics elementary theory and the application.Keywords: combinatorial mathematics;drawer principle;theory of drawer structure