班级:电科0802 学号:200822340210 姓名:吕晨冉
一、前言
早上起来再也不用让单调的闹钟叫醒啦,让音响放一首动听的歌曲把磕睡虫赶跑吧;天冷的时候电热水器乖乖的帮您准备好了热水洗脸;面包机里昨晚放进去的材料,早上也变成了香喷喷的面包了,没热水冲牛奶?呵呵,那懂事的饮水机总是在需要喝的时候提前煮好了哦。上班用的电动自行车的早已充满了电并定时断了,电源不至于过充哦!
中午回到家里,一股冷空气扑面而来,原来是家里的空调偷偷的转了起来;电饭锅里飘出了淡淡的米饭香气,呵呵,吃完别忘了再洗点米准备好下午的晚饭哦;哎呀,早上充电给手机电池忘了拔出来啦,幸好咱们的智能插座可没忘记呢;午睡再也不用担心门铃骚扰啦,让那些乱按门铃的人傻笑去吧!
晚上下班,不再担心黑灯瞎火咯,“超级管家”已经帮你开好了夜灯;吃完饭又可以洗个热水澡啦;另外每天给鱼缸里可爱的小金鱼定时的打点氧气也是它必不可少的工作哦!
现在我们已经可以用已学的单片机有关知识进行设计实现以上功能了。
二、课程设计要求
1、利用单片机设计一定时开关,在24小时内的时间里能预先设定定时范围,每天周而复始地控制用电器具的自动开启和关闭。
2、要求最少能控制两路220V/10A的交流负载。
3、产品的成本应尽量低,不能超过35元。
4、产品的功能应尽量多,最少应具有时间显示和校正、定时显示和设置等功能。
5、产品的质量应可靠、安全。具体性能指标如下:
供电电源:220V 50Hz
使用环境温度:-10至40度
功率消耗:<2W
负载功率:2500W(250V 10A)
最大负载电流:>10A
定时范围:1分钟至23小时59分任意设定
最小设定单位:1分钟
最小设定间隙:1分钟
定时精度:1分钟
可定时次数:不少于1次
工作方式:连续工作制
三、课程设计内容
根据要求自行设计方案并编写程序完成以下任务:
1、设计并制作低成本高可靠性的电源供电电路,电压:5V,电流:>200mA.
2、设计并制作单片机控制电路,要求能够显示时间、通过按键修改时间和设置定时。
3、设计并制作输出控制电路,要求能控制两路以上的220V/10A的插座。
4、编写产品使用说明书。
四、课程设计步骤
(一)为实现要求所需功能,选取元件,设计电路并用仿真软件进行仿真,观察是否能达到定时功能。
1、根据设计要求画出流程图:
重要部分的文字说明:
(1)、电源部分
利用电路将220V转变为5V输入单片机中进行正常工作。
(2)、显示:利用LED显示
(3)、4个按键功能说明
按键K1作用:单片机的启动与关闭
按键K1作用:切换正常时间与定时时间显示
按键K3作用:正常时间与校准的切换
按键K4作用:校准正常时间与设定定时时间
(4)、2个插座:利用单片机I/O控制其开关。
2、在仿真软件上进行仿真。
(1)打开软件,在元件选取栏中输入所需元件名称,选出各元件。
(2)在画图区域进行电路的连接
(二)绘制电路原理图及PCB设计方法,需要注意的问题
1、绘制电路原理图
(1)绘制原理图的基本步骤
a)首先将所有元件都从库中取出来,如库中没有的要自己制作比如数码管元件图要创建自己的元件库制作,放置在图纸上,并调整好位置,以便布线。
b)使用连线工具将元件连接起来。
c)设置元件属性。
d)使用Tool/Annotate菜单对元件进行编号。
e)使用电气检查(ERC)。
f)使用Edit/Export to Spread 菜单建立元件列表。
h)使用Design/Create Netlist菜单建立网络表,为画电路板图做准备。
i)在将这些练习画成电路板图时,特别注意元件封装的正确性以及管脚和封装焊盘之间的对应关系。
(2)绘制电路图应该注意的问题
a)核对数码管的引脚号与单片机等引脚的对应关系
b)核对单片机的引脚与LED的对应关系
c)可能出现的错误:①地线符号使用不当,其网络名称为Vcc。②器件引脚号没有重新编辑。
d)绘制完电路原理图后,要求:1)进行DRC(电器规则检查),排除原理图设计中的错误。2)Create Netlist(创建网络表)。3)列出材料报告表。
(电源部分)
(单片机部分)
(开关部分)
2、PCB设计方法
(1)制作数码管极有关元件封装图,将DIP-8、DIP-24、DIP-40封装图中的含拍尺寸改为合适大小。
(2)使用向导,定义一个合适大小的单面PCB板,根据所设计的原理图,设计该电路的PCB图。
(3)将原理图的网络表调入设计的单面板中,进行布局,启动自动拉伸元件,然后进行人工布局,布局一定要合理使线走的最短,最省。
(4)先进性布线规则设定(铜膜线线宽设为15mil,地线和电源线宽设为30mil线间距设为15mil)然后进行布线,尽量使过线减少,走跨线的少,不能出现高亮线。
(PCB板连线图)
3、PCB设计时碰到的问题
(1)PCB尺寸与规定的不一致。元器件排布合理,疏密分布较为均匀
(2)数码管的封装不能做少了,两列焊盘兼具不是300mil,应该是600mil
(3)注意焊盘号的顺序为逆时针1~18,焊盘号一定不能放错
(4)数码管的位置高位放置方向应正确
(5)插口放在PCB的边缘,且要注意方向
(6)跳线不宜过长,不要转弯
(7)IC两焊盘间尽量少走线
(8)铜模线宽度合理
(9)姓名用汉语拼音,使用水平镜像
(10)PCB设计后的检查和打印:①DRC应无错误,无违规,无高亮(绿色)显示,否则,应根据原理图中的网络表,在PCB管理器下逐一核对,找出错误。②注意PCB图的打印设置方法(下图为转印用的PCB图)
(3D图 正面)
4、PCB图的打印、转印与敷铜板的腐蚀加工方法与问题
(1)按尺寸剪切敷铜板,并用细砂纸打磨光,清洁
(2)将打印的PCB底层图用热转印机转印到敷铜板上
(3)修板:用快干漆将少量没有印好的线条修补好
(4)腐蚀:将印好了电路板图的敷铜板放入三氯化铁溶液中腐蚀。溶液浓度高、温度高则腐蚀速度快,但浓度和温度要合适。腐蚀时间要掌握好。
(5)清洗、晾干
(6)钻孔:选择直径合适的钻头:集成电路引脚及一般电阻、电容用0.8mm直径的钻头,如有元件引脚较粗,可以根据测量值,换相应大些直径的钻头。钻孔过程中,钻头尽量插入夹具深一些,并且夹具要拧。
(3D图 反面)
(7)除去铜膜上的油墨:用有机溶剂(酒精、香蕉水、丙酮等)擦除覆盖在铜膜线上的油墨,没有上述溶剂时,也可以用砂纸擦除。
(8)打磨并检查电路板
① 除去油墨后,用较细的砂纸将铜膜线打磨光亮。打磨越好,越好焊接。不过不可打磨过度,以免铜膜厚度损耗过多。打磨后,用面巾纸清洁干净。
②检查电路板:用万用表检查PCB上线条间有无短路、断路。有短路要割断,有断路要搭上焊锡,将其连接好。
(9)上助焊剂
①将松香溶于无水酒精中制作成助焊剂待用。注意助焊剂的浓度要合适。过浓,干燥后不光亮,过稀,助焊性能较差。
②用毛刷将酒精松香焊剂均匀地涂在清洁后的PCB板,涂刷时,将PCB板垂直放置,以免焊剂堵塞钻孔。涂刷一遍即可,涂刷次数过多容易起皱纹,不光亮。
③将涂刷酒精松香焊剂的PCB放置在阳光下凉干或自然凉干。
(打印的PCB底层图)
五、装配与调试
1.装配
(1).焊接:先焊接所有跳线:先确定好跳线长度,两端剥去绝缘层。拧好,上锡,再焊接。也可以用剪下来的元件引脚做跳线。再焊接集成电路插座和其它元件。 注意:所给的数码管插槽和电路板所需要的有所不同,所以要进行改进。
(2).检查、排错:根据网络表(或电路原理图)用万用表检查铜膜线有无短路、断路,发现错误,及时排除。比如,2个发光二级管的正负极是否接对,电容的正负极是否接正确等等。
(3).确定无错误后,可以插上集成电路器件。
(4).注意芯片引脚脚的位置,不能接错,否则将损坏。
2.调试
(1).掌握正确的调试方法,一是要多实践,二是要弄清楚该电路各部分的原理。
(2).通电前,用万用表的欧姆档(1K档)检查电路中有无短路,若短路,应排除故障后在通电;
(3)装载以下程序:
#include unsigned char led[]={0,0,0,0}; unsigned int counter; unsigned char n,w=0,flag=0,flag1=0,flag2=0,start=0; unsigned char K1_on=1,K2_on=1; unsigned char h_data=0,m_data=0,s_data=0; unsigned char hdata1_on=0,mdata1_on=3, hdata2_on=0,mdata2_on=7; unsigned char hdata1_off=0,mdata1_off=5,hdata2_off=0,mdata2_off=9; void display(void); void delay(unsigned int j) { unsigned int i; for(i=0;i { led[0]=H/10; led[1]=H%10; led[2]=M/10; led[3]=M%10; } unsigned char H1_set(unsigned char H1) { H1=(H1/10+1)*10+H1%10;if(H1>23){H1=H1%10;};return H1;} unsigned char H0_set(unsigned char H0) { if(H0%10==3&&H0/10==2) H0=H0/10*10;else H0=H0%10+1+H0/10*10;return H0;} unsigned char M1_set(unsigned char M1) { M1=(M1/10+1)*10+M1%10;if(M1>=60){M1=M1%10;};return M1;} unsigned char M0_set(unsigned char M0) { if(M0%10==9) M0=M0/10*10;else M0=M0%10+1+M0/10*10;return M0;} void display(void) { char code num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; char code tv[]={0xfe,0xfd,0xfb,0xf7}; unsigned char k,i; switch(flag) { case 0: {load_LED(h_data, m_data);break;} case 1: {load_LED(h_data, m_data);break;} case 2: {load_LED(hdata1_on, mdata1_on);break;} case 3: {load_LED(hdata1_off, mdata1_off);break;} case 4: {load_LED(hdata2_on, mdata2_on);break;} case 5: {load_LED(hdata2_off, mdata2_off);break;} case 6: {load_LED(hdata1_on, mdata1_on);break;} case 7: {load_LED(hdata1_off, mdata1_off);break;} case 8: {load_LED(hdata2_on, mdata2_on);break;} case 9: {load_LED(hdata2_off, mdata2_off);break;} default:{P1=0xFF;load_LED(h_data, m_data);break;} } n++; { if(flag) { if(n>180) n=0; if(k==w) {if(n<90) { i=led[k]; P0=num[10];/*该LED位不显示(短时消隐),送消隐段码*/ P2=tv[k]; /*送需要显示的LED位码*/ delay(10);/*短时消隐延时,有利于显示位的切换*/ P0=num[i]; if(k==1) /*如果送显示的LED为分的个位*/ P0=num[i] | 0x80; /*则将分的个显示码附加小数点*/ delay(100); /*显示延时,让LED充分点亮*/ } else /*后90次消隐*/ {P0=num[10];/*送LED消隐段码*/ if(k==1) /*如果要消隐的是分的个位*/ P0=num[10] | 0x80;/*则将分的个位后的小数点点亮(小数点不闪烁)*/ P2=tv[k]; /*送消隐的位码(即哪个LED需要闪烁)*/ delay(100); /*消隐延时,让其充分消隐*/} else /*如果送显示的位不调整的位,则不需要闪烁显示*/ { i=led[k]; /*将该LED位需要显示的数存于i中*/ P0=num[10]; /*该LED位不显示(短时消隐),送消隐段码*/ P2=tv[k]; /*送需要显示的LED位码*/ delay(10); /*短时消隐延时,有利于显示位的切换* P0=num[i]; if(k==1) /*如果送显示的LED为分的个位*/ { P0=num[i] | 0x80;}/*则将分的个显示码附加小数点*/ delay(100); /*显示延时,让LED充分点亮*/ }} else /*如果不是处在设置模式,则正常显示*/ { load_LED(h_data, m_data); i=led[k]; /*将该LED位需要显示的数存于i中*/ P0=num[10]; /*该LED位不显示(短时消隐),送消隐段码*/ P2=tv[k]; /*送需要显示的LED位码*/ delay(10); /*短时消隐延时,有利于显示位的切换*/ P0=num[i]; if(k==1) /*如果送显示的LED为分的个位*/ { P0=num[i] | 0x80;} /*则将分的个显示码附加小数点*/ delay(100); /*显示延时,让LED充分点亮*/ } } } /**************************************************************************/ void adjust(void) /*调整函数定义*/ {if(P3_0==0) /*选择键按下*/ { delay(100); while(P3_0==0) {flag1++; display();} if(flag1>50) { flag1=0; flag++; if(flag>=10) {flag=0;} /*对flag清零*/ switch(flag) /*调整模式选择,原理是通过调整键按下的次数来选择*/ {case 0: {P1=0xFF;TR0=1;break;} case 1: {P1=0xFF;P1_0=0; TR0=0;break;} case 2: {P1=0xFF;P1_1=0;P1_3=0;P1_5=0; TR0=1;break;} case 3: {P1=0xFF;P1_1=0;P1_3=0;P1_6=0; TR0=1;break;} case 4: {P1=0xFF;P1_1=0;P1_4=0;P1_5=0; TR0=1;break;} case 5: {P1=0xFF;P1_1=0;P1_4=0;P1_6=0; TR0=1;break;} case 6: {P1=0xFF;P1_2=0;P1_3=0;P1_5=0; TR0=1;break;} case 7: {P1=0xFF;P1_2=0;P1_3=0;P1_6=0; TR0=1;break;} case 8: {P1=0xFF;P1_2=0;P1_4=0;P1_5=0; TR0=1;break;} case 9: {P1=0xFF;P1_2=0;P1_4=0;P1_6=0; TR0=1;break;} default:{P1=0xFF;TR0=1;break;} } } } if(P3_1==0) /*移位控制键,在4个LED上来回移动,选择需要设置的LED位*/ { delay(100); /*消抖*/ while(P3_1==0) display(); if(flag) {w=w+1; if(w>=4) w=0; } } if(P3_2==0) /*加1操作*/ { delay(100); /*消抖*/while(P3_2==0) display(); if(flag) /*当处于调整模式时,对所选择的LED进行加1*/ {switch(flag) { case 1:{ if(w==0) {h_data=H1_set(h_data);display();} if(w==1) {h_data=H0_set(h_data);display();} if(w==2) {m_data=M1_set(m_data);display();} if(w==3) {m_data=M0_set(m_data);display();} break; } case 2: { if(w==0){hdata1_on=H1_set(hdata1_on);display();} if(w==1) {hdata1_on=H0_set(hdata1_on);display();} if(w==2) {mdata1_on=M1_set(mdata1_on);display();} if(w==3) {mdata1_on=M0_set(mdata1_on);display();} break; } case 3: { if(w==0){hdata1_off=H1_set(hdata1_off);display();} if(w==1) {hdata1_off=H0_set(hdata1_off);display();} if(w==2) {mdata1_off=M1_set(mdata1_off);display();} if(w==3) {mdata1_off=M0_set(mdata1_off);display();} break; } case 4: { if(w==0){hdata2_on=H1_set(hdata2_on);display();} if(w==1) {hdata2_on=H0_set(hdata2_on);display();} if(w==2) {mdata2_on=M1_set(mdata2_on);display();} if(w==3) {mdata2_on=M0_set(mdata2_on);display(); break; } case 5: { if(w==0){hdata2_off=H1_set(hdata2_off);display();} if(w==1) {hdata2_off=H0_set(hdata2_off);display();} if(w==2) {mdata2_off=M1_set(mdata2_off);display();} if(w==3) {mdata2_off=M0_set(mdata2_off);display();} break; } default:{TR0=1;break;} } } } if(P3_3==0) /*启动定时开关按钮*/ { delay(100); /*当调整键按下时,延时消抖,flag2控制延迟时间*/ while(P3_3==0) {flag2++; display();} if(flag2>50) { flag2=0; display();if(start) start=0;else start=1; } } } void timer0() interrupt 1 /*一号定时器中断T0服务子程序(产生一溢出)*/ {counter++; /*counter对定时中断进行计数,10000次中断为1秒*/ if(counter==100) {s_data++; /counter=0; } if(s_data==60) /*如果秒计满60则向分进位,并将秒清0*/ {s_data=0; m_data++; /*分进位 */} if(m_data==60) /*如果分计满60则向时进位,并将分清0*/ { m_data=0; /*分清0*/h_data++; /*时进位 */} if(h_data==24) /*如果时计满24则将时清0*/ {h_data=0; /*时清0*/} } main(void) { IE=0x82; /*EA|-|-|ES|ET1|EX1|ET0|EX0=10000010,中断允许控制*/ TMOD=0x02; TH0=-200; /*计数常数寄存器设置,中断定时时间为(256+200)*12/f0 */ TL0=-200; /*定时计数器装初值*/ TR0=1; /*启动定时器T0,TCON为TF1|TR1|TF0|TR0|IE1|IT1|IE0|IT0*/ P3_6=1; /*关断定时开关1*/ P3_7=1; /*关断定时开关2*/ while(1) /*以下为死循环*/ { adjust(); /*调用调整函数*/ K1_on=h_data>hdata1_on&&h_data { P1_7=0;/*指示灯亮起*/ if(K1_on) P3_6=0; else P3_6=1; if(K2_on) P3_7=0; else P3_7=1; } else { P1_7=1; P3_6=1; P3_7=1; } display(); } (4).按照5个键的功能进行调试定时,观察数码管的显示,并记录是否能在定时时间电路开启。 五、小结 通过制作低成本多路程控定时插座结合了所学的许多知识,深刻地的体会到了将理论联系到实际的真实含义。当电路板做好并能够实现定时功能时,就能够进一步了解其原理了。 通过这次设计性实验,对于单片机有关接口电路的设计有了更清楚的了解。而对于protel 99se这个软件有了一定的掌握,知道了该软件的强大功能:能够在电脑上进行各种电路和电路板的设计,大大避免了用实际电路进行设计中可能出现的错误。以前并没有接触过用PCB图的打印、转印与敷铜板的腐蚀加工制成电路板,这次完成了这个流程,初步的了解其中应该注意的问题。 当电路板完成后进行试验,我所做的电路板能够实现定时的功能,能够通过按键进行设定所定时刻,并能够实现实验要求的功能。 这次试验基本上成功完成,但在细节方面还有很多可以改进的地方,需要我的深入学习和动手实验。