51单片机简易电子称程序

发布者:WanderlustGaze最新更新时间:2020-09-14 来源: 51hei关键字:51单片机  简易电子称 手机看文章 扫描二维码
随时随地手机看文章

这是我的单片机设计,主要是使用压力传感器、HX711模块和51单片机做的,附件里包含了电子称的原理图和源代码
这个简易电子称共有三个模式:
模式1:进行普通的物体测量;
模式2:计价模式;
模式3:累计测量模式;
此外,除了可以用按键进行模式的切换,还可通过上位机发送指令进行模式的切换。
此次课程设计主要是针对51单片机的基础知识的运用,其中主要运用了以下知识点:对矩阵按键、LED灯、蜂鸣器、AD转换、LCD12864、
定时器0、定时器1、外部中断0、外部中断1、串口(使用到定时器2,所以在烧录时芯片请用STC89C52)等。

简易介绍
基于51单片机设计的简易电子称,性能比较简单,共分为3个模式,模式一是用于重物的测量,模式2主要用于物品的计价,不过单价输入只能是整数,由于重物重量精确到小数点后两位,所以单计价后的价格可以是小数的。模式三是重物的累计测量。同时处理按键进行模式切换后,还可以通过上位机发送指令进行模式切换,当上位机发送1时,接收机接到指令后启动模式1,并发送“模式1启动”。其他模式也与此相似,但当上位机发送其他字符时,单片机会返回“模式切换失败,请输入正确序号”类似的字样。
模式说明
模式1
普通测量模式,只进行普通的测量
模式2
计价测量模式,可根据输入的价格和被测物重量计算价格
模式3
累计测量模式,可在按键按下后累计被测物重量,结束键按下后显示总重量
按键说明
数字键
模式2下的价格输入键,只在模式2下有效
功能键A
按下A键进入模式1
功能键B
按下B键进入模式2
功能键C
按下C键进入模式3
功能键D
模式3下按下后被测物体重量被确认,若没按下模式3结束键,继续进行下一被测物体的测量。只在模式3下有效
功能键*
模式2下的价格清除键,按下后价格归0,显示清空。只在模式2下有效
功能键#
模式2下的价格确认键,按下后下个被固定,再按下数字键时价格处于重新输入的状态。模式3下作为模式3结束键,按下按键后显示累计测量的总重量。

界面简介模式1界面

模式2界面

模式3界面

模式3最终界面

程序主流程图

各个模块流程图(略)
单片机源程序如下:

#include "reg52.h"

#include "HX711.h"

#include "lcd12864.h"

#include "module.h"

#include "keyborad.h"


//*************************************************************************

// 定时器0初始化函数

//*************************************************************************

void timer0_init(void)//50ms

{

ET0 = 1; //允许定时器0中断

TMOD = 0x11; //定时器工作方式选择

TL0 = 0xb0;

TH0 = 0x3c; //定时器赋予初值

TR0 = 1; //启动定时器

EA = 1;

}



//*************************************************************************

// 定时器0中断服务函数

// 每秒中刷新5次

//*************************************************************************

bit weight_flag=0; //定时器0的标志位

uchar time0_count=0; //定时器0计数标志

void timer0() interrupt 1

{

TL0 = 0xb0;

TH0 = 0x3c; //定时器赋予初值

time0_count++;

if(time0_count>=4){

time0_count = 0;

weight_flag = 1;

}

}


//*************************************************************************

// 定时器1初始化函数

//*************************************************************************

void timer1_init(void)        //50ms

{

ET1 = 1;

TL1 = 0xB0;        //设置定时初值

TH1 = 0x3C;        //设置定时初值

//        TR1 = 1;        //定时器1开始计时

}


//*************************************************************************

// 定时器0中断服务函数

// 计时3秒钟

//*************************************************************************

bit weight_flag1; //定时器1的标志位

uchar timer1_count;//定时器计1数标志

void timer1(void) interrupt 3

{

TL1 = 0xB0;        //设置定时初值

TH1 = 0x3C;        //设置定时初值

timer1_count++;

if (timer1_count == 60) {

TR1 = 0;

timer1_count = 0;

weight_flag1 = 1;

}

}


//*************************************************************************

// 外部中断0初始化

// 用来调整超重报警值

//*************************************************************************

ulong weight_alarm=200000;

void INIT0_int()

{

EX0 = 1;

IT0 = 1;

}

//*************************************************************************

// 外部中断0服务函数

//*************************************************************************

void INIT0_deal() interrupt 0

{

weight_alarm-=50000;if(weight_alarm<=100000)weight_alarm=450000;

}


//*************************************************************************

// 外部中断1初始化

// 用来调整超重报警值

//*************************************************************************

void INIT1_int()

{

EX1 = 1;

IT1 = 1;

}

//*************************************************************************

// 外部中断1服务函数

//*************************************************************************

void INIT1_deal() interrupt 2

{

weight_alarm+=50000;if(weight_alarm>=450000)weight_alarm=200000;

}


//*************************************************************************

// 串口发送数据函数

//*************************************************************************

void SendData(unsigned char *s)

