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

📄 108.lst

📁 PIC16F876单片机,有4到20MA电流输出,低功耗等特点,使用于工业仪表行业
💻 LST
📖 第 1 页 / 共 4 页
字号:
     1:         /*软件名称:智能涡轮流量计                                      *
     2:         *                                                               *
     3:         *作者:李维平&陈超                                              *
     4:         *时间:星期二 2005年4月26日                                     *
     5:         * 晶振:640KHZ                                                  *
     6:         * 微处理器:PIC16F877或者PIC16F877A                             *
     7:         * 采用澳大利亚HI-TECH公司的PICC编译器                           *                                       *                       功能简介:                              *
     8:         *可显示瞬时流量和累计流量                                       *
     9:         *累计量定时存储于EEPROM                                         *
    10:         *瞬时量和累计量都可实现精度自动调整(小数点动态移动显示)       *
    11:         *仪表系数K可以在线置入EEPROM当中,设置同时计量工作仍继续        *
    12:         *当第一点K值为0时,可以作为频率计使用                           *
    13:         *仪表系数的点数可通过修改宏定义中的set 值来改变,范围3~6点     *
    14:         *按键操作采用中断方式                                           *
    15:         *仪表系数K默认小数部分为零                                      *
    16:         *                                                               *
    17:         *                                                               */
    18: #include <pic.h>
    19: #include <pic1687x.h>
    20: //#include <pic168xa.h>
    21: #include <math.h>
    22: #include <stdio.h>
    23: 
    24: #define  uchar  unsigned char
    25: #define  uint   unsigned int
    26: #define  ushort   unsigned short
    27: #define  ulong   unsigned long
    28: #define  sleep()  asm("sleep")
    29: #define  nop()     asm("nop")
    30: #define  clrwdt()  asm("clrwdt")
    31: #define  CS        RB1   
    32: #define  WR        RB2   
    33: #define  DATA      RB3     
    34: #define  KEY_SR    RB4     //RB4
    35: #define  KEY_ADD   RB6   
    36: #define  KEY_F     RB5     //RB6
    37: 
    38: #define  set1 3                         //set1为仪表系数点数3~6点
    39: #define  set2 1                 //set2为0,无满度流量,set2为1,有满度流量
    40: 
    41: void delay(uchar x,uchar y);
    42: void delay1(void);     
    43: void delay2(void);
    44: void Lcd_Write_Com(uchar  com);
    45: void Lcd_Write_Data_Contin_u(uchar addr,uchar j);
    46: void Lcd_Write_Data_Contin_n(uchar addr,uchar j);
    47: void Lcd_Write_Data_Q_or_P(uchar j);
    48: void Lcd_Black();
    49: void Lcd_Init(void);
    50: void Timer_Init(void);
    51: void Eeprom_Initia(void);
    52: void interrupt ISR(void);
    53: void Read_Fre_K(void);
    54: void Caculate_pre();
    55: void Caculate();
    56: void Caculate_Q3();
    57: void Dis_Buf(void);
    58: void Lcd_Dispay(void);
    59: void Cumulation_to_EEPROM();
    60: void Read_Sum_flux();
    61: void Parameter_Set();
    62: void ccp2_out(void);
    63: void Sum_Q_Clear();
    64: 
    65: 
    66: bank3 uchar i,eeadr,addr,da,time_f_sr=0,time_sr=0,no_f=0,ti; 
    67: bit flag_tmr0=0,flag_tmr1=0,key_f=0,key_sr=0,key_add=0,key_f_add=0,key_f_sr=0,key_sr_add=0,flag_set=0,flag_out=0,flag_turn,flag_mid;
    68: uchar *p1,x[3],y[3],save_time,save_adr,pass_time,ct=0,disp_buf[15],disp;
    69: bank2 uchar n1,m1,n2,m2,n3,m3,n4,m4,gdl,jc,jm;
    70: bank3 uint x1,x2,F1,F2,F3,F4,F5,F6,Q2d,ff;
    71: bank2 float K1,K2,K3,K4,K5,K6,b0,b1,b2,b3,b4;
    72: bank1 ulong Q3nd,Q3ud,Q3INT,Qfull;
    73: bank1 float Q2,Q3DEC,*p2,fr,K,qqq,Q1,frqian,Qliu,Q3;
    74: bank1 uint mm @ 0xA0;
    75: bank3 uint gao @ 0x1A0;
    76: bank3 uchar cp @ 0x1A2;
    77: 
    78:  
    79: const char table_up_for_lcd [25][2]={// the digit from "0" to "9" for upper number 1~6
    80:  {0xe0,0xb0},{0x60,0x00},{0xC0,0x70},{0xe0,0x50},//0~9不带点
    81:  {0x60,0xc0},{0xa0,0xd0},{0xa0,0xf0},{0xe0,0x00},
    82:  {0xe0,0xf0},{0xe0,0xd0},     
    83:  {0xf0,0xb0},{0x70,0x00},{0xd0,0x70},{0xf0,0x50}, //0~9带点     
    84:  {0x70,0xc0},{0xb0,0xd0},{0xb0,0xf0},{0xf0,0x00},
    85:  {0xf0,0xf0},{0xf0,0xd0},
    86:  {0x00,0x00},{0x10,0x00}};      //BLACK,末尾显Q1可不要 03.10调换后两位位置
    87: 
    88: const char table_nether_for_lcd[21][2]={                        //used nether number 7~14                                 // segment for character  0~9
    89: {0xd0,0x70},{0x00,0x60},{0xe0,0x30},{0xa0,0x70},      //0~3不带点
    90: {0x30,0x60},{0xb0,0x50},{0xF0,0x50},{0x00,0x70},      //4~7
    91: {0xf0,0x70},{0xb0,0x70},
    92: {0xd0,0xf0},{0x00,0xe0},{0xe0,0xb0},{0xa0,0xf0},      //0~3带点
    93: {0x30,0xe0},{0xb0,0xd0},{0xF0,0xd0},{0x00,0xf0},      //4~7
    94: {0xf0,0xf0},{0xb0,0xf0},
    95: {0x00,0x00} };           //8,9,.,black
    96:     
    97: const char Ladr[16]={                   //液晶字符地址
    98:         0x15,0x13,0x11,0x0f,
    99:         0x1e,0x1c,0x00,0x02,0x04,0x06,0x08,0x0a,0x19,0x17};      
   100:                                       
   101: //#pragma interrupt_level 1
   102: void delay(uchar x,uchar y)   //delay time :14+(3*(Y-1)+7)*(X-1)
   103: {                 
   104:  uchar z;             
   105:  do{                           
   106:    z=y;                         
   107:    do{;}while(--z);                 
   108:    }while(--x);
   109: }
   110: 
   111: void  delay1()     //delay function
   112:   {
   113:    nop();
   114:    }
   115:   
   116: void delay2()     //delay function
   117:  {
   118:   uchar x;
   119:   x=250;
   120:   while(--x){;};
   121:  }
   122: 
   123: void Lcd_Write_Com(uchar  com)     //write command to lcd
   124: {
   125:  uchar j;
   126:  CS=1;              // pre-initialize 
   127:  delay1();
   128:  nop();
   129:  CS=0;              // pre-initialize 
   130:  delay1();
   131: 
   132: DATA=1;  
   133:  delay1();
   134:  WR=0;  
   135:  delay1();  
   136:   WR=1;  
   137:   delay1();   //d=1  command mode 100
   138:   
   139: DATA=0; 
   140:  delay1(); 
   141:  WR=0;
   142:  delay1(); 
   143:  WR=1;  
   144:  delay1();   //d=0
   145:   
   146: DATA=0;
   147:  delay1();
   148:  WR=0; 
   149:   delay1();  
   150:    WR=1;  
   151:   delay1();   //d=0
   152: 
   153: for(j=0;j<8;j++)    //write 8+1 bit command
   154:    {  
   155:         if(com&0x80)
   156:                  DATA=1;
   157:         else
   158:                  DATA=0;
   159:         delay1();
   160:         WR=0;
   161:         delay1();
   162:         WR=1;
   163:         delay1();
   164:         com<<=1;
   165:         }
   166:         DATA=0; 
   167:     delay1();
   168:     WR=0;  
   169:     delay1();  
   170:     WR=1;  
   171:     delay1();     //the last bit of the command 0
   172: }
   173: 
   174: //#pragma interrupt_level 1
   175: void Lcd_Write_Data_Contin_u(uchar addr,uchar j)                //液晶显示器上排显示
   176: {
   177: uchar k,m,da;
   178: CS=1;              // pre-initialize 
   179: delay1();
   180: CS=0;              // pre-initialize 
   181: delay1();
   182: 
   183: DATA=1; 
   184:  delay1();   
   185:  WR=0;  
   186:  delay1();  
   187:  WR=1;  
   188:  delay1();   //d=1  data mode 101
   189:  
   190: DATA=0; 
   191:  delay1();   
   192:  WR=0;  
   193:  delay1();     
   194:  WR=1;  
   195:  delay1();   //d=0
   196:  
   197:  DATA=1; 
   198:  delay1();   
   199:  WR=0;  
   200:  delay1();  
   201:  WR=1;  
   202:  delay1();   //d=1
   203:  addr<<=2;                                                      //surpose that ADDR=8bit
   204:   for (k=0;k<6;k++)
   205:     {
   206:      if (addr&0x80)
   207:          DATA=1;
   208:      else
   209:          DATA=0;
   210:      WR=0;
   211:      delay1();
   212:      WR=1;
   213:      delay1();
   214:      addr<<=1;
   215:     }  
   216: for(k=0;k<2;k++)                        //send number
   217:         {
   218:         da= table_up_for_lcd [j][k];            //j is determined  by other things 
   219:         for(m=0;m<4;m++)
   220:                 {
   221:                 if(da&0x80)                //send  DATA first ,WR clock second for safety
   222:                         DATA=1;
   223:                 else
   224:                         DATA=0;
   225:                 WR=0;
   226:                 delay1();
   227:                 WR=1;
   228:                 delay1();
   229:                 da<<=1; 
   230:                 }
   231:         }
   232: }
   233: 
   234: 
   235: 
   236: //#pragma interrupt_level 1
   237: void Lcd_Write_Data_Contin_n(uchar addr,uchar j)                //液晶显示器下排显示
   238: {
   239: uchar k,m,da;
   240: CS=1;              // pre-initialize 
   241: delay1();
   242: CS=0;              // pre-initialize 
   243: delay1();
   244: 
   245: DATA=1; 
   246:  delay1();   
   247:  WR=0;  
   248:  delay1();  
   249:  WR=1;  
   250:  delay1();   //d=1  data mode 101
   251:  
   252: DATA=0; 
   253:  delay1();   
   254:  WR=0;  
   255:  delay1();     
   256:  WR=1;  
   257:  delay1();   //d=0
   258:  
   259:  DATA=1; 
   260:  delay1();   
   261:  WR=0;  
   262:  delay1();  
   263:  WR=1;  
   264:  delay1();   //d=1
   265: // addr=0x19;           //the digit 5's address
   266: // Lcd_Write_Data_Addr();
   267: addr<<=2;                                                       //surpose that ADDR=8bit
   268:   for (k=0;k<6;k++)
   269:     {
   270:      if (addr&0x80)
   271:          DATA=1;
   272:      else
   273:          DATA=0;
   274:      WR=0;
   275:      delay1();
   276:      WR=1;
   277:      delay1();
   278:      addr<<=1;
   279:     }  
   280:        
   281: for(k=0;k<2;k++)                        //send number
   282:         {
   283:         da= table_nether_for_lcd [j][k];     //j is determined  by other things 
   284:         for(m=0;m<4;m++)
   285:                 {
   286:                 if(da&0x80)             //send  DATA first ,WR clock second for safety
   287:                         DATA=1;
   288:                 else
   289:                         DATA=0;
   290:                 WR=0;
   291:                 delay1();
   292:                 WR=1;
   293:                 delay1();
   294:                 da<<=1; 
   295:                 }
   296:         }
   297: }
   298: 
   299: //#pragma interrupt_level 1
   300: 
   301: void Lcd_Write_Data_Q_or_P(uchar j)                     //K1为0时显示P,其余情况显示Q
   302: {
   303: uchar k,m,da,addr;
   304: CS=1;              // pre-initialize 
   305: delay1();
   306: CS=0;              // pre-initialize 
   307: delay1();
   308: 
   309: DATA=1; 
   310:  delay1();   
   311:  WR=0;  
   312:  delay1();  
   313:  WR=1;  
   314:  delay1();   //d=1  data mode 101
   315:  
   316: DATA=0; 
   317:  delay1();   

⌨️ 快捷键说明

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