欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2779|回復: 1
打印 上一主題 下一主題
收起左側

電子稱控制程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:374633 發(fā)表于 2018-7-19 10:32 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

#include"reg51.h"
/****************************************************************
環(huán)宇電子秤系統(tǒng)  stc89C52單片機控制          
12864 LCD顯示    制作日期:2015/06/27
*****************************************************************/

#define uchar unsigned char
#define uint  unsigned int
unsigned char jian_ma,flag,jiao_flag,set_flag;
unsigned int   heavy,price=1,money,alarm=500,jiao_zhun=1010;              //相關變量定義   ,上限報警值初始值為500克
unsigned char menu,jia,jian,confr,fu,menu_flag,exit;
long data_num,data_temp,data_flash;
        unsigned char f=0;
        unsigned char code        table[]={" Welcome to you"};
                unsigned char code        table1[]={" Weight          "};
sbit IRIN = P3^3;         //紅外接收器數(shù)據(jù)線
sbit ADDO=P1^0;              //ad采集數(shù)據(jù)接口
sbit ADSK= P1^1;           //ad采集時鐘接口
sbit rs=P2^3;
sbit rw=P2^4;                   //液晶接口定義
sbit lcden=P2^5;
sbit bell=P3^6;    //蜂鳴器定義
sbit key=P2^7;    //按鍵定義
   #define Imax 14000    //此處為晶振為12時的取值, 紅外解碼
    #define Imin 8000    //如用其它頻率的晶振時,
    #define Inum1 1450    //要改變相應的取值。
    #define Inum2 700
    #define Inum3 3000
          unsigned char Im[4]={0x00,0x00,0x00,0x00};

    unsigned long m,Tc;
void delay_ms(unsigned char x)    //x*0.14MS
{
unsigned char i;
  while(x--)
{
  for (i = 0; i<13; i++) {}
}
}

void delay(unsigned int t)                //延時函數(shù)
{         
        uint x,y;
        for(x=t;x>0;x--)
        for(y=12;y>0;y--);
}
//****************************************************
   /*    名稱:寫命令函數(shù)
      功能:向LED1602中寫命令
  入口參數(shù):uchar com
  出口參數(shù):無
*/
void write_com(unsigned char com)
{
        rs=0;
        rw=0;
        lcden=0;
        P0=com;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;       
}

/*    名稱:寫數(shù)據(jù)函數(shù)
      功能:向LED1602中寫數(shù)據(jù)
  入口參數(shù):uchar date
  出口參數(shù):無
*/

void write_date(unsigned char date)
{
        rs=1;
        rw=0;
        lcden=0;
        P0=date;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;       
}


/*    名稱:初始化函數(shù)
      功能:初始化LED1602
  入口參數(shù):無
  出口參數(shù):無
*/

