[导读]
本仪器的程序主要由键盘、显示程序、AT24C01A读写程序、信号产生程序等部分组成。以下对部分功能作一些分析。一、键盘程序 本仪器需要调整的数值范围较大,因此,“增加”和“减少”键必须具有快速连
本仪器的程序主要由键盘、显示程序、AT24C01A读写程序、信号产生程序等部分组成。以下对部分功能作一些分析。一、键盘程序 本仪器需要调整的数值范围较大,因此,“增加”和“减少”键必须具有快速连加和快速连减的功能,否则调整速度太慢。这种键盘可以用多种方法来实现,关键在于设计一个正确的程序结构,图1是一种实现方法的流程图。图1 流程图 程序工作时,不断地扫描键盘,第一次扫描到有键按下后如常规键盘一样,进行键值处理,处理完毕,不等待键盘释放,直接退出键盘程序。当又一次执行到键盘程序,如果检测到键还被按着,就不再直接去键值处理程序,而是将一个计数器加1,直接返回主程序,如此循环,直到计数到一个定值(如500,表示键盘程序已被执行了500次),如果键还被按着,说明用户有连加(或连减)要求,程序即将计数器减去一个数值(如30),然后进行键值处理。这样,以后键盘程序每执行30次,就执行一次键值处进程序,实现了第一次启动时间较长,以后快速连续动作的要求。如果检测到键已被释放,则清除所有标志,将计数器清零,准备下一次按键处理。 程序开始时定义了两个常量:Qdsj和Ljsj,如下所示const uintQdsj=500;/*与首次启动连加(减)功能的时间有关*/const uintLjsj=30;/*与连加(减)的速度有关*/ 这两个常量与第一次启动及连加、减的速度有关,具体数值应根据实际情况试验后确定。下面是部分键处理程序,注意其中这两个变量的使用。voidKey()/*键处理*/{……if(!KeyValue){…无键按下,清除一切标志退出}if(KeyMark)/*第一次检测到按键吗?*/{KeyCounter++;/*不是第一次(KeyMark已是1了)*/if(Qdsj==KeyCounter) /*连续按着已有Qdsj次了*/{KeyCounter-=Ljsj; /*减去Ljsj次*/ KeyProcess(KeyValue,1);/*键值处理*/}else{return;}/*如果按着还没有到Qdsj*/}else /*第一次检测到有键按下*/{ mDelay(10);/*延时10毫秒*/…再次检测if(!KeyValue){…清除一切标志并返回}}二、小数点的处理 要在LED数码管上显示小数点,可以有两种选择,一种方式是在显示0.1~0.9时用小数显示,而在显示1~500时不显示小数点,这种方式编程略麻烦一些;另一种是使用定点的方式显示小数点,即不论是在0.1~0.9Hz段,还是1~500Hz段,均在倒数第二位点亮小数点,这种显示方式比较简单,本机采用了第二种方式。 通常,用高级语言编程时,可以用浮点型数据来表示小数,但本程序并没有这样来处理。因为单片机的资源有限,而浮点型数据的表达方式与其他数据的表达方式很不相同,无论是存储还是运算,都相当占用资源,因而在单片机中能不用浮点型数据就尽量不要使用。这里我们将所有的频率设定值扩大10倍,即所要求的频率值是0.1~500Hz,但在单片机内部用1~5000来表示。如果频率设定值小于10,每按一次键,频率设定值就加或减1,如果频率设定值大于等于10,每按一次按键就加或减10。例如,当前频率设定值为100,按一下“增加”键,该值就会变为110,相当于频率设定值由10变为11;如果当前设定值为9,按一下“减少”键,该值变为8,相当于频率值由0.9变到了0.8。在根据频率设定值计算定时常数时,只要将被除数扩大10倍即可,程序中是这样表示的:LTEmp=1000000; ltemp*=10; //由于plsd被放大了10倍,故被除数也放大10倍…… 在显示频率设定值时,点亮倒数第二位的数码管上的小数点,显示程序中有这样的程序行:if(Counter1==1) //如果当前正在显示倒数第二位时{ if(!PlSl) //如果是要求显示频率DispCode=DispCode&0xbf;/*点亮小数点*/} 由于P0.6与小数点位相连,所以不论待显示的数是多少,该位被清零后,小数点就能被点亮。要将该位清零,只要将字形码与0xbf(10111111)相与即可。三、AT24C01A的读写 AT24C01A芯片是具有I2C接口的EEPROM,由于89C51 单片机 没有I2C接口,因此,必须用I/O口模拟I2C时序。这里仅提供作者用C语言编写的接口程序,不对此作更多的介绍。 使用这一接口程序,只要定义好写常数、读常数及根据硬件连线定义好三个引脚SDA、SCL和WP,然后直接调用读、写函数即可。#defineAddWr0xa0/*器件地址选择及写标志*/#defineAddRd0xa1/*器件地址选择及读标志*/sbitSda=P3^7;/*串行数据*/sbitScl=P3^6;/*串行时钟*/sbitWP=P3^5; 接口程序提供了多字节的读、写函数,其中读函数需要用到三个参数:用于存放读出数据的数组,待读EEPROM的起始地址,字节数;写函数也要用到三个参数:用于存放待写入数据的数组,待写入EEPROM的起始地址,字节数。下面是这两个函数的用法参考: RdFromROM(Number,10,2); //从地址10H开始处读出2个字节,存入Numbre数组中。 WrToROM(Number,10,2); //将Number数组中的2个字节写入EEPROM,地址从10H开始四、信号产生 信号发生由定时中断0完成,在定时时间到之后,重置定时常数,接着判断究竟是较高频率还是较低频率,分别予以处理,如果是较高频率,直接取反输出端口即可返回,如果是较低频率,则要进行计数,并判断计数值是否到设定值,如果到了,则取反输出端口,并清零计数器,然后再返回,这部分程序如下 :voidOutWave()interrupt1 //定时0中断用于波形输出{ statICuint Count; //较低频率时计数用TH0=CTH0; //重装时间常数TL0=CTL0;if(HighLow) //如果是较高频率{ WaveOut=!WaveOut;Mczsl++; }else{ Count++;if(Count>=Plcs){ WaveOut=!WaveOut;Count=0;Mczsl++;} } } 其中Mczsl是脉冲输出个数的计数值。从程序中还可以看出,每次输出只能得到波形的一半,要么高电平,要么低电平,一个完整的波形需要两次输出才能完成。 定时中断中所设定的定时常数,预设定计数值(Plcs)都由主程序根据频率设定值计算得到,根据前述原理,对于较低频率的信号和较高频率的信号采用两种不同的方法产生,对于较低频率的信号,定时常数是一个定值,通过改变预设定计数值来达到定时时间,而对于较高频率的信号,直接改变定时常数来改变定时时间。为此,在主程序中根据设定值的大小分别处理,如果设定值大于10Hz,那么是较高频率的算法,只要计算出设定频率值对应的时间,不难得到待设定值,程序中的处理方法是:ltemp=1000000;ltemp*=10; //由于plsd被放大了10倍,故被除数也放大10倍ltemp/=Plsd; //获得周期(单位微秒)ltemp/=2; //获得定时常数 根据t=1/f,计算定时时间,单位是s,而我们所要求的定时时间单位是μs,因此,首先让ltemp等于1000000,又由于Plsd变量在 单片机 内部被放大10倍,故再将该值扩大10倍,然后用ltemp为被除数,去除以Plsd,得到周期数。由于每次定时中断只能得到一半波形,因此定时数应该是周期数的一半,将周期数除以2,即得到了定时常数。显然,这里没有先计算时间到s,然后再换算为μs,其目的也是为了避免小数运算。当所设定的频率值小于10Hz时,程序是这样处理的:CTH0=(65536-1000)/256;CTL0=(65536-1000)%256; //否则是在10HZ以下,定时器的定时常数是1msHighLow=0;Plcs=5000/Plsd; 首先将定时常数确定为1000μs,然后将标志位HighLow置0,表示要进行较低频率的处理,最后计算出中断次数。中断次数这样来确定:用10000000/Plsd得到周期数,然后用这个值除以2000即得可,这时除以2000的原因同上述分析,即定时时间为1000μs,最终得到的的周期是2000μs。限于篇幅,完整的源程序在本期光盘中提供。 如果读者在设计、制作等方面有收获,欢迎到http://www.mcustudio.com(平凡 单片机 工作室)交流,如果在制作、调试或有什么困难,也可以到这里寻求帮助。作者制作的成品如图2所示。|
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
上海2025年8月26日 /美通社/ -- 在全球数字经济加速演进的时代浪潮中,海量数据资源正成为企业发展的双刃剑。超66%的企业面临"数据沉睡"危机——分散于供应链、财务、客户运营等数十个系统的业务...
关键字:
AI
模型
软件
数据分析
一直以来,单片机都是大家的关注焦点之一。因此针对大家的兴趣点所在,小编将为大家带来单片机的相关介绍,详细内容请看下文。
关键字:
单片机
数字信号
模拟信号
加快开发进程;提升质量、安全性、性能与成本效益 利用耐世特在底盘领域的专业知识和线控技术产品组合 美国密西根州奥本山2025年8月11日 /美通社/ -- 耐...
关键字:
MOTION
软件
运动控制
NI
从自然汲取,向未来创造 上海2025年8月8日 /美通社/ -- 2025 世界机器人大会将于8月8-12日在北京亦创国际会展中心拉开帷幕,Festo(A112展位)将以"从自然汲取,向未来创造&q...
关键字:
FESTO
机器人
BSP
软件
引言:穿越变革浪潮,迎接智能金融时代 上海2025年7月28日 /美通社/ -- 在全球科技变革的浪潮中,生成式AI正加速驱动各行业变革,金融行业尤为显著。在强监管与用户需求升级的双重压力,行业亟需重构服务模...
关键字:
软件
生成式AI
模型
数字化
宁波2025年7月28日 /美通社/ -- 日前,在第四届宁波市专利创新大赛的聚光灯下,中之杰智能的创新技术"一种基于电子周转箱的生产管理方法及系统"强势斩获专利优秀奖。这枚沉甸甸的奖章背后...
关键字:
软件
电子
智能工厂
BSP
杭州2025年7月28日 /美通社/ -- 近日,大华股份与北京北大软件工程股份有限公司(以下简称"北大软件")签署战略合作协议。双方将重点围绕长江禁渔等领域,发挥各自在产品、技术、平台等方面的经验和...
关键字:
软件
数字化
存储器是一种用于存储数据的集成电路。存储器的架构可以分为静态随机存取存储器(SRAM)和动态随机存取存储器(DRAM)等类型。
关键字:
数字信号
成都 2025年7月16日 /美通社/ -- 由立嘉会议展览有限公司主办的"2025第四届成渝地区装备制造业博览会"将于9月11日至13日在成都世纪城新国际会展中心盛大举办。本届博览会以&...
关键字:
BSP
软件
供应链
智能制造
在数字信号处理领域,滤波器是不可或缺的核心组件,其作用是对信号进行筛选,保留有用成分并去除干扰。其中,FIR(Finite Impulse Response,有限脉冲响应)滤波器和 IIR(Infinite Impuls...
关键字:
数字信号
滤波器
脉冲响应
上海 2025年7月14日 /美通社/ -- 近日,微创软件与全球领先的工业级绿色智能系统解决方案提供商——上海电气集团股份有限公司旗下直属子公司上海电气数字科技有限公司,以下简称"电气数科"宣布深...
关键字:
电气
软件
数字化
BSP
模拟数字转换器即A/D转换器,或简称ADC,通常是指一个将模拟信号转变为数字信号的电子元件。
关键字:
数字信号
全新的集成解决方案确保企业以安全、负责任的方式应用 AI智能体及其他生成式AI技术。 借助以上工具,企业可以对智能体执行"红队测试"和审计,并检测"影子智能体"...
关键字:
IBM
软件
智能体
AI
从传统机械制造迈向数字化、智能化的转型之路,软件定义汽车(SDV)的出现,无疑成为这场变革的关键驱动力,预示着产业拐点即将来临。那么,支撑软件定义汽车发展的支柱究竟是什么呢?
关键字:
软件
传感器
智能化
上海 2025年6月16日 /美通社/ -- 在工信部《"十四五"智能制造发展规划》推动产业升级的背景下,工业互联网平台加速向制造核心环节渗透。据权威机构统计,我国制造业重点领域关键工序数控化率达5...
关键字:
数字化
软件
智能制造
智能工厂
在科技飞速发展的当下,汽车行业正处于一场深刻变革的浪潮之中。从传统机械制造迈向数字化、智能化的转型之路,软件定义汽车(SDV)的出现,无疑成为这场变革的关键驱动力,预示着产业拐点即将来临。
关键字:
汽车
机械制造
软件
上海 2025年5月29日 /美通社/ -- 2025年6月1日,Brother集团在华全资子公司——兄弟(中国)商业有限公司(下简称"兄弟(中国)")...
关键字:
打印机
可持续发展
软件
通信
长春 2025年5月26日 /美通社/ -- 5月23日,第63届中国高等教育博览会(简称"高博会")在长春东北亚国际博览中心开幕,浪潮软件精彩亮相A3馆,为参展嘉宾和观众带来了灵犀有言教育大模型、...
关键字:
软件
AI
模型
工业互联网
在科技飞速发展的当下,汽车行业正经历着一场深刻变革,软件定义车辆(Software-Defined Vehicle,SDV)逐渐成为行业焦点,对汽车电子技术的未来发展产生着深远影响。
关键字:
汽车架构
软件
SDV
江苏无锡 2025年5月19日 /美通社/ -- 5月16日,第九届智能工厂高峰论坛在无锡盛大启幕,数百位制造业管理者、技术专家与行业先锋齐聚太湖之畔,共探智能工厂的落地路径与未来图景。在这场以"智造进阶&q...
关键字:
离散
智能工厂
软件
中国制造