{

while(*s>0)

{

SBUF = *s;

while(!TI);

TI = 0;

s++;

}

}

//*************************************************************************

// 串口初始化函数

//*************************************************************************

sfr T2MOD = 0x9C;

void USTAR_init()

{

PS = 1;

SCON = 0x50;

T2MOD = 0x01;

T2CON = 0x30;

TH2 = 0xFF;

TL2 = 0xDC;        

RCAP2H = 0XFF;

RCAP2L = 0xDC; //波特率9600

TR2 = 1;

ES = 1;

EA = 1;

}

//*************************************************************************

// 串口中断服务函数

//*************************************************************************

uchar ReceiveData=0;

void USTAR() interrupt 4

{

ReceiveData = SBUF;

while(!RI);

RI = 0;

if(ReceiveData=='1')

{

SendData("模式1启动n");

}

else if(ReceiveData=='2')

{

SendData("模式2启动n");

}

else if(ReceiveData=='3')

{

SendData("模式3启动n");        

}

else

{

SendData("切换失败,");

SendData("非所属模式n");

}

}

//*************************************************************************

// 串口模式切换界面函数

//*************************************************************************

void BoundaryChange()

{

if(ReceiveData==0)return;

if(ReceiveData=='1')

{

module1_flag=1;

module2_flag=0;

module3_flag=0;

ReceiveData=0;

module1_init();

}

else if(ReceiveData=='2')

{

module1_flag=0;

module2_flag=1;

module3_flag=0;

ReceiveData=0;

module2_init();

}

else if(ReceiveData=='3')

{

module1_flag=0;

module2_flag=0;

module3_flag=1;

ReceiveData=0;

module3_init();        

}

}


//*************************************************************************

// 报警函数

//*************************************************************************

sbit beep = P2^7;

sbit led = P0^0;

void beep_alarm()

{

uint i=500;

while(i--){

beep = ~beep;

if(i==1)led =~led;

delay(1);}

}

//*************************************************************************

// 主函数

//*************************************************************************

void main()

{

lcd_init();        //LCD12864初始化

USTAR_init();        //串口中断初始化

timer0_init();        //定时器0初始化

timer1_init();        //定时器1初始化

INIT0_int();        //外部中断0初始化

INIT1_int();        //外部中断1初始化

Get_MaoPi();        

Get_MaoPi();

delay(1000);

Get_MaoPi();

Get_MaoPi();        //获取毛皮重量

while(1)

{

BoundaryChange();

if(weight_flag==1){

Get_Weight();

weight_flag=0;} //每次标志位为1的时候刷新

Key_Deal();        

if(module1_flag==1) module1();

else if(module2_flag==1)module2();

else if(module3_flag==1)module3();

if(weight >= weight_alarm){beep_alarm();}else{led=1;}//超重报警

if(module3_flag != 1){thing_count=1;Totle_weight=0;}//非模式3下的计数量全部清零

}        

}





关键字:51单片机  简易电子称 引用地址:51单片机简易电子称程序

上一篇:基于51单片机PWM调速数码管显示测速
下一篇:单片机+PCF8591实现数字电压表

推荐阅读最新更新时间:2024-11-02 12:20