void lcd_init()
{
        unsigned char num;
        lcden=0;

        write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);    //清屏
        write_com(0x80);
        delay(5);
        write_com(0x80);
        for(num=0;num<15;num++)
                {
                        write_date(table[num]);
                        delay(5);
                }

        delay(20000);
                write_com(0x80);
        for(num=0;num<15;num++)
                {
                        write_date(table1[num]);
                        delay(5);
                }

}
void display( unsigned int weight,unsigned int bj,unsigned int vl)
{     unsigned int qian,bai,shi,ge;   
              qian=(weight/1000)%10;
                   bai=(weight/100)%10;
                        shi=(weight/10)%10;
                        ge=weight%10;
               write_com(0x87);                //重量顯示
                                write_date(':');
                                if(fu)                      //為賦值則顯示負號
                                 {
                                 fu=0;
                                        write_date('-');
                                }
                                else
                                        write_date(' ');               
                                if(qian)
                                {
                               write_date(0x30+qian);
                   write_date(0x30+bai);
                   write_date(0x30+shi);
                   write_date(0x30+ge);
                             }
                                 else
                                 if(bai)
                                 {
                                     write_date(' ');
                   write_date(0x30+bai);
                   write_date(0x30+shi);
                   write_date(0x30+ge);
                                 }
                                 else
                                 if(shi)
                                 {
                                              write_date(' ');
                    write_date(' ');
                   write_date(0x30+shi);
                   write_date(0x30+ge);
                                 }
                                 else
                                 {
                                      write_date(' ');
                      write_date(' ');
                     write_date(' ');
                      write_date(0x30+ge);
                                 }
                           write_date('g');
                            qian=(bj/1000)%10;
                   bai=(bj/100)%10;
                        shi=(bj/10)%10;
                        ge=bj%10;
                            write_com(0x80+0x40);          //報警值顯示
                                  write_date('M');
                                write_date(':');
                                                if(qian)
                                {
                               write_date(0x30+qian);
                   write_date(0x30+bai);
                   write_date(0x30+shi);
                   write_date(0x30+ge);
                             }
                                 else
                                 if(bai)
                                 {
                                     write_date(' ');
                   write_date(0x30+bai);
                   write_date(0x30+shi);
                   write_date(0x30+ge);
                                 }
                                 else
                                 if(shi)
                                 {
                                              write_date(' ');
                    write_date(' ');
                   write_date(0x30+shi);
                   write_date(0x30+ge);
                                 }
                                 else
                                 {
                                      write_date(' ');
                      write_date(' ');
                     write_date(' ');
                      write_date(0x30+ge);
                                 }
                          qian=(vl/1000)%10;        //校準值顯示
                   bai=(vl/100)%10;
                        shi=(vl/10)%10;
                        ge=vl%10;
                            write_com(0x80+0x47);
                                  write_date('V');
                                write_date(':');
                                             if(qian)
                                {
                               write_date(0x30+qian);
                   write_date(0x30+bai);
                   write_date(0x30+shi);
                   write_date(0x30+ge);
                             }
                                 else
                                 if(bai)
                                 {
                                     write_date(' ');
                   write_date(0x30+bai);
                   write_date(0x30+shi);
                   write_date(0x30+ge);
                                 }
                                 else
                                 if(shi)
                                 {
                                              write_date(' ');
                    write_date(' ');
                   write_date(0x30+shi);
                   write_date(0x30+ge);
                                 }
                                 else
                                 {
                                      write_date(' ');
                      write_date(' ');
                     write_date(' ');
                      write_date(0x30+ge);
                                 }
                                 if(set_flag)    //報警上限光標打開
                                 {
                                            write_com(0x80+0x40);          //報警值閃爍
                                         write_com(0x0f);          //報警值顯示
                                     write_date('M');
                                         
                                 }
                                 if(jiao_flag)
                                 {
                                    write_com(0x80+0x47);
                                         write_com(0x0f);          // 校準值閃爍
                                     write_date('V');
                                 }

}                        


void  read_count()        //ad采集函數(shù)
{
  unsigned long count;
  unsigned char i;
  ADSK=0;//使能ad
  count=0;
  while(ADDO);  //等待ad轉換結束
  for(i=0;i<24;i++)
  {
    ADSK=1; //PD_SCK置高,發(fā)送脈沖
        count=count<<1;
//        delayp();
        ADSK=0;   //pd_sck置低
        if(ADDO)count++;
  }
  ADSK=1;
  count=count^0x800000;        //第25個脈沖下降沿來時,轉換數(shù)據(jù)
// delayp();
  ADSK=0;
data_num=count;   // 讀出來的數(shù)據(jù)賦值給變量data_num
}


/****************************************************************
                                        蜂鳴器 報警
*****************************************************************/
void beep()
{
        unsigned char i;
        for(i=0;i<20;i++)
        {
                bell = 0;
                delay(40);
                bell = 1;
        }
}

       

void price_change()                 //遙控按鍵掃描函數(shù)
{  
jian_ma=jian_ma&0x1f;
if(jian_ma>=0x1f)
{
flag=0;
}
   if(flag)
   {
      flag=0;
          
           switch (jian_ma)
            {
                case 0x01:           //按下2號按鍵進入 校準值設定
                menu_flag=1;
               
                   jiao_flag=1;
                   set_flag=0;
                   beep();
                break;
                case 0x02:          //按下3號按鍵進入   報警值設定狀態(tài)
                menu_flag=2;
                   jiao_flag=0;
                   set_flag=1;
                   beep();
                  break;
                   case 0x0c:              //*鍵進入清零
                   read_count();
               data_temp=data_num;
                   beep();
                   break;
                 
                   case        0x11:          //加鍵
                          jia=1;
                        beep();
                   break;   
                    case 0x19:          //減鍵
                          jian=1;
                        beep();
                   break;
                   case 0x15:
                    flag=0;
                      menu_flag=0;//按下ok按鍵退出
                          set_flag=0;
                          jiao_flag=0;
                          write_com(0x0c);
                          beep();
                          exit=1;
                   break;           
               
                  
                }
               
   }

}
void sao_miao()//按鍵掃描函數(shù)
{
     if(key==0)
         {
            delay(10);
           if(!key)
             {
                     while(!key);
                     read_count();
                         delay(500);
                         read_count();
                         data_temp=data_num;        //重新讀取ad采集值,進入清零功能
            }
         }
}
void chu_li()         //單價設定函數(shù)
{
price_change();                   //遙控按鍵掃描函數(shù)
    while(menu_flag)                //對遙控按鍵的處理
   {
                   price_change();
                    
                                  if(set_flag)                  //報警值設定
                                  {
                                      if(jia)
                                         {
                                           jia=0;
                                           if(alarm<5000)   //最大數(shù)值為5000
                                           alarm++;
                                         }
                                         if(jian)
                                         {
                                           jian=0;
                                                   if(alarm>=2)   //最小數(shù)值為1
                                                alarm--;
                                         }
                                       
                                  }
                                   if(jiao_flag)          //校準值設定
                                  {
                                              if(jia)
                                                 {
                                                   jia=0;
                                                   if(jiao_zhun<5000)   //最大數(shù)值為5000
                                                   jiao_zhun++;
                                                 }
                                                 if(jian)
                                                 {
                                                   jian=0;
                                                           if(jiao_zhun>=2)   //最小數(shù)值為1
                                                        jiao_zhun--;
                                                       
                                                 }
                                         
                                  }
                                   delay(500);
                                                read_count();
                      if(data_num>=data_temp)                          // 比較采集出來的數(shù)值與臨時變量
                                  {
                          data_num=(data_num-data_temp);
                                          heavy=(unsigned int)(data_num/jiao_zhun);//1677;         //計算重量
                                   }
                         delay(5000);
                                  display(heavy,alarm,jiao_zhun);
                                  
                }
   sao_miao();   //按鍵掃描函數(shù)
}
/****************************************************************

/****************************************************************
                                                主函數(shù)
*****************************************************************/

void main()
{
    uchar i=0;
        IRIN=1;                    //I/O口初始化
              m=0;
    f=0;
        lcd_init();
    IT1=1;          
    EX1=1;           //開外部中斷

    TMOD=0x11;   //定時器方式
    TH0=0;
        TL0=0;
    TR0=1;         //開定時器
        EA=1;         //開總中斷
        P0=0;
        delay(50);
        delay(100);

         read_count();                   //ad采集函數(shù)
         delay(3000);
          read_count();                   //ad采集函數(shù)       
           delay(3000);
            read_count();                   //ad采集函數(shù)
                   data_temp=data_num;  //采集數(shù)據(jù)賦值給臨時變量 data_temp
                 
        while(1)
        {
           read_count();
          if(data_num>=data_temp)                          // 比較采集出來的數(shù)值與臨時變量
          data_num=(data_num-data_temp);
          else
          {
          data_num=(data_temp-data_num);
          if(data_num>=500)
           {  
              fu=1;
                 }
                 else
                 {
                 fu=0;
                 data_num=0;
               
                 }
       

          }
         heavy=(unsigned int)(data_num/jiao_zhun);//1677;         //計算重量
            delay(500);
                data_flash=heavy*price;                 // 總價=單價*重量
                money=(unsigned int)data_flash;
                if(exit)        //如果進行了設置
                {
                   exit=0;
                   //show() ;              //顯示刷新
                }
         display(heavy,alarm,jiao_zhun);        //計算完成后送到液晶顯示
          delay(500);
          chu_li();        //掃描函數(shù)
           if(heavy>alarm)                   //重量超過上限報警
           {
              beep();
           }
           delay(500);
     }
}
//外部中斷解碼程序
  void intersvr1(void) interrupt 2 using 1
{
    Tc=TH0*256+TL0;                                               //提取中斷時間間隔時長
    TH0=0;
    TL0=0;              //定時中斷重新置零
if((Tc>Imin)&&(Tc<Imax))        //定時器判斷讀取的啟始碼正確
      {
        m=0;
        f=1;
        return;
      }       //找到啟始碼

   if(f==1)
      {
        if(Tc>Inum1&&Tc<Inum3)
    {
   Im[m/8]=Im[m/8]>>1|0x80; m++;
       }
      if(Tc>Inum2&&Tc<Inum1)
        {
         Im[m/8]=Im[m/8]>>1; m++; //取碼
  }
  if(m==32)
   {
                         m=0;  
                         f=0;
                       if(Im[2]==~Im[3])
                      {
                           flag=1;
                                 jian_ma=Im[2];
                      }
                        else flag=0;   //取碼完成后判斷讀碼是否正?
     }
          if(jian_ma==0x15)
   {

          }
               //準備讀下一碼
   }

}








開發(fā)板原理圖.pdf

625.91 KB, 下載次數(shù): 16, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:846249 發(fā)表于 2020-11-20 21:34 | 只看該作者
請教一下,用單片機電子稱通過改寫程序可以制作密度計嗎?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表