#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
/**************端口定义**************/
sbit a=ACC^0;
sbit s=ACC^7;
sbit rs=P2^6;
sbit e=P2^7;//时能端
sbit rw=P2^5;//1602读写控制端
sbit DI=P2^0;//P1^2;//AD0832数据
sbit ADCCLK=P2^1;//P1^1;//AD0832时钟
sbit ADCCS=P2^2;//P1^0;//AD0832片选
/*******************************/
sbit p1=P1^6;//单价输入
sbit p2=P1^7;//确定
sbit beep=P2^3;
/****************变量定义*************/
uint g=-1,ge1;//输入单价时 用来确定输入位数
uint k2;//键盘返回值
uint biao;//输入单价标志位
uchar dd;//从AD读出的值
uint i;
int b;
/************数组定义****************/
//uchar code qw[]={1,0,0};//AD0832模式选择
uint array[6]={0x00,0x00,0x00,0x00,0x00};//存储数据
/************时钟初始化************/
uchar code tad[]="Q: 00.00Kg ";
uchar code tad1[]="UP:00.0 TP:000.0";
/****************延时******************/
void delay(uchar x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
/********1602**********/
void write_date(uchar date)//写数据
{
rs=1;
P0=date;
delay(5);
e=1;
delay(5);
e=0;
}
void write_com(uchar c)//写指令
{
rs=0;
P0=c;
delay(5);
e=1;
delay(5);
e=0;
}
/*************1602初始化*******/
void init1602()
{
uint num;
rw=0;
e=0;
/* cs=1;
clk=0; */
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<16;num++)
{
write_date(tad[num]);
delay(1);
}
write_com(0x80+0x40);
for(num=0;num<16;num++)
{
write_date(tad1[num]);
delay(1);
}
}
/*************************************/
/**** AD0832*********************/
/*************************************/
uint du(uint CH)
{
uint i,test,adval,dat;
adval=0;
test=0;
ADCCS=0; //选通ADC0832
_nop_(); //延时
ADCCLK=1;//第一个脉冲的上升沿
_nop_(); //延时
DI=1; //第一个脉冲下降沿之前ADC0832转换启动信号
ADCCLK=0;//第一个脉冲的下降沿
_nop_(); //延时
ADCCLK=1;//第二个脉冲的上升沿
_nop_(); //延时
if(CH==0)//选通CH0通道
{
DI=1;//第二个脉冲下降之前送人通道选择第二位
ADCCLK=0;//第二个下降沿
_nop_();
ADCCLK=1;//第三个脉冲上升沿
_nop_();
DI=0; //第三个脉冲下降沿之前送入通道选择第3位
ADCCLK=0;//第三个脉冲的下降沿
_nop_();
ADCCLK=1;//开始第四个脉冲
_nop_();
}
else //选通CH1通道
{
DI=1; //第二个脉冲下降沿之前送通道选择的第一位
ADCCLK=0; //第二个下降沿
_nop_();
ADCCLK=1; //第三个脉冲的上升沿
_nop_();
DI=1;//第三个脉冲的下降沿之前送通道通道选择的第二位
ADCCLK=0;//第三个脉冲的下降沿
_nop_();
ADCCLK=1;//开始第四个脉冲
_nop_();
}
ADCCLK=0;//第四个脉冲的下降沿
DI=1;
for(i=0;i<8;i++)//读取前八位
{
_nop_();
adval<<=1;
ADCCLK=1;
_nop_();
ADCCLK=0;
if(DI)
adval|=0x01;
else
adval|=0x00;
}
for(i=0;i<8;i++)//读取后八位
{
test>>=1;
if(DI)
test|=0x80;
else
test|=0x00;
_nop_();
ADCCLK=1;
_nop_();
ADCCLK=0;
}
if(adval==test)//比较前8位与后8位的数值,如果不相同,舍去
dat=test;
_nop_();
ADCCS=1;//释放ADC0832
DI=1;
ADCCLK=1;
return dat;
}
/*****************************************/
/****** 对读入的AD值进行换算*****/
void sa()//数据处理
{
// int b;
uint bai,shi,ge;
dd=du(0);
b=dd*200;
b=b/51;
// b=b-50;
if(b<=50)
{
b=0;
}
bai=b/1000;
shi=(b%1000)/100;
ge=b%100/10;
ge1=b%10;
write_com(0x80+5);
write_date(0x30+bai);
write_date(0x30+shi);
write_date('.');
write_date(0x30+ge);
write_date(0x30+ge1);
array[4]=array[3]*b/10;
write_com(0x80+0x40+11);
write_date(0x30+array[4]/10000);
write_date(0x30+array[4]%10000/1000);
write_date(0x30+array[4]%10000%1000/100);
write_date('.');
write_date(0x30+array[4]%100/10);
}
/*****************************************/
/*****************************************/
/**** 键盘*******************/
/*****************************************/
uchar aj()
{
uint f;
/*****************1-4***********************/
P1=0xf7;
f=P1;
f=f&0xf0;
while(f!=0xf0)
{
delay(1);
f=P1;
f=f&0xf0;
while(f!=0xf0)
{
f=P1;
switch(f)
{
case 0xe7:k2=1;
break;
case 0xd7:k2=2;
break;
case 0xb7:k2=3;
break;
case 0x77:k2=4;
break;
}
g++;
if(g==3)
g=0;
while(f!=0xf0)
{
f=P1;
f=f&0xf0;
}
}
}
/*****************5-8***********************/
P1=0xfb;
f=P1;
f=f&0xf0;
while(f!=0xf0)
{
delay(1);
f=P1;
f=f&0xf0;
while(f!=0xf0)
{
f=P1;
switch(f)
{
case 0xeb:k2=5;
break;
case 0xdb:k2=6;
break;
case 0xbb:k2=7;
break;
case 0x7b:k2=8;
break;
}
g++;
if(g==3)
g=0;
while(f!=0xf0)
{
f=P1;
f=f&0xf0;
}
}
}
/*****************9-0***********************/
P1=0xfd;
f=P1;
f=f&0xf0;
while(f!=0xf0)
{
delay(1);
f=P1;
f=f&0xf0;
while(f!=0xf0)
{
f=P1;
switch(f)
{
case 0xed:k2=9;
break;
case 0xdd:k2=0;
break;
}
g++;
if(g==3)
g=0;
while(f!=0xf0)
{
f=P1;
f=f&0xf0;
}
}
}
return k2;
}
/**************单价与重量的切换**************/
void aj1() //进入单价设置
{
P1=0xfd;
if(p1==0)
{
delay(5);
if(p1==0)
{
biao=1;g=-1;
write_com(0x80+14);
write_date('T');
}
while(!p1);
}
}
void aj2()//确定
{
P1=0xfd;
if(p2==0)
{
delay(5);
if(p2==0)
{
biao=0;g=-1;
write_com(0x80+14);
write_date(' ');
array[3]=(array[0]*100+array[1]*10+array[2]);
}
while(!p2);
}
}
/*****************************************/
/***** 初始化*******************/
/*****************************************/
void init()
{
biao=0;
init1602();
}
/*****************************************/
/**** 主函数*****************/
/*****************************************/
void main()
{
init();
while(1)
{
sa();
aj1();
if(b>500)
{
beep=0;
delay(100);
beep=1;
}
while(biao)
{
aj2();
array[g]=aj(); //读取键值
write_com(0x80+0x40+3);
write_date(0x30+array[0]);
write_date(0x30+array[1]);
write_date('.');
write_date(0x30+array[2]);
}
}
}
/************************************/
没有合适的资源?快使用搜索试试~ 我知道了~
127、基于51单片机LM358放大电子秤电路图PCB及程序.rar
共29个文件
lst:3个
obj:3个
bak:2个
3 下载量 21 浏览量
2023-11-06
12:23:49
上传
评论
收藏 631KB RAR 举报
温馨提示
本资源内容概要: 这是基于51单片机LM358放大电子秤设计,包含了电路图源文件(Altiumdesigner软件打开)、C语言程序源代码(keil软件打开) 。 本资源适合人群: 单片机爱好者、电子类专业学生、电子diy爱好者。 本资源能学到什么: 可以通过查看电路学习电路设计原理,查看代码学习代码编写原理。 本资源使用建议: 建议使用者需要具备一定电子技术基础,掌握一些常用元器件原理,例如三极管、二极管、数码管、电容、稳压器等。了解C语言基础设计原理,能看懂基础的电路图,具备一定的电路图软件使用能力。
资源推荐
资源详情
资源评论
收起资源包目录
127、基于51单片机LM358放大电子秤电路图PCB及程序.rar (29个子文件)
127、基于51单片机LM358放大电子秤电路图PCB及程序
程序
电子称
电子称.OBJ 16KB
12.Opt 1KB
1602.OBJ 14KB
12.Uv2 2KB
STARTUP.LST 14KB
12.M51 21KB
12.lnp 56B
12_Opt.Bak 1KB
电子称.c 7KB
STARTUP.A51 6KB
12.hex 5KB
电子称.LST 18KB
12_Uv2.Bak 2KB
12 14KB
STARTUP.OBJ 749B
12.plg 200B
1602.LST 17KB
电子称电路图PCB
PCB_PROJECT1.PRJPCBStructure 48B
PCB1.pcb 160KB
PCB1.PcbDoc 628KB
__Previews
PCB1.PcbDocPreview 123KB
Sheet1.SchDocPreview 45KB
PCB1.pcblib_viewstate 3KB
History
PCB_PROJECT1.PRJPCB 41KB
PCB1 PCB ECO 2011-11-2 21-30-25.LOG 5KB
Sheet1.SchDoc 223KB
PCB1.PcbLib 70KB
PCB1.PcbDoc.htm 6KB
PCB1.pcbdoc_viewstate 3KB
共 29 条
- 1
资源评论
>行者<
- 粉丝: 209
- 资源: 135
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功