四川师范大学成都学院电子工程学院课程设计报告
前 言
汽车工业是国民经济发展的支柱产业之一,现代汽车正从一种单纯的交通工具朝着满足人们需求、安全、节能和环保的方向发展。为了满足人们对汽车日益提高的要求,汽车研发及生产机构必然要将越来越多的电子产品引入到汽车上,智能控制系统也成为汽车革新的主要内容。
雨刮器属汽车附件,是汽车安全行驶的重要部件,用于消除挡风玻璃、后窗玻璃及大灯玻璃上的雨雪、灰尘和水泥等,以保证玻璃透明清晰。
第一个发明电动刮水器的是德国博世公司,博世将它作为“博世最年幼的产品”加入到博世的产品家族。自那以后,这个婴儿逐渐成长,从单纯的刮片发展到二十一世纪初的风窗玻璃之星——无支架的刮水器。在汽车的驾驶史上,对风窗玻璃的清洁问题解决开始得比较晚。汽车从只有平添驾驶发展到成为全天候的驾驶。技术变化最大是在二战以后伴随着大规模机械的出现。风窗玻璃洗涤器、间歇开关、后窗刮水器和可加热喷水器保证了驾驶时的视野清晰与行车安全。伴随着其他一些技术革新,比如雨滴传感器、可变位刮水臂、刮水器的出现,就更扩大了刮拭的范围,刮水器成为了一个复杂的系统。
目前传感器在汽车上的应用已经相当广泛,汽车传感器作为汽车电子控制系统的信息源,是汽车电子控制系统的关键部件,也是汽车电子技术领域研究的核心内容之一。在对于汽车雨刮器的研究上,智能雨滴传感器自然成了智能刮水器系统的重要组成部分。智能化传感器是具有智能功能的高档传感器,它具有检测、信息处理功能、自动进行各种误差补偿、精度高、量程覆盖范围大、稳定性好、输出信号大、信噪比高、传输中抗干扰性能好,可远距离输送信号,有的还带有自检功能。在汽车智能雨刮系统中由于两个雨刮电机的转速不可能完全一样,就存在两个雨刮摆动不同步的问题。本文在分析了模糊控制理论及雨刮同步摆动规则的基础上,提出了一种基于模糊控制的汽车智能雨刮系统。该系统将转速偏差和转速偏差变化量模糊化为模糊控制器的输入语言变量,根据所制定的一套模糊控制规则来选择控制PWM的输出语言变量,并以此通过脉宽调制技术来驱动直流电机,使两个雨刮同步摆动。光源发射器将红外光以固定角度投射到挡风玻璃上,经由挡风玻璃棱镜反射回到红外线接收器;在挡风玻璃清晰的情况下,红外接收器收到的红外线总量与红外线发射器发出的红外线总量基本相等。当有雨滴落在挡风玻璃上时,部分红外线会因雨滴的折射而分散到外部,导致红外接收器接收到的红外线总量小于发射器发出的红外线总量。通过对红外线总量的检测,判断雨量的大小,进而发出刮水请求到雨刷控制器,完成不同档位的刮水行为。
1
四川师范大学成都学院电子工程学院课程设计报告
1.总体设计方案
1.1 雨刮器要求
a) 雨量检测
b) 利用单片机检测雨刷故障(检测电流等)
c) 喷水电机、雨刮器电机转速PWM控制(实现间歇、快速1、快速2、点动等控制) d) 通过检测雨量构成自适应控制 e) 刮水器关闭,刮片自动返回初始位置 f) 刮片要具有耐久性
g) 雨滴检测雨刮器,将雨滴传感器检出的雨量变成电信号,根据电信号的大小,控制刮
雨器动作。
1.2 雨刮器方案
本设计中的雨滴传感器选用红外雨滴传感器,属于光量变化原理雨滴传感器的一种由光(本设计中选用红外线)发射元件发射出的红外光以全反射角度在挡风玻璃的外表面反射,其角度必须在42°(玻璃-水)和63°(玻璃-空气)之间。如果在挡风玻璃上有雨雨量越大,反射回来的光越多。从发射元件发出的光反射到接收装置的挡风玻璃区域被称之为传感器的“敏感区域”,仅当雨水滴到这个区域时,才可以被探测出来。为使系统灵敏可靠,挡风玻璃区域和灵敏区域之间必须要有一个较好的比例[1]。雨滴传感器的原理图,如图1所示。
[6]
图1 雨滴传感器原理图
2
四川师范大学成都学院电子工程学院课程设计报告
2.系统功能
本雨刮器可以实现以下的具体功能
a) 具有高速和低速两个档位的雨刮电机来同时控制两个雨刮,雨刮器不工作时,两个雨
刮都停在风挡玻璃的左侧位置,即雨刮电机复位位置。
b) 两电极复位端的时间偏差E及偏差变化为输入变量,PWM脉宽调制信号占空比增量U
为输出量。
c) 消除系统稳态误差的性能比较差,尤其在变量分级不够多的情况下,还可能会在平衡
点附件产生小幅震荡。
d) 可以在控制过程中采用改变量化因子和比例因子的方法,来调整整个控制过程中不同
阶段上的控制特性,使其对复杂过程控制收到良好的控制效果。这种形式的控制器称为自调整比例因子模糊控制器 e) 能够测出雨刮器的耐久性
f) 求系统给定值与反馈值的误差e。微机通过采样获得系统被控量的精确值,然后将其
与给定值比较,得到系统的误差。
3
四川师范大学成都学院电子工程学院课程设计报告
3.系统设计
3.1原理图设计
根据要求,雨刮控制电路设计可分为几个模块:故障检测电路、雨量检测电路、电机驱动电路、雨刮工作模式显示电路以及电路设计中的复位电路和时钟电路两个基本模块下面,具体介绍各模块电路的设计原理。
单片机在启动时都需要复位,以使CPU及系统各部件处于确定的初始状态,并从初态开始工作。ST89C52单片机的复位信号是从RST引脚输入到芯片内的施密特触发器中的。当系统处于正常工作状态时,且振荡器稳定后,如果RST引脚上有一个高电平并维持2个机器周期(24个振荡周期)以上,则CPU就可以响应并将系统复位。单片机系统的复位方式有:手动按钮复位和上电复位。本设计中复位电路采用手动按钮复位方式。
手动按钮复位需要人为在复位输入端RST上加入高电平(图一)。一般采用的办法是在RST端和正电源Vcc之间接一个按钮。当人为按下按钮时,则Vcc的+5V电平就会直接加到RST端。手动按钮复位的电路如所示。由于人的动作再快也会使按钮保持接通达数十毫秒,所以,完全能够满足复位的时间要求。单片机在启动时都需要复位,以使CPU及系统各部件处于确定的初始状态,并从初态开始工作
[12]
。
图2 单片机复位电路
3.2雨刷故障检测电路
在雨刷工作状态中,最常见的故障便是雨刷电机堵转。当电机出现堵转现象时,流过电机线圈电流会急剧上升,如果堵转现象不能得到及时解决可能会导致电机线圈烧毁。具体解决方法如下:
在电机与接地之间连接一个小电阻,将比较器的正端给定略大于电机正常运行时小电
4
四川师范大学成都学院电子工程学院课程设计报告
阻两端的电压值,而比较器负端则接在小电阻的高电位上。
电机正常运行情况下,电阻的端电压较小,比较器正端电压会大于或等于负端电压而当电机堵转时,由于电流急剧上升,所接小电阻端电压急剧变大,从而导致比较器正端电压小于负端电压的现象出现。我们利用比较器的特性,通过比较器的正负端电压来判断电机是否出现堵转故障:若在一定时间内,比较器正端电压与负端电压相差不大,则表明电机正常运转;若在一定时间内,比较器正端电压低于负端电压, 见下图。
[3]
图3 雨刷故障检测电路
3.2.1雨量检测电路
在自动雨刷系统中,控制器通过雨量检测装置检测降雨量大小,进而控制雨刷器摆动速度。此次设计采用红外式雨量检测装置。
3.2.2红外雨量监测装置工作原理
雨量检测装置由玻璃棱镜、红外线光源发射器和红外线光源接收器等部件组成。红外线光源发射器将红外光以固定角度投射到挡风玻璃上,经由挡风玻璃、棱镜反射回到红外线接收器;在挡风玻璃清晰的情况下,红外接收器收到的红外线总量与红外线发射器发出的红外线总量基本相等。当有雨滴落在挡风玻璃上时,部分红外线会因雨滴的折射而分散到外部,导致红外接收器接收到的红外线总量小于发射器发出的红外线总量。通过对红外线总量的检测,判断雨量的大小,进而发出刮水请求到雨刷控制器,完成不同档位的刮水行为
[20]
。原理图见图4。
5
四川师范大学成都学院电子工程学院课程设计报告
图4 雨量检测原理图
3.2.3 红外发送电路
雨量检测的发送装置采用的是红外发射二极管(TSAL6200),它将周期的电信号转变成一定频率的红外信号。如果给红外发射端提供频率为38KHZ的方波信号,那么发射端就会发射出相应频率的红外信号。
3.2.4 红外接收电路
HS0038B是一种能够接收红外信号的小型接收器件,不需要加红外过滤装置。当HS0038B在没有接收到红外光时,输出端处于高电平;当接收端有红外光输入时,输出端为低电平。
实际应用中,由于雨量大小的不同,实际应用中,由于雨量大小的不同,玻璃的反射率就会有所不同,红外光的反射数量也就不同,红外光接收器输出地脉冲频率也会有相应的变化。通过单片机的P2.6管脚的捕捉功能,连续捕捉脉冲的两个上升沿,算出脉冲频率值,通过处理就能得到雨量大小变化。
玻璃的反射率就会有所不同,红外光的反射数量也就不同,红外光接收器输出地脉冲频率也会有相应的变化。通过单片机的P2.6管脚的捕捉功能,连续捕捉脉冲的两个上升沿,算出脉冲频率值,通过处理就能得到雨量大小变化。
3.2.5 电机驱动电路
电机驱动电路中,由单片机输出一定频率的脉冲,通过三极管驱动继电器工作,当继电器闭合时,直流电机两端承受正向电压,电机启动。为了保护继电器,我们在继电器两
6
四川师范大学成都学院电子工程学院课程设计报告
端并联一个反向二极管,起到续流的作用
[13]
,电路图如下。
图5 电机驱动电路
3.3雨刮器工作模式显示
雨刮工作模式显示由单片机和数码管共同完成,雨刮工作时,单片机将判断雨刮出于何种工作模式,并有由单片机P0口各引脚和P1口的低四位输出对应的高低电平,控制数码管显示
[12]
,电路连接如下。
图6 工作模式显示
7
四川师范大学成都学院电子工程学院课程设计报告
3.4雨刮控制电路原理图
图7 雨刮控制电路原理图
3.5仿真图设计
仿真图如下图:
图8 雨刮控制仿真图
8
四川师范大学成都学院电子工程学院课程设计报告
3.6制程序编写
图9 程序流程图
9
四川师范大学成都学院电子工程学院课程设计报告
4.设计总结
紧张的课程设计即将结束了,这期间让我学到了许多知识,让我懂得了对待科学要严谨、认真的道理。这将是我在今后工作学习中的一笔宝贵财富。
本文在查阅了大量文献的基础上,结合实际应用问题,对智能雨刮系统进行了研究目前的雨刮系统大多是机械连杆结构的,采用雨滴感应式的智能雨刮系统只是在少数高级轿车上有应用,因为目前使用的光电雨滴传感器大都是由国外厂商一统天下,因而,价格比较昂贵,很难普及。本文所研究的红外雨滴传感器及智能雨刮系统,由于成本低廉,性能稳定,可靠性高,易于在大客车和低档轿车上普及应用,有广泛的市场应用前景。关于红外雨滴传感器及模糊控制器的设计,还有一些特殊情况未在本文所研究之内,仍有待进一步研究。
在汽车智能雨刮系统中由于两个雨刮电机的转速不可能完全一样,就存在两个雨刮摆动不同步的问题。本文在分析了模糊控制理论及雨刮同步摆动规则的基础上,提出了一种基于模糊控制的汽车智能雨刮系统。该系统将转速偏差和转速偏差变化量模糊化为模糊控制器的输入语言变量,根据所制定的一套模糊控制规则来选择控制PWM的输出语言变量并以此通过脉宽调制技术来驱动直流电机,使两个雨刮同步摆动。
课程设计是对我们大学三年学习生活的实践和总结。让我们把学会把理论运用到实际中。整个设计中都倾注了苏老师大量的心血,对我的设计思路,设计方案的决定、构思都给予了重要的指导,使得我少走了不少弯路,我的课程设计才能按时、顺利的完成。同时还要感谢帮助过我的同学们,谢谢你们在设计中给我的支持与动力。
最后感谢所有教过我的老师们,有了你们的孜孜不倦的教导,才有今天的我,我才有能力去为明天的理想奋斗!
课程设计中用到了软件来分别设计原理图和仿真图,同时也用到了软件来编写运行控制程序。在解决设计过程中所遇到的各种问题的过程中,在一定程度上加深了对以上软件的认识与理解,也加强了对这些软件的运用和掌握。
此次课程设计中运用到了模拟电子技术、单片机技术、自动控制原理等专业基础课程中的内容,是对我们在大学里面所学习的知识的一个考察与检测,同时,也是在为即将参加工作的同学们提供一次整体知识回顾与运用的机会。
综合设计题目来源于生活,让我们在大学期间学习的理论知识显得并不是那么空洞得到了很好的实践,也使得对自己的发展方向更加明确。
10
四川师范大学成都学院电子工程学院课程设计报告
参考文献:
[1] 秦前清,杨宗凯.实用小波分析[M].西安:西安电子科技大学出版社,1994.4.p125-p133
[2] 赵岩.汽车智能雨刮系统的研究〔D〕.北京:哈尔滨理工大学,2007.6.p110-p121 [3] 邹寿彬.电子技术基础[M].北京:高等教育出版社,1987.8.p347-p373
[4] 孙在信.环境对555红外线发射系统的影响[J].大连交通大学学报,2007.11.p94-p96 [5] 张国雄.测控电路[M].北京:机械工业出版社,2006.2.p91-p118
[6] 赵岩,訾鸿.汽车雨滴传感器的设计[J].佳木斯大学学报,2007.2.p801-p803 [7] 程国钢.单片机keil cx51应用开发技术[M].北京:人民邮电出版社,2007.4.p115-p131 [8] 潘新民,王燕芳.微型计算机控制技术[M].北京:电子工业出版社,2003.6.p135-p142 [9] 邹庆超.多速雨刮器的控制电路[J].北京汽车,1994.2.p42-p43
[10] 李全福.模糊PID控制算法在电动舵机控制中的应用[J].微电机,2007.5.p28-p47 [11] 刘曙光,魏俊民.模糊控制技术[M].北京:中国纺织出版社出版,2001.12.p59-p84 [12] 贾玉英.基于单片机控制的PWM直流调速系统[J].包头钢铁学院报,
2005.8.p334-p337
[13] 李勇.基于模糊控制的直流电机PWM调速系统[J].大电机技术,2006.2.p66-p68 [14] 岑木峰.汽车雨刮器的改进[J].湖北汽车工业学院报,2007.3.p74-p78
[15] 谢飞.基于微分平坦的双电机雨刮控制器研究〔D〕.吉林:吉林大学,2007.11.p111-p123
[16] 郭立书,郑殿旺.雨滴感知型间接刮水控制系统[J].汽车电器,1996.2.p8-p9 [17] 吴勇.汽车智能化技术[J].上海汽车,2004.4.p37-p39
[18] 李东生.Protel 99SE电路设计教程[M].北京:电子工业出版社,2007.2.p19-p125 [19] 廉小亲.模糊控制技术[M].北京:中国电力出版社,2003.6.p10-p50
[20] 戎月莉.计算机控制原理及应用[M].北京:北京大学出版社,1998.3.p123-p150 [21] 陈杰,黄鸿.传感器与检测技术[M].北京:高等教育出版社,2002.1.p132-p140 [22] 唐钰,葛龙.红外光电散射式感烟探测器的研制[J].四川大学学报,
2004.2.p117-p120
[23] 臧英杰.电气传动的脉宽调制控制技术[M].北京:机械工业出版社,1997.1.p87-p112
11
四川师范大学成都学院电子工程学院课程设计报告
附录:源程序
#include
#define_MHZ_12 /设置单片机使用的晶振频率 unsigned int count=0,precount,Maichong;
void t1 (void); /t1定时子函数 void int1(void) interrupt1; /中断服务子函数 void Yudi(void); /sbit Q7=p3^3; sbit int1=p3^3; main() {
t1(); /while(precount!=0) { Yudi();
P0=Maichong; /t1(); } }
void t1 (void); {
TMOD=0x10; /计数器
TH1=0X01; /TL1=0XA0;
TR1=1; /IT1=1; /EA=1;
ET1=1; /EX1=1; /判断雨量多少子函数 调用定时子程序 调用雨量多少子程序 定时器1工作在方式1,即为16位设置60ms定时时间的初值 启动T1
设置INTR1中断方式为边沿触发方式,负跳变时产生中断 允许定时器1中断 允许外部中断1中断
12
四川师范大学成都学院电子工程学院课程设计报告
EA=1; /CPU开放中断 count=0; }
void int1(void) interrupt1; /外部中断1处理函数 TR1=0; TH1=0X15; TL1=0XA0; while (int1==0); count ++; precount=count; TR1=1; }
void Yudi(void); /{
if(precount>=3&&precount<12) {Maichong=04H;
else if (precount>=12&&precount<20) {Maichong=0FH;} else Maichong=00H Maichong=P0; }
第二片用于电机控制的单片机程序: #include
float pwmcycle, pwmcycle1,pwmcycle2; char E(k)[8],Ec(k)[8]; sbit pwm1=P0.0; sbit pwm1=P0.1; sbit pwm2=P0.3; sbit pwm2=P0.4;
void delay(unit m); /13
雨滴传感器子程序 声明延时函数
四川师范大学成都学院电子工程学院课程设计报告
void dianji(void);
void timer1(void)interrupt 0 using 1; void timer2(void)interrupt 1 using 1; void shijiancha(void); void Tongbu(void); void gengxin(void); main { P1=P0; dianji(); shijiancha(); tongbu(); dengxin();
if(timer1!=timer2) {dianji();} }
void delay(unit m) /{ uchar i; while(m--)
for(i=125;i>0;i--) }
void dianji(void) /{
while (Maichong==4) {if(SA1==1 or SA3==1) {P0=09H;}
else if(SA0==1or SA2==1) {P0=12H;}
pwmcycle=40% delay(20); P0=00H;
14
延时1ms子程序电机双向子程序 四川师范大学成都学院电子工程学院课程设计报告
delay(30);
while (Maichong==16) {if(SA1==1 or SA3==1) {P0=09H;}
else if(SA0==1or SA2==1) {P0=12H;}
pwmcycle=60% delay(30); P0=00H; delay(20); }
void shijiancha(void) {
TMOD=0x11; /TH0=0xff; TL0=0xff; TH1=0xff; TL1=0xff; IT0=1; IT1=1; EA=1; ET0=1; ET1=1; TR0=1; TR1=1; }
void timer1(void)interrupt 0 using 1 {
unsigned char tmp1,tmp2; do {
15
定时方式,工作在方式1 四川师范大学成都学院电子工程学院课程设计报告
tmp1=TH0; tmp2=TL0;
timer1=256*tmp1+tmp2; TH0=0; TL0=0; }
void timer2(void)interrupt 1 using 1 {unsigned char tmp3,tmp4; do { tmp3=TH1; tmp4=TL1;
timer2=256*tmp3+tmp4; } TH0=0; TL0=0; }
void Tongbu(void) /{
int e(k),ec(k); for(k=0;;k++)
{ e(k)=timer1(k)-timer2(k); ec(k)=E(k)-E(k-1); }
if(e(k)>25ms) {e(k)=25ms;} else if(e(k)<-25ms) {e(k)=-25ms;} if (ec(k)>50ms) {ec(k)=50ms;) else if(ec(k)<-50ms)
16
两电机同步子程序 四川师范大学成都学院电子工程学院课程设计报告
{ec(k)=-50ms;}
if(e(k)>15ms) /时间误差置位规律 {E(k)[0]=1;}
else if (e(k)>8ms&&e(k)<=15ms) {E(k)[1]=1;}
else if (e(k)>0&&e(k)<=8ms) {E(k)[2]=1;} else if (e(k)==0) {E(k)[3]=1;}
else if (e(k)>-8ms&&e(k)>0) {E(k)[4]=1;}
else if(e(k)>=-15ms&&e(k)<-8ms) {E(k)[5]=1;}
else if (e(k)<-15ms) {E(k)[6]=1;}
if(ec(k)>16&&ec(k)<=30) /{Ec(k)[0]=1;}
else if (ec(k)>0&&ec(k)<=16) {Ec(k)[1]=1;} else if(ec(k)==0) {Ec(k)[2]=1;}
else if(ec(k)>-16&&ec(k)<0) {Ec(k)[3]=1;}
else if(ec(k)>=-30&&ec(k)<=-16) {Ec(k)[4]=1;}
while(E(k)[6]=1) /{
if(Ec(4)=1) {U=-3;} else if(Ec(3)=1) {U=-2;}
时间误差变化置位规则 查表 17
四川师范大学成都学院电子工程学院课程设计报告
else if(Ec(2)=1) {U=-2;} else if(Ec(1)=1) {U=-1;} else if(Ec(0)=1) {U=0;} }
while(E(k)[5]=1) {
if(Ec(4)=1) {U=-3;} else if(Ec(3)=1) {U=-2;} else if(Ec(2)=1) {U=-2;} else if(Ec(1)=1) {U=-1;} else if(Ec(0)=1) {U=0;} }
while(E(k)[4]=1) {
if(Ec(4)=1) {U=-3;} else if(Ec(3)=1) {U=-2;} else if(Ec(2)=1) {U=-1;} else if(Ec(1)=1) {U=0;}
else if(Ec(0)=1)
18
四川师范大学成都学院电子工程学院课程设计报告
{U=2;} }
while(E(k)[3]=1) {
if(Ec(4)=1) {U=-3;} else if(Ec(3)=1) {U=-2;} else if(Ec(2)=1) {U=0;}
else if(Ec(1)=1) {U=2;}
else if(Ec(0)=1) {U=3;} }
while(E(k)[2]=1)
sbit Fl=P1^0; //喷水电机控制位sbit Off=P1^1; //停止电机控制位sbit Int=P1^5; //间歇转 sbit Hi1=P1^3; //电机高速1 sbit Hi2=P1^4; //电机高速2 sbit diankong=P1^2;
sbit Hi_motor=P3^0; //雨刷电机 sbit Fl_motor=P3^1; //喷水电机
sbit WE1= P3^4; sbit WE2= P3^5; sbit WE3= P3^6;
sbit WE4= P3^7; //数码管位选 sbit led= P3^3;
19
四川师范大学成都学院电子工程学院课程设计报告
uint num=0,k=0,delta=5,time=0,temp; uint k1,k2,k3,k4; uint flag=0; uchar
code
dtable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc8}; //共阳数码管码表
uchar
code
lable[]={0xbf,0xc0,0x8e,0xf9,0xab,0x87,0xc7,0x89,0xa4};//\字符编码
void delay(uint z) {
uint x,y;
for(x=15;x>0;x--) for(y=z;y>0;y--); }
/**********电机、IO口函数************/ void init(void) {
Hi_motor=0; Fl_motor=0; P1=0xef; WE1=0; WE2=0; WE3=0; WE4=0; P0=0x00; }
/**********定时器0初始化函数************/ void Init_timer0() {
TMOD=0x01; //工作模式1
TH0=(65536-100)/256;
20
}
四川师范大学成都学院电子工程学院课程设计报告
TL0=(65536-100)%6;//定时器0赋初值 0.1ms EA=1; //开
ET0=1; //打开定时器0中断 TR0=1; //启动定时器0
/**********外部中断0初始化函数********/ void X0_init() {
if(Ec(4)=1) {U=-2;} else if(Ec(3)=1) {U=0;}
else if(Ec(2)=1) {U=1;}
else if(Ec(1)=1) {U=2;}
else if(Ec(0)=1) {U=3;} }
while(E(k)[1]=1) {
if(Ec(4)=1) {U=0;}
else if(Ec(3)=1) {U=1;}
else if(Ec(2)=1) {U=2;}
else if(Ec(1)=1) {U=2;}
else if(Ec(0)=1)
21
四川师范大学成都学院电子工程学院课程设计报告
{U=3;} }
while(E(k)[0]=1) {
if(Ec(4)=1) {U=0;}
else if(Ec(3)=1) {U=1;}
else if(Ec(2)=1) {U=2;}
else if(Ec(1)=1) {U=2;}
else if(Ec(0)=1) {U=3;} }
void gengxin(void) {
{pwm1=pwmcycle+U*3.5; pwm2=pwmcycle;} if(SA1==1 or SA3==1) {P0=09H; delay(pwm1*50); P0=08H;
delay((1-pwm1)*50); }
else if(SA0==1or SA2==1) {P0=12H; delay(pwm1*50); P0=10H;
delay((1-pwm1)*50);
sbit Fl_motor=P3^1; //喷水电机22
四川师范大学成都学院电子工程学院课程设计报告
sbit WE1= P3^4; sbit WE2= P3^5; sbit WE3= P3^6;
sbit WE4= P3^7; //数码管位选 sbit led= P3^3;
uint num=0,k=0,delta=5,time=0,temp; uint k1,k2,k3,k4; uint flag=0;
uchar code dtable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc8}; //共阳数码管码表
uchar code lable[]={0xbf,0xc0,0x8e,0xf9,0xab,0x87,0xc7,0x89,0xa4};//\字符编码
void delay(uint z) {
uint x,y;
for(x=15;x>0;x--) for(y=z;y>0;y--); }
/**********电机、IO口函数************/ void init(void) {
Hi_motor=0; Fl_motor=0; P1=0xef; WE1=0; WE2=0; WE3=0; WE4=0; P0=0x00;
23
四川师范大学成都学院电子工程学院课程设计报告
}
/**********定时器0初始化函数************/ void Init_timer0() {
TMOD=0x01; //工作模式1 }
/**********外部中断0初始化函数********/ void X0_init() {
EX0=1;//允许外部中断0中断 IT0=1;//跳沿式触 }
/**********数码管函数************/ void display1(uint k1,uint k2,uint k3) { WE1=1;
WE4=1;
24
TH0=(65536-100)/256;
TL0=(65536-100)%6;//定时器0赋初值 0.1ms EA=1; //开
ET0=1; //打开定时器0中断 TR0=1; //启动定时器0
P0=lable[k1]; delay(1); WE1=0;
WE2=1; P0=lable[k2]; delay(1); WE2=0;
}
四川师范大学成都学院电子工程学院课程设计报告
P0=dtable[k3]; delay(1); WE4=0;
WE3=1;
P0=dtable[k3/10]; delay(1); WE3=0;
/**********雨量检测函数************/ uint check_date()//雨量检测 { uint k; temp=P2; temp=temp&0x0f;
switch(temp) {
case 0x00: return k=0; break; case 0x01: return k=1; break; case 0x02: return k=2; break; case 0x03: return k=3; break; case 0x04: return k=4; break; case 0x05: return k=5; break; case 0x06: return k=6; break; case 0x07: return k=7; break; case 0x08: return k=8; break; case 0x09: return k=9; break; case 0x0a: return k=10; break; case 0x0b: return k=11; break; case 0x0c: return k=12; break;
case 0x0d: return k=13; break;
25
四川师范大学成都学院电子工程学院课程设计报告
case 0x0e: return k=14; break; case 0x0f: return k=15; break;
default:break;
} }
/**********main函数************/ void main() {
init(); // 电机初始化 X0_init(); //外部中断0初始化 Init_timer0(); //定时器0初始化 while(1) {
/*if(flag) display1(0,0,check_date()); else if(!Fl) {
display1(2,6,check_date()); Fl_motor=1;
}
else
Fl_motor=0;
} */ if(!Fl) {
display1(2,6,check_date()); Fl_motor=1;
}
else
Fl_motor=0;
}
26
四川师范大学成都学院电子工程学院课程设计报告
}
/**********定时器0中断函数************/ void timer0_IRQ() interrupt 1 //控制电机各种转动 {
TH0=(65536-100)/256;
TL0=(65536-100)%6; //定时器0赋初值 0.1ms if(!Off) //判断是否按下“Off”键 {
while(!Off) {
display1(1,2,check_date()); Hi_motor=0; //电机停止 if(Off) break;
}
//退出循环
}
else if(!Int) //判断是否按下“Int”键
{
num++; //计数值增加 while(!Int)
{ display1(3,4,check_date()); if(num<250)
{
led=1; Hi_motor=1;
//电机转2.5s
}
if(num>=2500&&num<5000) { led=0;
Hi_motor=0; //电机停2.5s }
27
四川师范大学成都学院电子工程学院课程设计报告
if(num>=5000) num=0;
if(Int)
num=0; //计数值清0,防止干扰 break; //退出循环 }
}
else if(!diankong) //判断是否按下“Int”键 {
num++; //计数值增加 while(!diankong)
{ display1(0,0,check_date()); if(num<2000)
{
led=1; Hi_motor=1;
//电机转2.5s
}
if(num>=2000) { led=0;
Hi_motor=0; //电机停2.5s num=2000; }
if(diankong)
num=0; //计数值清0,防止干扰 break; //退出循环 }
}
else //PWM控制电机的转速 {
if(!Hi1) //高速1
28
四川师范大学成都学院电子工程学院课程设计报告
{
display1(7,3,check_date()); delta=50; }
else if(!Hi2) //高速2 {
display1(7,8,check_date()); delta=0; }
led=0;
Hi_motor=0; //电机停2.5s num=2000; }
if(diankong)
num=0; //计数值清0,防止干扰 break; //退出循环 }
}
else //PWM控制电机的转速 {
if(!Hi1) //高速1 {
else
delta=0; //高速1
num++;
//计数值增加
time=20+check_date()*5;//电机运行的时间
if(num