单片机高级语言程序设计与应用

发布者:数字翻飞最新更新时间:2012-03-14 来源: 仪表技术关键字:单片机  C语言  应用程序 手机看文章 扫描二维码
随时随地手机看文章

1引言
  
在隧道窑温度控制系统、自助式寄存柜等多个实际应用中,我们利用单片机高级C语言编制应用程序,满足了用户对各项性能参数的不同要求。下面以一实例,介绍C语言在应用程序设计上的优点。

2系统结构
  
系统由电器和机械两部分组成。机械部分由寄存柜箱位、电控锁组成;电器部分由单片机、控制继电器、操作面板、工作状态指示组成。系统结构如图1所示。

3系统功能程序设计
  
系统程序有以下部分组成:主程序、存取程序、监控管理程序、控制输出程序、柜体箱位排序程序及键盘中断、时钟定时中断和报警程序。下面主要介绍箱位排序程序、存取程序和防止密码重复程序。软件设计采用了模块化结构设计方法,所有程序采用单片机高级C语言编写。
  
主程序完成各个外设接口初始化,然后,进入键盘采样处理显示程序,由时钟中断程序完成显示扫描更新及采样处理。下面是箱位号初始化子程序。

  上述程序中的jicunnum[]变量用于保存箱位的箱位号,初始时的jicunnumi=i(i=12,…,32),即所有的32个箱位分别设置为12,…,32,以便于箱位状态指示和接受继电器的输出控制,完成柜体箱位的闭锁控制,因为箱位电控锁的开启是按照箱位对应的箱位号进行操作的。例如,对应5号箱位初始号码为jicunnum5=5,其他依此类推。
  
存放物品时,在有空箱位情况下,系统随机自动产生一个12位密码,并保存起来,同时将该密码打印出来由顾客自己随身携带。密码随机产生程序如下:
  void Take()
  
1.qqMimac=ReadKey()
  
2.if(Mimac!=0x11)
  
3.if(Mimacountnumset)
  
4.Mimac--Mimac=c&0x00f
  
5.displayMimacount=Mimac
  
6.Mimatemp*=10
  
7.Mimatemp+=Mimac
  
8.Mimacount++goto qq;}
  
9.goto endt;}
  
10.for(j=0jcountj++)
  
11.if(jicunj=Mimatemp)
  
12.orinum=j;}}
  
13.endtreturn();}

  上面程序中的第3rand()是随机数发生子程序,程序中的24行随机自动产生一个12位密码,并以十进制的形式保存在变量Mimanew中。
  
为了防止本次产生的密码与当天已经产生的密码重复,程序中设置了判别程序。程序中的57行将随机产生的12位密码与原来已经产生的其他密码进行比较,其中jiold[]变量用于存放当天已经产生的密码,totalcount变量为已经产生密码的个数。
  若比较的结果相同,说明新产生的密码重复,程序返回,再重新产生一个12位密码。若不同,说明密码没有重复,将新密码保存在密码变量jicun[]中,同时自动打开一个新箱位,对应箱位的占位指示灯亮。811行调整密码计数指针(count)和当天已经产生密码计数指针(totalcount)
  
当柜体箱位己满,也就是count大于32时,工作状态指示箱位已满,提醒后来的顾客不要继续在该寄存柜操作。
  
取出物品时,通过操作面板输入12位数字密码,12位密码数据分别存放在变量displayi(i=12,…,12)单元,显示程序将display[]中的数值在数码管上显示出来。控制系统将这次输入的密码与原来保存在变量jicun[]中的12位数字密码进行比较,若相同,打开原来存放物品对应箱位门锁,并熄灭相应箱位的占位指示灯;否则,不执行任何操作。取出物品程序如下:
  
void Take()
  
1.qqMimac=ReadKey()
  
2.if(Mimac!=0x11)
  
3.if(Mimacountnumset)
  
4.Mimac--Mimac=c&0x00f
  
5.displayMimacount=Mimac
  
6.Mimatemp*=10
  
7.Mimatemp+=Mimac
  
8.Mimacount++goto qq;}
  
9.goto endt;}
  
10.for(j=0jcountj++)
  
11.if(jicunj=Mimatemp)
  
12.orinum=j;}}
  
13.endtreturn();}
  
上述程序中的第1ReadKey()是键盘按键读取子程序,29行等待读取操作面板输入12位数字密码,并将输入的密码以十进制的形式暂时保存在变量Mimatemp中,程序中的第2行用于判断是否退出键。1012行判别输入的12位密码是否与原来某一内存变量jicun[]的密码相同,若相同,打开原来存放物品的箱位门锁;否则,不执行任何操作。第3Mimacount用于计算密码输入个数的位置,第4Mimac用于保存密码的一位数字,第12orinum用于保存对应密码的箱位号。numset是初始设定的密码位数,这里,numset=12
  
