工程测控设计报告数字时钟涡流称重_第1页
工程测控设计报告数字时钟涡流称重_第2页
工程测控设计报告数字时钟涡流称重_第3页
工程测控设计报告数字时钟涡流称重_第4页
工程测控设计报告数字时钟涡流称重_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 2015工程测控设计报告 第37页 工程测控设计报告班级:电子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实现涡流称重计在两个不同函数之间的切换。光电转速计的设计要求:本实验要求编写程序实现当板子上的P3.5引脚接光电转速计时,在数码管上的后三位显示转速,单位为转/分,前三位显示脉冲频率,单位是脉冲/秒。2、硬件电路的原理框图(1)、软件时钟的硬件电路原理图显示电路电源及功能指示电路 单片机外围电路(复位电路、时钟电路) 按键控制电路 数码管驱动电路 4个按键的地址从左至右依次为:0xe0、0xd0、0xb0、0xff(2)、涡流称重计

4、原理图3、软件设计(1)、软件时钟的软件设计算法的原理概述所谓软件时钟就是利用51单片机制作一个电子时钟。其算法就是以单片机的时钟为基准,记录单片机时钟脉冲的数量,当数量足够多(如脉冲为每秒12Mhz,那么记录12M个脉冲所需时间即为1秒)就可以将显示部分的“秒”位加一。加到60以后进位为“分”,“秒”位清零以后继续记录。当“分”累加为60以后进位为“时”,“分”位清零以后继续记录,当“时”位为24以后,“时”位清零并继续记录。程序流程图见图3-1源程序见本报告最后附加页文档。(2)、涡流称重计的软件设计算法的原理概述本项设计中用电位器的中间抽头所输出的电压模拟采集的重量数据,单片机经ADC0

5、832的通道0输入该电压信号,并将其转换为数字信息送6位共阳8段LED显示。程序流程图见图3-2源程序见本报告最后附加页文档。(3)、光电转速计的软件设计算法的原理概述数字频率计是直接用十进制数字来显示被测信号频率的一种测量装置。它不仅可以测量正弦波,方波,三角波和尖脉冲信号的频率,而且还可以测量他们的周期。数字频率计在测量其他物理量如转速、振荡频率等方面获得广泛应用。所谓频率,就是周期性信号在单位时间(1s)里变化的次数。若在一定时间间隔T内测得的这个周期性信号的重复变化次数N,则其频率可表示为f =N/T,一般为简单起见我们通常选择测量间隔为1秒(即T1),这样1秒内信号重复变化的次数就是

6、信号的频率1秒的计数周期要采用单片机本身的时钟脉冲来计算,在1秒的时间内,记录的外部脉冲的数量就是外部信号的频率。所以一共需要2个计数过程,一个是记录单片机本身时钟脉冲的个数以准确划定1秒的时间,一个是记录外部脉冲的个数,以准确记录外部信号的频率。因为显示的数码管数量有限,所以在编写程序时要注意采用小数点所在的位置来表示频率单位程序流程图见图3-3源程序见本报告最后附加页文档。图3-3图3-2图3-14、检测装置的使用方法(1)、软件时钟按按键1进入设置状态并进行移位,按键2减,按键3加,按键4退出,调整时间为23:59:57,若三秒后变为00:00:00,则装置没有问题。(2)、涡流称重计按

7、按键2切换测量函数,测量值与相应函数线的理论值进行比较,若误差在允许范围内,则装置没有问题。(3)、光电转速计将单片机P3.5脚接频率发生器正极,40脚接负极,调整频率发生器为方波,频率150HZ,幅值4V,看数码管显示值是否正确。然后将其接入光脉冲上并用数字示波器对脉冲频率进行测量,调整转速在1000以内,查看数码管值转速值是否正确,并与数字示波器的频率值进行比较,查看大小是否相同,若均相同,则装置没有问题。5、测试结果分析(1)、软件时钟本实验共设置了5个按钮,按键1设置小数点到达哪位数码管的值,按键2减小设置位的值,按键3增加设置位的值,到达23:59:59后数据清零为00:00:00,

8、按键1按下后进入设置状态,按键5是复位按键。(2) 、涡流称重计通过从电位器中调出一部分电压,并将其进行A/D转换,将模拟量转换为数字量,显示高三位数码管,测量值显示在低三位数码管,我们组测的最高值为1.96v 199g,超过此数,后三位数码管显示“EOR”。测试数据表格:测试值函数1测试结果函数2测试结果0.50.49 0000.49 0001.00.98 0670.98 0991.51.49 1331.49 1672.01.96 1991.96 1992.52.49 3492.49 349(3)、光电转速计STC89C52芯片的P3.5引脚实现的是计数功能,将P3.5引脚转速测量仪的正极接

