涡流称重和电子时钟工程测控设计报告汇总.docx
- 文档编号:17945741
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:25
- 大小:86.20KB
涡流称重和电子时钟工程测控设计报告汇总.docx
《涡流称重和电子时钟工程测控设计报告汇总.docx》由会员分享,可在线阅读,更多相关《涡流称重和电子时钟工程测控设计报告汇总.docx(25页珍藏版)》请在冰点文库上搜索。
涡流称重和电子时钟工程测控设计报告汇总
工程测控设计报告
班级:
电子112姓名:
李大龙
分组序号:
电子2-4
1.课程设计目的及要求
(1)课程设计的目的
1、熟悉元器件及芯片的焊接与调试;
2、了解基于51单片机的软件时钟和数码管显示的工作原理;
3、会用C语言开发单片机;
4、会使用KeiluVision编译调试程序,并生成HEX文件,通过数据线下载到电路板上;
(2)课程设计的要求及最终达到的效果
①软件时钟:
☐按键1--进入调整状态,(硬件左侧第1个)
☐按键2--向左移动调整位置,
☐按键3--增加所选位值的数值,
☐按键4--退出调整状态,恢复时钟状态。
☐通常采用“位”是否闪烁让操作者明确当前自己所选定的调整“位”。
②涡流称重计:
☐前三位数码管显示输入电压V,后三位数码管显示称重W
☐W与V的数学表达式及数码管的显示情况为:
称重W
关系式
V的取值
前三位数码管显示
后三位数码管显示
W
W=0
V<0.5
正常显示
显示最下面一横
W=10*V-5
0.5= 正常显示 正常显示 W=40*V-50 1.5 正常显示 正常显示 V>2 正常显示 显示最上面一横 2.硬件电路的原理框图 (1)软件时钟的硬件电路原理图 ①显示电路 ②电源及功能指示电路③单片机外围电路(复位电路、时钟电路) ④按键控制电路⑤数码管驱动电路 6个数码管的地址从左至右依次为: 0xf0、0xf1、0xf2、0f3、0xf4、0xf5 4个按键的地址从左至右依次为: 0xe0、0xd0、0xb0、0xff (2)涡流称重计原理图 3.软件设计 (1)软件时钟的软件设计 ①算法的原理概述 软件时钟就是利用51单片机制作一个电子时钟。 其算法就是以单片机的时钟为基准,记录单片机时钟脉冲的数量,当数量足够多(如脉冲为每秒12Mhz,那么记录12M个脉冲所需时间即为1秒)就可以将显示部分的“秒”位加一。 加到60以后进位为“分”,“秒”位清零以后继续记录。 当“分”累加为60以后进位为“时”,“分”位清零以后继续记录,当“时”位为24以后,“时”位清零并继续记录。 ②程序流程图 (2)涡流称重计的软件设计 ①算法的原理概述 本项设计中用电位器的中间抽头所输出的电压模拟采集的重量数据,单片机经ADC0832的通道0输入该电压信号,并根据给定的转换关系将其转换为数字信息送6位共阳8段LED显示。 ②程序流程图 最终两个程序组合在一起功能为: 上电后进入时钟程序,各种功能时钟的要求 但是当直接按下2键时进入涡流称重计程序 按下复位键又回到始终程序 实现的方法为在时钟程序判断1键是否按下前先判断一下2键是否按下,如果2键先按下了就转入执行称重程序,反之继续执行始终程序 合并后的源程序见最后附录 4.检测装置的使用方法 在为单片机写入程序后看一下是否进行时钟的显示,在逐一测试四个调整键,没问题后将时间设置为23.59.54看一下能否从23.59.59变为00.00.00如果可以则表示时钟部分没有问题 退出时钟的调整状态,直接按下2键则单片机应执行称重程序,并且显示关系为 称重W 关系式 V的取值 前三位数码管显示 后三位数码管显示 W W=0 V<0.5 正常显示 显示最下面一横 W=10*V-5 0.5= 正常显示 正常显示 W=40*V-50 1.5 正常显示 正常显示 V>2 正常显示 显示最上面一横 5.测试结果分析 实验结果为: 上电后时钟显示正常 ☐按键1--进入调整状态,(硬件左侧第1个) ☐按键2--向左移动调整位置, ☐按键3--增加所选位值的数值, ☐按键4--退出调整状态,恢复时钟状态。 ☐“位”闪烁明确当前自己所选定的调整“位”。 将时间调整为23.59.54后可以看到从23.59.59变为00.00.00 说明软件时钟满足功能要求 然后退出时钟的调整状态直接按下2键可以看到单片机开始执行称重程序 调节滑动变阻器测试表格为 前三位数码管显示V(v) 后三位数码管显示W(g) 前三位数码管显示V(v)与电压变测得输入电压的比较结果 0.10 显示最下面一横 基本一致 0.31 显示最下面一横 0.50 000 1.50 010 2.00 030 2.30 显示最上面一横 2.47 显示最上面一横 说明涡流称重计满足功能要求 6.遇到的问题与解决办法 问题一: 如何设置时间? 解决办法: 读取按键,设置按键对时钟进行调整,编写SWITCH语句控制按键的选择,将修改以后的结果放到数组中进行显示。 问题二: 如何使前三位数码管显示的电压值一位一位的变? 解决办法: 要改变算法,先做加和相乘,最后再做除法和取余数操作,并且在计算时尽量不使用中间变量,尽量使用最原始的变量进行计算减小误差 问题三: 如何使V和W满足所给定的函数关系? 解决办法: 使用if语句,根据V的取值,选择表达W的取值。 问题四: 如何实现两个程序之间的切换? 解决办法: 由于时钟程序要进行时间的调整必须先按下1键,因此可以在时钟程序判断1键是否按下前先判断2键是否按下,如果2键一按下则转入执行称重程序,如果2键没有按下则继续执行时钟程序,按下复位键是又开始执行时钟程序 7.焊接、设计、调试心得体会。 在焊接时注意要先预热焊盘,这样焊点会比较光亮好看,一定不要有虚焊,另外在焊接元件之前要先检查元件的好坏,否则一旦有坏的元件,在整机焊接完成之后就很难找出来了 在写程序时不可能一次就写好,在调试和修改时一定要保留上一个文件,新建一个工程去修改以免把原来的程序改的面目全非了 要注意算法的选择,比如在做称重程序时,由于一开始使用了中间变量(做除法取余数后的)导致显示结果不能连续变化,这是因为单片机不同于计算机,它的位数太少计算时尤其是对整型数做除法和取余数会有很多的省略误差会很大,因此要尽量减少中间变量的使用因为这些中间变量本身已经有误差了,并且要先做加减和乘法最后再做除法和取余操作 8.现场布置的程序修改使的按下3键时前三位数码管显示123 只需将源程序在两个程序之间跳转的语句条件改为3键被按下,同时为显示子程序中前三位数码管永久赋值为123即可 附录软件时钟和涡流称重计综合后的程序为: #include #include"intrins.h" #defineulongunsignedlong//定义ulong代替unsignedlong #defineuintunsignedint #defineucharunsignedchar ucharn,h,s,m,h_1,h_0,m_1,m_0,s_1,s_0; uinti,counter; ucharxuanz,jieg,shift,x; unsignedcharcodeduanx[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x00}; voiddelay(); voiddisplay(uchar,uchar,uchar,uchar,uchar,uchar); voiddisplay1(uchar,uchar,uchar,uchar,uchar,uchar); ucharinkey(void); sbitADCS=P3^5;//ADC0832chipseclect sbitADCLK=P3^4;//ADC0832clocksignal sbitADDI=P3^3;//ADC0832kin sbitADDO=P3^3;//ADC0832kout sbitP20=P2^0;//A sbitP21=P2^1;//B sbitP22=P2^2;//C sbitP23=P2^3;//38译码器使能端 sbitP10=P1^0;//LED测试端口 sbitP26=P2^6; sbitP25=P2^5; uchardispbuf[6]; ucharcodetab[]={0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x7,0x7f,0x6f,0x8,0x1}; uinttemp; uchargetdata;//获取ADC转换回来的值 uchare=0; voidzd()interrupt3 { n++; if(n==20) { n=0; s++; TH1=(65536-50000)/256; TL1=(65536-50000)%256; TR1=1; } } /*********时间显示子程序*************/ voiddisplay(ucharh_1,ucharh_0,ucharm_1,ucharm_0,uchars_1,uchars_0)//根据数码管的地址选择要显示的值 { P23=0; P20=0; P21=0; P22=0; P0=duanx[h_1]; delay(); P20=1; P21=0; P22=0; P0=duanx[h_0]|0x80; delay(); P20=0; P21=1; P22=0; P0=duanx[m_1]; delay(); P20=1; P21=1; P22=0; P0=duanx[m_0]|0x80; delay(); P20=0; P21=0; P22=1; P0=duanx[s_1]; delay(); P20=1; P21=0; P22=1; P0=duanx[s_0]; delay(); } voiddisplay1(ucharh_1,ucharh_0,ucharm_1,ucharm_0,uchars_1,uchars_0) { switch(shift) { case0: h_1=15;break; case1: h_0=15;break; case2: m_1=15;break; case3: m_0=15;break; case4: s_1=15;break; case5: s_0=15;break; } P23=0; P20=0; P21=0; P22=0; P0=duanx[h_1]; delay(); P20=1; P21=0; P22=0; P0=duanx[h_0]|0x80; delay(); P20=0; P21=1; P22=0; P0=duanx[m_1]; delay(); P20=1; P21=1; P22=0; P0=duanx[m_0]|0x80; delay(); P20=0; P21=0; P22=1; P0=duanx[s_1]; delay(); P20=1; P21=0; P22=1; P0=duanx[s_0]; delay(); P10=0; } ucharinkey(void) { ucharjjj,keydat; P2=0xff;//P2准备读入 keydat=P2;//读入键值 keydat=keydat&0xf0;//找出四个键的值 if(keydat! =0xf0)//有键输入 { _nop_(); _nop_(); jjj=P2;//再读,去抖动 jjj=jjj&0xf0; if(jjj! =keydat) keydat=0xf0; do { jjj=P2; jjj=jjj&0xf0; }//等待键松手 while(jjj! =0xf0); } return(keydat); } voiddelay(void)//延时程序 { uchari; for(i=0;i<201;i++) _nop_(); } voidddisplay(void)//六位数码管显示程序,disdat[]是要显示的内容(是0~9的数字),xsd是在那一位显示小数点 { uchari,disa,disb,disc; disb=0x00;//显示第n位 for(i=0;i<6;i++)//共显示3个数据 { disa=dispbuf[i];//显示数据 if(disa<10&&e==0) { P2=disb; disc=tab[disa];//显示段码 if(i==0||i==5) disc=disc|0x80;//增加小数点显示 P0=disc;//送显示 delay();//延时 P0=0x0; disb++;//下一个要显示的位置 } if(e==1) { P2=disb; if(i>=3) {disc=tab[10];//显示段码 P0=disc;} else { if(i==0||i==5) { disc=tab[disa]; disc=disc|0x80;//增加小数点显示 P0=disc;} else {disc=tab[disa]; P0=disc;} } //送显示 delay();//延时 P0=0x0; disb++;//下一个要显示的位置 } if(e==2) { P2=disb; if(i>=3) {disc=tab[11];//显示段码 P0=disc; } //送显示 else { if(i==0||i==5) { disc=tab[disa]; disc=disc|0x80;//增加小数点显示 P0=disc;} else {disc=tab[disa]; P0=disc; } } delay();//延时 P0=0x0; disb++;//下一个要显示的位置 } } P2=0xff; } unsignedintAdc0832(unsignedcharchannel)//AD转换,返回结果 { uchari=0; ucharj; uintdat=0; ucharndat=0; if(channel==0)channel=2; if(channel==1)channel=3; ADDI=1; _nop_(); _nop_(); ADCS=0;//拉低CS端 _nop_(); _nop_(); ADCLK=1;//拉高CLK端 _nop_(); _nop_(); ADCLK=0;//拉低CLK端,形成下降沿1 _nop_(); _nop_(); ADCLK=1;//拉高CLK端 ADDI=channel&0x1; _nop_(); _nop_(); ADCLK=0;//拉低CLK端,形成下降沿2 _nop_(); _nop_(); ADCLK=1;//拉高CLK端 ADDI=(channel>>1)&0x1; _nop_(); _nop_(); ADCLK=0;//拉低CLK端,形成下降沿3 ADDI=1;//控制命令结束 _nop_(); _nop_(); dat=0; for(i=0;i<8;i++) { dat|=ADDO;//收数据 ADCLK=1; _nop_(); _nop_(); ADCLK=0;//形成一次时钟脉冲 _nop_(); _nop_(); dat<<=1; if(i==7)dat|=ADDO; } for(i=0;i<8;i++) { j=0; j=j|ADDO;//收数据 ADCLK=1; _nop_(); _nop_(); ADCLK=0;//形成一次时钟脉冲 _nop_(); _nop_(); j=j<<7; ndat=ndat|j; if(i<7)ndat>>=1; } ADCS=1;//拉低CS端 ADCLK=0;//拉低CLK端 ADDO=1;//拉高数据端,回到初始状态 dat<<=8; dat|=ndat; return(dat);//returnadk } voidmain(void) { EA=1; ET1=1; TMOD=0x10; TH1=(65536-50000)/256; TL1=(65536-50000)%256; TR1=1; while (1)//时钟的计时 { if(s==60) { s=0; m++; if(m==60) { m=0; h++; if(h==24) h=0; } } s_1=s/10; s_0=s%10; m_1=m/10; m_0=m%10; h_1=h/10; h_0=h%10; display(h_1,h_0,m_1,m_0,s_1,s_0); xuanz=inkey(); if(xuanz==0xd0)//判断是否跳出时钟程序转而执行称重程序 { unsignedintw; while (1) { getdata=Adc0832(0); temp=getdata*1.0/255*500;//电压值转换,5V做为参考电压,分成256份。 dispbuf[2]=temp%10;//个位 dispbuf[1]=temp/10%10;//十位 dispbuf[0]=temp/100;//百位 w=temp*1.0/2.5/6;//确定称重与输入电压的函数关系 w=0.1*temp-5; if(w>10) w=0.4*temp-50; if(dispbuf[0]==0&&dispbuf[1]<5) e=1; elseif(dispbuf[0]==2&&(dispbuf[1]>0|dispbuf[2]>0)) e=2; else { e=0; dispbuf[5]=w%10;//个位 dispbuf[4]=w/10%10;//十位 dispbuf[3]=w/100;//百位 } ddisplay(); } } else { switch(xuanz)//根据按下的键进入相应的调整状态 { case0xe0: jieg=1;break; case0xd0: jieg=2;break; case0xb0: jieg=3;break; case0x70: jieg=4;break; } if(jieg==1) { x=1; shift=0; EA=0; ET1=0; TR1=0; while (1) {xuanz=inkey(); switch(xuanz) { case0xe0: jieg=1;break; case0xd0: jieg=2;break; case0xb0: jieg=3;break; case0x70: jieg=4;break; } if(jieg==2) { jieg=0; shift--; if(shift==-1) shift=5; } if(jieg==3) { jieg=0; switch(shift)//根据移位变量选择所增加的位 { case0: h_1++;if(h_1==3)h_1=0;break; case1: h_0++;if((h_1==2)&&(h_0>4))h_0=0;break; case2: m_1++;if(m_1==6)m_1=0;break; case3: m_0++;if(m_0==10)m_0=0;break; case4: s_1++;if(s_1==6)s_1=0;break; case5: s_0++;if(s_0==10)s_0=0;break; } } if(jieg==4) { jieg=0; EA=1; ET1=1; TR1=1; break; } if(counter==40) { counter=0; x=~x; } h=10*h_1+h_0; m=10*m_1+m_0; s=10*s_1+s_0; s_1=s/10; s_0=s%10; m_1=m/10; m_0=m%10; h_1=h/10; h_0=h%10; if(x==1) display(h_1,h_0,m_1,m_0,s_1,s_0); else display1(h_1,h_0,m_1,m_0,s_1,s_0);//doublek counter++; } } } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 涡流 称重 电子 时钟 工程 测控 设计 报告 汇总