课程设计报告使用51单片机设计软件钟、涡流称重计、光电转速计.doc

上传人:仙人指路1688 文档编号:2885046 上传时间:2023-03-01 格式:DOC 页数:15 大小:131KB
返回 下载 相关 举报
课程设计报告使用51单片机设计软件钟、涡流称重计、光电转速计.doc_第1页
第1页 / 共15页
课程设计报告使用51单片机设计软件钟、涡流称重计、光电转速计.doc_第2页
第2页 / 共15页
课程设计报告使用51单片机设计软件钟、涡流称重计、光电转速计.doc_第3页
第3页 / 共15页
课程设计报告使用51单片机设计软件钟、涡流称重计、光电转速计.doc_第4页
第4页 / 共15页
课程设计报告使用51单片机设计软件钟、涡流称重计、光电转速计.doc_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《课程设计报告使用51单片机设计软件钟、涡流称重计、光电转速计.doc》由会员分享,可在线阅读,更多相关《课程设计报告使用51单片机设计软件钟、涡流称重计、光电转速计.doc(15页珍藏版)》请在三一办公上搜索。

1、课程设计报告课题一 使用51单片机设计软件钟一、 实验目的:1. 掌握元器件及芯片的焊接与调试;2. 了解基于51单片机的软件钟的工作原理;3. 会用C语言编写时钟函数,复习用switch语句和do-while语句、for语句实现循环的方法;4. 会使用MEDWIN编译调试程序,并生成HEX,通过数据线下载到电路板上;5. 根据自己焊接的板子在程序中设置按键控制时钟的调整。二、 算法原理:所谓软件钟就是利用51单片机制作一个电子时钟。其算法就是以单片机的时钟为基准,记录单片机时钟脉冲的数量,当数量足够多(如脉冲为每秒6Mhz,那么记录6M个脉冲所需时间即为1秒)就可以将显示部分的“秒”位加一。

2、加到60以后进位为“分”,”秒“位清零以后继续记录。当“分”累加为60以后进位为”时“,”分“位清零以后继续记录,当”时“位为24以后,”时“位清零并继续记录。三、 硬件原理: 显示电路:单片机外围电路(复位电路,时钟电路): 按键控制电路: 数码管驱动电路:四、 实现功能要求:使用中需要对时钟进行调整。在调整的时候需要一个按键来进入调整状态。进入调整状态以后需要一个按键来向左移动调整位置,一个按键来向右移动调整位置,一个按键来增加所选位置的数值,一个按键来减小所选位置的数值。调整完成以后还需要一个按键来 退出调整位置,恢复时钟的计数运转。以上所需按键可以根据需要合并。在调整中另外一个需要注意

3、的问题是如何显示目前所选定调整的位置(如秒的个位或者十位,分的个位或者十位等)。可以采用是否显示数位右下的小数点或者所选需调整位是否闪烁来让操作者明确目前自己所选定的需要调整的数位。五、 设计内容:(1)硬件焊接:按照电路图焊接好各个元器件和芯片插座,注意焊接时焊点要尽量光滑,与管脚接触良好,元件的管脚弯曲处要尽量光滑,有需要区分正负极的元器件焊接时要注意不要焊反。焊接完后将元件多余的管脚用尖嘴钳剪掉,以免形成短路。(2)软件设计:1子程序设计:A. 单片机初始化程序a) 定时器T0中断服务程序B. 显示子程序C. 时钟运行计数子程序D. 时间数据送显示缓冲区子程序E. 设置时间子程序F. 时

4、钟调整子程序G. 键值读入子程序H. 延时子程序2.实验程序清单:#pragma db oe#include #include #include #include #include #include #define uint unsigned int#define uchar unsigned char#define ulong unsigned longvoid display(void);void initsiu(void);void delay(void);void sztz(void);void jssz(void);void setsz(void);void tzszw(uchar