9、,芯片的40引脚与转速测量仪的负极接,板子通电后,即为显示的频率值。6、遇到的问题与解决办法。(1) 遇到的问题:焊接完成后连接电源,状态指示灯不亮; 解决办法:利用万用表测试焊接板的各点,检测电路的问题。经查状态指示灯所用二极管损坏,更换后,状态指示灯正常工作。(2)遇到的问题:下载电路测试程序(数码管显示程序)后,按下按键K1第一位数码管不亮; 解决办法:经检查使用数码管应为共阴数码管,而实际使用的数码管为共阳数码管,更换数码管之后问题解决。(3) 遇到的问题:涡流称重中单片机测量的电压,始终是万用表测量值的1/2; 解决办法:认真检查AD转换中数字量读取的程序,并和所给ADC0832时序

10、图相比较,发现在读取数据时少读了一位数据,因此造成所得数字量向左少移一位,更改程序后问题解决。(4) 遇到的问题:在涡流称重状态下,数码管显示不稳定,尤其是电压和重量的最低位跳变迅速引起串红,读数困难。 解决办法:经老师指导,将显示缓存的赋值改为每0.5秒一次,这样数码管的显示至少需要0.5秒才会改变一次,从而消除了跳变太快导致的读数困难。附加内容1:软件时钟/*注:按键抬手时瞬间显示*/#include <reg52.h> /定义8052的特殊功能寄存器、中断#include <absacc.h> /绝对地址函数#include <string.h> /字

11、符串函数#include <stdio.h> /标准i/o函数#include <intrins.h> /内部函数#include <MATH.H> /数学函数#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)

12、; /初始化单片机void delay(void); /延时程序void delay1ms(unsigned 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; /显示缓存数码

13、管 / 0 1 2 3 4 5 6 7 8 9 uchar int_time ; /中断次数计数变量char second; /秒计数变量char minute; /分钟计数变量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(); /调

14、用:初始化单片机/i=inkey(); /调用:键盘输入程序P23=0; while(1) DisplaySecond(second); /调用秒显示子程序 delay1ms(1); DisplayMinute(minute); /调用分钟显示子程序 delay1ms(1);DisplayHour(hour); delay1ms(1); keyscan=inkey(); /调用:键盘输入程序timeset(); /* 延时程序*/void delay(void)uchar i;for (i=0;i<201;i+)_nop_();void delay1ms(unsigned int i)

15、unsigned char j; while(i-) for(j=0;j<115;j+)/延时1ms的延时语句(11.0592M晶振时) void delay500us() unsigned char j; for(j=0;j<57;j+)/延时500us的延时语句(11.0592M晶振时) /* 初始化程序 */void initsiu(void)TMOD=0x11;/定时器1:gate0->TR11开始计数,C/T=0->对内部计数,模式1->16位计数TH0=(65536-50000)/256; /51计数器为加计数TL0=(65536-50000)%256

16、;ET0=1;/打开定时器0中断ET1=0;/关闭定时器1中断TR0=1;/打开计数器0TR1=0;/关闭计数器1EA=1;/总中断允许int_time=0; /中断计数变量初始化second=0; /秒计数变量初始化 minute=30; /分钟计数变量初始化hour=6; /小时计数变量初始化/* 键盘输入程序 1:0x70 2:0xb0 3:0xd0 4: 0xe0 */uchar inkey(void)uchar jjj,keydat; /P2 = 0xff;/P2准备读入P2 |= 0xf0; /P2准备读入 高4位置1 低4位不变 keydat = P2;/读入键值 keydat

17、= 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);void timeset() switch(keyscan) case 0x70: /0111 0000ET0=1;/打开定时器0中断 TR0=1;/打

18、开计数器0set-;if(set<0) set=2; break;case 0xb0: /1011 0000ET0=0;/关闭定时器0中断 TR0=0;/关闭计数器0set+;if(set>2) set=0; break;case 0xd0: /1101 0000add-; break;case 0xe0: /1110 0000add+; break;default :break;switch(set) case(0): second+=add;if(second>60) second=0;if(second<0) second=59;add=0; break;case

19、(1): minute+=add;if(minute>60) minute=0;if(minute<0) minute=59;add=0; break;case(2): hour+=add; if(hour>24) hour=0;if(hour<0) hour=23;add=0; break; default :break; /*函数功能:显示秒的子程序入口参数:s*/ void DisplaySecond(unsigned char s) P22=1;P21=0;P20=0;/xxxx x100 ->1111 0111 P0=segs/10; /显示十位 del

20、ay1ms(2); P22=1;P21=0;P20=1;/xxxx x101 ->1111 1011 P0=segs%10; /显示个位 delay1ms(2); /*函数功能:显示分钟的子程序入口参数:m*/void DisplayMinute(unsigned char m) P22=0;P21=1;P20=0;/xxxx x010 ->1110 1111 P0=segm/10;/显示十位 delay1ms(2); P22=0;P21=1;P20=1;/xxxx x011 ->1101 1111P0=segm%10|0x80;delay1ms(2); /*函数功能:显示小

21、时的子程序入口参数:h*/void DisplayHour(unsigned char h) P22=0;P21=0;P20=0;/xxxx x000 ->0111 1111 P0=segh/10; /显示十位 delay1ms(2); P22=0;P21=0;P20=1;/xxxx x001 ->1011 1111 P0=segh%10|0x80; /显示个位 delay1ms(2); /*函数功能:定时器T0的中断服务子程序*/void interserve(void ) interrupt 1 using 1 /using Time0 int_time+;if(int_tim

22、e=20) int_time=0; /中断计数变量清0 second+; /秒计数变量加1if(second=60)second=0; /如果秒计满60,将秒计数变量清0minute+; /分钟计数变量加1if(minute=60)minute=0; /如果分钟计满60,将分钟计数变量清0hour+; /小时计数变量加1if(hour=24) hour=0; /如果小时计满24,将小时计数变量清0TH0=(65536-50000)/256; /定时器重新赋初值TL0=(65536-50000)%256; 附加内容2:涡流称重计综合程序/*程序名称:*/#include <reg52.h&