C51单片机在电机转速测量仿真系统中的设计
单片机电机转速测量系统仿真系统采用单片机中T1计数器对转速脉冲进行计数。定时器T1 工作于外部事件计数方式,对转速脉冲计数; T0 工作于定时器方式。每到1 s 读1 次计数值,此值即为脉冲信号的频率,根据式( 1) 可计算出电机的转速。转速检测装置的软件系统主要包括: 测速主程序、数据处理子程序和显示子程序。单片机上电后,系统进入准备状态。首先进行初始化,然后读取脉冲数据进行运算,将转速显示在LCD上。需要这款仿真及C语言程序的爱好者可从文章配图左上角网址上了解。 该单片机电机转速测量系统仿真仿真采用测频法“M法”测量电机转速。即在一定测量时间T内,测量脉冲发生器(替代输入脉冲)产生的脉冲数m1来测量转速,计算式如下:n=
[单片机]
C<font color='red'>51单片机</font>在电机转速测量仿真系统中的设计
#51单片机#中断
中断 中断,是单片机的一种运行机制。 标准的51单片机有两个控制中断的寄存器。一个是中断使能寄存器,另一个是中断优先级寄存器。 IE——中断使能寄存器的位分配(地址0XA8,可位寻址 ) IE——中断使能寄存器的位描述 中断查询序列 中断的优先级 中断有两种优先级。一种是抢占优先级,另一种是固有优先级。 抢占优先级 参考C语言的优先级理解。单片机会先执行优先级高的中断。 这里需要认识一个现象——中断嵌套。 如果单片机在执行低优先级中断时发生了高优先级中断,单片机会马上进入高优先级中断执行。高优先级中断处理完后,单片机返回处理低优先级中断。这个过程叫中断嵌套。 IP寄存器通过将优先级控制位置1,将
[单片机]
#<font color='red'>51单片机</font>#中断
基于51单片机的电子广告牌电路设计
0 引 言 现在城市中用于装点各种建筑物的绚丽色彩依旧是霓虹灯.但是霓虹灯具有发热量大,亮度较小,色彩较暗,价格较贵且耗电量较大等缺点已经不作为现在装饰的主要选择对象。点阵屏具有价格便宜,可视度远,亮度高,耗能较低,体积较小,且可以根据实际情况由几块小的点阵屏组合成较大面积的点阵块等优点。在此主要介绍以AT89S51为控制芯片,用8×8的点阵屏4块来级联实现16×16的点阵屏,从而用于广告牌显示等。 1 系统设计方案 鉴于所设计的点阵屏为16×16单色显示,可以用8×8的点阵屏4块来级联实现,此时点阵屏的行列各为16管脚,需要扩展口,采用74LS164串行输入并行输出来实现。整个系统以AT89S51为控制芯片,P0/P2
[单片机]
基于<font color='red'>51单片机</font>的电子广告牌电路设计
基于AT89C51单片机的无线病房呼叫系统设计
病房呼叫系统作为一种基本医疗陪护设备已逐步得到普及并不断得到改进。传统的病房呼叫系统采用PC 机联网监控和有线控制, 虽然具备很强的专业服务功能和监护能力, 但是其实现方法复杂, 前期投资和后期维护的费用都很高。 本文采用单片机实现无线数据传输通信和实时报警功能, 设计一套低成本通用型的病房呼叫系统。整个系统采用无线通信的方式, 降低了复杂的布线、安装检修和拆卸的难度, 并可监控多个病房且便于扩充升级。 1 系统方案设计 本设计采用从机和主机相分离的模式。从机安装于各个病房, 主机安装于医务室或值班室。多个从机处于等待外部呼叫信号的状态, 主机则时刻处于等待接收从机呼叫信息的状态, 并且从机与主机之间采用无线数据 传输通信
[单片机]
基于AT89C<font color='red'>51单片机</font>的无线病房呼叫系统设计
单片机第一步——51单片机
俗话说:“天才第一步,XX纸尿裤。”哈哈!扯远了。不过,我们今天说的,确实可能是绝大多数嵌入式工程师或者电子爱好者接触的第一款单片机——51单片机。 图为51单片机驱动LED点阵的电子制作 51单片机只是爱好者们的一种“爱称”,51单片机指的是所有搭载可执行INTEL 8031指令系统的MCU的单片机。这里,我们需要澄清单片机实际使用方面的一个产品概念,MCS-51单片机是美国INTEL 公司于1980年推出的产品,典型产品有 8031(内部没有 程序存储器 ,实际使用方面已经被市场淘汰)、8051(芯片采用HMOS,功耗是630mW,是89C51的5倍,实际使用方面已经被市场淘汰)和8751等通用产品,一直到现在, M
[单片机]
单片机第一步——<font color='red'>51单片机</font>
51单片机测量脉冲周期
要求:测量脉冲的周期 思想:用定时器和外部中断(下降沿触发中断),当第一个下降沿时,触发外部中断,此时开始计时。当第二个下降沿时,此时停止计时,此时的时间就是脉冲的周期。 程序: #include reg51.h #include intrins.h #define uLint unsigned long int uLint cycle_t = 0 ;//脉冲周期时间 sbit in = P3^2 ; bit start = 0 ; void Int0 (void) interrupt 0 { if(start == 0)//第一次下降沿开始计时 { cycle_t = 0 ; TL0 = 0 ; }
[单片机]
<font color='red'>51单片机</font>测量脉冲周期
51单片机读写max186的c51程序
//ad转换子程序 //返回的是12位的int型数据 //max186通道ch0对应的是0,它是max186第1脚 //max186通道ch1对应的是1,它是max186第2脚 //max186通道ch2对应的是2,它是max186第3脚 //max186通道ch3对应的是3,它是max186第4脚 //max186通道ch4对应的是4,它是max186第5脚 //max186通道ch5对应的是5,它是max186第6脚 //max186通道ch6对应的是6,它是max186第7脚 //max186通道ch7对应的是7,它是max186第8脚 //比如:int ch3; // ch3=ad186(3); //ch3就是从max
[单片机]
<font color='red'>51单片机</font>读写max186的c51程序
51单片机——中断系统结构
1 什么是中断 在生活中经常会遇到这样的情况:正在书房看书时,突然客厅的电话响了,人们往往会停止看书,转而去接电话,接完电话后又回书房接着看书。这种停止当前工作,转而去做其他工作,做完后又返回来做先前工作的现象称为中断。 单片机也有类似的中断现象,当单片机正在执行某程序时,如果突然出现意外情况,它就需要停止当前正在执行的程序,转而去执行处理意外情况的程序(又称中断子程序),执行处理完后又接着执行原来的程序。 2 中断的基本概念 2.1 中断源 要让单片机的CPU中断当前正在执行的程序转而去执行中断子程序,需要向CPU发出中断请求信号。让CPU产生中断的信号源称为中断源(又称中断请求源)。 8051单片机有5个中断源,分
[单片机]
<font color='red'>51单片机</font>——中断系统结构
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved