资源描述
CHANGZHOU INSTITUTE OF TECHNOLOGY题目:基于单片机的自行车里程表设计二级学院(直属学部): 延陵学院 专业: 电气工程及其自动化 班级: 10电Y3 学生姓名: 学号: 10124508 指导教师姓名: 范力旻 职称: 副教授 2013年12月30日至2014年1月10日目 录第1章 绪论21.1课题的背景21.2课题的主要任务及设计内容3第2章 总体方案的设计32.1任务分析与实现32.2 自行车里程表硬件方案设计42.3 自行车里程表软件方案设计4第3章 自行车里程表软件程序设计53.1 自行车里程表总体程序设计5第4章 自行车里程表软件子程序设计64.1 中断子程序设计64.2 延时程序84.3 按键扫描84.4 数据处理子程序设计94.5 显示子程序的设计114.6 存储芯片的选择13第5章 软件仿真145.1 Keil软件的使用145.2 Keil软件仿真14第6章 系统调试与分析166.1 调试故障及原因分析16第7章 总结16附录17参考文献17元器件清单18原理图20程序清单20实物图33第1章 绪论1.1课题的背景自行车被发明及使用到现在已有两百多年的历史,这两百年间人类在不断的尝试与研发过程中,将玩具式的木马车转换到今日各式新颖休闲运动自行车。我国是自行车大国,随着人们生活水平的不断提高,自行车已经不仅仅是运输、代步的工具,其辅助功能也变得越来越重要。因此,人们希望自行车的娱乐、休闲、锻炼的功能越来越多,能带来大家更多的健康与快乐。在这个背景下,自行车里程表作为自行车的一大辅助工具迅速发展起来。本次设计主要阐述一种基于霍尔元件的自行车里程表的设计。以 AT89S52 单片机为核心,A44E 霍尔传感器测转数,实现对自行车里程/速度的测量统计,采用 24C02 实现在系统掉电的时候保存里程信息,并能将自行车的里程数及速度用LCD实时显示。文章详细介绍了自行车里程表的硬件电路和软件设计。硬件部分利用霍尔元件将自行车每转一圈的脉冲数传入单片机系统,然后单片机系统将信号经过处理送显示。软件部分用C语言进行编程,采用模块化设计思想。1.2课题的主要任务及设计内容本文介绍的自行车里程表是以ATC89S52单片机为核心,用开关型霍尔传感器将到来的脉冲信号输入到单片机进行控制与计算,再采用LCD液晶屏进行显示,直观的显示给使用者,方便地实现了智能化、高精度、高可靠性、高效率的自行车里程表的设计,并且使用方便。本文主要介绍了自行车里程表的设计思想、方案论证等内容,整体上分为硬件部分设计和软件部分设计。首先对该课题进行任务分析,包括硬件和软件方案的设计,然后具体的介绍里程表的硬件设计(传感器的选择、单片机的选择、显示电路的设计),软件设计(单片机的选择、存储器的选择、中断子程序设计、数据处理子程序设计、显示子程序的设计),最后进行软件仿真,系统调试,然后分析解决问题,对这次设计进行总结。软件设计采用C语言编写,主要思想是自顶向下,模块化设计。第2章 总体方案的设计2.1任务分析与实现本设计的任务是:以ATC89S52单片机为处理核心,用传感器将车轮的转数转换为电脉冲,进行处理后送入单片机。里程及速度的测量,是经过ATC89S52测出总的脉冲数和转一圈所需的时间,再经过单片机的计算得出,其结果通过LCD显示屏显示出来。本系统总体思路如下:设计时,应综合考虑测速精度和系统反应时间。本设计采用的脉冲计数方法,用来计算速度具有较高的测速精度。在计算里程时取了自行车的理想状态。里程和速度传感器采用霍尔元件。自行车里程的测量是通过霍尔元件输出端的电压发生变化产生脉冲,通过计数器,根据脉冲数计算里程。自行车速度的测量是通过定时器测出车轮转一周所用的时间t,车轮周长L除以时间t就是自行车的速度。本次科研设计要求达到的各项指标和实现方法:1、用霍尔传感器产生脉冲信号,对脉冲信号进行计数,这个指标的实现是利用单片机自带的计数器T0对霍尔传感器脉冲信号进行计数的。2、对数据进行处理,用LCD显示里程总数和速度。这个功能的实现是利用编程软件,对数据进行处理得到需要的数值。最终本次课题需要实现的目标是:自行车里程表具有里程、速度测试与显示功能,采用单片机作控制,显示电路可显示里程及速度,可以通过按键设定报警速度,自行车超速,系统发出报警提示。通过不同按键复位及里程清零的功能,方便地实现了智能化、高精度、高可靠性、高效率的自行车里程表的设计。2.2 自行车里程表硬件方案设计自行车里程表的里程及速度设计,采用的是霍尔传感器进行检测。当自行车转过一圈时产生一个脉冲,根据脉冲数计算里程,然后计算自行车车轮转过一圈所需的时间,用总的里程除以时间即可得到速度。在设计的时候还要设计系统的输入部分(按键电路、存储电路等),输出部分(显示电路、报警等)。2.3 自行车里程表软件方案设计通过软件控制单片机的功能是单片机的主要特点和优点,程序的设计要考虑合理性和可读性,遵循模块化设计的原则,采用自顶向下的设计方法。模块化设计使程序的可读性好、修改及完善方便。软件设计包括主程序、中断子程序、延时程序、按键扫描、存储芯片的选择、数据处理子程序(分为里程子程序、速度子程序)、显示子程序。中断子程序是将传感器产生的信号接入计数器的T0口,然后计数器开始计数,当计数到一定数目后,计数器就产生溢出中断。数据处理子程序是将得到的车轮所转的圈数与实际要显示值之间有一定的对应关系,经过软件编程显示所需要的值。秒表计时子程序是采用计数器T0通过编程实现秒表计时工作。脉冲接收子程序是通过编程实现脉冲的计数,即对车轮所转的圈数计数。显示子程序是通过编程将数据处理的结果送给显示器显示。系统软件总体流程图如图2.3所示:初始化P3.2检测到中断计算速度计算里程显示里程显示速度开始YN图2.3 软件总体流程图第3章 自行车里程表软件程序设计 3.1 自行车里程表总体程序设计在整个设计过程中,软件设计必须与硬件设计紧密地结合在一起。软件部分设计是设计中最核心和最为主要的。基于霍尔传感器自行车里程表的软件设计包括计数子程序、计时子程序、LED显示子程序等几大部分。由于要实现很多功能,所以采用模块化设计,下面就其主要部分分别加以分析。在主程序模块中,需要完成对各接口芯片的初始化、自行车里程和速度的初始化、中断向量的设计以及开中断、循环等待等工作。另外,在主程序模块中还需要设置启动/清除标志寄存器、里程寄存器、速度寄存器,并对它们进行初始化。然后主程序将根据各标志寄存器的内容,分别完成启动、清除、计程和计速等不同的操作。P1.2和P1.3口分别指示报警。主程序流程图如图3.5所示。开始LCD、定时器初始化开中断脉冲接收数字处理显示信息结束键盘输入?NY键盘扫描NY图3.5 主程序流程图第4章 自行车里程表软件子程序设计4.1 中断子程序设计定时中断是为满足定时或计数的需要而设置的。为此在单片机内部有两个定时/计数器,以对其中的计数结构进行计数的方法,来实现定时或计数功能。当结构发生计数溢出时,即表明定时时间或计数值已满,这时就以计数溢出信号作为中断请求,去置位一个溢出标志,作为单片机接受中断请求的标志。这种中断请求是在单片机芯片内部发生的,因此无须在芯片上设置引入端。定时/计数器控制寄存器TCON是8位寄存器,地址为88H,可以按位寻址。其高4位用于定时/计数器中断控制,低4位借给外部中断,用做中断标志和触发方式选择位。TF0/TF1:定时器计数溢出标志位。可用于申请中断或供CPU查询。这里用作中断请求。(由硬件自动置位)。=0:定时器未溢出; =1:定时器溢出(由全“1”变成全“0”)时由硬件自动置位,申请中断, 中断被CPU响应后由硬件自动清零。TR0/TR1:定时器运行启停控制位(可由用户通过软件设置 )。 =0:定时器停止运行; =1:定时器启动运行。本设计采用定时中断,对自行车的里程和速度进行计数。自行车开始运行,定时器0为1,开始计时,当自行车转过一圈产生一个脉冲时,定时器溢出,外部中断0响应,此时由脉冲数和时间可以计算出里程和速度。中断程序流程图如图4.1所示。 图 4.1 中断程序流程图4.2 延时程序自行车里程表的设计中延时有按键延时(速度加、减、里程清0)、LCD显示延时、AT24C02存储的延时,本次设计的延时全部采用延时5ms。,程序编写时是采用延时1ms,然后调用5次。延时流程图如图4.2所示。4.3 按键扫描本次设计中的按键分为独立式按键和矩阵式按键,这里采用的是独立式按键。主要有速度加按键、速度减按键、里程清0按键,在运用按键的时候需要去抖来使系统运行更加稳定。去抖的方法有硬件去抖和软件去抖。这里采用的是软件去抖。这里去抖是分别在按下和松开后加一小段延时,当按键按下后在05ms内出现抖动,所以这里采用的延时时间是5ms。按键对应的接口如下:sbit KEY1=P35;/速度加按键sbit KEY2=P36;/速度减按键sbit KEY3=P37;/里程清0按键按键具体程序见附录。开始扫描键盘是否有键盘按下并判断键号延时去抖动YN再次判断相应键是否被按下加速子程序减速子程序里程清0子程序NY图4.2 延时流程图4.4 数据处理子程序设计自行车里程表里程、速度子程序设计定时器的初值的计算如下:在定时器模式下,计数器的计数脉冲来自于晶振脉冲的12分频信号,即对机器周期进行计数。选择12MHZ晶振,则定时器的计数频率为1MHZ。定时时间为1000ms,机器周期为1us,即12/晶振频率。X为定时器初值。则 X=(2n-T)/T1。方式0,n=13,方式1时,n=16,方式2和方式3,n=8TMOD=0X01;TH0=(65536-1000)/256;TH0=TL0=(65536-1000)%256;外中断0服务程序用于对单片机输入的圈脉冲进行计数,为十六进制计数器。60H为低位,62H为高位。每次计数一次后,对里程数据进行一次存储操作。当车轮每转一圈,通过霍尔元件将脉冲数输入单片机内,通过计数器计出脉冲数,再用乘法子程序算出里程数。设定自行车车轮周长为30mm,脉冲数为m,则总的里程数=0.030*m,在速度子程序的设计中,使用单片机的定时器T0,10ms计数一次,其初值X经计算得出,X=D8F0,即应将D8H送入TH0中,F0送入TL0中。具体的设计思路是:定时器T0每10ms中断一次,当中断次数达到100,即时间刚好为1秒的时候,调用脉冲接收子程序中当前的圈数变量,然后与设置好的自行车车轮周长相乘之后,再除以1s即为瞬时速度,每次计算完之后将此圈数变量置0。本次设计的报警采用声光报警。声音部分采用的是蜂鸣报警器,当自行车的速度超过预设的15km/h,L2灯亮,蜂鸣器报警。蜂鸣器是高电平有效,即当速度超过预设值时,蜂鸣器输入信号由0变为1,蜂鸣器开始工作。Led灯采用的是共阳极接法即低电平有效。当自行车的行驶速度低于15km/h时,此时L1接收到低电平(0),L1常亮,当速度超过预设的值时,L1的信号由低电平调为高电平(由0变为1),灯熄灭不亮,此时L2由高电平变为低电平(由1变为0),L2常亮报警,直到解除报警。里程处理子程序流程图如图4.3(a)所示,速度处理子程序流程图如图4.3(b)所示。 图4.3(a) 里程处理子程序流程图速度处理子程序开中断每10ms中断次数加1,计数为100?计算瞬时速度是否超速?报警关报警显示速度YY返回图4.3(b) 速度处理子程序流程图4.5 显示子程序的设计DDRAM显示数据RAM地址和屏幕的对应关系如表4.1所示。表4.1 DDRAM地址和显示位置的对应关系显示位置12345640DDRAM地址第一行00H01H02H03H04H05H27H第二行40H41H42H43H44H45H67H也就是说想要在LCD1602屏幕的第二行第一列显示一个M字,就要向DDRAM的40H地址写入“M”字的代码就行了。那就是向DDRAM的的40H地址写入“M”字的代码4DH。同样,在LCD模块上也固化了字模存储器,这就是CGROM和CGRAM。下图4.4说明了CGROM和CGRAM与字符的对应关系。图4.4 CGROM和CGRAM与字符的对应关系从上图可以看出,“M”字的对应上面高位代码为0100,对应左边低位代码为1101,合起来就是01001101,也就是4DH。LCD屏幕上显示一个字符的过程:初始化、写指令、写函数、在某个屏幕位置上显示一个字符、检查忙函数、延时函数。速度的显示运用程序定位到第一行第十列,找到显示对应的位置为09H,通过速度调节键设定输入速度为16km/h,所以要在09H中输入1,所以1对应的高位代码为0011,对应的地位代码为0001H,合起来是00110001,也就是1,然后光标右移一位(用程序实现),用同样的方法写出6.简而言之数据显示就是显示的时候先送要显示的地址,然后再送要显示的数据。显示程序流程图如图4.4所示。开始液晶初始化光标定位送显示数据显示结束图4.4 显示子程序流程图4.6 存储芯片的选择本次设计采用的储存芯片是24C02,AT24C02是一个2K位串行CMOS E2PROM, 内部含有256个8位字节,有一个专门的写保护功能,可以实现掉电存储。起始条件起始调教必须在所有操作命令之前发送。时钟线保持高电平期间,数据线电平从高到低跳变作为I2C总线的启动信号。CAT24Cxxx一直监视SDA和SCL电平信号,直到条件满足时才响应。停止条件时钟线保持高电平期间,数据线电平从低到高跳变作为I2C总线的停止信号。器件地址的约定主器件在发送启动命令后开始传送数据,主器件发送相应的从器件地址,8位从器件地址的高四位固定为1010,接下来的3位用来定义存储器的地址,最后一位为读写控制位,“1”表示对从器件进行读写操作,“0”表示写操作。在主器件发送启动命令和一字节从器件地址后,如果与从器件地址吻合,CAT24C02将发送一个应答信号,然后再根据读/写控制为进行读或写操作。应答信号每次数据传送成功后,接收器件将发送一个应答信号。当第九个时钟信号产生时,产生应答型号的器件将SDA下拉为低,通知已经接受到8位数据,接收到起始条件和从器件地址后,CAT24C02发送一个应答信号,如果为写操作,每接收到一个字节数据,CAT24C02发送一个应答信号。如果为读操作,CAT24C02发送一个字节数据后释放总线等待应答信号,一旦接收到应答信号,它将继续发发送数据,如果接收到主器件发送非应答信号,将结束数据传送等待停止条件。写操作在写字节模式下,助器件发送起始命令和从器件地址信息给从器件,在从器件响应应答信号后,主器件将要写入的数据地址发送到CAT24C02的地址指针,主器件收到从器件的应答信号后再送数据到相应的数据存储区地址,CAT24C02再响应一个应答信号,主器件产生一个停止信号,然后CAT24C02启动内部写周期,在内部写周期期间,CAT24C02不再响应主器件任何请求。写操作时序读如读操作CAT24C02读操作的初始化方式和写操作一样,仅把R/W位置1,读操作有三种方式:立即地址读、选择地址读、连续读。选择地址读操作时序图第5章 软件仿真5.1 Keil软件的使用 在keil中输入编写好的c语言程序,在编译运行没有的错误的情况下,在project中找到options for targettarget1在output选项中勾选create HEX file,即可生成.hex文件。5.2 Keil软件仿真主程序仿真图如图5.1所示图5.1 主程序仿真图LCD显示仿真如图5.2所示图5.2 LCD显示仿真图AT24C02仿真如图5.2所示图5.2 AT24C02仿真图第6章 系统调试与分析6.1 调试故障及原因分析这次的科研项目实训中,我主要负责自行车里程表的软件部分,所以我的调试主要侧重在软件的调试。首先查阅相关资料,在同学的帮助下完成C语言程序的编写。编写好程序后我利用keil软件进行编译调试。一开始由于平时C语言的书写习惯会出现很多语法和字符用错的问题,在软件的提示下一步步修改程序,直到程序没有错误。在C语言程序完成后,利用proteus仿真软件开始绘制仿真图,查找好所有型号的器件,并用线连接起来,然后用keil软件实现两者的联调。一开始会出现速度调节按钮无效的问题,在检查完线路没有问题后,开始查找程序的问题,在同学的帮助下终于找出程序问题所在,然后对程序进行修改,重新编译,重新调试,直到所有功能实现。第7章 总结经过这一段时间的努力最终按要求完成本设计,所完成的设计能实现任务要求的各项功能。对总体相应的软、硬件进行了设计、制作及调试,并贯穿至设计的全过程。本课题的主要任务是开发一个以AT89S52单片机为核心的自行车的速度里程表,主要由脉冲接收,LCD显示等模块组成。本设计主要分为硬件部分和软件部分,硬件部分着重考虑硬件电路的简单性,故尽可能简化硬件电路,节省线路板的空间,达到硬件电路最优化设计。软件采用C语言编写,采用模块化设计思想,程序可读性强。通过对程序的烧录、实验验证了系统的可行,能满足设计要求,达到设计的指标,实现对自行车里程/速度的计算功能,并用LCD液晶屏显示,功能性较强。这次科研实践让我对自己以后的毕业设计方面也有了更深的了解。这次实践,同学们也帮了我很大的忙,让我知道一个项目的完成不是一件容易的事情,团队合作还是比较重要的。附录参考文献1 ATMEL新型AT89S52系列单片机及其应用 清华大学出版社2 范力旻.单片机原理及应用技术.电子工业出版社3 楼然苗, 李光飞. 51系列单片机设计实例. 北京航空航天大学出版社, 20064 李朝青. 单片机原理及接口技术. 北京航空航天大学出版社, 19945张毅刚, 刘杰. MCS-51单片机原理及应用. 哈尔滨工业大学出版社,20046李勋, 刘源, 李静东. 单片机实用教程. 北京航空航天大学出版社, 2006元器件清单序号文字标号名称数量规格型号备注1R2、R3、R6电阻4102R1、R9-R10R14-R16、R23电阻71K3R17电阻14.7K4R13电组110K5Q1三极管185506C6、C8瓷片电容20.01uF103瓷片电容7U3霍尔元件1A44E8磁铁两个29D1、D2二极管2IN400710C10瓷片电容10.1uF103瓷片电容11C4瓷片电容1470uf12LS1蜂鸣器1GPC1407YB有源13L1、L2、L3发光二极管3SL-H302314C6、C8瓷片电容230pf15Y1晶振112M16Q10三极管1S855017B1电机1RF-300CA-0858518K2自锁按键1LCD-37AX537BX519R10电位器11K20K1、K3-K5按键4TD-03B21U2定时器1555芯片22P2插座2DIP23R2电位器11K24U1单片机1AT89S5225插座1DIP4026P1液晶显示屏1LCD160227U4PROM1AT24C02原理图程序清单#include#define uchar unsigned char#define uint unsigned intuint num=0; /外部中断次数uchar num1=0;uint Speed_dat=0;uint Total_Dis=0;uchar Beep_speed=40;sbit KEY1=P35;/速度加按键sbit KEY2=P36;/速度减按键sbit KEY3=P37;/里程清0按键void delayms(uint xms)uint i,j;for(i=xms;i0;i-)/xms延时子程序for(j=110;j0;j-);#includeLCD1602.H#includeAT24C02.Hvoid keyscan()if(!KEY1)delayms(5);if(!KEY1)if(Beep_speed0)Beep_speed-;while(!KEY2);else if(!KEY3)delayms(5);if(!KEY3)Write_AT24C02_Byte(0,0);Write_AT24C02_Byte(1,0);/里程清0Total_Dis=0;dis_Mileage();while(!KEY3);void main()uchar dat=0;float M_dat=0.0;init_1602();Init_AT24C02();dat=Read_AT24C02_Random(0);Total_Dis=dat*256+Read_AT24C02_Random(1);dis_Mileage();TMOD=0X01;TH0=(65536-1000)/256;TL0=(65536-1000)%256;ET0=1;TR0=1;IT0=1; /边沿触发中断EX0=1;EA=1;while(1)if(num199)num1=0;M_dat+=(float)(Cur_Speed/3.60);/每0.1s走的米数if(M_dat1000.0) /路程每增加100m储存一次M_dat-=1000.0;Total_Dis+=1;Write_AT24C02_Byte(0,Total_Dis/256);Write_AT24C02_Byte(1,Total_Dis%256);dis_Mileage();display();keyscan();void T0_time() interrupt 1 /定时器0TH0=(65536-1000)/256;TL0=(65536-1000)%256;if(num500)num+;elseSpeed_dat=0;if(num1100)num1+;void ex_0() interrupt 0 /外部中断0Speed_dat=(500/num); num=0;#define uchar unsigned char#define uint unsigned int sbit EN=P27;sbit RS=P25;sbit RW=P26;sbit BEEP=P20;sbit LED1=P12;/正常显示sbit LED2=P13;/报警uchar LCD1602_Table=0123456789;/LCD1602显示标尺 /0123456789abcdefuchar code DIS_TAB1= Speed:-Km/h ;/显示速度uchar code DIS_TAB2=M: Km-Km/h;/显示里程 uint sum_dat=0;uchar Cur_Speed=0;extern uint Speed_dat;extern uint Total_Dis;extern void delayms(uint xms);void WRITE_LCD1602_DAT(uchar date)EN=0;RS=1;/写数据P0=date;EN=0;delayms(5);EN=1;void WRITE_LCD1602_COM(uchar date)EN=0;RS=0;/写命令P0=date;EN=0;delayms(5);EN=1;void init_1602() unsigned char i;RW=0; WRITE_LCD1602_COM(0 x38);/设定使用8位总线、2行显示使用5X7字符,初始化WRITE_LCD1602_COM(0 x0c);/开显示,不显示光标WRITE_LCD1602_COM(0 x06); /地址加1,当写入数据的时候光标右移WRITE_LCD1602_COM(0 x01);/清屏WRITE_LCD1602_COM(0 x80); P0口的地址for(i=0;i16;i+)WRITE_LCD1602_DAT(DIS_TAB1i);WRITE_LCD1602_COM(0 x80+0 x40);/第一行、第二行显示for(i=0;i16;i+)WRITE_LCD1602_DAT(DIS_TAB2i);void display()static uint dat=0;static uchar i=0;if(i0)WRITE_LCD1602_DAT(LCD1602_Tabledat%1000/100);elseWRITE_LCD1602_DAT( );if(dat/100)WRITE_LCD1602_DAT(LCD1602_Tabledat%100/10);elseWRITE_LCD1602_DAT( );WRITE_LCD1602_DAT(LCD1602_Tabledat%10);WRITE_LCD1602_COM(0 x80+9+0 x40);if(Beep_speed/1000)WRITE_LCD1602_DAT(LCD1602_TableBeep_speed%1000/100);elseWRITE_LCD1602_DAT( );if(Beep_speed/100)WRITE_LCD1602_DAT(LCD1602_TableBeep_speed%100/10);elseWRITE_LCD1602_DAT( );WRITE_LCD1602_DAT(LCD1602_TableBeep_speed%10);if(datBeep_speed)if(i0)WRITE_LCD1602_DAT(LCD1602_TableTotal_Dis%10000/1000);elseWRITE_LCD1602_DAT( );if(Total_Dis/1000)WRITE_LCD1602_DAT(LCD1602_TableTotal_Dis%1000/100);elseWRITE_LCD1602_DAT( );WRITE_LCD1602_DAT(LCD1602_TableTotal_Dis%100/10);WRITE_LCD1602_DAT(.);WRITE_LCD1602_DAT(LCD1602_TableTotal_Dis%10);#include#defineAT24C02_OP_READ0 xa1/ AT24C02器件地址以及读取操作#defineAT24C02_OP_WRITE 0 xa0/ AT24C02器件地址以及写入操作/#defineAT24C02_MAX_ADDR 0 xff/ AT24C02最大地址/unsigned char code dis_code=0 x7e,0 xbd,0 xdb,0 x7e,0 xdb,0 xbd,0 x7e,0 xff;/ 写入到AT24C02的数据串sbit AT24C02_SDA=P11;sbit AT24C02_SCL=P10;/sbit AT24C02_WP=P33; /写保护 “=0”读写 “=1” 只读/*延时子程序*/void Delay_1ms(unsigned int xms) unsigned int i,j; for(i=xms;i0;i-) for(j=122;j0;j-);/*24C02初始化子程序*/void Init_AT24C02() AT24C02_SDA=1; /总线空闲时,因各设备都是集电极或漏极开路,上拉电阻使SDA和SCL线都保持高电平。/AT24C02_WP=1; AT24C02_SCL=1; _nop_(); _nop_(); _nop_(); _nop_();/*24C02起始信号子程序*/void AT24C02_Start()AT24C02_SDA=1;_nop_();_nop_();AT24C02_SCL=1;_nop_();_nop_();AT24C02_SDA=0;_nop_();_nop_();_nop_();_nop_();AT24C02_SCL=0;/*24C02停止信号子程序*/void AT24C02_Stop()AT24C02_SDA=0;_nop_();_nop_();AT24C02_SCL=1;_nop_();_nop_();_nop_();_nop_();AT24C02_SDA=1;_nop_();_nop_();/*24C02应答子程序*/void AT24C02_ACK()AT24C02_SDA=1;/ 读取应答_nop_();_nop_();AT24C02_SCL=1;_nop_();_nop_();_nop_();_nop_();while(AT24C02_SDA);/等待应答信号AT24C02_SCL=0;_nop_();_nop_();/*读出24C02数据子程序*/unsigned char Read_AT24C02_DATA()unsigned char i,read_data;for(i=0;i8;i+)AT24C02_SCL=1;_nop_();_nop_();_nop_();_nop_();read_data=1; /从高位到底位read_data|=(unsigned char)AT24C02_SDA;AT24C02_SCL=0;_nop_();_nop_();_nop_();_nop_();return(read_data);/*写入24C02数据子程序*/void Write_AT24C02_DATA(unsigned char write_data)unsigned char i;for(i=0;i8;i+)/ 循环移入8个位AT24C02_SDA=(bit)(write_data&0 x80);_nop_();AT24C02_SCL=1;_nop_();_nop_();AT24C02_SCL=0;write_data=1;/*字节写入24C02数据子程序*/void Write_AT24C02_Byte(unsigned char addr, unsigned char write_data) / 在指定地址addr处写入数据write_dataAT24C02_Start();/发起始命令Write_AT24C02_DATA(AT24C02_OP_WRITE);/从机地址写命令AT24C02_ACK();Write_AT24C02_DATA(addr); /发送AT24C02的字节地址AT24C02_ACK();Write_AT24C02_DATA(write_data); /发送数据到被寻址的存储单元AT24C02_ACK();AT24C02_Stop();/停止信号Delay_1ms(10);/延时等待AT24C02内部数据的擦写unsigned char Read_AT24C02_Current()/ 在当前地址读取unsigned char read_data;AT24C02_Start();Write_AT24C02_DATA(AT24C02_OP_READ);AT24C02_ACK();read_data = Read_AT24C02_DATA();AT24C02_Stop();return read_data;unsigned char Read_AT24C02_Random(unsigned char addr)/ 在指定地址读取AT24C02_Start();Write_AT24C02_DATA(AT24C02_OP_WRITE);AT24C02_ACK();Write_AT24C02_DATA(addr);AT24C02_ACK();return(Read_AT24C02_Current();实物图g an employment tribunal claimEmployment tribunals sort out disagreements between employers and employees.You may need to make a claim to an employment tribunal if: you dont agree with the disciplinary action your employer has taken against you your employer dismisses you and you think that you have been dismissed unfairly.For more information about dismissal and unfair dismissal, seeDismissal.You can make a claim to an employment tribunal, even if you haventappealedagainst the disciplinary action your employer has taken against you. However, if you win your case, the tribunal may reduce any compensation awarded to you as a result of your failure to appeal.Remember that in most cases you must make an application to an employment tribunal within three months of the date when the event you are complaining about happened. If your application is received after this time limit, the tribunal will not usually accept it.If you are worried about how the time limits apply to you, take advice from one of the organisations listed underFurther help.Employment tribunals are less formal than some other courts, but it is still a legal process and you will need to give evidence under an oath or affirmation.Most people find making a claim to an employment tribunal challenging. If you are thinking about making a claim to an employment tribunal, you should get help straight away from one of the organisations listed underFurther help.If you are being represented by a solicitor at the tribunal, they may ask you to sign an agreement where you pay their fee out of your compensation if you win the case. This is known as adamages-based agreement. In England and Wales, your solicitor cant charge you more than 35% of your compensation if you win the case.If you are thinking about signing up for a damages-based agreement, you should make sure youre clear about the terms of the agreement. It might be best to get advice from an experienced adviser, for example, at a Citizens Advice Bureau. To find your nearest CAB, including those that give advice by e-mail, click onnearest CAB.For more information about making a claim to an employment tribunal, seeEmployment tribunals.The (lack of) air up there Watch mCayman Islands-based Webb, the head of Fifas anti-racism taskforce, is in London for the Football Associations 150th anniversary celebrations and will attend Citys Premier League match at Chelsea on Sunday.I am going to be at the match tomorrow and I have asked to meet Yaya Toure, he told BBC Sport.For me its about how he felt and I would like to speak to him first to find out what his experience was.Uefa hasopened disciplinary proceedings against CSKAfor the racist behaviour of their fans duringCitys 2-1 win.Michel Platini, president of European footballs governing body, has also ordered an immediate investigation into the referees actions.CSKA said they were surprised and disappointed by Toures complaint. In a statement the Russian side added: We found no racist insults from fans of CSKA.Age has reached the end of the beginning of a word. May be guilty in his seems to passing a lot of different life became the appearance of the same day; May be back in the past, to oneself the paranoid weird belief disillusionment, these days, my mind has been very messy, in my mind constantly. Always feel oneself should go to do something, or write something. Twenty years of life trajectory deeply shallow, suddenly feel something, do it.一字开头的年龄已经到了尾声。或许是愧疚于自己似乎把转瞬即逝的很多个不同的日子过成了同一天的样子;或许是追溯过去,对自己那些近乎偏执的怪异信念的醒悟,这些天以来,思绪一直很凌乱,在脑海中不断纠缠。总觉得自己自己似乎应该去做点什么,或者写点什么。二十年的人生轨迹深深浅浅,突然就感觉到有些事情,非做不可了。The end of our life,
展开阅读全文