ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:85.61KB ,
资源ID:6117844      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6117844.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(使用51单片机设计软件钟涡流称重计光电转速计.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

使用51单片机设计软件钟涡流称重计光电转速计.docx

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

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

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

4、显示缓冲区子程序E. 设置时间子程序F. 时钟调整子程序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(v

5、oid);void tzszw(uchar 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)

6、setsz(); jssz(); display(); /显示 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 dis

7、dat0-; hour=disdat0*10+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 (z

8、j=0) disdat2+; if (disdat25) 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 (disdat4

9、5) disdat4=0; else if (disdat4=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

10、-对内部计数,模式1-16位计数 TH0=0X3C; 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 =

11、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); 六、 测试结果分析:经过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进行单通道

15、转换。当2 位数据为“0”、“0”时,将CH0作为正输入端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 个脉冲时数据输出

16、完成,也标志着一次A/D转换的结束。最后将CS置高电平禁用芯片,直接将转换后的数据进行处理就可以了。三、实现功能要求:使用时用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

17、 char/ADC0832的引脚sbit ADCS =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转换回来的值ucha

18、r e=0;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+) /共显示3个数据 if(e=0) disa = dispbufi;/显示数据 else disa = i - 3; if (disa 1)&0x1; _nop_(); _nop_(); ADCLK=0;/拉低CLK端,

19、形成下降沿3 ADDI=1;/控制命令结束 _nop_(); _nop_(); dat=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;/拉低C

20、S端 ADCLK=0;/拉低CLK端 ADDO=1;/拉高数据端,回到初始状态 dat=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/1

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1