|

楼主 |
发表于 2016-2-11 14:47:15
|
显示全部楼层
把单片机的程序发上来- /********************************************************************
- * 文件名 : LED显示 5位半万用表
- * 描述 : 使用24M晶体 , STC15F2K32S2单片机 ,LTC2400 ADC
- * 创建人 : CCA767,2016.1.28
- * 版本号 : 1.0
- ***********************************************************************/
- #include<STC15F2K60S2.H> //定义STC15F2K32S2单片机特殊功能寄存器和位寄存器的。
- #include <intrins.h> //包含指令_nop_(); 延时一个机器周期。
- #include<math.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define AVE 30 //平均值滤波次数
- #define Vref 5.00025 //电压基准值
- uchar code table1[] ={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //带小数点数字编码
- uchar code table[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //不带小数点数字编码
- sbit LE1=P3^6; //继电器控制锁存器 锁存控制端 (低电平锁存)
- sbit LE2=P3^5; //模拟开关控制锁存器 锁存控制端 (低电平锁存)
- sbit FUN_EN=P1^0; //功能选择板模拟开关使能端
- sbit FUN_A2=P1^1; //功能选择板模拟开关地址口A2
- sbit FUN_A1=P1^2; //功能选择板模拟开关地址口A1
- sbit FUN_A0=P1^3; //功能选择板模拟开关地址口A0
- sbit SCK=P5^4; //定义LTC2400引脚 时钟口
- sbit SDO=P5^5; //LTC2400数据口
- sbit CS=P3^4; //LTC2400片选口
- long value; //采样前滤波值
- uchar gear; //档位标识符
- uchar range; //量程标识符
- uchar add; //超量程标识符
- uchar red; //减量程表示符
- uchar AUTO; //自动量程手动量程标识
- long null; //NULL值
- long U; //计算后测量值
- uchar num;
- long ZERO;
- uchar n;
- long get_v();
- long filter();
- void AUTO_ZERO();
- void delay_ms(unsigned int i); //延时函数 i*ms
- void delay_us( uchar i); //延时函数 (i+1)*us
- void LED_display(uchar i,uchar j);
- void DCV_250mV();
- void DCV_2500mV();
- void DCV_25V();
- void DCV_250V();
- void ohms_2w_5M();
- void ohms_2w_500K();
- void ohms_2w_50K();
- void ohms_2w_5K();
- void ohms_2w_500();
- void null_set();
- void DCI_2mA();
- void DCI_20mA();
- void DCI_200mA();
- void DCI_2A();
- uchar keyboard();
- void keyscan();
- void display_v_Auto();
- void display_V_Man();
- void display_i_Auto();
- void display_i_Man();
- void display_ohms_Auto();
- void display_ohms_Man();
- void welcome(); //开机欢迎语 HELLO
- void system_init()
- {
- P1=0x00;
- LE1=1;
- delay_ms(1);
- LE1=0;
- P1=0x45; //5V,x1,1/1,5M ,ohms
- LE2=1;
- delay_ms(1);
- LE2=0;
- CS=0;
- SCK=0;
- AUTO=1;
- }
- long filter() //滤波函数
- {
- long V=0;
- V=get_v();
- if(labs(V-value)>2000) //限幅
- value=V*AVE;
- else
- value=V+value-value/AVE; //一阶滤波
- return value/AVE; //取平均值
- }
- void time_init()
- {
- TMOD=0X00;
- TL0=(65536-40000)%256;
- TH0=(65536-40000)/256;
- TR0=1;
- ET0=1;
- EA=1;
- }
- /********************************************************************
- * 名称 : 主函数
- * 功能 :
- * 输入 : 无
- * 输出 : 无
- ***********************************************************************/
- void main()
- {
- P0M1=0x00;
- P0M0=0x00;
- P5M0=0x00;
- P5M1=0x20;
- P2M0=0xff;
- P2M1=0x00;
- P4M0=0xff;
- P4M1=0x00;
-
- welcome();
- system_init();
- AUTO_ZERO();
- time_init();
- delay_ms(2000);
-
- while(1)
- {
- keyscan();
- if(n==3)
- {
- AUTO_ZERO();
- }
- switch(gear)
- {
- case 0:
- if(AUTO)
- display_v_Auto();
- else
- display_V_Man();
- break;
- case 1:
- if(AUTO)
- display_ohms_Auto();
- else
- display_ohms_Man();
- break;
- case 2:
- if(AUTO)
- display_i_Auto();
- else
- display_i_Man();
- break;
- }
-
- }
- }
- void DCV_250mV()
- {
- P1=0;
- LE1=1;
- delay_us(10);
- LE1=0;
- P1=0x45; //x10.1/1
- LE2=1;
- delay_us(10);
- LE2=0;
- gear=0;
- range=0; //量程标识符
- }
- void DCV_2500mV()
- {
- P1=0;
- LE1=1;
- delay_us(5);
- LE1=0;
- // P1=0x41; //x10,1/100
- P1=0x05; //5V,x1,1/1,5M ,ohms
- // P1=0x03;
- // P1=0x35; //5k ohms
- // P1=0x25; //50k,ohms
- // P1=0x15; //500k,ohms
- // P1=0x03;
- LE2=1;
- delay_us(5);
- LE2=0;
- }
- void DCV_25V()
- {
- P1=0x04;
- LE1=1;
- delay_us(5);
- LE1=0;
- P1=0x41; //x10,1/100
- // P1=0x43;
- LE2=1;
- delay_us(5);
- LE2=0;
- }
- void DCV_250V()
- {
- P1=0x04;
- LE1=1;
- delay_us(5);
- LE1=0;
- P1=0x01; //x1.1/100
- // P1=0x03;
- LE2=1;
- delay_us(5);
- LE2=0;
- }
- void ohms_2w_5M()
- {
- P1=0x38;
- LE1=1;
- delay_us(5);
- LE1=0;
- P1=0x05;
- LE2=1;
- delay_us(5);
- LE2=0;
- gear=1;
- range=4; //量程标识符
- }
- void ohms_2w_500K()
- {
- P1=0x38;
- LE1=1;
- delay_us(5);
- LE1=0;
- P1=0x15;
- LE2=1;
- delay_us(5);
- LE2=0;
- }
- void ohms_2w_50K()
- {
- P1=0x38;
- LE1=1;
- delay_us(5);
- LE1=0;
- P1=0x25;
- LE2=1;
- delay_us(5);
- LE2=0;
- }
- void ohms_2w_5K()
- {
- P1=0x38;
- LE1=1;
- delay_us(5);
- LE1=0;
- P1=0x35;
- LE2=1;
- delay_us(5);
- LE2=0;
- }
- void ohms_2w_500()
- {
- P1=0x78;
- LE1=1;
- delay_us(5);
- LE1=0;
- P1=0x35;
- LE2=1;
- delay_us(5);
- LE2=0;
- }
- void null_set()
- {
- switch(gear)
- {
- case 0: break;
- case 1:
- null=U;
- break;
- }
- }
- void DCI_2mA()
- {
- P1=0x02;
- LE1=1;
- delay_us(10);
- LE1=0;
- P1=0x49;
- LE2=1;
- delay_us(10);
- LE2=0;
- gear=2;
- range=0; //量程标识符
- }
- void DCI_20mA()
- {
- P1=0x0a;
- LE1=1;
- delay_us(10);
- LE1=0;
- P1=0x49;
- LE2=1;
- delay_us(10);
- LE2=0;
- }
- void DCI_200mA()
- {
- P1=0x12;
- LE1=1;
- delay_us(10);
- LE1=0;
- P1=0x49;
- LE2=1;
- delay_us(10);
- LE2=0;
- }
- void DCI_2A()
- {
- P1=0x06;
- LE1=1;
- delay_us(10);
- LE1=0;
- P1=0x49;
- LE2=1;
- delay_us(10);
- LE2=0;
- }
- uchar keyboard()
- {
- uchar i, temp1,temp2;
- for(i=0;i<4;i++)
- {
- P0=~(1<<i);
- temp1=P0&0xf0;
- if(temp1!=0xf0)
- {
- delay_ms(10);
- temp2=P0&0xf0;
- if(temp1==temp2)
- {
- if(temp1==0x70) //7
- {
- while(temp1!=0xf0)
- {
- temp1=P0&0xf0;
- }
- return i*4+0;
- }
- if(temp1==0xd0) //5
- {
- while(temp1!=0xf0)
- {
- temp1=P0&0xf0;
- }
- return i*4+1;
- }
- if(temp1==0xe0) //4
- {
- while(temp1!=0xf0)
- {
- temp1=P0&0xf0;
- }
- return i*4+2;
- }
- }
- else
- return 16;
- }
- }
- }
- /*******************************************************************************
- |
- 6 4 5 | 2 0 1
- DCV DCI OHMS | *** *** NULL
- ------------------------------------------------------------------------------
- |
- 10 8 9 | 14 12 13
- < > *** | *** Auto ***
- Man
- *******************************************************************************/
- void keyscan()
- {
- uchar KEY;
- KEY=keyboard();
- switch(KEY)
- {
- case 6:
- DCV_250mV();
- break;
- case 5:
- ohms_2w_5M();
- break;
- case 1:
- null_set();
- break;
- case 4:
- DCI_2mA();
- break;
- case 10:
- if(range>0)
- range--;
- break;
- case 8:
- if(gear==1)
- {
- if(range<4)
- range++;
- }
- else
- {
- if(range<3)
- range++;
- }
- break;
- case 12:
- if(AUTO==1)
- AUTO=0;
- else
- AUTO=1;
- break;
- }
- }
- void display_v_Auto()
- {
- long V; uchar SIG=0,NEG=0;
- V=filter();
- if(V&0x2000000)
- {
- V=V-33554432;
- if(V<ZERO)
- U=ZERO-V;
- else
- {
- U=V-ZERO;
- NEG=1;
- }
- U=U*Vref/1.6777216;
- }
- else
- {
- U=(33554432-V)*Vref/1.6777216 ;
- U=U+25001100;
- }
- if(U>25500000)
- {
- add++;
- }
- if(U<2500000)
- {
- red++;
- }
- if(add==2)
- {
- if(range<3)
- {
- range++;
- }
- add=0;
- }
- if (red==2)
- {
- if(range>0)
- {
- range--;
- }
- red=0;
- }
- if(NEG)
- {
- LED_display(191,0);
- }
- else
- {
- LED_display(255,0);
- }
- switch (range)
- {
- case 0:
- DCV_250mV();
- LED_display(table[U/10000000],1);
- LED_display(table[U%10000000/1000000],2);
- LED_display(table1[U%1000000/100000],3);
- LED_display(table[U%100000/10000],4);
- LED_display(table[U%10000/1000],5);
- LED_display(table[U%1000/100],6);
- LED_display(0xbf,7);
- LED_display(0xff,8);
- LED_display(0xfe,9);
- break;
- case 1:
- DCV_2500mV();
- LED_display(table1[U/10000000],1);
- LED_display(table[U%10000000/1000000],2);
- LED_display(table[U%1000000/100000],3);
- LED_display(table[U%100000/10000],4);
- LED_display(table[U%10000/1000],5);
- LED_display(table[U%1000/100],6);
- LED_display(0xef,7);
- LED_display(0xfe,9);
- break;
- case 2:
- DCV_25V();
- if(NEG)
- U=U*1.00024-650;
- else
- U=U*1.00024+650;
- LED_display(table[U/10000000],1);
- LED_display(table1[U%10000000/1000000],2);
- LED_display(table[U%1000000/100000],3);
- LED_display(table[U%100000/10000],4);
- LED_display(table[U%10000/1000],5);
- LED_display(table[U%1000/100],6);
- LED_display(0xef,7);
- LED_display(0xfe,9);
- break;
-
- case 3:
- DCV_250V();
- if(NEG)
- U=U*1.00024-65;
- else
- U=U*1.00024+65;
- LED_display(table[U/10000000],1);
- LED_display(table[U%10000000/1000000],2);
- LED_display(table1[U%1000000/100000],3);
- LED_display(table[U%100000/10000],4);
- LED_display(table[U%10000/1000],5);
- LED_display(table[U%1000/100],6);
- LED_display(0xef,7);
- LED_display(0xfe,9);
- break;
- }
- }
- void display_V_Man()
- {
- long V; uchar SIG=0,NEG=0;
- V=filter();
- if(V&0x2000000)
- {
- V=V-33554432;
- if(V<ZERO)
- U=ZERO-V;
- else
- {
- U=V-ZERO;
- NEG=1;
- }
- U=U*Vref/1.6777216;
- }
- else
- {
- U=(33554432-V)*Vref/1.6777216 ;
- U=U+25001100;
- }
- if(NEG)
- {
- LED_display(191,0);
- }
- else
- {
- LED_display(255,0);
- }
- switch (range)
- {
- case 0:
- DCV_250mV();
- LED_display(table[U/10000000],1);
- LED_display(table[U%10000000/1000000],2);
- LED_display(table1[U%1000000/100000],3);
- LED_display(table[U%100000/10000],4);
- LED_display(table[U%10000/1000],5);
- LED_display(table[U%1000/100],6);
- LED_display(0xbf,7);
- LED_display(0xff,8);
- LED_display(0x7e,9);
- break;
- case 1:
- DCV_2500mV();
- LED_display(table1[U/10000000],1);
- LED_display(table[U%10000000/1000000],2);
- LED_display(table[U%1000000/100000],3);
- LED_display(table[U%100000/10000],4);
- LED_display(table[U%10000/1000],5);
- LED_display(table[U%1000/100],6);
- LED_display(0xef,7);
- LED_display(0x7e,9);
- break;
- case 2:
- DCV_25V();
- if(NEG)
- U=U*1.00024-650;
- else
- U=U*1.00024+650;
- LED_display(table[U/10000000],1);
- LED_display(table1[U%10000000/1000000],2);
- LED_display(table[U%1000000/100000],3);
- LED_display(table[U%100000/10000],4);
- LED_display(table[U%10000/1000],5);
- LED_display(table[U%1000/100],6);
- LED_display(0xef,7);
- LED_display(0x7e,9);
- break;
-
- case 3:
- DCV_250V();
- if(NEG)
- U=U*1.00024-65;
- else
- U=U*1.00024+65;
- LED_display(table[U/10000000],1);
- LED_display(table[U%10000000/1000000],2);
- LED_display(table1[U%1000000/100000],3);
- LED_display(table[U%100000/10000],4);
- LED_display(table[U%10000/1000],5);
- LED_display(table[U%1000/100],6);
- LED_display(0xef,7);
- LED_display(0x7e,9);
- break;
- }
- }
- void display_i_Auto()
- {
- long V; uchar SIG=0,NEG=0;
- V=filter();
- if(V&0x2000000)
- {
- V=V-33554432;
- if(V<ZERO)
- U=ZERO-V;
- else
- {
- U=V-ZERO;
- NEG=1;
- }
- U=U*Vref/1.6777216;
- }
- else
- {
- U=(33554432-V)*Vref/1.6777216 ;
- U=U+25001100;
- }
-
- if(U>25500000)
- {
- add++;
- }
- if(U<2500000)
- {
- red++;
- }
- if(add==2)
- {
- if(range<3)
- {
- range++;
- }
- add=0;
- }
- if (red==2)
- {
- if(range>0)
- {
- range--;
- }
- red=0;
- }
-
- if(NEG)
- {
- LED_display(191,0);
- }
- else
- {
- LED_display(255,0);
- }
- switch (range)
- {
- case 0:
- DCI_2mA();
- LED_display(table1[U/10000000],1);
- LED_display(table[U%10000000/1000000],2);
- LED_display(table[U%1000000/100000],3);
- LED_display(table[U%100000/10000],4);
- LED_display(table[U%10000/1000],5);
- LED_display(table[U%1000/100],6);
- LED_display(0xbf,7);
- LED_display(0xff,8);
- LED_display(0xfd,9);
- break;
- case 1:
- DCI_20mA();
- LED_display(table[U/10000000],1);
- LED_display(table1[U%10000000/1000000],2);
- LED_display(table[U%1000000/100000],3);
- LED_display(table[U%100000/10000],4);
- LED_display(table[U%10000/1000],5);
- LED_display(table[U%1000/100],6);
- LED_display(0xef,7);
- LED_display(0xfd,9);
- break;
- case 2:
- DCI_200mA();
- LED_display(table[U/10000000],1);
- LED_display(table[U%10000000/1000000],2);
- LED_display(table1[U%1000000/100000],3);
- LED_display(table[U%100000/10000],4);
- LED_display(table[U%10000/1000],5);
- LED_display(table[U%1000/100],6);
- LED_display(0xef,7);
- LED_display(0xfd,9);
- break;
-
- case 3:
- DCI_2A();
- LED_display(table1[U/10000000],1);
- LED_display(table[U%10000000/1000000],2);
- LED_display(table[U%1000000/100000],3);
- LED_display(table[U%100000/10000],4);
- LED_display(table[U%10000/1000],5);
- LED_display(table[U%1000/100],6);
- LED_display(0xef,7);
- LED_display(0xfd,9);
- break;
- }
- }
- void display_i_Man()
- {
- long V; uchar SIG=0,NEG=0;
- V=filter();
- if(V&0x2000000)
- {
- V=V-33554432;
- if(V<ZERO)
- U=ZERO-V;
- else
- {
- U=V-ZERO;
- NEG=1;
- }
- U=U*Vref/1.6777216;
- }
- else
- {
- U=(33554432-V)*Vref/1.6777216 ;
- U=U+25001100;
- }
- if(NEG)
- {
- LED_display(191,0);
- }
- else
- {
- LED_display(255,0);
- }
- switch (range)
- {
- case 0:
- DCI_2mA();
- LED_display(table1[U/10000000],1);
- LED_display(table[U%10000000/1000000],2);
- LED_display(table[U%1000000/100000],3);
- LED_display(table[U%100000/10000],4);
- LED_display(table[U%10000/1000],5);
- LED_display(table[U%1000/100],6);
- LED_display(0xbf,7);
- LED_display(0xff,8);
- LED_display(0x7d,9);
- break;
- case 1:
- DCI_20mA();
- LED_display(table[U/10000000],1);
- LED_display(table1[U%10000000/1000000],2);
- LED_display(table[U%1000000/100000],3);
- LED_display(table[U%100000/10000],4);
- LED_display(table[U%10000/1000],5);
- LED_display(table[U%1000/100],6);
- LED_display(0xef,7);
- LED_display(0x7d,9);
- break;
- case 2:
- DCI_200mA();
- LED_display(table[U/10000000],1);
- LED_display(table[U%10000000/1000000],2);
- LED_display(table1[U%1000000/100000],3);
- LED_display(table[U%100000/10000],4);
- LED_display(table[U%10000/1000],5);
- LED_display(table[U%1000/100],6);
- LED_display(0xef,7);
- LED_display(0x7d,9);
- break;
-
- case 3:
- DCI_2A();
- LED_display(table1[U/10000000],1);
- LED_display(table[U%10000000/1000000],2);
- LED_display(table[U%1000000/100000],3);
- LED_display(table[U%100000/10000],4);
- LED_display(table[U%10000/1000],5);
- LED_display(table[U%1000/100],6);
- LED_display(0xef,7);
- LED_display(0x7d,9);
- break;
- }
- }
复制代码 |
|