23、gt;#include <intrins.h>#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=P10;/LEDsbit P23=P2

24、3;/74LS138 - CSsbit P22=P22;/74LS138sbit P21=P21;/74LS138sbit P20=P20;/74LS138sbit ADDI = P33; /数据输入接口 P3.3接口进行分时复用sbit ADDO = P33; /数据输出接口sbit ADCLK = P34; /时钟接口 sbit ADCS = P35; /使能接口uchar code seg=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; /数码管 / 0 1 2 3 4 5 6 7 8 9uchar dis = 0,0,0,0,0,0

25、; /AD转换为电压显示double adg=0;double adv=0;uchar Temp;/*函数名称:void AD_init(uchar i)函数作用:初始化ADC0832参数说明:i=2,表示通道0,i=3,表示通道1 0010 0011*/uchar ADC0832(uchar ch) uchar temp = 0; uchar temp1 = 0; uchar temp2 = 0; uchar i = 0; /*在第1个时钟脉冲的下沉之前DI端必须是高电平,表示启始信号*/ADCLK = 0; _nop_(); _nop_(); ADDI = 1; _nop_(); _nop

26、_(); ADCS = 0; /使能ADC0832 _nop_(); _nop_(); ADCLK = 1; _nop_(); _nop_(); ADCLK = 0; /形成下降沿1 _nop_(); _nop_(); /*在第2、3个脉冲下沉之前DI端应输入2位数据用于选择通道功能*/ ADDI = 1; _nop_(); _nop_(); ADCLK = 1; _nop_(); _nop_(); ADCLK = 0; /形成下降沿2 _nop_(); _nop_(); ADDI = 0; _nop_(); _nop_(); ADCLK = 1; _nop_(); _nop_(); ADCL

27、K = 0; /形成下降沿3 _nop_(); _nop_();ADDI = 1; _nop_(); _nop_(); /第4-11个脉冲期间读数据(MSB->LSB) DATA7DATA0 for(i = 0; i < 8; i+)/读取前8位的值 ADCLK = 1; _nop_(); _nop_(); ADCLK = 0; /形成下降沿 _nop_(); _nop_(); if(ADDI) temp1 |= 0x01; else temp1 |= 0x00; /temp1 = temp1 << 1;temp1 = temp1 >> i; /第11-18

28、个脉冲期间读数据(LSB->MSB) DATA0DATA7反向校验 for(i = 0; i < 8; i+) /读取后8位的值 if(ADDI) temp = 0x01; else temp = 0x00; temp = temp << i; temp2 |= temp; ADCLK = 1; _nop_(); _nop_(); ADCLK = 0; /形成下降沿 _nop_(); _nop_(); ADCS = 1; /ADC0832 _nop_(); _nop_();return temp2;void main() Temp=0; P23=0;/CS Temp=

29、ADC0832(2); while(1) Temp= ADC0832(2); convdata(Temp); display(); /*函数功能:将0-255级换算成0.00-5.00的电压数值入口参数:i出口参数:*/void convdata(uchar i) adv=(double)i; /3.5+if(adv>125) adg=3.5; /1.52.5else if(adv>75) adg=adv/50+1.0; /0.51.5else if(adv>25)adg=adv/50*2.5-1.25; /00.5else adg=0;/adg=1.55; /13位 dis

30、0 = 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; /*函数名称:void display(void)函数作用:数码管显示参数说明:无函数返回:无返回*/void display(void) P22=0;P21=0;P

31、20=0;/xxxx x000 ->0111 1111 P0=segdis0|0x80; /显示个位和小数点 delay1ms(2); P22=0;P21=0;P20=1;/xxxx x001 ->1011 1111 P0=segdis1; /显示小数点后第一位 delay1ms(2); P22=0;P21=1;P20=0;/xxxx x010 ->1101 1111 P0=segdis2; /显示小数点后第二位 delay1ms(2); P22=0;P21=1;P20=1;/xxxx x011 ->1110 1111 P0=segdis3|0x80; delay1ms(2); P22=1;P21=0;P20=0;/xxxx x100 ->1111 0111 P0=segdis4; delay1ms(2); P22=1;P21=0;P20=1;/xxxx x101 ->1111 1011 P0=segdis5; delay1ms(2);/*函数名称:void delay1ms(unsigned int i)函数作用:1ms延时程序*/void delay1ms(unsigned int i) unsigned char j; while(i-) for(j=0;j<125;j+)/延时1ms的延时语句 附加内容

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论