【51单片机】【protues仿真】基于51单片机送带计数器系统

目录

一、主要功能

二、使用步骤

三、硬件资源

四、软件设计

五、实验现象

一、主要功能

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(); //计算

}

}

}

五、实验现象

演示视频:

相关推荐
AI+程序员在路上7 分钟前
CANopen 协议:介绍、调试命令与应用
linux·c语言·开发语言·网络
森利威尔电子-23 分钟前
森利威尔SL3062替代 LM3485 60V降压恒压芯片
单片机·嵌入式硬件·集成电路·芯片·电源芯片
爱编码的小八嘎24 分钟前
C语言完美演绎4-4
c语言
_Ningye40 分钟前
STM32 — 3.1 GPIO输出
stm32·单片机·嵌入式硬件
学嵌入式的小杨同学1 小时前
STM32 进阶封神之路(十九):ADC 深度解析 —— 从模拟信号到数字转换(底层原理 + 寄存器配置)
c++·stm32·单片机·嵌入式硬件·mcu·架构·硬件架构
青桔柠薯片1 小时前
51单片机(STC89C52RC)学习总结:从裸机编程到外设驱动
嵌入式硬件·学习·51单片机
weiyvyy1 小时前
从开发视角看硬件接口:接口开发的本质与全景图
驱动开发·单片机·嵌入式硬件·硬件工程
老李的森林2 小时前
杂谈--如何与AI高效率的对话
人工智能·stm32·嵌入式硬件·机械
Book思议-2 小时前
【数据结构实战】线性表的应用
c语言·数据结构·算法·链表
weixin_462901973 小时前
esp32wifi的AP模式
单片机·嵌入式硬件