⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 电子称.c

📁 电子称的程序
💻 C
字号:
/*********************************************************************/
//                      电压表C程序
//                    使用keil C51 ver7.09
//                     2004.10.11
/*********************************************************************/
/*使用AT89C52单片机,12MHZ晶振,P0口读入AD值,P2口作AD控制,用共阳LED数码管
P1口输出段码,P3口扫描,最高位指示通道(0-7)。*/
#include "reg52.h"        //52系列单片机定义文件
#include "intrins.h"      //调用_nop_();延时函数用
#define  ad_con   P2      //AD控制口
#define  addata   P0      //AD数据计入读入口
#define  Disdata    P1    //显示数据段码输出口
#define uchar unsigned char//无符号字符(8位)
#define uint unsigned int  //无符号整数(16位)
uchar number = 0x00;
sbit  ALE=P2^3;           //锁存地址控制位
sbit  START=P2^4;         //启动一次转换位
sbit  OE=P2^5;            //0809输出数据控制位
sbit  EOC=P3^7;           //转换结束标志位
sbit key1 = P3^5;
sbit key2 = P3^6;
sbit FLAG = PSW^0;
sbit  DISX=Disdata^7;     //LED小数点
//
//
uchar code dis_7[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
/* 共阳七段LED段码表  "0"  "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9" "不亮" */                
uchar code  scan_con[4]={0xf7,0xfb,0xfd,0xfe};                      //四位列扫描控制字
uchar data  ad_data[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//定义8个数据内存单元
uint  data  dis[5]={0x00,0x00,0x00,0x00,0x00};  //定义4个显示数据单元、1个数据暂存单元
//
// 
/********1毫秒延时子函数**********/
delay1ms(uint t)
{
 uint i,j;
 for(i=0;i<t;i++)
  for(j=0;j<120;j++) ;
}
//
//
/***********显示扫描子函数**********/
/****************检测按键子函数***************/
 keytest ()
{
  if (key1 == 0)
    {
      FLAG =! FLAG;
      while (key1 == 0);
    }
  if (FLAG == 1)
    {
      if (key2 == 0)
      {
        number ++;
         if (number == 8) 
             {
               number = 0;
             }
     while (key2 == 0);
      }
    }
  }
scan()
{
  uchar k,n;
   int h;
   if (FLAG == 0)
    { 
       dis[4]=0x00;                 //通道初值为0
              
       dis[3]=ad_data[n]/45;      //测得值转换为三位BCD码,最大为5.12V,计算百位数据
       dis[4]=ad_data[n]%45;      // 余数暂存
       dis[4]=dis[4]*10;          //计算十位数据,
       dis[2]=dis[4]/45;          //
       dis[4]=dis[4]%45;          //
       dis[4]=dis[4]*10;          //计算个位数据
       dis[1]=dis[4]/45;  
       dis[4]=dis[4]%45;          //计算小数点后面第一位数
       dis[4]=dis[4]*10;
        dis[0]=dis[4]/45;
      for(h=0;h<500;h++)         //每个通道值显示时间控制(约1秒)
       {
          for(k=0;k<4;k++)         //四位LED扫描控制
          {
            Disdata=dis_7[dis[k]];
	         if(k==1){DISX=0;}
	         P3=scan_con[k];delay1ms(1);P3=0xff;
          }
       
      dis[4]++;                 //通道值加1
     keytest();
     }
  }
   if (FLAG == 1)
       {
         dis[4] = number;
          for (k = 0;k < 4;k ++)
            {
                Disdata=dis_7[dis[k]];
	         if(k==1){DISX=0;}
	         P3=scan_con[k];delay1ms(1);P3=0xff;
            }
          keytest ();
        }
  }
  
//
//
/*******0809AD转换子函数***********/
test()
  {
   uchar m=0;
   uchar s=0x00;
   ad_con=s;
   ALE=1;_nop_();_nop_();ALE=0;     //转换通道地址锁存
    START=1;_nop_();_nop_();START=0; //开始转换命令
    _nop_();_nop_();_nop_();_nop_(); //延时4微秒
     while(EOC==0);                   //等待转换结束
     OE=1;ad_data[m]=addata;OE=0;s++;ad_con=s;//取AD值,地址加1
    ad_con=0x00;                       //控制复位 
  }
//


//**************主函数****************//
 main()
 {
   P0=0xff;          //初始化端口 
   P1=0xff;
   P3=0xff;
   while(1)
    {
      test();       //测量转换一次 
      scan();       //依次显示8个通道值一次  
    }
 }
//*********************结束**************************//

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -