单片机实例分享,射频卡流量监控系统
回想以前,学校浴室的收费标准是1.5元/次,每次可以持续洗一个小时,但是很多人洗澡的时间并不是很长,根本用不了一个小时,于是浪费水的情况便时有出现。我经常看到有些同学在浴室里洗衣服,所以这样的收费方式有滋生学生浪费习惯的弊端。为此我想到了通过改进浴室管理方案,修改计费方式,从而遏制大学生的浪费行为,这个系统可先在饮水机上进行测试。
我所在学校使用的“一卡通”是一张 IC 卡,用它可以到图书馆借书、到食堂就餐,学校还能通过IC卡获得使用者的详细信息等。我设想也可以利用IC卡对淋浴流量管理,每秒或者每几秒读取一次流量器的数据,再经过计算然后扣费,如果某个同学一直开启喷头,那么他一卡通内的钱也会随着流量的增加被更多地扣除。
我们设计的射频卡进行流量计费管理的系统具有以下优点。(1)存储容量大。磁卡的存储容量大约在200个字符;IC卡的存储容量根据型号不同,小的有几百个字符,大的有上百万个字符。
(2)安全保密性好,不容易被复制,IC卡上的信息能够随意读取、修改、擦除,但都需要密码。
(3)IC卡具有数据处理能力。在与读卡器进行数据交换时,可对数据进行加密、解密,以确保交换数据的准确可靠;而磁卡则无此功能。
(4)使用寿命长,可以重复充值。
(5)IC卡具有防磁、防静电、防机械损坏和防化学破坏等能力,信息保存年限长,读写次数在数万次以上。
(6)IC卡能广泛应用于金融、电信、交通、商贸、社保、税收、医疗、保险等方面,几乎涵盖所有的公共事业领域。
设计思路
通过单片机对流量计、射频卡、电磁阀等实施控制。单片机会按照流量,对射频卡内的信息进行修改(修改余额信息,对其他信息无影响),单片机访问流量计的频率大约为3s访问一次,也就是,单片机每3s扫描一次流量计的数据,同时进行运算费用,然后修改射频卡内的信息(修改余额)。余额不足会通过12864液晶显示器显示。整个系统的设计框图如图19.1所示。
图19.1 整个系统同的设计框图
本系统的主控采用STC12C5A60S2单片机,该单片机是增强型51单片机,ROM高达61KB,运算速度是普通51单片机的8倍。STC12C5A60S2兼容51单片机的指令、引脚,而且该单片机具有A/D转换功能、高速低功耗、抗干扰等特点。电磁阀采用12V六分管通水电磁阀,直流持续式工作模式,工作压力在0.02~0.8MPa,介质温度在1~85℃。并且导体与非导体之间应能承受AC2500V电压,1min不击穿以及产生飞弧等现象。流量计采用六分管高精度水流量传感器,频率F=26×Q(Q表示流量,单位为L/min),内径3.0mm,流量范围0.5~5L/min。射频卡采用RFID读卡模块和EHUOYAN IC卡。
本系统的设计分为3个具体实施阶段。
第一个阶段,如图19.2所示,识别IC卡,读取IC卡信息,检查余额,满足条件后打开电磁阀,准备读取流量计数据。如果余额不足,则产生提示。
图19.2 第一阶段
射频卡相关知识
IC卡工作的基本原理是:射频读写器向IC卡发一组固定频率的电磁波,卡片内有一个LC串联谐振电路,其频率与读写器发射的频率相同,这样在电磁波激励下,LC谐振电路产生共振,从而使电容内有了电荷;在这个电容的另一端,接有一个单向导通的电子泵,将电容内的电荷送到另一个电容内存储,当所积累的电荷达到2V时,此电容可作为电源为其他电路提供工作电压,将卡内数据发射出去或接受读写器的数据。
IC卡的外形与磁卡相似,它与磁卡的区别在于数据存储的媒体不同。磁卡是通过卡上条的磁场变化来存储信息的,而IC卡是通过嵌入卡中的电擦式可编程只读存储器集成电路芯(EEPROM)来存储数据信息的。
作为电子货币的IC卡,其上记录有大量重要信息,安全性是很重要的,作为IC卡应用系统开发者必须为IC卡系统提供合理有效的安全措施,以保证IC卡及其应用系统的数据安全。影响IC卡及应用系统安全的主要方式有:使用用户丢失或被窃的IC卡,冒充合法用户进入应用系统,获得非法利益;用伪造的或空白卡非法复制数据,进入应用系统;使用系统外的IC卡读写设备,对合法卡上的数据进行修改,改变操作级别等;在IC卡交易过程中,用正常卡完成身份认证后,中途变换IC卡,从而使卡上存储的数据与系统中不一致;在IC卡读写操作中,对接口设备与IC卡通信时所作交换的信息流进行截听、修改,甚至插入非法信息,以获取非法利益,或破坏系统。常用的安全技术有:身份鉴别和IC卡合法性确认、指纹鉴别技术、数据加密通信技术等。这些技术采用可以保证IC卡的数据在存储和交易过程中的完整性、有效性和真实性,从而有效地防止对IC卡进行非法读写和修改。总体上,IC卡的安全包括物理安全和逻辑安全两方面。
物理安全包括:IC卡本身的物理特性上的安全性,通常指对一定程度的应力、化学、电气、静电作用的防范能力;对外来的物理攻击的抵抗能力,要求IC卡应能防止复制、窜改、伪造或截听等。常采用的措施有:采用高技术和昂贵的制造工艺,使之无法被伪造;在制造和发行过程中,一切参数严格保密;制作时在存储器外面加若干保护层,防止分析其中内容,即很难破译;在卡内安装监控程序,以防止处理器或存储器数据总线和地址总线的截听。
常用的逻辑安全措施有:存储器分区保护,一般将IC卡中存储器的数据分成3个基本区:公开区、工作区和保密区;用户鉴别,用户鉴别又叫个人身份鉴别,一般有验证用户个人识别PIN、生物鉴别。
卡片有着16个扇区,每个扇区包含4个数据块,每个数据块具有16byte的存储容量。扇区被定义为扇区0~扇区15,数据块被分为数据块0~数据块3,整个卡共有64个数据块。
每个扇区的密码和存取控制都是独立的,可以根据实际需要设定各自的密码及存取控制。存取控制为4个字节,共32位,扇区中的每个块(包括数据块和控制块)的存取条件是由密码和存取控制共同决定的。
第二个阶段,如图19.3所示,首先采集流量计数据,然后流量计产生的脉冲通过单片机计数。目前市场上常见的流量计是1L水共输出450个脉冲。1L水的质量是1kg,一个脉冲大概是2.2g水,利用单片机对脉冲数进行计数,每过一个脉冲扣除一定费用(单价×2.2即可)。实时监测IC卡内余额,如果余额不足,则触发单片机中断,等待关闭电磁阀,延迟1min后关闭电磁阀。
图19.3 第二阶段
第三阶段,如图19.4所示,监测IC卡状态,如果未识别到IC卡,则关闭电磁阀(防止使用者不关喷头直接拔卡)。
图19.4 第三阶段
制作过程
表19.1 制作所需材料
制作所需材料见表19.1,整个系统的电路图和PCB如图19.5所示。
图19.5 电路图和PCB图
PCB图是外加工的,需要注意的是,图中长方形白色框体是射频卡模块,尺寸可根据购买的射频卡模块尺寸进行修改。焊接电路板时,遵循“先贴片后插件,先低后高,先小后大”的原则,这样做会让你事半功倍,按照电路图焊接完成并通电之后的的系统可以进行简要的操作(见图19.6~图19.9)。
图19.6 驱动12864,没有用户,等待模式
图19.7 读到卡了,显示姓名、学号、钱包
图19.8 随着流量计脉冲个数增长,单片机进行计费,同时进行扣款操作,操作完毕显示当前余额
图19.9 用户移走卡,蜂鸣器长鸣一声,提示卡已移走
简单的测试之后,下位机就制作完成了,接下来就是进行上位机的编写,上位机(改变姓名、充值、初始化等操作依赖于模块)是用于改变射频卡信息的PC软件,我使用C#语言编写,第一次编写上位机软件,虽然界面很普通,但是功能还是比较完备的(见图19.10~图19.12)。
图19.10 没选择串口前所有的都是灰色表示不可操作
图19.11 选择串口后,按钮可操作更改框可以进行改写
此制作需要用到的射频卡通信设备(此设备需要和上位机搭配使用)如图19.13所示,设备上面黄色的纸是打印的,然后用双面胶贴上去,内部使用一个USB转TTL模块以及一个射频卡读写卡模块。
图19.12 单击读卡按钮后的显示
图19.13 此制作需要用到的的射频卡通信设备
程序部分
按照设计的流程图编写程序,由于程序过多,我不一一附上,只截取部分进行说明。下列程序是本制作要用到的命令数组、处理数组、显示数组等程序,也是上位机和下位机都需要的部分,需要注意的地方是,数组的个数和串口发送与接收命令的长度一定要搭配,否则会出错。比如某个命令的返回值的数组大小为10,如果我们在写串口中断处理函数的时候,没注意接收的个数,写成了9,那么处理函数会一直等待最后一个数,才满足跳出函数的条件,当然,你可以写个报错的函数,调试完成后关闭它。
//search card and get card serial number
uchar xdata ComSearchCard[5] = {0xAA,0xBB,0x02,0x20};// 寻卡,返回AA BB 06 20 92 BF 72 59 20
//read block No.x
uchar xdata ComReadBlock[13] = {0xAA, 0xBB, 0x0a, 0x21, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};// 读哪一块,第6位就是0x0几
//read block No.8
//uchar ComReadBlock6[13] = {0xAA, 0xBB, 0x0a, 0x21, 0x00, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
// write block No.8 with 0x01 to 0x0f
uchar xdata ComWriteBlock[29] = {0xAA, 0xBB, 0x1a, 0x22, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,//0xff 是密码
0x02, 0x00, 0x01, 0x01, 0x00, 0x07, 0x00, 0x01,//
0x04, 0x02, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00};// 要写的数据
//initialize block No.8 as a purse
uchar xdata ComIntiPurse[17] = {0xAA, 0xBB, 0x0e, 0x23, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0x00, 0x00};//初始化钱包。分区5为钱包
//read purse value of block No.5
uchar xdata ComReadPurse[13] = {0xAA,0xBB,0x0a, 0x24, 0x00, 0x05,0xff, 0xff, 0xff, 0xff, 0xff, 0xff};// 读取分区5的钱包 返回4字节的数据
// purse in block No.5 increase with value“2”
uchar xdata ComIncrPurse[17] = {0xAA,0xBB,0x0e, 0x25, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //增加钱包的余额
0x01, 0x00, 0x00, 0x00};//要增加的值
// purse in block No.5 decrease with value“1”
uchar xdata ComDecrPurse[17] = {0xAA,0xBB,0x0e, 0x26, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,//扣费
0x01, 0x00, 0x00, 0x00};//要减少的值
提取数据的数组:
uchar xdata user_block8[12]={0}; //学号(8位)
uchar xdata user_card[4]={0}; //卡号
uchar xdata user_cash[4]={0}; //现金
uchar xdata user_name[6]={0}; //姓名
程序中有一个举足轻重的“指令选择”函数,由于程序太长,就不附上,有兴趣的朋友可以到我的QQ群下载。这个函数是一个带返回值的函数,整个系统的命令都由这个函数发出。下面的解释一目了然,以后如果需要升级本系统,在这个函数内部添加命令即可。
指令选择入口函数:
输入:j 1~8
输出:1或0
功能概述:
a. 确认返回数组的正确性(数组最后一个数据的异或校验以及数组的长度)。
b. 序号说明:
(1)寻卡,返回射频卡序列号;
(2)读取某个模块的值,返回16位数值;
(3)写某个模块,返回成功命令;
(4)初始化钱包,即定义制定射频卡分区为钱包返回成功命令;
(5)读取钱包的值;
(6)增加钱包的值;
(7)减少钱包的值;
(8)返回增加、减少后钱包的值。
由于这个制作的初步设想是在学校里使用的,因此价格基本稳定,就没有给管理员权限使用输入设备更改资费。更改资费需要改动源代码,当然,做成产品肯定需要设计输入设备,由于本次制作的用户就是我,所以就简化了。
更改资费的程序段如下:
EX0 = 0;
countflag = 0;//脉冲标志清零
feetemp = 0x01;//这里是扣的金额
feecount = feecount + feetemp;//计算使用总额,需要显示也可以显示的
ComDecrPurse[12] = feetemp;//写入扣钱金额
j = Command_choic(7);//100个脉冲减少一分钱
关于脉冲个数与消费金额关系的问题,在外部中断里去修改一下就好了,建议大家使用宏定义,直接在顶部修改。
count++;
if (count == 1) //这里更改脉冲个数
{
countflag = 1;
count = 0;
}
注:之所以使用双串口单片机是有原因的,因为一边要和模块通信,一边要打印出来数据观察是否正确,所以要使用两个串口,当然,此制作我用串口2与模块通信,这也是为什么用12C5A60S2的原因。
流量管理系统制作好了,现在就试着将它搭建到饮水机上进行测试。总的来说,就是先断开饮水机的水管,把电磁阀和流量计串连进去,再连接上即可。但连接的时候需要用一些胶布,以防止漏水,并避免饮水机发生漏电危险。
总结
此制作的射频卡读取模块,使用的是串口协议,它的所有命令都是以“AA BB”开头,最后一位数据是前面除开头以外的异或结果,串口收数据的时候本来就不知道收多长,这个版本的模块没有解决这个问题。例如,寻卡的命令是“AA BB 02 20 22”,“AA BB”为开头,22是前面02和20的异或结果。因此推荐大家使用其他协议,其他协议可以自己规定头和尾,检测的时候非常方便,当然也纯属个人意见。
单片机实例分享,反射式红外测速仪DIY
常用的测速方法
常用的测速传感器可输出脉冲信号,只要通过频率电压或电流转换就能与电压、电流输入型的指针表和数字表匹配。频率电流转换的方法有阻容积分法、电荷泵法和专用集成电路法,前两种方法在磁电转速仪中也有运用。专用集成电路大多数是阻容积分法、电荷泵法的综合。目前,常用的专用集成电路有LM331、AD654和VF32等,转换精度在0.1%以上;但在低频时,这种转换就无能为力。采用单片机或FPGA做F/D和D/A转换,转换精度在0.5%~0.05%,量程从0~2Hz到0~20kHz,频率低于10Hz时反映时间也会变长。
在显示精度、可靠性、成本和使用灵活性上有一定要求时,就可直接采用脉冲频率运算型测速仪。频率运算方法有定时计数法(测频法)、定数计时法(测周法)和同步计数计时法。测频法在测量上有±1的误差,低速时误差较大。测周法也有±1个时间单位的误差,在高速时,误差也很大。同步计数计时法综合了上述两种方法的优点,在整个测量范围都达到了很高的精度,万分之五以上精度的测量转速仪表基本都采用同步计数计时法。
反射式红外测速仪的设计
这里我们介绍一款实用的反射式红外测速仪的设计与制作。
反射式红外测速仪在测量物体运转速度时,首先向被测物体发射出红外线脉冲,利用被测物体表面的反射能力(可在被测物体表面粘贴白色的反射纸等),使红外接收器收到光脉冲信号,然后通过光电转换电路将光脉冲信号转变为电脉冲信号,电脉冲信号通过放大和处理后,输入到单片机的计数控制门,与内部的标准表秒脉冲信号相比较,经运算后,通过显示器将被测物体运动的旋转速度显示出来。
红外探头的测量距离根据实际需要,可设计成近距离和远距离两类。近距离的探头可采用小功率发光管和光敏受光管。如果是远距离的测量,探头就可采用中、大功率的发光二极管或者是合适的激光二极管。
1.系统设计方案
图26.1为反射式红外测速仪的系统构成方框图,由单片机控制器、38kHz载频振荡器、红外线发射/接收电路、8×2点阵字符型液晶屏及工作电源等组成。
图26.1 反射式红外测速仪的系统构成方框图
2.转速测试原理
转速测试原理见图26.2。进入测试状态后,38kHz的载频振荡器起振工作,驱动红外发射管向外发射红外载频信号。单片机首先检测信号的边沿,当一个脉冲的下降沿到来时(图中A点),计数器开始对脉冲计数,同时,单片机还启动定时器进行测试计时。当定时器计时到1000ms时(图中B点),单片机发出一个准备结束本次测试的信号,这时程序又开始检测信号的下降沿,当下降沿到来时(图中C点),单片机对脉冲的计数cnt及对测试时间的计时time完成。此时根据公式:转速=(cnt/time)×60000即可算出此时的转速。当计时到1300ms时(图中D点),单片机输出显示,将测得的转速显示到液晶屏上。此次测试、显示完成后,又进入下一次的测试、显示,周而复始。
图26.2 转速测试原理
测速仪常用于电机、电扇、纸张、塑料、化纤、洗衣机、汽车、飞机、轮船等制造业中。依据对转速检测原理的不同,测速仪可分为以下几种类型。
离心式测速仪:利用离心力与拉力的平衡来检测转速,是最传统的机械式测速工具,测量精度一般在1~2级。
磁性测速仪:利用旋转磁场,在金属罩帽上产生旋转力,通过旋转力与游丝力的平衡来检测转速。
电动式测速仪:电动式测速仪由小型交流发电机、电缆、电动机和磁性表头组成。磁性表头与小型交流电动机同轴连接在一起,小型交流发电机产生交流电,交流电通过电缆输送,并驱动小型交流电动机,小型交流电动机的转速与被测轴的转速一致,磁性表头指示的转速自然就是被测轴的转速。
闪光式测速仪:闪光式测速仪可发出频率可调的脉冲闪光,利用人眼视觉暂留的原理对转动物体进行测速。除了检测转速(往复速度)外,还可以观测循环往复运动物体的静像。
电子式测速仪:电子式测速仪是以现代电子技术及计算机技术为基础而设计的,一般有传感器和显示器,有的还有信号输出和控制。
3.电路设计
反射式红外测速仪的电路如图26.3所示。单片机选择Atmel公司的ATmega48,负责整个测试系统的运行。IC2及阻容元件组成了38kHz的载频振荡器,其载频经VT1放大后驱动红外发射管IR向外发射红外线。IC4为38kHz的一体化红外接收头,它负责红外线的接收、放大及解调,它将解调出的脉冲信号送入单片机进行计数处理。IC5为液晶显示模块,使用了8×2的点阵字符型液晶屏(带背光),形体较小,用于显示测试得到的转速。
图26.3 反射式红外测速仪电路图
整机供电使用9V积层单池,经稳压器IC5稳定为5V后,供单片机工作。笔者实际制作的发射、接收组件如图26.4所示,使用热熔胶固定。制作完成的样机上的液晶屏、电源开关及按键如图26.5所示,按键SB目前没有使用,作为备用,整机照片如图26.6所示。
图26.4 发射、接收组件
图26.5 液晶屏及控制按键
图26.6 反射式红外测速仪整机照片
主函数
void main(void)//主函数
{
uchar temp;//定义单字节无符号局部变量
float count,time,x;//定义浮点型局部变量
Delay_nms(400);//延时400ms,等待电源稳定
init_devices();//初始化单片机
InitLcd();//初始化液晶模块
display1();//液晶屏显示欢迎界面
Delay_nms(2000);//等待2s
display2();//液晶屏显示工作界面
DisFlag=1;//测速显示标志置1
while(1)//无限循环
{
WDR();//看门狗喂狗指令
if(DisFlag==1)//如果测速显示标志为1
{
time=(float)tx;//整数转成浮点数
count=(float)cx;
x=count/time;x=x*30000;//数学计算
DisVal=(uint)x;
/******将测得的4位转速值存放于显示缓冲区*******/
disx[3]=(DisVal/1000)%10;
disx[2]=(DisVal/100)%10;
disx[1]=(DisVal%100)/10;
disx[0]=DisVal%10;
/**********在液晶屏上显示转速值*********/
DisplayOneChar(4,1,disx[3]+0x30);
DisplayOneChar(5,1,disx[2]+0x30);
DisplayOneChar(6,1,disx[1]+0x30);
DisplayOneChar(7,1,disx[0]+0x30);
/**此次显示完成后,相关变量初始化,准备进入下一次的测试**/
DisFlag=0;WorkTime=0;
DisTime=0;
EndFlag=0;Start=0;cnt=0;
}
else//否则如果测速显示标志为0则进行脉冲取样
{
do{
temp=PIND&0x04;WDR();JS=1;//等待下降沿后下一次测试
if(Counter>1500)
{Counter=0;JS=0;DisFlag=1;cx=0;goto END;}
}while(temp==0x04);
BeginFlag=1;Start=1;GICR=0x40;
//重开INT0中断
END:;
}
}
}
4.软件设计
程序主要分为主控程序、液晶屏驱动程序和头文件三大部分,这样设计速度快、结构完善,并且也便于整个程序的装配。程序使用ICC7.14C集成开发环境编译。限于篇幅,这里仅介绍一下主函数,完整程序可以到QQ群下载。
调试与应用
本机唯一需要调整的是红外发射电路的38kHz载频,它关系到红外测速仪的使用灵敏度及可靠性。整机检查无误后通电,用一个10kΩ的多圈可调电位器代替R6,用示波器或频率计测R7电阻的任一端,细调电位器,使频率为38.000kHz,越准确越好。调好后,取下电位器,测出其阻值,用一个同阻值的固定电阻代替电位器,焊在R6位置。整机其他部分全是数字信号处理,因此只要器件良好,就无需调整了。
红外发射管需要套一个直径5mm的黑色热塑套管,并且与红外接收头稍微隔开一点距离安装,防止发射出的红外光直接进入红外接收头。当然也不能离开太远,以免降低接收灵敏度。
相关问答
单片机 中定义 flag 有啥作用flag=1和flag=0都是什么意思?以下为我建议的方案。首先按键控制LED这样的代码例程比比皆是,无序赘述,在这边外加一个松手检测的代码应该也不难。定义一个标志位flag,如果flag=0为按下检...
急!(51 单片机 ) 主函数前面定义的这句bit flag ;是什么意思?怎么用的?就是定义的一个标志位。跟你平时定义的变量性质是一样的。只是这个变量的类型比较特殊,是bit型的,也就是说,它的取值只能是0或1.通常用来做为标志。就是定义...
求详细解释这个51 单片机 PWM波原理初学者,求逐步详解.#includ...[最佳回答]t去给定时器赋值初始化,然后开启定时器,定义一个标志位flag,根据flag的状态决定输出高平还是低电平,假设定义flag=1的时候输出高电平,用一个变量去...
请问 单片机 怎么用独立按键按一下实现一个功能,按另一个按键实现另一个功能,这个代码要怎么写啊?如果这两个功能都是一个死循环,可以考虑用中断,这样就不必在两个独立的功能中插入按键检测了while(1){while(flag==1){死循环1}while(flag==2){死循环2}}....
51 单片机 定时闹铃(c语言) - R6OWXQ1Id 的回答 - 懂得我来发一个C语言51单片机2113时钟程序,希望5261能帮到你/*程序功能:带定时闹4102铃时钟*//*----------------------------------------------...
【如何利用 单片机 和传感器信号控制步进电机的转停?我现在的...[最佳回答]请详细阐述这几个脚的作用,你的电机需要什么样子的驱动波形?sbitclock=P1^0;//CLOCK产生时钟信号sbitenable=P1^1;//ENABLE使能sbithalf...
用51 单片机 写一个简单的脉冲计数程序-ZOL问答bitflag=0;voidext0()interrupt0{pnum++;}voidt0isr()interrupt1{TH0=(65536-50000)/256;TL...
老司机们能告诉我: 单片机 (秒表制作)?,制作 单片机 xxx如何??[回答]有了解过一点,上次跟朋友一起吃饭的时候提到过,正好我们也需要他们的产品。单片机是指一个集成在一块芯片上的完整计算机系统。尽管他的大部分功能...
51 单片机 程序中如何接收信号的?在51单片机程序中,可以通过串口通信来接收外部信号。以下是一些常用的方法:1.使用串口接收函数:在程序中使用串口接收函数(例如USART_Receive())来读取串...
51 单片机 如何用外部中断来停止定时器的工作,然后再用此中断程序来实现中断返回?利用一个变量做标志来做处理,外部中断出发后将这个标志置1,然后在主函数里面判断这个变量,如果标志为1,那么TR0或者TR1就等于1(运行定时器),再次出发外部...