基于51单片机的传送带产品计数器仿真

仿真图:

在这里插入图片描述

功能简介:

单片机采用AT89C52,液晶显示采用LCD1602
两个功能按键,分别是启动复位、模拟产品计数,另外还有一个紧急急停开关
通过8位拨动开关可设置计数预置数量,一旦传送带数量达到后,蜂鸣器和LED就会启动报警
传送带通过继电器驱动电机来模拟演示

主程序:

	
    #include"lcd1602.h"

	#define uchar unsigned char
	#define uint unsigned int
    uchar out[6];

	sbit STAR_KEY =P3^2;//定义键与单片机的连接引脚

	sbit L0=P1^0;  //定义SFR中引脚的位
	sbit L1=P1^1;
	sbit L2=P1^2;
	sbit L3=P1^3;
	sbit L4=P1^4;
	sbit L5=P1^5;
	sbit L6=P1^6;
	sbit L7=P1^7;
	sbit buzzer=P2^1;

	sbit MOTOR=P3^0;
	uchar n[2]={1,0};
	void delayms(uint x)   //延时子程序
	{
	  uchar y;
	  while(x--)
	  {
	    for(y=0;y<123;y++){;}
	  }
	}

	uchar Keynum()	 //按键子程序1
	{
	   uchar key=0;
	   STAR_KEY=1; //置初值
	   if(STAR_KEY==0){delayms(10);if(STAR_KEY==0)n[0]=0;n[1]=1;}	 //按下STAR键则n[0]=0;n[1]=1
	   return n[1];	 //返回n值
	}
	void xianshi(uint dispbuf)   //显示子程序
	{ 
		out[0]=dispbuf/10000+0x30;
		out[1]=((dispbuf%10000)/1000)+0x30;
		out[2]=((dispbuf%1000)/100)+0x30;
		out[3]=((dispbuf%100)/10)+0x30;
		out[4]=dispbuf%10+0x30;
		out[5]='\0'; 
		LCD_Initial();          //LCD初始化
		LCD_Prints(1, 0,"Number:");   //LCD输出
		LCD_Prints(10, 1,"pcs");
		LCD_Prints(4, 1,out);      
	}
	uint qiuzhi() //求用拨码盘所置数的值的子程序
	{
	   uchar a;
	   uchar b;
	   uchar c;
	   uchar d;
	   uchar e;
	   uchar f;
	   uchar g;
	   uchar h;
	 
	   uint p=0;
	   if (L0==1) {a=1;} else {a=0;}	//将电平信号变为数字的值
	   if (L1==1) {b=1;} else {b=0;}
	   if (L2==1) {c=1;} else {c=0;}
	   if (L3==1) {d=1;} else {d=0;}
	   if (L4==1) {e=1;} else {e=0;}
	   if (L5==1) {f=1;} else {f=0;}
	   if (L6==1) {g=1;} else {g=0;}
	   if (L7==1) {h=1;} else {h=0;}

	   p=a+b*2+c*2*2+d*2*2*2+e*2*2*2*2+f*2*2*2*2*2+g*2*2*2*2*2*2+h*2*2*2*2*2*2*2;
	   return p;   // 返回所求的P值
	}
	void main(void)	  //主程序
	{
	   uint q;
	   IT0=1;			    //负跳变触发
	   EA=1;			    //开总允许中断
	   EX0=1;			    //开INTO中断
       
	   TMOD=0X05; 			//置T0为计数器    方式1
	   TL0=0;			//置计数器初值
	   TH0=0;
	   while(1)				//无限循环
	   { 
	      q=qiuzhi();		   //调用求值子程序求出所置的数
	      if (MOTOR==1) {xianshi(q);} else {xianshi(TL0);Keynum();TR0=n[1];} //当电动机关闭时显示用薄码盘所置的数并停止计数,电机启动时则开始计数,并显示计数值
	      if (TL0==q) 
				{TR0=0;MOTOR=1;buzzer=0;} 
				else 
					{Keynum();MOTOR=n[0];buzzer=1;}	//当计数值与所置数相同时关闭电机,停止计数,当计数值不等时则将电机启动与关闭交由按键控制,所以不存在计数值超过置数值的情况
	   }									
	}
	void Int0(void) interrupt 0 	//中断服务程序,工作寄存器用0组
	{
	   TL0=0;TR0=1;			   //重置计数值,重新开始计数
	}

设计文件:

链接:https://pan.baidu.com/s/1627KXAm9hhLlkbtgKhvH0w?pwd=7ih6

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值