单片机课程设计测量电阻和电容 联系客服

发布时间 : 星期三 文章单片机课程设计测量电阻和电容更新完毕开始阅读16645881571252d380eb6294dd88d0d232d43c28

5.1.3 转换模块

ADC0804是属于连续渐进式(Successive Approximation Method),即AD转换器,这类型的A/D转换器除了转换速度快(几十至几百us)、分辨率高外,还有价钱便宜的优点,普遍被应用于微电脑的接口设计上。 以输出8位的ADC0804动作来说明“连续渐进式A/D转换器”的转换原理,动作步骤如下表示(原则上先从左侧最高位寻找起)。 第一次寻找结果:10000000 (若假设值≤输入值,则寻找位=假设位=1) 第二次寻找结果:11000000 (若假设值≤输入值,则寻找位=假设位=1) 第三次寻找结果:11000000 (若假设值>输入值,则寻找位=该假设位=0) 第四次寻找结果:11010000 (若假设值≤输入值,则寻找位=假设位=1) 第五次寻找结果:11010000 (若假设值>输入值,则寻找位=该假设位=0) 第六次寻找结果:11010100 (若假设值≤输入值,则寻找位=假设位=1) 第七次寻找结果:11010110 (若假设值≤输入值,则寻找位=假设位=1) 第八次寻找结果:11010110 (若假设值>输入值,则寻找位=该假设位=0) 这样使用二分法的寻找方式,8位的A/D转换器只要8次寻找,12位的A/D转换器只要12次寻找,就能完成转换的动作,其中的输入值代表图1的模拟输入电压Vin 。各管脚的作用: D0-D7:八位数字量输出端; CLK:为芯片工作提供工作脉冲,时钟频率计算方式是:fck=1/(1.1×R×C) CS:片选信号; WR:写信号输入端; RD:读信号输入端; INTR:转换完毕中断提供端; 其他管脚连接如图,是供电和提供参考电压的管脚输入端。

3.1.4 启动/暂停,复位模块

该模块的功能是实现秒表的启动/暂停,复位。本实验中第一次按下09键进入测量程序,开始测量,第二电阻时的按键,当按下测电阻键时,显示相应的电阻值,当按下电容值时显示测得的电容值,此外还有量程更改的键,程序未编写,但画图有。

5.1.5 整体功效

次按下09键暂停测量,并返回到主程序,在电路中设定三个按键一个是换电阻的按键,其余分别为测电容和测

当按下测量电阻按键是,液晶屏第一行显示measures,第二行显示R=??.?KΩ,当按下测量按键时,液晶屏第一行显示measures,第二行显示C=??E??uF,若同时按下,则轮流显示。按复位键时,程序会自动重新执行,电阻的测量在2~50KΩ较准确,电容只能测量1~50uF。当然,可以通过程序更改 5.2 程序流程图 略 5.3程序清单

#include #include #define DATA P0

#define uchar unsigned char

#define uint unsigned int

sbit adcs=P2^3;//可以硬件直接接地 sbit adrd=P2^5;

sbit adwr=P2^4; sbit RW=P2^1;//1602写数据 sbit RS=P2^0;//1602写地址 sbit EN=P2^2; //1602工作使能

sbit b_test=P3^7; //开始测量电容的按键输入 sbit c_test=P3^6;

sbit _reset=P3^5; //555时基芯片工作控制信 uint T_flag,N,D,C,i,Dis1,Dis0; uchar get_ad(); uint A,F,H,A1,A2;

uint r[]={'R','=','0','0','.','0','K',0Xf4};

uint b[9]={'C','=','0','0','.','0','0','u','F'}; //显示C=00.00UF uint Data1;

/***********延时1MS******************/ void Delay1ms(uint mm) {uint i;

for(;mm>0;mm--) for(i=0;i<100;i++); }

void delay(uint z)//延时程序 {

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--); }

/***************检查忙否*****************/ void Checkstates() {

uchar dat; RS=0; RW=1;

do{EN=1;//下降沿

_nop_();//保持一定间隔 _nop_(); dat=DATA; _nop_(); _nop_(); EN=0;

}while((dat&0x80)==1); }

/**************LCD写命令函数*********/ void wcomd(uchar cmd) {

Checkstates(); RS=0; RW=0;

DATA=cmd; EN=1; _nop_(); _nop_(); _nop_(); _nop_(); EN=0; }

/**********LCD写数据函数**************/ void wdata(uchar dat) {

Checkstates(); RS=1; RW=0; DATA=dat; EN=1; _nop_(); _nop_(); _nop_(); _nop_(); EN=0; }

/*****************初始化********************/ void LCDINIT() {

Delay1ms(15);

wcomd(0x38);//功能设置 Delay1ms(5);

wcomd(0x38);//功能设置 Delay1ms(5);

wcomd(0x01);//清屏 Delay1ms(5);

wcomd(0x08);//关显示 Delay1ms(5);

wcomd(0x0c);//开显示,不开光标

}

/***********显示函数**************/ void Display(void) //显示函数 {

uchar i,j;

uchar a[12]={0X4D,0X45,0X41,0X53,0X55,0X52,0X45,0X4D,0X45,0X4E,0X54,0X53};//显示measurements for(i=0;i<12;i++)//写显示第一行 { wcomd(0x80+i); Delay1ms(1); wdata(a[i]); Delay1ms(1); }

for(j=0;j<9;j++)//写显示第二行 {

wcomd(0xc0+j); Delay1ms(1); wdata(b[j]); Delay1ms(1); }

Delay1ms(150); }

void Display1() //显示函数 显示电阻 {

uchar i,j;

uchar a[12]={0X4D,0X45,0X41,0X53,0X55,0X52,0X45,0X4D,0X45,0X4E,0X54,0X53};//显示measurements

for(i=0;i<12;i++)//写显示第一行 { wcomd(0x80+i);

Delay1ms(1); wdata(a[i]); Delay1ms(1); } for(j=0;j<9;j++)//写显示第二行 { wcomd(0xc0+j); Delay1ms(1); wdata(r[j]); Delay1ms(1); } Delay1ms(1000);