5、zj);uchar inkey(void);uchar sec,min,hour;uchar disdat6;uchar code tab=0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x7,0x7f,0x6f;uint count;uchar set_state,xsd;sbit zsd=P10;main()uchar i; for (i=0;i2;i+) disdati= 0; /将显示缓存清零 initsiu(); /初始化单片机 set_state=0; do i=inkey(); /设置时钟 if(i=0x70) setsz(); jssz(); displa

6、y(); /显示 if(sec & 0x01) /指示灯闪烁 zsd=1; else zsd=0; while(1);void display(void)/六位数码管显示程序,disdat是要显示的内容(是09的数字),xsd是在那一位显示小数点 uchar i,disa,disb,disc; disb = 0x00; /显示第n位 for (i=0;i6;i+) /共显示6个数据 disa = disdati; /显示数据 if (disa 2) disdat0=0; else if (disdat0=0) disdat0=2; else disdat0-; hour=disdat0*10+

7、disdat1; break; case 1: /时低位调整 if (zj=0) disdat1+; if (disdat19) disdat1=0; else if (disdat0!=2&disdat1=0) disdat1=9; /else /disdat1-; else if(disdat0=2&disdat1=0) disdat1=3;else disdat1-; if(disdat0=2&disdat13) disdat1=0; hour=disdat0*10+disdat1; break; case 2: /分高位调整 if (zj=0) disdat2+; if (disdat

8、25) disdat2=0; else if (disdat2=0) disdat2=5; else disdat2-; min=disdat2*10+disdat3; break; case 3: /分低位调整 if (zj=0) disdat3+; if (disdat39) disdat3=0; else if (disdat3=0) disdat3=9; else disdat3-; min=disdat2*10+disdat3; break; case 4: /秒高位调整 if (zj=0) disdat4+; if (disdat45) disdat4=0; else if (di

9、sdat4=0) disdat4=5; else disdat4-; sec=disdat4*10+disdat5; break;case 5: /秒低位调整 if (zj=0) disdat5+; if (disdat59) disdat5=0; else if (disdat5=0) disdat5=9; else disdat5-; sec=disdat4*10+disdat5; break; default: break; void delay(void) /延时程序 uchar i; for (i=0;iTR11开始计数,C/T=0-对内部计数,模式1-16位计数 TH0=0X3C;

10、 TL0=0XAF; ET0=1; /打开定时器0中断 ET1=0; /关闭定时器1中断 TR0=1; /打开计数器0 TR1=0; /关闭计数器1 EA=1; /总中断允许void inttime0(void) interrupt 1 using 1 TH0=0X3C; /50ms中断一次,20次为一秒,调整时间一次 TL0=0XAF; count+; if (count=20) count=0; sztz(); uchar inkey(void) uchar jjj,keydat; P2 = 0xff; /P2准备读入 keydat = P2; /读入键值 keydat = keydat

11、& 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); 六、 测试结果分析:经过medwin对程序的调试无误后,将hex文件下载到电路板上,可正常显示时钟,并且可以通过按键对时钟进行调整。针对我的程序,按键实现功能依次为:一号键:进入和退出设

12、置,当时钟运行时按下可进入设置;当设置完成后按下可恢复时钟显示。二号键:右移一位。在设置状态每次按下就右移一位。三号键:加一四号键:减一此外还设有一个复位键,按下后时钟归零。七、 遇到的问题与解决方法:问题一:如何编写时钟函数?解决方法:每60秒进一位,即一分钟;每60分钟进一位,即一小时;在函数体内用循环,在主函数中调用。编写时注意当时高位为2时,时地位最高到3,且分高位和秒高位最高为5。问题二:如何设置时间?解决方法:改变现实状态,将现在的结果放到数组中去,读取按键,设置按键对时钟进行调整,编写SWITCH语句控制按键的选择。问题三:如何解决时间变化太快?解决方法:使用一个延时函数来缓冲每

13、一秒变化时间。八、 实验总结:通过本次实验,我对时钟函数的编写有了更深一步的掌握,复习了C语言的编程。并且可以通过自己焊接的板子来调试时钟程序,对今后的学习与研究有了很大的帮助课题二 使用51单片机设计涡流称重计一、实验目的1. 了解电涡流传感器用于称重的原理与方法;2. 熟悉ADC0832的器件手册;3. 了解基于51单片机的涡流称重计的工作原理;4. 会用C语言编写时钟函数,复习用switch语句和do-while语句、for语句实现循环的方法;5. 会使用MEDWIN编译调试程序,并生成HEX,通过数据线下载到电路板上;二、算法原理本项设计中用电位器的中间抽头所输出的电压模拟采集的重量数

14、据,单片机经ADC0832的通道0输入该电压信号,并将其转换为数字信息送6位共阳8段LED显示。ADC0832的芯片接口说明: CS_ 片选使能,低电平芯片使能。 CH0 模拟输入通道0,或作为IN+/-使用。 CH1 模拟输入通道1,或作为IN+/-使用。 GND 芯片参考0 电位(地)。 DI 数据信号输入,选择通道控制。 DO 数据信号输出,转换数据输出。 CLK 芯片时钟输入。 Vcc/REF 电源输入及参考电压输入(复用)当此2 位数据为“1”、“0”时,只对CH0 进行单通道转换。当2位数据为“1”、“1”时,只对CH1进行单通道转换。当2 位数据为“0”、“0”时,将CH0作为正

15、输入端IN+,CH1作为负输入端IN-进行输入。当2 位数据为“0”、“1”时,将CH0作为负输入端IN-,CH1 作为正输入端IN+进行输入。到第3 个脉冲的下沉之后DI端的输入电平就失去输入作用,此后DO/DI端则开始利用数据输出DO进行转换数据的读取。从第4个脉冲下沉开始由DO端输出转换数据最高位DATA7,随后每一个脉冲下沉DO端输出下一位数据。直到第11个脉冲时发出最低位数据DATA0,一个字节的数据输出完成。也正是从此位开始输出下一个相反字节的数据,即从第11个字节的下沉输出DATD0。随后输出8位数据,到第19 个脉冲时数据输出完成,也标志着一次A/D转换的结束。最后将CS置高电

16、平禁用芯片,直接将转换后的数据进行处理就可以了。三、实现功能要求:使用时用5V的电压来表示200g的重量,使用通道O来输入模拟量。四、设计内容:(1)硬件焊接:根据ADC0832的接口说明焊接导线(2)软件设计:1子程序设计:A. 单片机的初始化程序B. 显示子程序C. 3.0832的转换子程序D. 采样数据换算压力子程序E. 将压力值转换为十进制数,并将每位送入显示缓冲区子程序2.实验程序清单:#include #include intrins.h#define uint unsigned int#define uchar unsigned char/ADC0832的引脚sbit ADCS

17、=P35; /ADC0832 chip seclectsbit ADCLK =P34; /ADC0832 clock signalsbit ADDI =P33; /ADC0832 k insbit ADDO =P33; /ADC0832 k outuchar dispbuf6;uchar code tab=0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x7,0x7f,0x6f;uchar code tab1=0x79,0x3f,0x77;uint temp;uchar getdata; /获取ADC转换回来的值uchar e=0;void delay(void)/延时程

18、序uchar i;for (i=0;i201;i+)_nop_();void display(void) /六位数码管显示程序,disdat是要显示的内容(是09的数字),xsd是在那一位显示小数点uchar i,disa,disb,disc;disb = 0x00;/显示第n位for (i=0;i6;i+)/共显示3个数据if(e=0)disa = dispbufi;/显示数据elsedisa = i - 3;if (disa 1)&0x1; _nop_(); _nop_(); ADCLK=0;/拉低CLK端,形成下降沿3 ADDI=1;/控制命令结束 _nop_(); _nop_(); d

19、at=0; for(i=0;i8;i+) dat|=ADDO;/收数据 ADCLK=1; _nop_(); _nop_(); ADCLK=0;/形成一次时钟脉冲 _nop_(); _nop_(); dat=1; if(i=7)dat|=ADDO; for(i=0;i8;i+) j=0; j=j|ADDO;/收数据 ADCLK=1; _nop_(); _nop_(); ADCLK=0;/形成一次时钟脉冲 _nop_(); _nop_(); j=j7; ndat=ndat|j; if(i=1; ADCS=1;/拉低CS端 ADCLK=0;/拉低CLK端 ADDO=1;/拉高数据端,回到初始状态 d

20、at=8; dat|=ndat; return(dat); /return ad kvoid main(void) /double k; unsigned int w; while(1) getdata=Adc0832(0); temp=getdata*1.0/255*500; /电压值转换,5V做为参考电压,分成256份。 dispbuf2=temp%10; /个位 dispbuf1=temp/10%10; /十位 dispbuf0=temp/100; /百位 w = temp * 1.0 /2.5;if(w=199)e=0; dispbuf5=w%10; /个位 dispbuf4=w/10

21、%10; /十位 dispbuf3=w/100; /百位elsee = 1; display(); 五、测试结果分析:此电路板实现的功能是从电位器中分出一部分电压,并将其进行A/D转换,将模拟量转换为数字量,把电压显示高三位数码管,并且通过换算得到它对应的克数值,显示在低三位数码管,经过调试,我测的最高值为4.98v 199g,继续增大后则开始报错,在后三位数码管显示“EOR”。六、遇到的问题及解决方法:问题一:如何编写程序选择O通道?解决方法:根据ADC0832的接口说明可知,当2 位数据为“1”、“0”时,只对CH0 进行单通道转换,所以可以编写语句:if(channel=0)channe

22、l=2;问题二:如何用0832采集模拟量?解决方法:分别用两个for循环,从高位开始采集一次,再从地位开始采集一次,对两次的结果进行校验,一致则输入。问题三:如何设置电压值?解决方法:用5V作为参考电压,分成256份,用从ADC0832采集来的数据除以255再乘以500。七、实验总结: 通过本次实验,我对ADC0832的接口和工作原理有了进一步的了解,并且会用C语言编程来实现ADC0832的数据采集,为今后的学习和研究打下了良好的基础。课题三 使用51单片机设计光电转速计一、实验目的:1. 了解光电传感器的工作原理及其使用方法;2. 熟悉掌握AT89C51系列单片微型计算机的工作原理;3. 了

23、解基于51单片机的涡流称重计的工作原理;4. 会用C语言编写时钟函数,复习用switch语句和do-while语句、for语句实现循环的方法;5. 会使用MEDWIN编译调试程序,并生成HEX,通过数据线下载到电路板上;二、算法原理:数字频率计的基本原理数字频率计是直接用十进制数字来显示被测信号频率的一种测量装置。它不仅可以测量正弦波,方波,三角波和尖脉冲信号的频率,而且还可以测量他们的周期。数字频率计在测量其他物理量如转速、振荡频率等方面获得广泛应用。所谓频率,就是周期性信号在单位时间(1s)里变化的次数。若在一定时间间隔T内测得的这个周期性信号的重复变化次数N,则其频率可表示为f =N/T

24、,一般为简单起见我们通常选择测量间隔为1秒(即T1),这样1秒内信号重复变化的次数就是信号的频率。1秒的计数周期要采用单片机本身的时钟脉冲来计算,在1秒的时间内,记录的外部脉冲的数量就是外部信号的频率。所以一共需要2个计数过程,一个是记录单片机本身时钟脉冲的个数以准确划定1秒的时间,一个是记录外部脉冲的个数,以准确记录外部信号的频率。因为显示的数码管数量有限,所以在编写程序时要注意采用小数点所在的位置来表示频率单位频率计同时应具有测量信号周期的功能,由f1/T可知,加入一段求倒数的代码即可求得周期。可以通过按键来切换显示的内容是信号的频率还是周期。三、硬件原理:1、光电测量部分原理:检测齿轮上

25、有12个齿均匀分布在轮盘周围,并被直接固定在被测轴上,安装时光电耦合器的发光二极管和光敏三极管正对齿轮上的齿,当被测轴转动时带动检测齿轮转动,光电耦合器通过对检测齿轮上的齿进行耦合从而产生数字脉冲。脉冲经过放大送向单片机的计数端。 2、单片机部分工作原理: 本次采用的单片机为AT89C51,内有两个定时/计数器。在程序设计时笔者将T0定时/计数器作为1秒定时使用,将T1定时/计数器作对脉冲的计数器使用。单片机计数端在接收到脉冲后对脉冲进行计数,每隔1秒提取TH1和TL1中的计数数据,并进行相应的运算,对16进制数据进行处理,得到10进制数据,送显示缓存进行显示输出。四、实现功能要求:本实验要求

26、编写程序实现当板子上的P3.5引脚接光电转速计时,在数码管上显示转速,单位为转/分。并且设置一个按键,当按键按下时,数码管显示的是旋转周期,并且通过此按键可以实现频率与周期的交替显示。五、设计内容:(1)硬件焊接:在之前焊接好的板子的基础上,从P3.5端引出一根导线,与光电测速仪的正极相连,负极与板子的地端相连。(2)软件设计:程序清单:#include #include #include #define uint unsigned int#define uchar unsigned char#define ulong unsigned longuchar disValue6;uchar lb

27、1,hb1; uint Value;uchar code tab=0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x7,0x7f,0x6f;uint count;void delay(void)/延时程序uchar i;for (i=0;i201;i+)_nop_();void display(void) /六位数码管显示程序,disdat是要显示的内容(是09的数字),xsd是在那一位显示小数点uchar i,disa,disb,disc;disb = 0x00;/显示第n位for (i=0;i6;i+) /共显示6个数据disa = disValuei;/显示数据if

28、 (disa TR11开始计数,C/T=0-对内部计数,模式1-16位计数TH0=0X3C;TL0=0XB0;TH1=0X00;TL1=0X00;ET0=1;/打开定时器0中断ET1=0;/关闭计数器1中断TR0=1;/打开定时器0TR1=1;/关闭计数器1EA=1;/总中断允许void inttime0(void) interrupt 1 using 1TH0=0X3C;/50ms中断一次,20次为一秒,调整时间一次TL0=0XB0;count+;if (count=20)count=0;sztz();TR1 = 0;lb1=TL1;hb1=TH1;TH1=0X00;TL1=0X00;TR1

29、 = 1;void main(void) uchar i; initsiu();/初始化单片机 while(1) Value = (lb1 + hb1 * 256)*5; disValue5=Value%10; /个位 disValue4=Value/10%10; /十位 disValue3=Value/100%10; /百位 disValue2=Value/1000%10; /千位 disValue1=Value/10000; /万位 display(); 六、测试结果及分析:STC89C52芯片的P3.5引脚实现的是计数功能,将P3.5引脚转速测量仪的正极接,芯片的地线与转速测量仪的负极接

30、,板子通电后,即为显示的频率值。由于我编写的频率转周期的函数不能读入缓冲区,所以我的程序不能实现由频率到周期的转换,只能显示和仪器上一样的频率数值。七、遇到的问题和解决方法:问题一:如何编写程序选择定时器和计数器的工作方式?解决方法:根据定时方式控制寄存器TMOD的格式:GATEC/TM1M0GATEC/TM1M0前四位控制T1,后四位控制T0,所以编写语句:TMOD=0x51; gate0-TR11开始计数,C/T=0-对内部计数,方式1-16位计数。问题二:如何设置计数器初值?解决方法:本程序要求50ms中断一次,20次为一秒,调整时间一次。又有TC=M-T/T计数 ,方式一下M=216所以TC=216-50ms/1us=3CB0,分别存在高八位和第八位中。八、实验总结:通过本次实验我学会了光电测速仪的工作原理,复习了TMOD的控制格式。但由于

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号