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

}

}

}

五、实验现象

演示视频:

相关推荐
云知谷4 小时前
【嵌入式基本功】单片机嵌入式学习路线
linux·c语言·c++·单片机·嵌入式硬件
Word码6 小时前
[排序算法]希尔排序
c语言·数据结构·算法·排序算法
小叮当⇔6 小时前
IOT项目——STM32
stm32·嵌入式硬件·物联网
光子物联单片机6 小时前
STM32G474单片机开发入门(十五)CAN通信功能详解及实战
stm32·单片机·嵌入式硬件·mcu
A9better6 小时前
嵌入式开发学习日志40——stm32之I2C协议层
stm32·单片机·嵌入式硬件·学习
来生硬件工程师7 小时前
【STM32笔记】:P03 ISP 一键下载电路详解
c语言·笔记·stm32·嵌入式硬件·硬件工程·接口隔离原则·硬件设计
biter down8 小时前
c语言14:字符指针
c语言·开发语言
可爱的鸡仔9 小时前
STM32--------ADC转换
stm32·单片机·嵌入式
一念&10 小时前
每日一个C语言知识:C 字符串
c语言·开发语言