51单片机设计电子秤参考代码
时间: 2023-08-04 22:09:33 浏览: 174
以下是一个简单的基于51单片机的电子秤代码示例:
```c
#include <reg52.h>
#include <intrins.h>
// 数码管显示的段码定义
unsigned char code duanma[10]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
};
// 74hc595芯片的控制端口定义
sbit DS=P1^0; // 数据
sbit SHCP=P1^1; // 时钟
sbit STCP=P1^2; // 存储
// 按键的端口定义
sbit key0=P3^0; // 清零
sbit key1=P3^1; // 去皮
// 电子秤AD转换函数
unsigned int Get_Weight()
{
unsigned int ad_val=0;
unsigned char i;
ADC_CONTR=0x90; // 启动AD转换
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
while(!ADC_CONTR&0x20); // 等待转换完成
ADC_CONTR&=0xdf; // 清除ADC转换完成标志
ad_val=ADC_RES;
ad_val<<=8;
ad_val|=ADC_RESL;
for(i=0;i<6;i++) // 滤波
ad_val=(ad_val*7+Get_Adc_Average(ADC_CHANNEL_3,10))/8;
return ad_val;
}
// 获取AD转换结果的平均值
unsigned int Get_Adc_Average(unsigned char ch, unsigned char times)
{
unsigned int temp_val=0;
unsigned char t;
for(t=0;t<times;t++)
{
temp_val+=Get_Adc(ch);
Delay_Ms(2);
}
return temp_val/times;
}
// 获取AD转换结果
unsigned int Get_Adc(unsigned char ch)
{
ADC_CONTR=0x80|ch|0x10;
Delay_Ms(2);
while(!(ADC_CONTR&0x20));
ADC_CONTR&=0xdf;
return ADC_RES;
}
// 去皮
void Tare()
{
unsigned int ad_val=0;
unsigned char i;
for(i=0;i<10;i++) // 采集10次
{
ad_val+=Get_Weight();
Delay_Ms(10);
}
ad_val/=10; // 计算平均值
EA=0; // 关中断,防止误差
ADRESH=(unsigned char)(ad_val>>8);
ADRESL=(unsigned char)ad_val;
EA=1; // 开中断
}
// 清零
void Clear()
{
EA=0; // 关中断,防止误差
ADRESH=0;
ADRESL=0;
EA=1; // 开中断
}
// 数码管显示函数
void Display(unsigned int weight)
{
unsigned char i;
unsigned char wei[5]={0,0,0,0,0}; // 存储每一位数码管上的数字
unsigned long tem=weight; // 转换为长整型
for(i=0;i<5;i++) // 将数字分解成每一位
{
wei[i]=tem%10;
tem/=10;
}
for(i=0;i<5;i++) // 循环扫描每一位
{
P0=0x00; // 关闭显示
DS=0; // 清除数据
SHCP=0; // 清除时钟
STCP=0; // 清除存储
P0=duanma[wei[i]]; // 设置段码
DS=1; // 存储数据
SHCP=1; // 上升沿时钟
STCP=1; // 存储数据
P0=0xff; // 打开显示
Delay_Ms(1); // 延时
}
}
// 主函数
void main()
{
unsigned int weight=0;
TMOD=0x01; // 定时器0工作在模式1
TH0=0xfc; // 定时器0初值
TL0=0x67;
TR0=1; // 启动定时器0
ET0=1; // 使能定时器0中断
EA=1; // 开总中断
while(1)
{
weight=Get_Weight(); // 获取重量
Display(weight); // 显示重量
if(key0==0) // 清零
{
Clear();
while(key0==0);
}
if(key1==0) // 去皮
{
Tare();
while(key1==0);
}
}
}
// 定时器0中断函数
void Timer0() interrupt 1
{
static unsigned char cnt=0;
TH0=0xfc; // 定时器0初值
TL0=0x67;
cnt++;
if(cnt>=10) // 每100ms获取一次重量
{
cnt=0;
weight=Get_Weight();
}
}
```
该代码实现了基本的电子秤功能,包括去皮、清零和重量显示。代码中使用了74hc595芯片进行数码管的驱动,通过定时器中断实现了重量的周期性获取和显示。需要根据具体硬件电路进行调整和优化。
阅读全文