历史上的今天
返回首页

历史上的今天

今天是:2025年03月11日(星期二)

正在发生

2018年03月11日 | 单片机C语言在应用程序设计设计

2018-03-11 来源:eefocus

    1前言

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

    2系统结构

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

 

   9.jpg?imageView2/2/w/550

    3系统功能程序设计

    系统程序有以下部分组成:主程序、存取程序、监控管理程序、控制输出程序、柜体箱位排序程序及键盘中断、时钟定时中断和报警程序。下面主要介绍箱位排序程序、存取程序和防止密码重复程序。软件设计采用了模块化结构设计方法,所有程序采用单片机高级C语言编写。

    主程序完成各个外设接口初始化,然后,进入键盘采样处理显示程序,由时钟中断程序完成显示扫描更新及采样处理。下面是箱位号初始化子程序。

    10.jpg?imageView2/2/w/550

    上述程序中的jICunnum[]变量用于保存箱位的箱位号,初始时的jicunnum[i]=i(i=1,2,…,32),即所有的32个箱位分别设置为1,2,…,32,以便于箱位状态指示和接受继电器的输出控制,完成柜体箱位的闭锁控制,因为箱位电控锁的开启是按照箱位对应的箱位号进行操作的。例如,对应5号箱位初始号码为jicunnum[5]=5,其他依此类推。

    存放物品时,在有空箱位情况下,系统随机自动产生一个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();}

    上面程序中的第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.


推荐阅读

史海拾趣

Brilliance公司的发展小趣事

在国内市场取得一定成功后,Brilliance公司开始将目光投向国际市场。公司制定了详细的国际化战略,积极寻求与国际知名企业的合作机会。通过与国外合作伙伴的共同努力,Brilliance的产品逐渐打入国际市场,并获得了良好的口碑。同时,公司还积极参加国际电子展会和交流活动,提升了品牌知名度和影响力。

Amulet Technologies公司的发展小趣事

在快速发展的同时,Brilliance公司始终关注社会责任和可持续发展。公司积极参与公益事业,为社会做出贡献。同时,公司还注重环保和节能减排,努力降低生产过程中的环境影响。这种积极履行社会责任的态度也赢得了社会各界的广泛认可。

通过以上五个故事,我们可以看到Brilliance公司在电子行业发展中的艰辛与辉煌。凭借技术创新、市场拓展、产业链整合以及社会责任等方面的努力,Brilliance成功地在电子行业中树立了自己的品牌形象,并为未来的发展奠定了坚实的基础。

Barkston Plastics Engineering Ltd.公司的发展小趣事

面对国内市场的饱和,Barkston Plastics Engineering Ltd.开始寻求国际化发展的道路。然而,国际市场环境的复杂性和文化差异给公司带来了诸多挑战。在经历了一系列的市场调研和风险评估后,Barkston成功打入欧洲市场,通过与当地企业的合作,逐步扩大了其国际影响力。这一国际化发展进程不仅为公司带来了更广阔的市场空间,也提升了其在全球电子行业中的地位。

APTA Group Inc公司的发展小趣事

APTA Group Inc深知,单打独斗在竞争激烈的电子行业中难以长久立足。因此,公司积极寻求与其他企业的战略合作。通过与知名电子产品制造商的合作,APTA得以将其技术应用于更广泛的领域,同时也借助合作伙伴的市场渠道,提高了品牌知名度和市场占有率。这种互利共赢的合作模式,为APTA的快速发展提供了有力支撑。

Daco Semiconductor Co Ltd公司的发展小趣事

Daco Semiconductor在成立之初就专注于半导体技术的研发与创新。公司由一群对半导体行业充满热情的工程师创立,他们致力于开发更高效、更稳定的半导体产品。一次偶然的实验中,Daco的研发团队发现了一种新型的材料组合,这种材料组合能够显著提高半导体的性能和稳定性。这一技术突破成为了Daco的核心竞争力,也为其在竞争激烈的半导体市场中打开了新的局面。

EDAL公司的发展小趣事

随着云计算、大数据等技术的兴起,传统EDA行业面临着前所未有的挑战。为了应对这些挑战,EDAL公司积极转型升级,将云计算、大数据等技术与EDA工具相结合,推出了更加高效、智能的云端EDA服务。这一创新的服务模式不仅提升了客户的设计效率,还降低了成本,赢得了市场的广泛认可。

问答坊 | AI 解惑

电容器安装注意事项

1 安装电容器时,每台电容器的接线最好采用单独的软线与母线相连,不要采用硬母线连接,以防止装配应力造成电容器套管损坏,破坏密封而引起的漏油。 2 电容器回路中的任何不良接触,均可能引起高频振荡电弧,使电容器的工作电场强度增大和发热 ...…

查看全部问答>

PICC资料

PICC编程基础…

查看全部问答>

74系列资料

74系列资料 晚上补充附件…

查看全部问答>

关于STM32,TI,NXP的ARM Cortex-m3学习板申请体会

这三家的都申请过,有一些想法 ST最大方,板子,光盘,连接线一应俱全。 并且ST搞过好几次免费申请活动,每次免费送的套件数量还比较大。 拿到套件后就能直接上手练习了。 TI其次,申请的TI套件,使用手册里明明说的是有两块板子,可是我只收到 ...…

查看全部问答>

evc检测远程端口是否开放

代码如下:         SOCKET Sock = INVALID_SOCKET;     // Datagram window socket           SOCKADDR_IN source_sin;          &n ...…

查看全部问答>

来分析一下crc的误码率

在CRC8中出现了误码但没发现的概率是1/256,CRC16的概率是1/65536,而CRC32的概率则是1/2^32,那已经是非常小了,所以一般在数据不多的情况下用CRC16校验就可以了,而在整个文件的校验中一般用CRC32校验。 如何理解,是否要用概率论的模型去解释? ...…

查看全部问答>

正弦曲线迷茫中,大家帮帮忙

之前关于EVC下图形编程画二维曲线问题已经有了进展,现在刚画出简单的二维曲线,就是随机折线那样的,主要通过两个随机数nRandomX = rand() % 10;nRandomY = rand() % 10; 主要代码如下: BOOL CDraw2DGraphDlg::OnInitDialog() {     ...…

查看全部问答>

C8051F温度计电源问题解决了

我的解决方法是用1117-3.3,相信这个芯片大家都有。它的引脚和BL相同,但板上封装是sot89,我手头只有sot223,我把1脚和3脚向里折了一下,注意不要折断,然后再焊上就可以了。这时板子上D2不要焊,L1用焊锡直接连上就可以了。 现在板子的电压是3.3V ...…

查看全部问答>

MSP430 入门及常见问题解答

Ver 0.1 - Jeffrey1.MSP430 入门2.如何为我的应用选择最合适的MSP430 芯片?3.与MSP430 的引导加载程序通信的开发工具4.MSP430 需配合何种晶振工作?5.使用哪款MSP430 编程器可以用来烧断JTAG 熔丝?6.要实现MSP430 编程,应如何连接JTAG?7 ...…

查看全部问答>

晒WEBENCH设计的过程+DIY飞利浦HUE供电电源

1设计要求 2设计方案 3选便宜的看看,效率和下边那个是什么 4原理图 在选择方案时会出现相关LED厂家产品的选择很方便,可以参考修改设计,找到更加合适方案 …

查看全部问答>