具体见附件,有代码。
单片机源程序如下:
- #include "delay.h"
- #include "GPIO.h"
- #include "config.h"
- #include "lcd_12864.h"
- #include "display.h"
- sbit key0=P1^0;
- sbit key1=P1^1;
- sbit key2=P1^2;
- sbit big_case=P1^5;
- sbit small_case=P1^6;
- long int freq,n,cap;
- //uchar n;
- uchar lcd_i;
- uint count_t0,s;
- uchar keystate='A';
- uchar code dis1[]={"<-电容测量仪->"};
- uchar code dis2[]={"频率: Hz"};
- uchar code dis3[]={"电容: F"};
- uchar code dis4[]={"档位:"};
- uchar code dis_auto[]={"自动挡"};
- uchar code dis_big[]={"大量程"};
- uchar code dis_small[]={"小量程"};
- //端口初始化
- void GPIO_config(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitStructure.Pin = GPIO_Pin_All;
- GPIO_InitStructure.Mode = GPIO_PullUp;
- GPIO_Inilize(GPIO_P0,&GPIO_InitStructure);
- // GPIO_Inilize(GPIO_P1,&GPIO_InitStructure);
- GPIO_Inilize(GPIO_P2,&GPIO_InitStructure);
- // GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);
- }
- //定时器0初始化
- void Timer0Init(void) //1毫秒@11.0592MHz--16位自动重装
- {
- AUXR |= 0x80; //定时器时钟1T模式
- TMOD &= 0xF0; //设置定时器模式
- TL0 = 0xCD; //设置定时初值
- TH0 = 0xD4; //设置定时初值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
-
- ET0=1;
- EA=1;
- }
- //外部中断0初始化
- void exint0_init()
- {
- INT0=1;
- IT0=1;//设置INT0中断类型(1:仅下降沿;0:上升沿和下降沿)
- EX0=1;//使能INT0
- }
- void main()
- {
-
- GPIO_config();//端口初始化
- lcd_init();//液晶初始化
- Timer0Init();//定时器0初始化
- exint0_init();//外部中断初始化
-
- //显示测量变量及档位
- lcd_dis_str(0,0,dis1);
- lcd_dis_str(1,0,dis2);
- lcd_dis_str(2,0,dis3);
- lcd_dis_str(3,0,dis4);
-
-
-
- while(1)
- {
- dis_freq(freq);
- switch(keystate)
- {
-
- //默认自动挡---------------------------------------------
- case 'A':
- lcd_dis_str(3,5,dis_auto);//显示自动挡
-
- if(freq>40000)
- {
- big_case=1;
- small_case=0;
- cap = 1430000000 / (3* (freq+1));//计算电容值
- }
- else
- {
- big_case=0;
- small_case=1;
- cap = 1430000000 / (20001* freq)-27;//计算电容值
- }
- dis_cap(cap);//显示电容值
-
- if(key1==0)//key1按下切换到大量程
- {
- delay_ms(5);
- if(key1==0)
- {
- keystate='B';
- while(!key1);
- }
- }
-
- if(key2==0)//key2按下切换到小量程
- {
- delay_ms(5);
- if(key2==0)
- {
- keystate='C';
- while(!key2);
- }
- }
- break;
-
-
- //大量程档位---------------------------------------------------
- case 'B':
-
- big_case=1;
- small_case=0;
-
- cap = 1430000000 / (3* (freq+1));//计算电容值
- dis_cap(cap);//显示电容值
- lcd_dis_str(3,5,dis_big);//显示大量程
-
- if(key0==0)//key0按下切换到自动挡
- {
- delay_ms(5);
- if(key0==0)
- {
- keystate='A';
- while(!key0);
- }
- }
-
- if(key2==0)//key2按下切换到小量程
- {
- delay_ms(key2==0);
- if(key2==0)
- {
- keystate='C';
- while(!key2);
- }
- }
- break;
-
-
- //小量程档位---------------------------------------------
- case 'C':
-
- big_case=0;
- small_case=1;
-
- cap = 1430000000 / (20001* freq)-27;//计算电容值
- dis_cap(cap);//显示电容值
-
- lcd_dis_str(3,5,dis_small);//显示小档位
-
- if(key0==0)//key0按下切换到自动挡
- {
- delay_ms(5);
- if(key0==0)
- {
- keystate='A';
- while(!key0);
- }
- }
-
- if(key1==0)//key1按下切换到大量程
- {
- delay_ms(5);
- if(key1==0)
- {
- keystate='B';
- while(!key1);
- }
- }
- break;
- }
-
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
电容测量仪2.0.zip
(110.95 KB, 下载次数: 59)
|