1、 2015 工程测控设计报告 第 1 页 工程测控设计报告班级:电子 121 班 姓名:马明杰 学号:122121分组序号:A15 同组人:焦亚男 1221001、课程设计目的及要求(1) 、课程设计的目的1、掌握元器件及芯片的焊接与调试;2、 了解基于 51 单片机的软件钟的工作原理;3、 会用 C 语言编写时钟函数,复习用 switch 语句和 do-while 语句、for 语句实现循环的方法;4、 会使用 MEDWIN 编译调试程序,并生成 HEX,通过数据线下载到电路板上;5、 根据自己焊接的板子在程序中设置按键控制时钟的调整。(2) 、课程设计的要求软件时钟的设计要求:使用中需要对
2、时钟进行调整。在调整的时候需要一个按键来进入调整状态。进入调整状态以后需要一个按键来向左移动调整位置,一个按键来向右移动调整位置,一个按键来增加所选位置的数值,一个按键来减小所选位置的数值。调整完成以后还需要一个按键来 退出调整位置,恢复时钟的计数运转。以上所需按键可以根据需要合并。在调整中另外一个需要注意的问题是如何显示目前所选定调整的位置(如秒的个位或者十位,分的个位或者十位等) 。可以采用是否显示数位右下的小数点或者所选需调整位是否闪烁来让操作者明确目前自己所选定的需要调整的数位。本小组最终实现用第一个按键进入调整状态,并进行循环左移,用第二个按键实现在软件时钟以及涡流称重计两种模式之间
3、的切换,第三个按键实现时钟设置时加法,第四个按键退出调整状态,并采用显示数位右下的小数点来显示当前要调整的位。涡流称重计的设计要求:使用时用 2V 的电压来表示 200g 的重量,使用通道 O 来输入模拟量。用按键 2 实现涡流称重计在两2015 工程测控设计报告 第 2 页 个不同函数之间的切换。光电转速计的设计要求:本实验要求编写程序实现当板子上的 P3.5 引脚接光电转速计时,在数码管上的后三位显示转速,单位为转/分,前三位显示脉冲频率,单位是脉冲/秒。2、硬件电路的原理框图(1) 、软件时钟的硬件电路原理图显示电路电源及功能指示电路 单片机外围电路(复位电路、时钟电路)按键控制电路 数
4、码管驱动电路2015 工程测控设计报告 第 3 页 4 个按键的地址从左至右依次为:0xe0、0xd0、0xb0、0xff(2)、涡流称重计原理图3、软件设计(1)、软件时钟的软件设计算法的原理概述所谓软件时钟就是利用 51 单片机制作一个电子时钟。其算法就是以单片机的时钟为基准,记录单片机时钟脉冲的数量,当数量足够多(如脉冲为每秒 12Mhz,那么记录 12M 个脉冲所需时间即为 1 秒)就可以将显示部分的“秒”位加一。加到 60 以后进位为“分” , “秒”位清零以后继续记录。当“分”累加为60 以后进位为“时” , “分”位清零以后继续记录,当“时”位为 24 以后, “时”位清零并继续
5、记录。程序流程图见图 3-12015 工程测控设计报告 第 4 页 源程序见本报告最后附加页文档。(2) 、涡流称重计的软件设计算法的原理概述本项设计中用电位器的中间抽头所输出的电压模拟采集的重量数据,单片机经 ADC0832 的通道 0 输入该电压信号,并将其转换为数字信息送 6 位共阳 8 段 LED 显示。程序流程图见图 3-2源程序见本报告最后附加页文档。(3) 、光电转速计的软件设计算法的原理概述数字频率计是直接用十进制数字来显示被测信号频率的一种测量装置。它不仅可以测量正弦波,方波,三角波和尖脉冲信号的频率,而且还可以测量他们的周期。数字频率计在测量其他物理量如转速、振荡频率等方面
6、获得广泛应用。所谓频率,就是周期性信号在单位时间(1s)里变化的次数。若在一定时间间隔 T 内测得的这个周期性信号的重复变化次数 N,则其频率可表示为f =N/T,一般为简单起见我们通常选择测量间隔为 1 秒(即 T1) ,这样 1 秒内信号重复变化的次数就是信号的频率1 秒的计数周期要采用单片机本身的时钟脉冲来计算,在 1 秒的时间内,记录的外部脉冲的数量就是外部信号的频率。所以一共需要 2 个计数过程,一个是记录单片机本身时钟脉冲的个数以准确划定 1 秒的时间,一个是记录外部脉冲的个数,以准确记录外部信号的频率。因为显示的数码管数量有限,所以在编写程序时要注意采用小数点所在的位置来表示频率
7、单位程序流程图见图 3-3源程序2015 工程测控设计报告 第 5 页 见本报告最后附加页文档。4、检测装置的使用方法(1) 、软件时钟按按键 1 进入设置状态并进行移位,按键 2 减,按键 3 加,按键 4 退出,调整时间为 23:59:57,若三秒后变为 00:00:00,则装置没有问题。(2) 、涡流称重计按按键 2 切换测量函数,测量值与相应函数线的理论值进行比较,若误差在允许范围内,则装置没有问题。(3) 、光电转速计将单片机 P3.5 脚接频率发生器正极,40 脚接负极,调整频率发生器为方波,频率 150HZ,幅值 4V,图 3-1 图 3-2 图 3-32015 工程测控设计报告
8、 第 6 页 看数码管显示值是否正确。然后将其接入光脉冲上并用数字示波器对脉冲频率进行测量,调整转速在 1000以内,查看数码管值转速值是否正确,并与数字示波器的频率值进行比较,查看大小是否相同,若均相同,则装置没有问题。5、测试结果分析(1) 、软件时钟本实验共设置了 5 个按钮,按键 1 设置小数点到达哪位数码管的值,按键 2 减小设置位的值,按键3 增加设置位的值,到达 23:59:59 后数据清零为 00:00:00,按键 1 按下后进入设置状态,按键 5 是复位按键。(2) 、涡流称重计通过从电位器中调出一部分电压,并将其进行 A/D 转换,将模拟量转换为数字量,显示高三位数码管,测
9、量值显示在低三位数码管,我们组测的最高值为 1.96v 199g,超过此数,后三位数码管显示“EOR” 。测试数据表格:测试值 函数 1 测试结果 函数 2 测试结果0.5 0.49 000 0.49 0001.0 0.98 067 0.98 0991.5 1.49 133 1.49 1672.0 1.96 199 1.96 1992.5 2.49 349 2.49 3492015 工程测控设计报告 第 7 页 (3) 、光电转速计STC89C52 芯片的 P3.5 引脚实现的是计数功能,将 P3.5 引脚转速测量仪的正极接,芯片的 40 引脚与转速测量仪的负极接,板子通电后,即为显示的频率值
10、。6、遇到的问题与解决办法。(1)遇到的问题:焊接完成后连接电源,状态指示灯不亮;解决办法:利用万用表测试焊接板的各点,检测电路的问题。经查状态指示灯所用二极管损坏,更换后,状态指示灯正常工作。(2)遇到的问题:下载电路测试程序(数码管显示程序)后,按下按键 K1 第一位数码管不亮;解决办法:经检查使用数码管应为共阴数码管,而实际使用的数码管为共阳数码管,更换数码管之后问题解决。(3)遇到的问题:涡流称重中单片机测量的电压,始终是万用表测量值的 1/2;解决办法:认真检查 AD 转换中数字量读取的程序,并和所给 ADC0832 时序图相比较,发现在读取数据时少读了一位数据,因此造成所得数字量向
11、左少移一位,更改程序后问题解决。(4)遇到的问题:在涡流称重状态下,数码管显示不稳定,尤其是电压和重量的最低位跳变迅速引起串红,读数困难。解决办法:经老师指导,将显示缓存的赋值改为每 0.5 秒一次,这样数码管的显示至少需要 0.5 秒才会改变一次,从而消除了跳变太快导致的读数困难。1. 焊接、设计、调试心得体会。通过此次课程设计再次熟悉并提高了自己的焊接技术,巩固并加强了 51 单片机 C 语言程序设计能力,深切体会到了 51 单片机在开发过程中利用 keil 编辑软件调试程序的重要性,开发过程要一步步进行,完成一部分功能之后再进行下一功能的开发,最后将程序整合到一起实现所有功能,否则排查错
12、误会十分困难。焊接要按一定的步骤进行,焊接之前先要对元件进行检查,元件能否正常工作、焊接位2015 工程测控设计报告 第 8 页 置是否对应等。然后将焊接模块和独立元件顺序排好依次焊接,例如首先焊接布局紧密部分中的小部件,然后再焊接较大的元件。焊接要完成一个功能模块的焊接,再焊接下一个功能模块,这样也有助于加强对电路的认识。在进行软件开发时,编写流程图有助于结构化编程,使得编程思路更加清晰。编程要化整为零,将一个大功能分解成诸多子功能、子函数,这样有利于提高代码的可读性和重用性。在开发调试过程中,要分别对每个函数进行调试和验证,例如显示子函数、按键子函数、时间调整子函数等,各各功能完成之后再将
13、他们组合,这有利于细化步骤和检查错误。通过此次完整的课程设计,对系统的开发流程,软件的开发步骤等有了清晰的认识,锻炼了动手能力。但这过程中依然暴露出许多问题,例如编程还不十分规范、排查问题的能力还有待提高等。发现自己的不足就要及时的进行补强,在进行理论学习的同时要多多动手实践,要学以致用。在理论学习过程中不忘实践,在实践过程中深化对理论的理解,这样才能达到学习的真是目的和效果。附加内容 1:软件时钟/*注:按键抬手时瞬间显示*/#include /定义 8052 的特殊功能寄存器、中断#include /绝对地址函数#include /字符串函数#include /标准 i/o 函数#incl
14、ude /内部函数2015 工程测控设计报告 第 9 页 #include /数学函数#define uint unsigned int /定义 uint 代替 unsigned int #define uchar unsigned char /定义 uchar 代替 unsigned char#define ulong unsigned long /定义 ulong 代替 unsigned long /void display(void); /六位数码管显示程序void initsiu(void); /初始化单片机void delay(void); /延时程序void delay1ms(un
15、signed int i);void delay500us();uchar inkey(void); /键盘输入程序void timeset();void DisplaySecond(unsigned char s);void DisplayMinute(unsigned char m);void DisplayHour(unsigned char h);uchar code seg=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; /显示缓存 数码管/ 0 1 2 3 4 5 6 7 8 9 uchar int_time ; /中断次数计数
16、变量char second; /秒计数变量char minute; /分钟计数变量2015 工程测控设计报告 第 10 页 char hour; /小时计数变量uchar keyscan;char set=0;/ timesetchar add=0;/ timesetchar swee=0;sbit zsd=P10;/LEDsbit P20=P20;/sbit P21=P21;/sbit P22=P22;/sbit P23=P23;/74LS138 - CS/*主程序*/void main()/uchar i;initsiu(); /调用:初始化单片机/i=inkey(); /调用:键盘输入程
17、序P23=0;while(1)2015 工程测控设计报告 第 11 页 DisplaySecond(second); /调用秒显示子程序delay1ms(1);DisplayMinute(minute); /调用分钟显示子程序delay1ms(1);DisplayHour(hour); delay1ms(1); keyscan=inkey(); /调用:键盘输入程序timeset();/*延时程序*/void delay(void)uchar i;for (i=0;iTR11 开始计数,C/T=0-对内部计数,模式1-16 位计数TH0=(65536-50000)/256; /51 计数器为加
18、计数TL0=(65536-50000)%256;ET0=1; /打开定时器 0 中断ET1=0; /关闭定时器 1 中断TR0=1; /打开计数器 0TR1=0; /关闭计数器 1EA=1; /总中断允许int_time=0; /中断计数变量初始化second=0; /秒计数变量初始化minute=30; /分钟计数变量初始化hour=6; /小时计数变量初始化2015 工程测控设计报告 第 14 页 /*键盘输入程序 1:0x70 2:0xb0 3:0xd0 4: 0xe0 */uchar inkey(void)uchar jjj,keydat;/P2 = 0xff; /P2 准备读入P2
19、|= 0xf0; /P2 准备读入 高 4 位置 1 低 4 位不变keydat = P2; /读入键值keydat = keydat /找出四个键的值if (keydat != 0xf0) /有键输入_nop_();_nop_();jjj = P2; /再读,去抖动jjj = jjj if (jjj != keydat)keydat = 0xf0;2015 工程测控设计报告 第 15 页 do jjj = P2;jjj = jjj /等待键松手while (jjj != 0xf0);return (keydat);void timeset()switch(keyscan)case 0x70:
20、 /0111 0000ET0=1; /打开定时器 0 中断TR0=1; /打开计数器 0set-;if(set2) set=0;break;case 0xd0: /1101 0000add-; break;case 0xe0: /1110 0000add+; break;default :break;switch(set)case(0):second+=add;if(second60) second=0;if(second60) minute=0;if(minute24) hour=0;if(hour1111 0111P0=segs/10; /显示十位delay1ms(2);P22=1;P21
21、=0;P20=1;/xxxx x101 -1111 1011P0=segs%10; /显示个位delay1ms(2);/*函数功能:显示分钟的子程序入口参数:m*/void DisplayMinute(unsigned char m)2015 工程测控设计报告 第 19 页 P22=0;P21=1;P20=0;/xxxx x010 -1110 1111P0=segm/10;/显示十位delay1ms(2);P22=0;P21=1;P20=1;/xxxx x011 -1101 1111P0=segm%10|0x80;delay1ms(2);/*函数功能:显示小时的子程序入口参数:h*/void
22、DisplayHour(unsigned char h)P22=0;P21=0;P20=0;/xxxx x000 -0111 1111P0=segh/10; /显示十位 delay1ms(2);2015 工程测控设计报告 第 20 页 P22=0;P21=0;P20=1;/xxxx x001 -1011 1111P0=segh%10|0x80; /显示个位delay1ms(2);/*函数功能:定时器 T0 的中断服务子程序*/void interserve(void ) interrupt 1 using 1 /using Time0int_time+;if(int_time=20)int_t
23、ime=0; /中断计数变量清 0second+; /秒计数变量加 1if(second=60)second=0; /如果秒计满 60,将秒计数变量清 02015 工程测控设计报告 第 21 页 minute+; /分钟计数变量加 1if(minute=60)minute=0; /如果分钟计满 60,将分钟计数变量清 0hour+; /小时计数变量加 1if(hour=24)hour=0; /如果小时计满 24,将小时计数变量清 0TH0=(65536-50000)/256; /定时器重新赋初值TL0=(65536-50000)%256; 附加内容 2:涡流称重计综合程序/*程序名称:2015
24、 工程测控设计报告 第 22 页 */#include #include #define uchar unsigned char /定义 uchar 代替 unsigned char#define uint unsigned int /定义 uint 代替 unsigned int #define ulong unsigned long /定义 ulong 代替 unsigned long void delay1ms(unsigned int i);void convdata(unsigned char i);void display(void); /六位数码管显示程序sbit LED1=P1
25、0;/LEDsbit P23=P23;/74LS138 - CSsbit P22=P22;/74LS138sbit P21=P21;/74LS138sbit P20=P20;/74LS138sbit ADDI = P33; /数据输入接口 P3.3 接口进行分时复用sbit ADDO = P33; /数据输出接口2015 工程测控设计报告 第 23 页 sbit ADCLK = P34; /时钟接口 sbit ADCS = P35; /使能接口uchar code seg=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; /数码管/ 0 1
26、2 3 4 5 6 7 8 9uchar dis = 0,0,0,0,0,0; /AD 转换为电压显示double adg=0;double adv=0;uchar Temp;/*函数名称:void AD_init(uchar i)函数作用:初始化 ADC0832参数说明:i=2,表示通道 0,i=3,表示通道 10010 0011*/uchar ADC0832(uchar ch) uchar temp = 0;uchar temp1 = 0;2015 工程测控设计报告 第 24 页 uchar temp2 = 0;uchar i = 0;/*在第 1 个时钟脉冲的下沉之前 DI 端必须是高电
27、平,表示启始信号*/ADCLK = 0;_nop_();_nop_();ADDI = 1; _nop_();_nop_();ADCS = 0; /使能 ADC0832_nop_();_nop_();ADCLK = 1;_nop_();_nop_();ADCLK = 0; /形成下降沿 1 _nop_();_nop_(); /*在第 2、3 个脉冲下沉之前 DI 端应输入 2 位数据用于选择通道功能*/2015 工程测控设计报告 第 25 页 ADDI = 1;_nop_();_nop_();ADCLK = 1;_nop_();_nop_();ADCLK = 0; /形成下降沿 2 _nop_(
28、);_nop_();ADDI = 0;_nop_();_nop_();ADCLK = 1;_nop_();_nop_();ADCLK = 0; /形成下降沿 3 _nop_();_nop_();2015 工程测控设计报告 第 26 页 ADDI = 1; _nop_();_nop_();/第 4-11 个脉冲期间读数据(MSB-LSB ) DATA7DATA0for(i = 0; i i;2015 工程测控设计报告 第 27 页 /第 11-18 个脉冲期间读数据(LSB-MSB ) DATA0DATA7 反向校验for(i = 0; i 125) adg=3.5;/1.52.5else if
29、(adv75) adg=adv/50+1.0; /0.51.5else if(adv25) adg=adv/50*2.5-1.25;/00.5else adg=0;2015 工程测控设计报告 第 30 页 /adg=1.55;/13 位dis0 = i/50; /个位dis1 = (i%50)/5; /小数点后第一位dis2 = (i%50)%5; /小数点后第二位/46 位/dis3 = i/100; /dis4 = (i%100)/10; /dis5 = (i%100)%10; /46 位dis3 = (uchar)adg%10; /dis4 = (uchar)(adg*10)%10; /dis5 = (uchar)(adg*100)%100%10; /