课程设计报告-使用51单片机设计软件钟、涡流称重计、光电转速计(编辑修改稿)内容摘要:

分析 : 经过 medwin对程序的调试无误后,将 hex文件下载到电路板上,可正常显示时钟,并且可以通过按键对时钟进行调整。 针对我的程序,按键实现功能依次为: 一号键:进入和退出设置,当时钟运行时按下可进入设置;当设置完成后按下可恢复时钟显示。 二号键:右移一位。 在设置状态每次按下就右移一位。 三号键:加一 四号键:减一 此外还设有一个复位键,按下后时钟归零。 七、 遇到的问题与解决方法: 问题一:如何编写时钟函数。 解决方法:每 60秒进一位,即一分钟;每 60 分钟进一位,即一小时;在函数体内用循环,在主函数中调用。 编写 时注意当时高位为 2时,时地位最高到 3,且分高位和秒高位最高为 5。 问题二:如何设置时间。 解决方法:改变现实状态,将现在的结果放到数组中去,读取按键,设置按键对时钟进行调整,编写 SWITCH语句控制按键的选择。 问题三:如何解决时间变化太快。 解决方法:使用一个延时函数来缓冲每一秒变化时间。 八、 实验总结 : 通过本次实验,我对时钟函数的编写有了更深一步的掌握, 复习了 C 语言的编程。 并且可以通 第 7 页 共 15 页 过自己焊接的板子来调试时钟程序,对今后的学习与研究有了很大的帮助 课题二 使用 51单片机设计涡流称重计 一、 实验目的 1. 了解电 涡流传感器用于称重的原理与方法 ; 2. 熟悉 ADC0832的器件手册 ; 3. 了解 基于 51单片机 的涡流称重计的工作原理; 4. 会用 C语言编写时钟函数,复习 用 switch语句 和 dowhile语句 、 for语句实现循环的方法 ; 5. 会使用 MEDWIN编译调试程序,并生成 HEX,通过数据线下载到电路板上; 二、算法原理 本项设计中用电位器的中间抽头所输出的电压模拟采集的重量数据,单片机经 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作为正输入端 IN+, CH1作为负输入端IN进行输入。 当 2 位数据为“ 0”、“ 1”时,将 CH0作为负输入端 IN, CH1 作为正输入端 IN+进行输入。 第 8 页 共 15 页 到第 3 个脉冲的下沉之后 DI端的输入电平就失去输入作用,此后 DO/DI端则开始利用数据输出 DO进行转换数据的读取。 从第 4个脉冲下沉开始由 DO端输出转换数据最高位 DATA7,随后每一个脉冲下沉 DO端输出下一位数据。 直到第 11个脉冲时发出最低位数据 DATA0,一个字节的数据输出完成。 也正是从此位开始输出下一个相反字节的数据,即从第 11个字节的下沉输出 DATD0。 随后输出 8位数 据,到第 19 个脉冲时数据输出完成,也标志着一次 A/D转换的结束。 最后将 CS置高电平禁用芯片,直接将转换后的数据进行处理就可以了。 三、实现功能要求: 使用时用 5V的电压来表示 200g的重量,使用通道 O来输入模拟量。 四、设计内容: ( 1) 硬件焊接: 根据 ADC0832的接口说明焊接导线 ( 2) 软件设计: 1.子程序设计: A. 单片机的初始化程序 B. 显示子程序 C. D. 采样数据换算压力子程序 E. 将压力值转换为十进制数,并将每位送入显示缓冲区子程序 : include include define uint unsigned int define uchar unsigned char //ADC0832的引脚 sbit ADCS =P3^5。 //ADC0832 chip seclect sbit ADCLK =P3^4。 //ADC0832 clock signal sbit ADDI =P3^3。 //ADC0832 k in sbit ADDO =P3^3。 //ADC0832 k out uchar dispbuf[6]。 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) //延时程序 { uchar i。 for (i=0。 i201。 i++) _nop_()。 } void display(void) //六位数码管显示程序, disdat[]是要显示的内容(是 0~ 9的数字), xsd是在那一位显示小数点 { uchar i,disa,disb,disc。 disb = 0x00。 //显示第 n位 for (i=0。 i6。 i++) //共显示 3个数据 { if(e==0) disa = dispbuf[i]。 //显示数据 else disa = i 3。 if (disa 10 amp。 amp。 e ==0) { P2 = disb。 disc = tab[disa]。 //显示段码 第 9 页 共 15 页 if (i == 0 || i == 5) disc = disc | 0x80。 //增加小数点显示 P0 = disc。 //送显示 delay ()。 //延时 P0 = 0x0。 disb++。 //下一个要显示的位置 } else//(e==1) { P2 = disb。 disc = tab1[disa]。 //显示段码 P0 = disc。 //送显示 delay ()。 //延时 P0 = 0x0。 disb++。 //下一个要显示的位置 } } P2 = 0xff。 } unsigned int Adc0832(unsigned char channel) //AD转换,返回结果 { uchar i=0。 uchar j。 uint dat=0。 uchar ndat=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=channelamp。 0x1。 _nop_()。 _nop_()。 ADCLK=0。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。