【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_buf4= {0,0,0,0};

uchar counter_buf4= {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_buf0=set_num/1000;

dis_data_buf1=set_num%1000/100;

dis_data_buf2=set_num%100/10;

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

}

}

}

五、实验现象

演示视频:

相关推荐
CSDN官方博客28 分钟前
「谁说嵌入式只是调包和焊板子?」—— 2026嵌入式全栈技术征锋令
嵌入式硬件·物联网·embedding
点灯小铭1 小时前
基于单片机的数码管定时插座设计与定时开关功能实现
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
云栖梦泽1 小时前
玩转RK3506SDK
linux·嵌入式硬件
努力攻坚操作系统2 小时前
编程语言编译运行机制对比:C / Java / Python
java·c语言·python
学会去珍惜2 小时前
C语言简介
c语言·开发语言
凡人叶枫3 小时前
Effective C++ 条款07:为多态基类声明 virtual 析构函数
linux·c语言·开发语言·c++
数智工坊3 小时前
机器人四大主控板系统分层选型指南:树莓派、ESP32、STM32与Arduino的能力边界与实战定位
stm32·嵌入式硬件·机器人
matlabgoodboy3 小时前
计算机java程序代写python代码编写c/c++代做qt设计php开发matlab
java·c语言·python
caimouse4 小时前
Reactos 第 5 章 进程与线程 — 5.11 线程本地存储 TLS
c语言·windows
进击的小头4 小时前
第8篇:IGBT 从零到精通:核心原理、关键参数、选型指南与工业级应用要点
经验分享·嵌入式硬件·学习