为防止恶意操作,密码不相符时,可重复输入三次,然后设置禁止操作标志位,自动闭锁延时一段时间(例如3分钟),再允许操作;在时钟定时中断程序中对设置的禁止操作标志复位,恢复正常操作。
  
前面已经介绍,jicunnum[]变量用于保存箱位的箱位号,初始状态为jicunnumi=i(i=12,…,32)。但是,经过一段时间操作运行以后,jicunnum[]的原始状态已经发生了变化。假如,现在第7位顾客取走了物品,jicunnum7]的内存已经不是7,为实现箱位状态指示和接受继电器控制输出,必须保证操作的密码和其箱位号一致,每次取出物品后,要对箱位号变量进行重新排序。下面是箱位的排序程序。
  
void sort()
  
1.count--
  
2.tempnum=jicunnumorinum];
  
3.for(i=orinumicounti++){
  4.jicuni=jicuni+1];
  
5.jicunnumi=jicunnumi+1
  
6.jicunnumcount=tempnum
  
7.return();}
  
程序中的第1行为计数器减1操作,说明物品已经被取走,空出一个箱位,第2行保存密码所对应的箱位号,35行将当时空的那个箱位后面的箱位号(jicunnum[])及对应密码(jicun[]),挨个往前依次移动,直到已经存放的箱位i=count逐个移动完毕。
  
程序中的第6行把已经取出物品的箱位号排到最后内存变量jicunnumcount]。
  
经过箱位排序程序重新排序后,此时第7位顾客的箱位号jicunnum7]保存的是当时空的那个箱位后面的箱位号。程序中的变量countorinumjicun[]定义与前面相同。
  
存、取物品过程中,为了让使用者了解系统的工作状态,例如:存放或取出物品,柜体箱位已满或已空,哪些箱位已空等状态,通过工作状态指示灯提醒顾客。
  为了便于操作管理,程序中设置了监控管理程序,遇有特殊情况,需要随时打开任一箱位时,系统操作人员有权完成该操作。设置不同的管理权限密码,只有系统管理人员,才能进入该操作;其操作过程与取出物品时相同。


参考文献

