您现在的位置:机电论文网>> 机床加工>> 正文内容

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

作者: 来源: 发布时间:2018/2/11 16:12:47  点击数:460
program design and application of the high level language
lu yonggeng, zhao chunsheng
(college of aerospace engineering, nuaa, nanjing 210016, china)
abstract:this paper discussed the advantage of the c high levellanguage in use and gave actual program.
key words:single chip processor; programmer; design; application
1引言
在隧道窑温度控制系统、自助式寄存柜等多个实际应用中,我们利用单片机高级c语言编制应用程序,满足了用户对各项性能参数的不同要求。下面以一实例,介绍c语言在应用程序设计上的优点。
2系统结构
系统由电器和机械两部分组成。机械部分由寄存柜箱位、电控锁组成;电器部分由单片机、控制继电器、操作面板、工作状态指示组成。系统结构如图1所示。

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

上述程序中的jicunnum[]变量用于保存箱位的箱位号,初始时的jicunnum[i]=i(i=1,2,…,32),即所有的32个箱位分别设置为1,2,…,32,以便于箱位状态指示和接受继电器的输出控制,完成柜体箱位的闭锁控制,因为箱位电控锁的开启是按照箱位对应的箱位号进行操作的。例如,对应5号箱位初始号码为jicunnum[5]=5,其他依此类推。
存放物品时,在有空箱位情况下,系统随机自动产生一个12位密码,并保存起来,同时将该密码打印出来由顾客自己随身携带。密码随机产生程序如下:

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

更多
字体:【】-【】-【】【关闭此页

上一篇:基于pic单片机的机器人灵巧手的控制'   下一篇:pic单片机与pc机的串行数据交换'


特别声明:机电之家(http://www.jdzj.com )所共享的机电类资料,机电论文、机电类文章、机电企业类管理制度、机电类软件都来自网上收集,其版权归作者本人所有,如果有任何侵犯您权益的地方,请联系我们,我们将马上进行处理。购买的论文都出自原创,保证作者的原创的版权的转让,任何纠纷由法律解决。