目录
一、主要功能
1、数码管显示
2、按键设置计数值、开始、暂停
3、超声波进行物体测量通过相应指示灯会点亮
4、电源电路设计
二、使用步骤
基于51单片机的传送带计数器系统设计通常包含硬件电路模块和软件程序逻辑两部分,核心功能是实现产品自动计数、显示与报警控制。
三、硬件资源
1、51单片机核心模块
2、按键模块
3、超声波传感器
4、蜂鸣器模块
5、继电器模块
6、数码管显示模块
四、软件设计
#include<reg52.h> //头文件
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit seg_1=P3^4;//定义数码管的位选
sbit seg_2=P3^5;
sbit seg_3=P3^6;
sbit seg_4=P3^7;
sbit TX=P2^5; //超声波传感器的接口
sbit RX=P2^6;
sbit LED=P2^7; //指示灯接口
sbit motor=P1^5; //传送带电机接口
sbit K1=P1^0; //按键接口
sbit K2=P1^1;
sbit K3=P1^2;
sbit K4=P1^3;
sbit K5=P1^4;
uchar code SEG_Table[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //CC共阴
char dis_data_buf[4]= {0,0,0,0};
uchar counter_buf[4]= {0,0,0,0};
long int set_num=2;
unsigned long int counter_num=0;
uchar start_flag=0; //开始标志
uchar set_flag=0;//设定计数值得标志
uchar key_num=0; //按键值
unsigned int time=0; //声波时间
unsigned int S=0; //距离
void Delay_1ms(uint i)//1ms延时
{
uchar x,j;
for(j=0; j<i; j++)
for(x=0; x<=148; x++);
}
//*********************************
//按键扫描程序
//mode:0,不支持连续按;1,支持连续按;
//*********************************
uchar KEY_Scan(uchar mode)
{
static uchar key_up=1;//按键按松开标志
if(mode)key_up=1; //支持连按
if(key_up&&(K1==0||K2==0||K3==0||K4==0||K5==0))
{
//Delay_1ms(10);//去抖动
key_up=0;
if(K1==0)return 1;
else if(K2==0)return 2;
else if(K3==0)return 3;
else if(K4==0)return 4;
else if(K5==0)return 5;
} else if(K1==1&&K2==1&&K3==1&&K4==1&&K5==1)key_up=1;
return 0;// 无按键按下
}
void delayms(unsigned int ms) //延时函数
{
unsigned char i=100,j;
for(;ms;ms--)
{
while(--i)
{
j=10;
while(--j);
}
}
}
//************************************
//定时器初始化
//初始化为10MS定时器
//************************************
void Time0_init()
{
TMOD |= 0x01; //使用模式1,16位定时器
TH0 = 0; //定时器装入初始值10ms
TL0 = 0;
EA = 1; //总中断
ET0 = 1;//定时器0初始化
TR0 = 0;
}
//************************************
//定时器初始化
//初始化为60MS定时器
//************************************
void Time1_init()
{
TMOD |= 0x10; //使用模式1,16位定时器
TH1 = (65536-6000)/256; //定时器装入初始值60ms
TL1 = (65536-6000)%256;
EA = 1; //总中断
ET1 = 1;//定时器1初始化
TR1 = 1;
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
uint try=0;
uchar timeout_flag=0;
Time0_init(); //初始化定时器
Time1_init();
dis_data_buf[0]=set_num/1000;
dis_data_buf[1]=set_num%1000/100;
dis_data_buf[2]=set_num%100/10;
dis_data_buf[3]=set_num%10;
while(1)
{
StartModule();
while(!RX) //当RX为零时等待
{
try++;
if(try>6000) //等待时间不能太长,防止程序死机
{
try=0;
timeout_flag=1;//置位超时标志
break;
}
}
TH0=0;
TL0=0;
TR0=1; //开启计数
if(timeout_flag==0)
{
while(RX) //当RX为1计数并等待
{
try++;
if(try>6000) //等待时间不能太长,防止程序死机
{
try=0;
timeout_flag=1; //置位超时标志
break;
}
}
}
TR0=0; //关闭计数
if(timeout_flag)//如果超时了
{
TH0=0;
TL0=0;
timeout_flag=0;
}
else//正常数据
{
Conut(); //计算
}
}
}
五、实验现象
演示视频: