资源简介

用proteus设计仿真的基于51单片机的电子秤电路,附带单片机源码。

资源截图

代码片段和文件信息

#include“reg51.h“//头文件
#include
#define DD P2
sbit CS=P1^0; //定义端口
sbit CLK=P1^1;
sbit DO=P1^2;
sbit DI=P1^3;
sbit KEY=P1^7;
sbit buzzer=P0^0;
sbit Rs=P1^4;//LCD定义端口
sbit Rw=P1^5;
sbit E=P1^6;
sbit busy_p=ACC^7;
unsigned char CH=0x02key_count=1;
unsigned char HC[6]={0};
unsigned char BZ=0;
void delay_1ms(unsigned char i) //延时函数1ms
{
unsigned char j;
while(i--)
for(j=0;j<125; j++);
}
void delay_10ns(unsigned char i)//延时函数10ns
{
unsigned char j;
while(i--)
for(j=0;j<10; j++);
}
void xiezhiling(unsigned char combit p)//写命令函数
{
if(p)
delay_10ns(5);
E=0;
Rs=0;
Rw=0;
DD=com;
delay_10ns(50);
E=1;
delay_1ms(2);
E=0;
delay_10ns(4);
}
void xieshuju(unsigned char DATA)//写数据函数
{
delay_10ns(50);
E=0;
Rs=1;
Rw=0;
DD=DATA;
delay_10ns(50);
E=1;
delay_10ns(50);
E=0;
delay_10ns(4);
}

void init(void)//初始化函数
{
delay_1ms(15);
xiezhiling(0x380);
delay_1ms(5);
xiezhiling(0x380);
delay_1ms(5);
xiezhiling(0x380);
delay_1ms(5);
xiezhiling(0x381); //功能设定(8位,2行,5*7点矩阵)
xiezhiling(0x081);
xiezhiling(0x011); //清除屏幕
xiezhiling(0x061); //加1
xiezhiling(0x0c1);//显示器ON,光标OFF,闪烁OFF
}
unsigned char ADconv(void)//AD转换子程序
{
unsigned char i;
unsigned int data_f=0data_c=0;
DI=1;
CS=1;
_nop_();
CS=0;
DI=1; ;
CLK=1;
_nop_();
_nop_();
CLK=0;
_nop_();
_nop_();
CLK=1;
DI=(bit)(0x02&CH);
_nop_();
CLK=0;
_nop_();
_nop_();
CLK=1;
DI=(bit)(0x01&CH);
_nop_();
_nop_();
CLK=0;
DI=1;
CLK=1;
_nop_();
_nop_();
CLK=0;
_nop_();
CLK=1;
     

for(i=8;i>0;i--)
{
  data_f|=DO;
  data_f<<=1;
  CLK=1;
  _nop_();
  _nop_();
  CLK=0;
  _nop_();
}
for(i=8;i>0;i--)
{
  data_c<<=1;
  data_c|=DO;
  _nop_();
  CLK=1;
  _nop_();
  _nop_();
  CLK=0;
  _nop_();

}

CLK=0;
_nop_();
_nop_();
CLK=1;
_nop_();
_nop_();

CLK=0;
_nop_();
_nop_();
CLK=1;
_nop_();
CS=1;
_nop_();
_nop_();
return data_f;
}

void xs_int(unsigned int shuju)//将一个数据各个位分开并存放在H C[]数组中
{

if(shuju < 10)
  BZ = 1;
else if(shuju < 100) BZ = 2;
else if(shuju < 1000) BZ = 3;
else if(shuju < 10000) BZ = 4;
else if(shuju < 65535) BZ = 5;
switch(BZ)
{
  case 5:HC[5] = shuju/10000; //百位
  case 4:HC[3] = shuju%10000/1000;//十位
  case 3:HC[2] = shuju%1000/100;//个位
  case 2:HC[1] = shuju%100/10;//小数点后一位
  case 1:HC[0] = shuju%10;
  break;
  default:break;
}



}
void main(void)//主函数
{
unsigned int data_temp=0;
init();
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
TR0=1;



while(1)
{
  data_temp=ADconv();
  if(data_temp>128)//报警数值
  {
   EA=1;
  }
  else
  {
   EA=0;
   buzzer=0;
  }
  P3=~data_temp;
  xs_int(196*data_temp);
  if(KEY==0)
  {
   delay_1ms(10);
   if(KEY==0)
   while(!KEY);
   key_count++;
   if(key_count==3)
   key_count=1;
   xiezhiling(0x010);
   
  }

  if(key_count==1)
  {
   xiezhiling(0x801);//LCD第一行
   xieshuju(‘P‘);
   xieshuju(‘R‘);
   xieshuju(‘E‘);
   xieshuju(‘S‘);
   xieshuju(‘S‘);

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件       20412  2018-07-24 13:53  电子秤proteus仿真及源码\电子秤仿真.pdsprj
     文件        4581  2018-07-24 10:41  电子秤proteus仿真及源码\电子称仿真.c
     文件        3731  2018-07-24 10:53  电子秤proteus仿真及源码\电子称仿真.hex
     文件       13279  2018-07-24 11:43  电子秤proteus仿真及源码\电子称仿真.uvproj
     目录           0  2018-07-24 14:25  电子秤proteus仿真及源码\

评论

共有 条评论