1 徐爱钧,彭秀华.单片机高级语言C51应用程序设计[M.北京:电子工业出版社,1999.

关键字:单片机  C语言  应用程序 引用地址:单片机高级语言程序设计与应用

上一篇:MSC1210在微位移传感器系统的应用
下一篇:P89LPC932的几种ISP编程方法

推荐阅读最新更新时间:2024-03-16 12:55

51单片机学习——1--点亮第一个LED
点亮LED 原理: 此单片机的LED灯就是个发光二极管,只能单向通行。图中LED阴极接IO口,阳极接VCC,也就是电源,为高电平,而正常情况下P2口默认输出高电平,所以只需令P2口输出低点平即可。 代码: #include reg52.h sbit led=P2^0;//通过位定义,令led代表P20口 void main() { while(1) { led=0;//令P20为低电平 } } 总结: 知识点: 设置管脚sbit name=Px^x(IO口) 令目标led灯对应的IO口输出低电平 拓展: 也可以直接对P2的所有IO口进行赋值输出。即1111 1111从高位到低位分别对应从左到右
[单片机]
51<font color='red'>单片机</font>学习——1--点亮第一个LED
STM32开发中使用C语言实现IIC驱动
简述 IIC(Inter-Integrated Circuit)其实是IICBus简称,它是一种串行通信总线,使用多主从架构,在STM32开发中经常见到。 使用面向对象的编程思想封装IIC驱动,将IIC的属性和操作封装成一个库,在需要创建一个IIC设备时只需要实例化一个IIC对象即可,本文是基于STM32和HAL库做进一步封装的。 底层驱动方法不重要,封装的思想很重要。在完成对IIC驱动的封装之后借助继承特性实现AT24C64存储器的驱动开发,仍使用面向对象的思想封装AT24C64驱动。 IIC驱动面向对象封装 iic.h头文件主要是类模板的定义,具体如下: //定义IIC类typedef struct IIC_Typ
[单片机]
单片机IO口另外三种状态
单片机 IO 口的其中一种“准双向 IO”的内部结构,实际上我们的单片机 IO 口还有另外三种状态,分别是开漏、推挽、高阻态,我们通过图 9-1 来分析下另外这三种状态。 前边我们简单介绍“准双向 IO”的时候,我们是用三极管来说明的,出于严谨的态度,我们这里按照实际情况用 MOS 管画图示意。实际上三极管是靠电流导通的,而 MOS 管是靠电压导通的,具体缘由和它们的内部构造有关系,在这里我们暂且不必关心,如果今后有必要了解可以直接查找模拟电子书或者百度相关资料进行细致学习。 在单片机 IO 口状态这一块内容上,我们可以把 MOS 管当三极管来理解。在图 9-1 中,T1 相当于一个 PNP 三极管,T2 相当于一个 NPN
[单片机]
<font color='red'>单片机</font>IO口另外三种状态
请工程化,定制化你的单片机代码
- 前言 - 时至今日,依旧看到很多小伙伴们放着单片机里的定时器不用,动辄delay1s(); delay500ms();虽然简单粗暴,但是其实是很不妥当的。 还有很多需要按键的程序,动不动就“while(k1==0);”的等按键松开,这样的代码只是“为了满足某个功能“而设计的代码,而非”为了保证产品的质量“而设计的代码。 我们应该时刻考虑“如果这傻逼用户不按我的标准操作来搞我的产品,我该怎么写程序?”,而不是”只要客户乖乖听我的,这样做是没问题的,就行了;出了问题都是他乱搞,跟我有个毛关系”,后面的思维是典型的只顾自己爽的思维,我们应当想方设法的提高产品的可靠度。 OK,扯远了,现在只是想提出一些设计的思路。 par
[单片机]
请工程化,定制化你的<font color='red'>单片机</font>代码
单片机 键盘编程
花了几天时间整了下单片机的键盘.我用的单片机板子是用的P2的8个IO端口对16个键达到控制的目的. 那怎样来使用8个端口控制16个键呢?其实很简单,先必须要掌握她的原理图, 附件中作者上传了一张,仅供参考.原理图看了之后,我们就可以正式开始编写程序了. 先将KEY0置低电平,其余的置高电平,当我们按下第一列的按键时,P2的高四位肯定会有所变化,而我们就是用的这种变化达到分辨不同按键的目的.同理,我们可以将KEY1置低电平,再去检测P2的高四位,也得出了第二列按的哪个键.依次类推,我们即可检测单片机的16个按键了. 下面有一个单片机键盘的完整示例程序,本程序已在89C52单片机上成功运行,产生的效果是,按下单片机
[单片机]
<font color='red'>单片机</font> 键盘编程
基于单片机的智能太阳能路灯设计
太阳能路灯的应用具有重要的现实意义,尤其是靠小规模火力发电或季节性水力发电的地区,更应大力发展太阳能电力。太阳能路灯以其先进、稳定、智能、成熟的控制技术及显著的节能特性、简便的维护方式等特点得到推广。随着太阳能照明灯具产品的普及,很多应用项目存在质量和售后服务问题。因此,需及时分析原因、规范市场,使太阳能路灯市场健康有序地发展。太阳能是地球上最为直接、普遍、清洁的能源,其作为一种可再生能源,每天达到地球表面的辐射能约2.5亿万桶石油。 1 硬件电路设计 选择DS1302计时器、AT24C02存储器、4位数码显示器、过充过放电路、STC12C2051单片机等组成智能控制系统。根据各部分电路的功能不同,整体电路可分为以下几个部分:太阳
[单片机]
基于<font color='red'>单片机</font>的智能太阳能路灯设计
基于AT89C52单片机近距离无线通信系统电路设计
  短距离无线传输具有抗干扰性能强、可靠性高、安全性好、受地理条件限制少、安装灵活等优点,在许多领域有着广泛的应用前景。低功耗、微型化是用户对当前无线通信产品尤其是便携产品的实际需求,短距离无线通信逐渐引起广泛关注。常见的短距离无线通信有基于802.11的无线局域网WLAN、蓝牙 (blueTooth)、HomeRF及欧洲的HiperLAN(高性能无线局域网),但其硬件设计、接口方式、通信协议及软件堆栈复杂,需专门的开发系统,开发成本高、周期长,最终产品成本也高。因此这些技术在嵌入式系统中并未得到广泛应用。普通RF产品不存在这些问题,且短距离无线数据传输技术成熟,功能简单、携带方便,使其在嵌入式短程无线产品中得到了广泛应用。
[单片机]
基于AT89C52<font color='red'>单片机</font>近距离无线通信系统电路设计
单片机为核心的温室智能控制系统
0 引言 随着社会的进步和工农业生产技术的发展,许多产品对生产和使用环境的要求越来越严,人们对温度、湿度、光强、二氧化碳浓度、灰尘等环境因素的影响越来越重视了。为此,本文以农业技术发展为目的开发了一种智能控制系统。 众所周知,光、温度、湿度是农业生产不可缺少的因素,所以本设计将其作为重点数据来处理,而目前市场上普遍存在的温度检测仪器大都是单点测量,而且温度信息传递不及时,精度达不到要求,不利于农业控制者根据温度变化及时做出决定。而湿度传感器价格昂贵,大多使用进口元件,但事实上,农用精度要求并不高,现在国产湿度传感器完全可以适用。为此,本设计开发了一种能够同时测量多点,并实时性高、精度高,能够综合处理多点温度信息,并能进行光控和
[工业控制]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved