范文一:单片机测电容实验
单片机实验报告
2011年4月12日 一、实验要求:
1,频率值能循环不断地被测量读取;
2,测量结果显示在外部LCD屏上;
3,利用本设计测量102、103、104三个电容的容值。
二、硬件环境不接口地址
设备选择了Atmel的AT89C51,设置波特率38400,频率11.0592MHz。LC1621是以ASII码写入的,,字,行的字符型LCD。通过,,和,,,的不同组合来选择控制线进行读写指令和数据,内部显示器的地址为第一行,~~,,,第二行为:~~CF。可以通过选择地址把字显示到某一位置上。LC1621的使能地址为0A000,控制地址为写指令地址为0A000H,读出BF信号和地址计数器AC到D0~D7地址0A001H,写数据寄存器地址0A002H,读数据寄存器地址为0A003H。
三、资源使用
整个程序可以采用自底向上的,模块化的设计思想进行设计,即一个一个功能模块进行设计调试,完成后再组合完整,其中可细分为以下几个模块:外部中断计数:定时/计数器T0和T1的工作方式设置,T0是工作在计数状态下,对输入的频率信号进行计数,但对工作在计数状态下的 T0,最大计数值为fOSC/24,由于fOSC,11.0592MHz,对于频率的概念就是在一秒只数脉冲的个数,即为频率值。所以T1工作在定时状态下,采用定时50ms,共定时20次,即可完成1
秒的定时功能,每定时1秒到,就停止T0的计数,而从T0的计数单元中读取计数的数值,然后进行数据处理,送到LCD显示;
四、程序原理不框图
由555定时器组成的多谐振荡器如左图所示,其中R、R和电容C为外元12
u,1u,件。电容充电时,定时器输出,电容放电时,0,电容不断地进行充、00
放电,输出端便获得矩形波。多谐振荡器无外部信号输入,却能输出矩形波,其
TTTT,,实质是将直流形式的电能变为矩形波形式的电能。振荡周期。为电112
TTRRCRRC,,,,()ln20.7()容充电时间,为电容放电时间。充电时间 211212
TRCRC,,ln20.7放电时间 222
RRTTTRRCRRC,,,,,,ln2(2)0.7(2)矩形波的振荡周期因此改变、和12121212。
电容C的值,便可改变矩形波的周期和频率。由此得到本实验的R=R=10K 12所以通过测量该振荡器的频率,通过逆变换就可以得到待测的电容C。
五、调试不实际运行结果
频率值较为准确,但由于计算电容的公式和电路的关系,显示出来的电容值精度不够高,而且无法测量太大和太小的电容,电容的单位无法自动调整,而且只取到小数点后的后倆位,还需改进。调试的过程中始终有一个警告,来自读忙函数,不知为何,但不影响运行。
void busy(void)
{
while(1)
{
uchar mang;
dptr=0xa001;
mang=*dptr&0x80;
if(!mang) break;
}
} 从语言角度看不出有什么错误,估计是单片机不允许这样编写。
六、总结不体会
这次试验需要进行大量的计算,若用汇编语言做的话大量的代码都是关
于计算的,不同于第一次的大量的控制和操作,故选择用C语言来做。先使
用汇编做的时候,转BCD码的时候就进行了大量的计算,由于AB寄存器
中最大可储存255的数字,故除法和乘法非常不好算。尤其是最后进行带公
式计算电容时候,非常难做,故进行了大量的化简,在频率高的时候可以保
证精度,但并联了电容以后,频率大幅下降,导致精度也出现问题,且无法
改正。故最后改用C语言来完成。以后做的时候要尽量考虑好用哪种语言,
或者混合编程,保证高效和简单。
附:
#include uchar xdata *dptr; uchar fre[6],cap[8],i; float count=0; uint temp=0; void busy(void) { while(1) { uchar mang; dptr=0xa001; mang=*dptr&0x80; if(!mang) break; } } void wirte(uchar char1) { busy(); dptr=0xa002; *dptr=char1; } void position(uchar location) { busy(); dptr=0xa000; *dptr=location+0x80; } void show(void) { busy(); dptr=0xa000; *dptr=0x01; //清屏 position(0); wirte('F'); wirte(' '); for(i=0;i { if(fre[i]=='0') fre[i]=' '; else break; } position(5); for(i=0;i { wirte(fre[i]); } position(14); wirte('H'); wirte('z'); position(0x40); wirte('C'); wirte(' '); for(i=0;i { if(cap[i]=='0') { cap[i]=' '; if(cap[i+1]=='.') cap[i]='0'; } else break; } position(0x43); for(i=0;i { wirte(cap[i]); } position(14+0x40); wirte('n'); wirte('F'); } void main(void) { TMOD=0x15; IE=0x8a; IP=0x02; TH1=0x4c; TL1=0x00; TH0=0x00; TL0=0x00; cap[5]='.'; busy(); dptr=0xa000; *dptr=0x0c; busy(); dptr=0xa000; *dptr=0x38; TR0=1; TR1=1; while(1) ; } void t1_Int(void) interrupt 3 { TH1=0x4a; TL1=0xb8; count++; if(count==20) { TR0=0; temp=TH0; temp=temp*256+TL0; count=38100/(float)temp-1.15; for(i=0;i<6;i++)>6;i++)> { fre[5-i]=temp%10+0x30; temp/=10; } for(i=0;i<5;i++)>5;i++)> { cap[4-i]=((int)count)%10+0x30; count/=10; } cap[6]=(uchar)(count*10)%10+'0'; cap[7]=(uchar)(count*100)%10+'0'; show(); TH0=0; TL0=0; TR0=1; count=0; } } 一、实验目的: 1,熟悉MCU51单片机的基本工作原理和组成结构; 2,掌握汇编语言,能用汇编语言编写简单程序; 3,以实验板为基础用MCU51单片机系统实现测量电容功能 二、实验要求: 1(频率值能循环不断地被测量读取; 2(测量结果显示在外部LCD屏上; 3(利用本设计测量102、103、104三个电容的容值。 三、实验原理 原理电路:555多谐振荡电路 由555定时器组成的多谐振荡器如左图所示,其中R、R和电容C为外接元12件。其工作波如右图所示。 u,1u,电容充电时,定时器输出,电容放电时,0,电容不断地进行充、00放电,输出端便获得矩形波。多谐振荡器无外部信号输入,却能输出矩形波, 其实质是将直流形式的电能变为矩形波形式的电能。 TTT,,TT振荡周期。为电容充电时间,为电容放电时间。 1212 TRRCRRC,,,,()ln20.7()充电时间 11212 TRCRC,,ln20.7放电时间 222 TTTRRCRRC,,,,,,ln2(2)0.7(2)矩形波的振荡周期 121212 RR因此改变、和电容C的值,便可改变矩形波的周期和频率。 12 由此得到本实验的R=R=20K 12 所以我们发现,通过测量该振荡器的频率,通过逆变换就可以得到待测的电 容C。 四、实验分析: 整个程序可以采用自底向上的,模块化的设计思想进行设计,即一个一个功能模块进行设计调试,完成后再组合完整,其中可细分为以下几个模块: 1?外部中断计数:定时/计数器T0和T1的工作方式设置,T0是工作在计数状态下,对输入的频率信号进行计数,但对工作在计数状态下的 T0,最大计数值为fOSC/24,由于fOSC,11.0592MHz,对于频率的概念就是在一秒只数脉冲的个数,即为频率值。所以T1工作在定时状态下,采用定时50ms,共定时20次,即可完成1秒的定时功能,每定时1秒(0.1秒,10秒)中到,就停止T0的计数,而从T0的计数单元中读取计数的数值,然后进行数据处理,送到LCD显示; 2?数据处理:具体分析见实验原理。 3?LCD显示输出:控制器接收来着来自数据总线DB0~DB7和E,R/W,RS三个输入控制端与MPU接口,并从CGROM中找到欲显示的字符的字符码,送入DDRAM,在LCD显示屏上与DDRAM存储单元对应的规定位置显示出该字符; 五、实验过程: 1,主程序流程图如下: 其中计时子程序采用中断方式。 2.频率电容换算 由于采用的555多谐振荡电路计算公式不是准确的,只是一个估计出来的公式,为了调整,我们采用了查表法。 六、设计感想: 在查找了大量资料后终于完成了此次单片机频率计的实验任务,实现了实验要求中的各项功能。通过这次实验,我加深了对51单片机的工作原理和内部组成结构及LCD液晶显示器件的理解,熟悉用汇编语言编写简单的程序,掌握了单片机程序调试的基本方法,提高了自己的编程能力。 此次实验相对前一次数字时钟的实验较为简单,但对了新内容LCD的使用,通过这次单片机的实验我收获了很多,在前次实验的基础上进一步加深了单片机知识的学习 后附:实验程序源代码 ORG 0000H AJMP START ORG 000BH JMP INTERUPT_T0 ;计数中断 ORG 001BH JMP INTERUPT_T1 ;定时1秒中断 CAP1 EQU 41H CAP2 EQU 42H CAP3 EQU 43H CAP4 EQU 44H CAP5 EQU 45H CAPH EQU 46H CAPL EQU 47H ORG 0100H START: ;初始化部分 MOV SP,#90H MOV TMOD,#15H ;Timer0和Timer1工作于模式 01且Timer0处于计数状态 SETB EA SETB ET0 SETB ET1 MOV IP,#08H ;中断优先级控制 MOV 38H,#00H ;计数器高八位辅助进位 MOV TH0,#00H MOV TL0,#00H MOV TH1,#4CH MOV TL1,#08H MOV 3EH,#00H MOV R3,#0 MOV R4,#0 MOV R5,#0 MOV R6,#0 MOV R7,#0 MOV 3DH,#0 MOV CAP1,#0 MOV CAP2,#0 MOV CAP3,#0 MOV CAP4,#0 MOV CAP5,#0 MOV CAPH,#02H MOV CAPL,#34H ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; LCALL INITIALIZE BIG_CYCLE: ;这里是主程序 LCALL DISP_MODE_1S LCALL DELAY LCALL DELAY LJMP BIG_CYCLE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DISP_MODE_1S: ;;;;;;;;;;;;;;;;;;;;;;;;; LCALL BEEF MOV DPTR,#0A000H MOV A,#80H ADD A,#00H MOVX @DPTR,A LCALL BEEF MOV DPTR,#0A002H MOV A,#46H ;F MOVX @DPTR,A LCALL BEEF MOV DPTR,#0A002H MOV A,#52H ;R MOVX @DPTR,A LCALL BEEF MOV DPTR,#0A002H MOV A,#45H ;E MOVX @DPTR,A LCALL BEEF MOV DPTR,#0A002H MOV A,#51H ;Q MOVX @DPTR,A LCALL BEEF MOV DPTR,#0A002H MOV A,#20H ;空格 MOVX @DPTR,A LCALL BEEF MOV A,R4 LCALL GET_DISP_SEG MOV DPTR,#0A002H MOVX @DPTR,A ;;;;;;;;;;;;;;;;;;;;;;;; LCALL BEEF MOV A,R5 LCALL GET_DISP_SEG MOV DPTR,#0A002H MOVX @DPTR,A ;;;;;;;;;;;;;;;;;;;;;;;; LCALL BEEF MOV A,R6 LCALL GET_DISP_SEG MOV DPTR,#0A002H MOVX @DPTR,A ;;;;;;;;;;;;;;;;;;;;;;;; LCALL BEEF MOV A,R7 LCALL GET_DISP_SEG MOV DPTR,#0A002H MOVX @DPTR,A ;;;;;;;;;;;;;;;;;;;;;;;; LCALL BEEF MOV A,3DH LCALL GET_DISP_SEG MOV DPTR,#0A002H MOVX @DPTR,A ;;;;;;;;;;;;;;;;;;;;;;;; LCALL BEEF MOV A,#0AH LCALL GET_DISP_SEG MOV DPTR,#0A002H MOVX @DPTR,A ;;;;;;;;;;;;;;;;;;;;;;;; LCALL BEEF MOV A,#0BH LCALL GET_DISP_SEG MOV DPTR,#0A002H MOVX @DPTR,A ;;;;;;;;;;;;;;;;;;;;;;;; 第二行 LCALL BEEF MOV DPTR,#0A000H MOV A,#80H ADD A,#40H MOVX @DPTR,A ;;;;;;;;;;;;;;;;;;;;;;;;; LCALL BEEF MOV DPTR,#0A002H MOV A,#43H ;C MOVX @DPTR,A LCALL BEEF MOV DPTR,#0A002H MOV A,#41H ;A MOVX @DPTR,A LCALL BEEF MOV DPTR,#0A002H MOV A,#50H ;P MOVX @DPTR,A LCALL BEEF MOV DPTR,#0A002H MOV A,#20H ;空格 MOVX @DPTR,A LCALL BEEF MOV DPTR,#0A002H MOV A,#20H ;空格 MOVX @DPTR,A ;;;;;;;;;;;;;;;;;;;;;;;; LCALL BEEF MOV A,CAP2 LCALL GET_DISP_SEG MOV DPTR,#0A002H MOVX @DPTR,A ;;;;;;;;;;;;;;;;;;;;;;;; LCALL BEEF MOV A,CAP3 LCALL GET_DISP_SEG MOV DPTR,#0A002H MOVX @DPTR,A ;;;;;;;;;;;;;;;;;;;;;;;; LCALL BEEF MOV DPTR,#0A002H MOV A,#2EH ;. MOVX @DPTR,A ;;;;;;;;;;;;;;;;;;;;;;;; LCALL BEEF MOV A,CAP4 LCALL GET_DISP_SEG MOV DPTR,#0A002H MOVX @DPTR,A ;;;;;;;;;;;;;;;;;;;;;;; LCALL BEEF MOV A,CAP5 LCALL GET_DISP_SEG MOV DPTR,#0A002H MOVX @DPTR,A ;;;;;;;;;;;;;;;;;;;;;;;; LCALL BEEF MOV DPTR,#0A002H MOV A,#6EH ;n MOVX @DPTR,A LCALL BEEF MOV DPTR,#0A002H MOV A,#46H ;F MOVX @DPTR,A RET INTERUPT_T1: ;这里是Timer1中断服务子程序 入口 1秒 CLR TR1 DJNZ R0,CONTINUE_20 CLR TR0 LCALL CALCULATE LCALL CALCULATE_CAP MOV 38H,#00H MOV TH0,#00H MOV TL0,#00H MOV TH1,#4CH MOV TL1,#0BH LCALL CLEAR_DISP LCALL DISP_MODE_1S MOV R0,#20 SETB TR0 SETB TR1 RETI CONTINUE_20: MOV TH1,#4CH ;又设计时初值 MOV TL1,#0BH ;又设计时初值 SETB TR1 ;又开始启动Timer1,开始计时 RETI INTERUPT_T0: ;这里是Timer0中断服务子程序 入口 CLR TR0 INC 38H MOV TH0,#00H MOV TL0,#00H SETB TR0 RETI ;计算频率 CALCULATE: MOV R1,TL0 MOV R2,TH0 MOV A,TH0 MOV 48H,A MOV DPTR,#TABLE_CAPH MOVC A,@A+DPTR MOV CAPH,A MOV A,48H MOV DPTR,#TABLE_CAPL MOVC A,@A+DPTR MOV CAPL,A MOV 39H,38H LCALL CLEAR_ZERO LOOPING10: ;对操作数进行计算 MOV A,R1 ;减数送A CLR C ;低字节减无借位CY清零 SUBB A,#10100000B ;低字节减100000的低八位 MOV 3AH,A MOV A,R2 SUBB A,#10000110B ;中字节减100000的中八位 MOV 3BH,A MOV A,39H SUBB A,#00000001B ;高字节减100000的高八位 MOV 3CH,A JC LOOPING20 MOV R1,3AH MOV R2,3BH MOV 39H,3CH INC R3 LJMP LOOPING10 LOOPING20: MOV A,R1 ;减数送A CLR C ;低字节减无借位CY清零 SUBB A,#00010000B ;低字节减10000的低八位 MOV 3AH,A MOV A,R2 SUBB A,#00100111B ;中字节减10000的中八位 MOV 3BH,A MOV A,39H SUBB A,#00000000B ;高字节减10000的高八位 MOV 3CH,A JC LOOPING30 MOV R1,3AH MOV R2,3BH MOV 39H,3CH INC R4 LJMP LOOPING20 LOOPING30: MOV A,R1 ;减数送A CLR C ;低字节减无借位CY清零 SUBB A,#11101000B ;低字节减1000的低八位 MOV 3AH,A MOV A,R2 SUBB A,#00000011B ;中字节减1000的中八位 MOV 3BH,A MOV A,39H SUBB A,#00000000B ;高字节减1000的高八位 MOV 3CH,A JC LOOPING40 MOV R1,3AH MOV R2,3BH MOV 39H,3CH INC R5 LJMP LOOPING30 LOOPING40: MOV A,R1 ;减数送A CLR C ;低字节减无借位CY清零 SUBB A,#01100100B ;低字节减100的低八位 MOV 3AH,A MOV A,R2 SUBB A,#00000000B ;中字节减100的中八位 MOV 3BH,A MOV A,39H SUBB A,#00000000B ;高字节减100的高八位 MOV 3CH,A JC LOOPING50 MOV R1,3AH MOV R2,3BH MOV 39H,3CH INC R6 LJMP LOOPING40 LOOPING50: MOV A,R1 ;减数送A CLR C ;低字节减无借位CY清零 SUBB A,#00001010B ;低字节减10的低八位 MOV 3AH,A MOV A,R2 SUBB A,#00000000B ;中字节减10的中八位 MOV 3BH,A MOV A,39H SUBB A,#00000000B ;高字节减10的高八位 MOV 3CH,A JC LOOPING60 MOV R1,3AH MOV R2,3BH MOV 39H,3CH INC R7 LJMP LOOPING50 RET LOOPING60: MOV A,R1 ;减数送A CLR C ;低字节减无借位CY清零 SUBB A,#000000001B ;低字节减1的低八位 MOV 3AH,A MOV A,R2 SUBB A,#00000000B ;中字节减1的中八位 MOV 3BH,A MOV A,39H SUBB A,#00000000B ;高字节减1的高八位 MOV 3CH,A JC LOOPING70 MOV R1,3AH MOV R2,3BH MOV 39H,3CH INC 3DH LJMP LOOPING60 RET LOOPING70:RET GET_DISP_SEG: ;取表子程序 MOV DPTR,#TABLE MOVC A,@A+DPTR RET TABLE: DB 30H,31H,32H,33H,34H ;01234 DB 35H,36H,37H,38H,39H ;56789 DB 48H,7AH,2EH ;H z . ;计算电容 CALCULATE_CAP: MOV R1,CAPL MOV R2,CAPH MOV 39H,#00H LCALL CLEAR_ZERO_CAP LOOP10: ;对操作数进行计算 MOV A,R1 ;减数送A CLR C ;低字节减无借位CY清零 SUBB A,#10100000B ;低字节减100000的低八位 MOV 3AH,A MOV A,R2 SUBB A,#10000110B ;中字节减100000的中八位 MOV 3BH,A MOV A,39H SUBB A,#00000001B ;高字节减100000的高八位 MOV 3CH,A JC LOOP20 MOV R1,3AH MOV R2,3BH MOV 39H,3CH INC R3 LJMP LOOP10 LOOP20: MOV A,R1 ;减数送A CLR C ;低字节减无借位CY清零 SUBB A,#00010000B ;低字节减10000的低八位 MOV 3AH,A MOV A,R2 SUBB A,#00100111B ;中字节减10000的中八位 MOV 3BH,A MOV A,39H SUBB A,#00000000B ;高字节减10000的高八位 MOV 3CH,A JC LOOP30 MOV R1,3AH MOV R2,3BH MOV 39H,3CH INC CAP1 LJMP LOOP20 LOOP30: MOV A,R1 ;减数送A CLR C ;低字节减无借位CY清零 SUBB A,#11101000B ;低字节减1000的低八位 MOV 3AH,A MOV A,R2 SUBB A,#00000011B ;中字节减1000的中八位 MOV 3BH,A MOV A,39H SUBB A,#00000000B ;高字节减1000的高八位 MOV 3CH,A JC LOOP40 MOV R1,3AH MOV R2,3BH MOV 39H,3CH INC CAP2 LJMP LOOP30 LOOP40: MOV A,R1 ;减数送A CLR C ;低字节减无借位CY清零 SUBB A,#01100100B ;低字节减100的低八位 MOV 3AH,A MOV A,R2 SUBB A,#00000000B ;中字节减100的中八位 MOV 3BH,A MOV A,39H SUBB A,#00000000B ;高字节减100的高八位 MOV 3CH,A JC LOOP50 MOV R1,3AH MOV R2,3BH MOV 39H,3CH INC CAP3 LJMP LOOP40 LOOP50: MOV A,R1 ;减数送A CLR C ;低字节减无借位CY清零 SUBB A,#00001010B ;低字节减10的低八位 MOV 3AH,A MOV A,R2 SUBB A,#00000000B ;中字节减10的中八位 MOV 3BH,A MOV A,39H SUBB A,#00000000B ;高字节减10的高八位 MOV 3CH,A JC LOOP60 MOV R1,3AH MOV R2,3BH MOV 39H,3CH INC CAP4 LJMP LOOP50 RET LOOP60: MOV A,R1 ;减数送A CLR C ;低字节减无借位CY清零 SUBB A,#000000001B ;低字节减1的低八位 MOV 3AH,A MOV A,R2 SUBB A,#00000000B ;中字节减1的中八位 MOV 3BH,A MOV A,39H SUBB A,#00000000B ;高字节减1的高八位 MOV 3CH,A JC LOOP70 MOV R1,3AH MOV R2,3BH MOV 39H,3CH INC CAP5 LJMP LOOP60 RET LOOP70:RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DELAY: MOV 30H,#0FFH LP: MOV 31H,#0FFH DJNZ 31H,$ DJNZ 30H,LP RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; BEEF: ;检测忙标志 MOV DPTR,#0A001H MOVX A,@DPTR JB ACC.7,BEEF RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CLEAR_DISP: ;清显示 MOV DPTR,#0A000H MOV A,#01H MOVX @DPTR,A RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CURSOR_SHIFT: MOV DPTR,#0A000H MOV A,#1CH MOVX @DPTR,A RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; INPUT_SETTING: ;设置输入模式 MOV DPTR,#0A000H MOV A,#06H MOVX @DPTR,A RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FUNCTION_SET: ;功能设置 MOV DPTR,#0A000H MOV A,#38H MOVX @DPTR,A RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DISP_ON_OFF: ;开显示 MOV DPTR,#0A000H MOV A,#0CH MOVX @DPTR,A RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; INITIALIZE: ;初始化模块 LCALL BEEF LCALL CLEAR_DISP LCALL BEEF LCALL INPUT_SETTING LCALL BEEF LCALL CURSOR_SHIFT LCALL BEEF LCALL FUNCTION_SET LCALL BEEF LCALL DISP_ON_OFF SETB TR0 SETB TR1 RET CLEAR_ZERO: MOV R3,#0 MOV R4,#0 MOV R5,#0 MOV R6,#0 MOV R7,#0 MOV 3DH,#0 CLEAR_ZERO_CAP: MOV CAP1,#0 MOV CAP2,#0 MOV CAP3,#0 MOV CAP4,#0 MOV CAP5,#0 ; MOV CAPH,#02H ; MOV CAPL,#34H RET TABLE_CAPH: DB 15H,0AH,07H,05H,04H,03H,03H,02H,02H,02H DB 01H,01H,01H,01H,01H,01H,01H,01H,01H,01H DB 01H,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0 TABLE_CAPL: DB 0CCH,0E6H,44H,73H,5CH,0A2H,1DH,0B9H,6CH,2EH DB 0FBH,0D1H,0ADH,8EH,74H,5CH,48H,36H,25H,17H DB 09H,0FDH,0F2H,0E8H,0DFH,0D6H,0CEH,0C7H,0C0H,0BAH DB 0B4H,0AEH,0A9H,0A4H,9FH,9BH,96H,92H,8FH,8BH DB 88H,84H,81H,7EH,7CH,79H,76H,74H,71H,6FH DB 6DH,6BH,69H,67H,65H,63H,61H,60H,5EH,5DH DB 5BH,5AH,58H,57H,55H,54H,53H,52H,50H,4FH DB 4EH,4DH,4CH,4BH,4AH,49H,48H,47H,46H,45H DB 44H,44H,43H,42H,41H,40H,40H,3FH,3EH,3EH DB 3DH,3CH,3CH,3BH,3AH,3AH,39H,38H,38H,37H END 摘要:本设计使用两个555定时器,其中一个555定时器搭建为多谐振荡器,通过电容充放电产生固定周期脉波,作为计波数;同时另一个555定时器搭建成单稳态触发器电路,多谐输出作为单稳输出,输出外加反锁作为控制脉波;在固定周期内采用74290对计数波计数,并使用74273锁存数据,将数据在led上显示出来,采用直流稳压为系统提供+5和+12的电压。 设计中使用开关转换来达到两个大量程电容,能够测量1nF~的电容值;并且系统具有单位功能。 关键词:555定时器,多谐振荡器,单稳态触发器,,锁存器 目录 一、概述 .............................................................. 错误~未定义书签。3 1.意义:................................................................................................ 错误~未定义书签。3 2.系统主要功能 .................................................................................... 错误~未定义书签。4 二、硬件电路设计及描述 ................................... 错误~未定义书签。4 1.方案及设计思想: ............................................................................ 错误~未定义书签。4 2. 电路原理图 ...................................................................................... 错误~未定义书签。6 3.芯片资料:........................................................................................ 错误~未定义书签。8 4.元件清单:.............................................................................................................................. 9 三、软件设计流程及描述 .................................................................... 10 1.模块层次结构图 .................................................................................................................. 10 2、程序流程图 ....................................................................................................................... 11 3、源程序代码 ....................................................................................................................... 11 四,总结 ............................................................................................... 18 一、 概述 1.意义, 电容,就是容纳和释放电荷的电子元器件。电容的基本工作原理就是充电放电,当然还有整流、振荡以及其它的作用。另外电容的结构非常简单,主要由两块正负电极和夹在中间的绝缘介质组成,所以电容类型主要是由电极和绝缘介质决定的。电容的用途非常多,主要有如下几种: 1(隔直流:作用是阻止直流通过而让交流通过。 2(旁路(去耦):为交流电路中某些并联的元件提供低阻抗通路。 3(耦合:作为两个电路之间的连接,允许交流信号通过并传输到下一级电路 4(滤波:这个对DIY而言很重要,显卡上的电容基本都是这个作用。 5(温度补偿:针对其它元件对温度的适应性不够带来的影响,而进行补偿,改善电路的稳定性。 6(计时:电容器与电阻器配合使用,确定电路的时间常数。 7(调谐:对与频率相关的电路进行系统调谐,比如手机、收音机、电视机。 8(整流:在预定的时间开或者关半闭导体开关元件。 9(储能:储存电能,用于必须要的时候释放。例如相机闪光灯,加热设备等等。(如今某些电容的储能水平已经接近锂电池的水准,一个电容储存的电能可以供一个手机使用一天。 2.系统主要功能 通过555定时器芯片的特点,把电容大小转换成555输出频率大小,用单片机对其频率进行测量,这样就可以得到电容相对大小的一个数值,调节某些电阻的参数,改动单片机中程序的计算公式,就可以简单的得到电容的值。 二、 硬件电路设计及描述 1. 方案及设计思想 设计要求,数字电容测量仪 1要求测量范围是100pf到5uf 1.1方案设计 设计原理: 基于AT89C51单片机的多谐振荡电路电容测量 主要原理是通过555芯片来测电容,让555定时器在直接反馈无稳态的状态下,555芯片输出一定频率一定频率的方波,其频率的大小跟被测电容之间的关系是:f=0.722/(R*Cx),固定一定的R的大小,就可以确定可测量C的一定范围,其公式经查询,为f=K/Cx,因此测出f即可。 在单片机中,我们使用单片机T0中断端口和中断INT0配合测量。方法相当简单。 原理如图 总原理图: 555定时器部分 AT89C51部分 晶振部分 复位电路 显示电路: 1VSS2VDD3VEE 4RS5RWLCD16ELM016L 7D08D19D210D311D412D513D614D7 P10P11P12 RP1 1 23456789 P20RESPACK-8P21 工作原理 1.9液晶模块简介 LM016L的结构及功能: LM016L液晶模块采用HD44780控制器,hd44780具有简单而功能较强的指令集,可以实现字符移动,闪烁等功能,LM016L与单片机MCU通讯可采用8位或4位并行传输两种方式,hd44780控制器由两个8位寄存器,指令寄存器(IR)和数据寄存器(DR)忙标志(BF),显示数RAM(DDRAM),字符发生器ROMA(CGOROM)字符发生器RAM(CGRAM),地址计数器RAM(AC)。IR用于寄存指令码,只能写入不能读出,DR用于寄存数据,数据由内部操作自动写入DDRAM和CGRAM,或者暂存从DDRAM和CGRAM读出的数据,BF为1时,液晶模块处于内部模式,不响应外部操作指令和接受数据,DDTAM用来存储显示的字符,能存储80个字符码, CGROM由8位字符码生成5*7点阵字符160中和5*10点阵字符32种.8位字符编码和字符的对应关系,可以查看参考文献(30)中的表4. CGRAM是为用户编写特殊字符留用的,它的容量仅64字节,可以自定义8个5*7点阵字符或者4个5*10点阵字符,AC可以存储DDRAM和CGRAM的地址,如果地址码随指令写入IR,则IR自动把地址码装入AC,同时选择DDRAM或CGRAM但愿,LM016L液晶模块的引脚图如图4-3所示。 图4-3 1601引脚图 LM016L引脚介绍: Vss(1脚):一般接地。 Vdd(2脚):接电源。 Vee(3脚):液晶显示器对比度调整端,接电源时对比度最弱,接地时对比度最高(对 比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。 RS(4脚):RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄 存器。 R/W(5脚):R/W为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。 E(6脚):E(或EN)端为使能(enable)端,下降沿使能。 DB0(7脚):底4位三态、 双向数据总线 0位(最低位)。 DB1(8脚):底4位三态、 双向数据总线 1位。 DB2(9脚):底4位三态、 双向数据总线 2位。 DB3(10脚):底4位三态、 双向数据总线 3位。 DB4(11脚):高4位三态、 双向数据总线 4位。 DB5(12脚):高4位三态、 双向数据总线 5位。 DB6(13脚):高4位三态、 双向数据总线 6位。 DB7(14脚):高4位三态、 双向数据总线 7位(最高位)(也是busy flang)。 寄存器选择控制如表4-1。 表4-1寄存器选择控制 RS R/W 操作说明 0 0 写入指令寄存器(清除屏等) 0 1 读busy flag(DB7),以及读取位址计数器(DB0~DB6)值 1 0 写入数据寄存器(显示各字型等) 1 1 从数据寄存器读取数据 三、软件设计流程及描述 3.1 模块层次结构图 #include #define uint unsigned int #define uchar unsigned char sbit EN = P2^2; //定义引脚 sbit RS = P2^0; sbit RW = P2^1; sbit BUSY = P0^7; sbit SOUT = P3^5; sbit FW1=P1^5; sbit FW2=P1^6; sbit FW3=P1^7; int CountFlag=-1,ShowResultFlag=0,FWFlag=0; long int N=1,maxnum=650000; //系统端口操作函数 void Delay(uint o) { uint i,j; for(i = 0; i < o;="" i++)for(j="0;" j="">< 100;="" j++);=""> } void WaitCheck() // 等待空闲 { do{ P0=0xFF; RS=0;//选择指令寄存器 RW=1;//读 rs rw 值为01时,忙标志和地址计数器读出 EN=0;//E=0,禁止读写 Delay(1);//等待,液晶显示器处理数据 EN=1;//E=1,允许读写 }while(BUSY==1);//判断是否为空闲,1为忙,0为空闲 } void WriteCom(uchar com)//给P0写指令 { P0=com; RS=0; RW=0; EN=0; WaitCheck(); EN=1; } void ShowChar(uchar c)//输入16进制数字码显示char { P0=c; RS=1; RW=0; EN=0; WaitCheck(); EN=1; } //设置命令 void SetLinePos(uchar line,uchar pos)//设置光标位置 { if(line==1) WriteCom(0x80|pos); else WriteCom(0xC0|pos); } void SetCursorStyle(uchar style)//0光标左移1光标右移 { if(style)WriteCom(0x04);//光标左移 else WriteCom(0x06);//光标右移 } //图像命令 void Cls()//清屏光标复位指令 { WriteCom(0x01); } void ShowCursor(uchar i)//1显示不闪烁的光标 0禁用光标 { if(i)WriteCom(0x14); else WriteCom(0x12); } void ShowStr(uchar *c) { while((*c)!=0) { ShowChar(*c); c++; } } void ShowBitNum(uchar num)//显示单个正数 { ShowChar(0x30+num); } int ShowNumber(long int number)//显示指定数字//返回0正常 1表示溢出 { uchar idnumbuf[10]={0};//1为负数,最大10位整数 int bitbuf; if(number==0)ShowBitNum(0); //显示正数 //10位赋值 for(bitbuf=0;number;bitbuf++) { idnumbuf[bitbuf]=number%10; number/=10; } for(bitbuf--;bitbuf>=0;bitbuf--) { ShowBitNum(idnumbuf[bitbuf]); } return 0; } void CapOperate() interrupt 0 { if(ShowResultFlag==0)CountFlag*=-1; if(CountFlag==1&&ShowResultFlag==0) { TR0=1;//Start Timer } if(CountFlag==-1&&ShowResultFlag==0) { TR0=0; EX0=0;//close interrupt SOUT=0;//Stop Sending Single N=TH0*256+TL0; TH0=0; TL0=0; ShowResultFlag=1; FW1=FW2=FW3=0; FWFlag=0; } } void Init() //初始化 { EN=1; //使能信号为高电平 WriteCom(0x38); //显示模式设置 WriteCom(0x0e); //显示开,光标开,不闪烁 WriteCom(0x06); //光标右移 文字移动无效 WriteCom(0x80); //设置访问地址 //创建定时器 IE=0x81;//打开全部中断控制 开启外部中断允许 TMOD=0x09;//T0为16位工作方式09 IT0=1; //外部中断触发方式为脉冲触发 TH0=0x00; TL0=0x00; SOUT=0; } void FindSwitch() { FW1=FW2=FW3=1; Delay(1); if(FW1==0) FWFlag=1; else if(FW2==0) FWFlag=2; else if(FW3==0) FWFlag=3; } void main() { Init(); while(1) { FindSwitch();//查询是否允许测量 while(FWFlag)//Key Press { SOUT=1;//start 555 sending single EX0=1;//Start interrupt 0 FindSwitch();//查询哪个量程开关 while(SOUT)//超出等待时间 中断信号没来就不进入循环 { maxnum--; if(maxnum<=0) sout="0;">=0)> if(N<1000)>1000)> { SetLinePos(2,0); ShowStr("Error..Check!"); } else if(N>1500000) { SetLinePos(2,0); ShowStr("CapNumTooBig!"); } else //if(N>500) { //N=N/2; SetLinePos(1,0); // ShowNumber(N); ///* ShowNumber(N/10); ShowStr(" "); ShowNumber(N%10); if(FWFlag==1) ShowStr("00pf"); else if(FWFlag==2) ShowStr("0pf "); else if(FWFlag==3) ShowStr("pf "); else if(FWFlag==0) ShowStr("-ERR"); SetLinePos(2,0); ShowStr("Show Cap Num:"); //*/ } } } } } 总结: 我小组成员共三人,刘太伟,王瀚兴,夏培峻,齐心协力,最后完成 了设计,仿真,制作等,成功完成了任务。 软硬件设计,王瀚兴 制作,刘太伟 实验报告,夏培峻 参考文献:51单片机C语言教程 郭天祥 编著 电子工业出版社 仲恺农业工程学院 20010—2011学年 第二学期 课程设计 课题名称:设计时间:系班姓 部:级:名: 指导教师: [摘要]本文介绍一种基于89c51单片机的一种电压测量电路,该电路采用ICL7135高精 度、双积分A/D转换电路,测量范围直流0-±2000伏,使用LCD 液晶模块显示,可以与PC 机进行串行通信。正文着重给出了软硬件系统的各部分电路,介绍了双积分电路的原理,89c51的特点,ICL7135的功能和应用,LCD1601的功能和应用。该电路设计新颖、功能强大、可扩展性强。 [关键词]电压测量,ICL7135,双积分A/D转换器,1601液晶模块 第一章前言 1.1概述 目前,由各种单片机机A/D转换器构成的测量数字电压的结构,已被广泛用于电子及电工测量、工业自动化仪表、自动测试系统等智能化测量领域,示出强大的生命力。本章重点介绍单片A/D转换器以及由它们构成的基于单片机的数字电压表的工作原理。 1.2系统原理及基本框图 如图1.1所示,模拟电压经过档位切换到不同的分压电路衰减后,经隔离干扰送到 A/D转换器进行A/D转换,然后送到单片机中进行数据处理。处理后的数据送到LCD 中显示,同时通过串行通讯与上位机通信。 输入电路 A/D转换89S52单片机 LCD 显示 通讯模块 图1.1系统基本方框图 第二章硬件设计 2.1输入电路 图2.1.1量程切换开关 图2.1.2衰减输入电路 输入电路的作用是把不同量程的被测的电压规范到A/D转换器所要求的电压值。智能化数字电压表所采用的单片双积分型ADC 芯片ICL7135,它要求输入电压0-±2V。本仪表设计是0-1000V 电压,灵敏度高所以可以不加前置放大器,只需衰减器,如图3.1.2所示9M、900K、90K、和10K 电阻构成1/10、1/100、1/1000的衰减器。衰减输入电路可由开关来选择不同的衰减率,从而切换档位。为了能让CPU 自动识别档位,还要有图3.1.1的硬件连接。 2.2A/D转换电路 A/D转换器的转换精度对测量电路极其重要,它的参数关系到测量电路性能。本设计采用双积A/D转换器,它的性能比较稳定,转换精度高,具有很高的抗干扰能力,电路结构简单,其缺点是工作速度较低。在对转换精度要求较高,而对转换速度要求不高的场合如电压测量有广泛的应用。2.2.1双积A/D 转换器的工作原理 图2.2.1.1双积A/D转换器 如图所示:对输入模拟电压和基准电压进行两次积分,先对输入模拟电压进行积分,将其变换成与输入模拟电压成正比的时间间隔T1,再利用计数器测出此时间间隔,则计数器所计的数字量就正比于输入的模拟电压;接着对基准电压进行同样的处理。在常用的A/D转换芯片中,ICL7135与其余几种有所不同,它是一种四位半的双积分A/D转换器,具有精度高(精度相当于14位二进制数)、价格低廉、抗干扰能力强等优点。本文介绍用单片机并行方式采集ICL7135的数据以实现单片机测电压功能的设计方案。 图2.2.1.2双积A/D转换器的波形图 7135是采用CMOS 工艺制作的单片4位半A/D转换器,其所转换的数字值以多工扫描的方式输出,只要附加译码器,数码显示器,驱动器及电阻电容等元件,就可组成一个满量程为2V 的数字电压表。(1)7135主要特点如下 : ①双积型A/D转换器,转换速度慢。②在每次A/D转换前,内部电 路都自动进行调零操作,可保证零点在常温下的长期稳定。在20000字(2V满量程)范围内,保证转换精度1字相当于14bitA/D转换器。 ③具有自动极性转换功能。能在但极性参考电压下对双极性模拟输入电压进行A/D 转换,模拟电压的范围为0~±1.9999V。 ④模拟出入可以是差动信号,输入电阻极高,输入电流典型值1PA。⑤所有输出端和TTL 电路相容。 ⑥有过量程(OR )和欠量程(UR )标志信号输出,可用作自动量程转换的控制信号。⑦输出为动态扫描BCD 码。 ⑧对外提供六个输入,输出控制信号(R/H,BUSH,ST,POL,OR,UR),因此除用 于数字电压表外,还能与异步接收/发送器,微处理器或其它控制电路连接使用。 ⑨采用28外引线双列直插式封装,外引线功能端排列如图所示。 (2)与单片机系统的串行连接 在ICL7135与单片机系统进行连接时,使用并行采集方式,要连接BCD 码数据输出线,可以将ICL7135的/STB信号接至AT89C52的P3.2(INT0)。 ICL7135需要外部的时钟信号,本设计采用CD4060来对4M 信号进行32分频得到125KHz 的时钟信号。CD4060计数为14级2进制计数器,在数字集成电路中可实现的分频次数最高,而且CD4060还包含振荡电路所需的非门,使用更为方便。 图2.2.2.3ICL7135 与系统的连接图 图2.2.2.4CD4060时钟发生电路 2.3单片机部分 单片机选用的是ATMEL 公司新推出的AT89S52,如图2.3.1所示。该芯片具有低功耗、高性能的特点,是采用CMOS 工艺的8位单片机,与AT89C51完全兼容。AT89S52还有以下 主要特点: ①采用了ATMEL 公司的高密度、非易失性存储器(NV-SRAM)技术;②其片内具有256字节RAM,8KB的可在线编程(ISP)FLASH存储器;③有2种低功耗节电工作方式:空闲模式和掉电模式 ④片内含有一个看门狗定时器(WDT),WDT包含一个14位计数器和看门狗定时器复 位寄存器(WDTRST),只要对WDTRST 按顺序先写入01EH,后写入0E1H,WDT便启动,当CPU 由于扰动而使程序陷入死循环或“跑飞”状态时,WDT即可有效地使系统复位,提高了系统的抗干扰性能。 图2.3.189S52引脚图 2.4液晶显示部分 显示接口用来显示系统的状态,命令或采集的电压数据。本系统显示部分用的是LCD 液晶模块,采用一个16×1的字符型液晶显示模块, 点阵图形式液晶由M 行×N列个显示单元组成,假设LCD 显示屏有64行,每行有 128 列,每8列对应1个字节的8个位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元和显示RAM 区1024个字节相对应,每一字节的内容和屏上相应位置的亮暗对应。一个字符由6×8或8×8点阵组成,即要找到和屏上某几个位置对应的显示RAM 区的8个字节,并且要使每个字节的不同的位为‘1’,其它的为‘0’,为‘1’的点亮,为‘0’的点暗,这样一来就组成某个字符。但对于内带字符发生器的控制器来说,显示字符就比较简单了,可让控制器工作在文本方式,根据在LCD 上开始显示的行列号及每行的列数找出显示RAM 对应的地址,设立光标,在此送上该字符对应的代码即可。 2.4.11601 使用说明 图2.4.1.11601引脚图 表2.4.1.1 引脚 1234567 符号GND Vcc VL RS LCD1601液晶模块的引脚 功能说明接地+5V 驱动LCD,一般将此脚接地 寄存器选择0:指令寄存器(WRITE)Busyflag,位址计数器(READ)1:数据寄存器(WRITE,READ) R/WE DB0 READ/WRITE选择 1:READ 0:WTITE 读写使能(下降沿使能)低4位三态、双向数据总线 续表2.4.1.1 891011121314 DB1DB2DB3DB4DB5DB6DB7 LCD1601液晶模块的引脚 高4位三态、双向数据总线另外DB7也是一个Busy flag 寄存器选择,如表所示: 表2.4.1.2寄存器选择控制线操作 RS 0011 R/W0101 操作说明 写入指令寄存器(清除屏幕…等) 读Busy flag(DB7),以及读取位址计数器(DB0~DB6)值 写入数据寄存器(显示各字型等) 从数据寄存器读取数据 Busy flag(DB7):在此位未被清除为“0”时,LCD将无法再处理其他指令要求。 (1)显示地址:内部地址计数器的计数地址:SB7=0(DB0~DB6)第一行00、01、02……等,第二行40、41、42……等,可配合检测DB7=1(RS=0,R/W=1)读取目前显示字的地址,判断是否需要换行。 表2.4.1.3 100 201 302 403 504 605 LCD160116×1显示字的地址706 807 940 1041 1142 1243 1344 1445 1546 1647 (2)外部地址:DB7=1,亦即80H+内部计数地址,可以用此方式将字显示在某一位置。LCD 各地址列举如下表: 表2.4.1.4 16×1180 16字1行1601281 382 483 584 685 LCD160116×1显示字的外部地址 786 887 9C0 10C1 11C2 12C3 13C4 14C5 15C6 16C7 表2.4.1.5 指说 令明 RS 0000000 定设置显示地址忙碌标志位BF 显示数据读取数据I/DI/D=1S D C B S=1D=1C=1B=1 0011 表示加1,表示显示幕ON 0001 01 R/W0000000 D70000000 LCD1601的指令组 设置码 D600000011 BF 写入数据读取数据 D5000001 D400001DL D30001S/CN AGC ADD D2001D R/LF D101I/DC ** D0**S B ** 清除显示幕光标回到原点进入模式设定显示幕ON/OFF 移位功能设定字发生器地址设 I/D=0表示减1 S=0表示OFF D=0表示显示屏幕OFF C=0表示光标OFF B=0表示显示闪烁OFF S/C=0光标移位R/L=0表示左移DL=0表示4位F=0表示5×7点矩阵 表示显示屏幕ON 表示光标ON 表示闪烁ON S/CS/C=1表示显示屏幕移位R/LR/L=1表示右移DL F DL=1表示8位F=1表示5×10点矩阵 N N=1表示2行显示行N=0表示1行显示行 BF BF=1:内部正在动作BF=0:可接收指令或数据码 2.4.2液晶显示部分与89c51的接口 如图所示:用89S52的P2口作为数据线,用P0.1、P0.2、P0.3分别作为LCD 的E、R/W、RS。其中E 是下降沿触发的片选信号,R/W是读写信号,RS 是寄存器选择信号本模块设计要点如下:显示模块初始化:首先清屏,再设置接口数据位为8位,显示行数为1行,字型为5×7点阵,然后设置为整体显示,取消光标和字体闪烁,最后设置为正向增量方式且不移位。向LCD 的显示缓冲区中送字符,程序中采用2个字符数组,一个显示字符,另一个显示电压数据,要显示的字符或数据被送到相应的数组中,完成后再统一显示.首先取一个要显示的字符或数据送到LCD 的显示缓冲区,程序延时2.5ms,判断是否够显示的个数,不够则地址加一取下一个要显示的字符或数据。 2.4.2.1液晶与89S52的接口 2.5通讯模块 89S52内部已集成通信接口URT,只需扩展一片MAX232芯片将输出信号转换成RS-232协议规定的电平标准,MAX232是一种双组驱动器/接收器,每个接收器将 TTL/CMOS电平。每个驱动器将TTL/CMOS输入电平EIA/TIA-232-E电平输入转换为5V 转换为EIA/TIA-232-E电平。即EIA 接口,就是把5V 转换为-8V到-15V电位 0V 转换为8V 到15V 再经RXD 输出,接收时由RXD 输入,把-8V到-15V电位转换为5V,8V到15V 转换为 0V。MAX232的工作电压只需5V,内部有振荡电路产生正负9V 电位。 图2.5.2MAX232 元件图 图2.5.2MAX232引脚功能图 第三章系统的软件设计 3.1主程序设计 图3.1.1主程序流程图ICL7135A/D与单片机连接电路的软件设计系统的程序流程图如图所示。主程序一开始 运行则设置堆栈起始地址为70H,设置中断寄存器,用来对ICL7135的中断进行计数,每5次后清零,完成一次数据采集工作,然后设置ICL7135的STB 端的中断的优先级。紧接着LCDM1601B 进行一次清屏,使其各个指令、数据寄存器的值进行清空,屏幕不显示任何字符。以前面对1601B 的介绍,只要将01H 送到数据总线,使RS=0,R/W=0,E有个下降沿的脉冲就可以完成清屏工作。用以下指令实现MOV P2,#01H;送到数据DB7---DB0,调用子程序ENABLE,由于下降沿时,内部数据要送到RAM 区,所以要有一个延时子程序,使这个下降沿持续2.5毫秒。内部RAM 有指令代码后就开始对RAM 进行清零,所以屏幕原有的字符将被清除。接着对1601进行功能的设定。MOVP2,#01111000B,按表3.1.1来看是设定显示器按2行显示,每行8位,5×7点阵。调用一次子程序ENABLE 程序,写入CPU 的指令寄存器中。每次向LCDM 中写入一个指令,就调用一次ENABLE,然后再对显示器进行闪烁、光标等功能进行设定。显示器的RAM 地址按加1方法进行读写。再设定第一行字符,也就是 ‘Voltage’的显示地址80H。字符‘Voltage’的TABLE 表地址送到DPTR 中,然后调用远程查表命令,依次把数据送到P2口,这时再调用子程序WRITE3,使LCD1601的RS=1,R/W=0使使能端E 产生一个下降沿脉冲,将数据送入到数据寄存器中,接下来执行子程序DISPLAY1,它的主要功能是将TABLE 表中的字符输出到LCD 中去。调定好显示字符数即远程查表的次数,就开始查表了。 采样数据存放的数据地址安排如下图所示,首先将60H 中的数显示在正负号的位置上,按照ASCII 码表,正号不显示(#20H),负号显示“-”(#2DH)。图4.1.2数据地址 程序 3.2A/D 中断程序设计 ICL7135每一分钟完成3次据的采集工作,1/3秒完成后向CPU 申请中断,CPU这时暂停工作,为中断服务.中断响应后关中断,将PSW、ACC压栈,判断是否首次中断,如果是首次图3.2.1中断子程序流程图 中断,则将正负号标志位置入60H,再把万位置入61H 中,如果不是首次中断,则跳到NEXT 处,如果是第二次中断,则将千位数置入62H 中,如果是第三次中断,再将百位数置入63H 中,第四次中断则将十位数置入64H 中,第五次中断则将小数点位置入65H 中,同时个位置 入66H 中。同时清除中断次数寄存器30H 中的值,完成中断后将ACC、PSW出栈,开中断。 消隐的思想:每次电压采集后,CPU将数据送到LCD 显示,将可能出现以下几种需要消隐的情况。 例如:2000V档量程:─0199. 9 此时万位的值‘0’不符合人们的视觉习惯,需要把万位的值消隐掉,编程是将#20H送入万位,使其在LCD 中不显示任何字符即可。同样的情况如下: 2000V 档量程:─ ─00001091. . 99需要消隐万位、千位需要消隐万位、千位、百位 200V 档量程:─ ─001091. . 9999需要消隐万位需要消隐万位、千位 20V 档量程: ─01. 999需要消隐万位 在采集到数据之后,置数之前判断档位,是2V 档不消隐,是其他档位时再看要消隐的位之前有几个是零。例如2000V 档量程,-0001.9V,在2次中断时判断档位是2000V 档,第1位是零,消隐第2位千位。 3.3通讯模块程序设计 89C51单片机内部有一个全双工的串行通信口,即串行接收和发送缓冲器(SBUF),这两个在物理上独立的接收发送器,既可以接收数据也可以发送数据。但接收缓冲器只能读出不能写入,而发送缓冲器则只能写入不能读出,它们的地址为99H。这个通信口既可以用于网络通信,亦可实现串行异步通信,还可以构成同步移位寄存器使用。如果在传行口的输入输出引脚上加上电平转换器,就可方便地构成标准的RS-232接口。89C51的串行口有4种工作方式,1种同步方式,3种异步方式。本方式选方式1,一帧数据有10位,包括起始位0、8位数据位和1位停止位1。串行口电路在发送时能自动加入起始位和停止位。在接收时,停止位进入SCON 中的RB8位。方式1的波特率是可变的,由定时器1的溢出率决定。由定时器1最好工作在方式2上(自动重装载模式),这样只需对TH1设置一次即可。数据通过TXD 输出,在8个位输出完毕后,SCON寄存器的TI 位被设为1,CPU只要判断TI 是1,接 着发送下一个字节。 波特率的设定:定时器T1工作在方式2 的初值为: (1.1) 为了减小误差,时钟振荡频率采用11.0592MHz,选用定时器T1工作在方式2作波特率发生器,波特率为300,设SMOD 为0,依公式(1.1)得初值为: 所以TH1=TL1=A0H MOV SCON ,#50H MOV TMOD ,#20H MOV TH1, #0A0H;URAT工作在方式1上;TIME1工作在方式2上;设置波特率为300 本设计的中断十分重要,为了减少相互间的干扰,保证可靠性,采用查询方式判断是否发送完毕。 A6:JBC TI , A5 AJMP A6 A5:INC R0;如果发送完毕跳,清标志位,跳到A5。;否则跳到A6,等待 电压检测原理, 模数转换芯片的说明, 与单片机的接口, 接口程序设计, 电路图, 程序, 不能实现程序的要有实现思路, 流程图等 结论/小结/心得体会 电压测量通过不同的接口电路可实现温度、湿度、压力等测量,广泛应用于工业领域。本电路设计别具一格,是一种高精度、低功耗、宽量程、智能化的电压表。可扩展键盘、EEPROM、报警电路,实现电压异常记录、报警。 致谢 光阴如梭,转眼间,大学生涯将过去。遥想入学之时,恍如隔日,不免感叹时光易逝,韶华难追。在大学生涯即将结束之际,谨对四年来给予我关心与支持的良师益友和亲人们致以最诚挚的谢意! 参考文献 [1]徐爱钧.《智能化测量控制仪表原理与设计》(第二版)[M].北京:北京航空航天大学出版社,2004. [2]吴金戌,沈庆阳,郭庭吉.《8051单片机实践与应用》[M].北京:清华大学出版社,2002. [3]高峰,《单片微型计算机与接口技术》[M].北京:科学出版社,2003. [4]刘伟,赵俊逸,黄勇,《一种基予C8051F 单片机的SOC 型数据采录器的设计与实现》[A].天津市计算机学会单片机分会编.《2003年全国单片机及嵌如入式系统学术年会论文集(下册)》[C].北京:北京航空航天大学出版社,2003.790-794 [5]ICL7135.PDF、MAX232.PDF 仲恺农业工程学院 20010 — 2011学年 第 二 学期 课程设计 课题名称:基于 AT89c51单片机的数字电压表 设计时间: 2011.06.01— 2011.06.9 系 部:机电工程系 班 级: 姓 名: 指导教师: [摘 要 ]本文介绍一种基于 89c51单片机的一种电压测量电路 , 该电路采用 ICL7135高精 度、双积分 A/D转换电路,测量范围直流 0-±2000伏,使用 LCD 液晶模块显示, 可以与 PC 机进行串行通信。正文着重给出了软硬件系统的各部分电路,介绍了双 积分电路的原理, 89c51的特点, ICL7135的功能和应用, LCD1601的功能和应用。 该电路设计新颖、功能强大、可扩展性强。 [关键词 ]电压测量, ICL7135,双积分 A/D转换器, 1601液晶模块 第一章 前言 1.1概述 目前,由各种单片机机 A/D 转换器构成的测量数字电压的结构,已被广泛用于电子及 电工测量、 工业自动化仪表、 自动测试系统等智能化测量领域, 示出强大的生命力。 本章重 点介绍单片 A/D 转换器以及由它们构成的基于单片机的数字电压表的工作原理。 1.2系统原理及基本框图 如图 1.1所示,模拟电压经过档位切换到不同的分压电路衰减后,经隔离干扰送到 A/D转换器进行 A/D转换,然后送到单片机中进行数据处理。处理后的数据送到 LCD 中显 示,同时通过串行通讯与上位机通信。 图 1.1系统基本方框图 第二章 硬件设计 2.1输入电路 图 2.1.1量程切换开关 图 2.1.2衰减输入电路 输入电路的作用是把不同量程的被测的电压规范到 A/D转换器所要求的电压值。 智能化 数字电压表所采用的单片双积分型 ADC 芯片 ICL7135, 它要求输入电压 0-±2V 。 本仪表设计 是 0-1000V 电压,灵敏度高所以可以不加前置放大器,只需衰减器,如图 3.1.2所示 9M 、 900K 、 90K 、和 10K 电阻构成 1/10、 1/100、 1/1000的衰减器。衰减输入电路可由开关来选 择不同的衰减率, 从而切换档位。 为了能让 CPU 自动识别档位, 还要有图 3.1.1的硬件连接。 2.2 A/D转换电路 A/D转换器的转换精度对测量电路极其重要,它的参数关系到测量电路性能。本设计 采用双积 A/D转换器,它的性能比较稳定,转换精度高,具有很高的抗干扰能力,电路结 构简单, 其缺点是工作速度较低。 在对转换精度要求较高, 而对转换速度要求不高的场合如 电压测量有广泛的应用。 2.2.1双积 A/D转换器的工作原理 图 2.2.1.1双积 A/D 转换器 如图所示:对输入模拟电压和基准电压进行两次积分, 先对输入模拟电压进行积分, 将 其变换成与输入模拟电压成正比的时间间隔 T1,再利用计数器测出此时间间隔,则计数器 所计的数字量就正比于输入的模拟电压;接着对基准电压进行同样的处理。在常用的 A/D转换芯片中, ICL7135与其余几种有所不同,它是一种四位半的双积分 A/D转换器,具有精 度高 (精度相当于 14位二进制数) 、 价格低廉、 抗干扰能力强等优点。 本文介绍用单片机并 行方式采集 ICL7135的数据以实现单片机测电压功能的设计方案。 图 2.2.1.2双积 A/D转换器的波形图 7135是采用 CMOS 工艺制作的单片 4位半 A/D转换器, 其所转换的数字值以多工扫描 的方式输出, 只要附加译码器, 数码显示器, 驱动器及电阻电容等元件, 就可组成一个满量 程为 2V 的数字电压表。 (1) 7135主要特点如下 : ①双积型 A/D转换器,转换速度慢。 ②在每次 A/D转换前,内部电 路都自动进行调零操作,可保证零点在常温下的长期稳定。在 20000字(2V 满量程)范围内,保证转换精度 1字相当于 14bitA/D转换器。 ③具有自动极性转换功能。能在但极性参考电压下对双极性模拟输入电压进行 A/D转 换,模拟电压的范围为 0~±1.9999V 。 ④模拟出入可以是差动信号,输入电阻极高,输入电流典型值 1PA 。 ⑤所有输出端和 TTL 电路相容。 ⑥有过量程(OR )和欠量程(UR )标志信号输出,可用作自动量程转换的控制信号。 ⑦输出为动态扫描 BCD 码。 ⑧对外提供六个输入 , 输出控制信号 (R/H,BUSH,ST,POL,OR,UR),因此除用 于 数字电压表外 , 还能与异步接收 /发送器 , 微处理器或其它控制电路连接使用。 ⑨采用 28外引线双列直插式封装,外引线功能端排列如图所示。 (2)与单片机系统的串行连接 在 ICL7135与单片机系统进行连接时, 使用并行采集方式, 要连接 BCD 码数 据输出线,可以将 ICL7135的 /STB信号接至 AT89C52的 P3.2(INT0) 。 ICL7135需要外部的时钟信号,本设计采用 CD4060来对 4M 信号进行 32分 频得到 125KHz 的时钟信号。 CD4060计数为14级2进制计数器,在数字集成电 路中可实现的分频次数最高,而且 CD4060还包含振荡电路所需的非门,使用更 为方便。 图 2.2.2.3 ICL7135与系统的连接图 图 2.2.2.4CD4060时钟发生电路 2.3单片机部分 单片机选用的是 ATMEL 公司新推出的 AT89S52,如图 2.3.1所示。该芯片具有低功耗、 高性能的特点,是采用 CMOS 工艺的 8位单片机,与 AT89C51完全兼容。 AT89S52还有以下 主要特点: ①采用了 ATMEL 公司的高密度、非易失性存储器(NV-SRAM )技术; ②其片内具有 256字节 RAM , 8KB 的可在线编程(ISP ) FLASH 存储器; ③有 2种低功耗节电工作方式:空闲模式和掉电模式 ④片内含有一个看门狗定时器(WDT ) , WDT 包含一个 14位计数器和看门狗定时器复位 寄存器 (WDTRST),只要对 WDTRST 按顺序先写入 01EH ,后写入 0E1H , WDT 便启动, 当 CPU 由 于扰动而使程序陷入死循环或“跑飞”状态时, WDT 即可有效地使系统复位,提高了系统的 抗干扰性能。 图 2.3.1 89S52引脚图 2.4液晶显示部分 显示接口用来显示系统的状态,命令或采集的电压数据。本系统显示部分用的是 LCD 液晶模块,采用一个 16×1的字符型液晶显示模块, 点阵图形式液晶由 M 行×N 列个显示单元组成, 假设 LCD 显示屏有 64行, 每行有 128 列, 每 8列对应 1 个字节的 8 个位, 即每行由 16 字节, 共 16×8=128个点组成, 屏上 64×16 个显示单元和显示 RAM 区 1024 个字节相对应, 每一字节的内容和屏上相应位置的亮 暗对应。一个字符由 6×8 或 8×8点阵组成,即要找到和屏上某几个位置对应的显示 RAM区的 8 个字节,并且要使每个字节的不同的位为‘ 1’ ,其它的为‘ 0’ ,为‘ 1’的点亮,为 ‘ 0’的点暗,这样一来就组成某个字符。但对于内带字符发生器的控制器来说,显示字符 就比较简单了,可让控制器工作在文本方式,根据在 LCD 上开始显示的行列号及每行的列 数找出显示 RAM对应的地址,设立光标,在此送上该字符对应的代码即可。 2.4.1 1601使用说明 图 2.4.1.1 1601引脚图 表 2.4.1.1 LCD1601液晶模块的引脚 续表 2.4.1.1 LCD1601液晶模块的引脚 寄存器选择,如表所示: 表 2.4.1.2 寄存器选择控制线操作 Busy flag(DB7):在此位未被清除为“ 0”时, LCD 将无法再处理其他指令要求。 (1)显示地址:内部地址计数器的计数地址:SB7=0(DB0~DB6) 第一行 00、 01、 02? ? 等,第二行 40、 41、 42? ?等,可配合检测 DB7=1 (RS=0,R/W=1)读取目前显示字的地址, 判断是否需要换行。 表 2.4.1.3 LCD1601 16×1显示字的地址 (2)外部地址:DB7=1,亦即 80H +内部计数地址,可以用此方式将字显示在某一位置。 LCD 各地址列举如下表: 表 2.4.1.4 LCD1601 16×1 显示字的外部地址 16×1 16字 1行 1601 表 2.4.1.5 LCD1601 的指令组 2.4.2 液晶显示部分与 89c51的接口 如图所示:用 89S52的 P2口作为数据线, 用 P0.1、 P0.2、 P0.3分别作为 LCD 的 E 、 R/W、 RS 。 其中 E 是下降沿触发的片选信号, R/W是读写信号, RS 是寄存器选择信号本模块设计要 点如下:显示模块初始化:首先清屏,再设置接口数据位为 8位,显示行数为 1行,字型为 5×7点阵, 然后设置为整体显示, 取消光标和字体闪烁 , 最后设置为正向增量方式且不移位。 向 LCD 的显示缓冲区中送字符, 程序中采用 2个字符数组, 一个显示字符, 另一个显示电压 数据,要显示的字符或数据被送到相应的数组中,完成后再统一显示 . 首先取一个要显示的 字符或数据送到 LCD 的显示缓冲区,程序延时 2.5ms, 判断是否够显示的个数,不够则地址 加一取下一个要显示的字符或数据。 2.5 通讯模块 89S52内部已集成通信接口 URT ,只需扩展一片 MAX232芯片将输出信号转换成 RS-232协议规定的电平标准 , MAX232 是 一 种 双 组 驱 动 器 / 接 收 器 ,每个接收器将 EIA/TIA-232-E电平输入转换为 5V TTL/CMOS电平。 每个驱动器将 TTL/CMOS输入电平转 换 为 EIA/TIA-232-E电平。即 EIA 接口,就是把 5V 转换为 -8V 到 -15V 电位 0V 转换为 8V 到 15V 再经 RXD 输出,接收时由 RXD 输入,把 -8V 到 -15V 电位转换为 5V , 8V 到 15V 转换为 0V 。 MAX232的工作电压只需 5V ,内部有振荡电路产生正负 9V 电位。 2.4.2.1 液晶与 89S52的接口 图 2.5.2 MAX232元件图 图 2.5.2 MAX232引脚功能图 第三章 系统的软件设计 3.1主程序设计 ICL7135A/D与单片机连接电路的软件设计系统的程序流程图如图所示。主程序一开始 运行则设置堆栈起始地址为 70H ,设置中断寄存器,用来对 ICL7135的中断进行计数,每 5次后清零,完成一次数据采集工作,然后设置 ICL7135的 STB 端的中断的优先级。紧接着 LCDM1601B 进行一次清屏, 使其各个指令、 数据寄存器的值进行清空, 屏幕不显示任何字符。 以前面对 1601B 的介绍,只要将 01H 送到数据总线,使 RS=0, R/W=0, E 有个下降沿的脉冲 就可以完成清屏工作。用以下指令实现 MOV P2,#01H ;送到数据 DB7---DB0,调用子程 序 ENABLE,由于下降沿时,内部数据要送到 RAM 区,所以要有一个延时子程序,使这个下 降沿持续 2.5毫秒。 内部 RAM 有指令代码后就开始对 RAM 进行清零, 所以屏幕原有的字符将 被清除。接着对 1601进行功能的设定。 MOV P2,#01111000B,按表 3.1.1来看是设定显示 器按 2行显示,每行 8位, 5×7点阵。调用一次子程序 ENABLE 程序,写入 CPU 的指令寄存 器中。每次向 LCDM 中写入一个指令,就调用一次 ENABLE ,然后再对显示器进行闪烁、光标 等功能进行设定。显示器的 RAM 地址按加1方法进行读写。再设定第一行字符,也就是 ‘ Voltage ’的显示地址 80H 。字符‘ Voltage ’的 TABLE 表地址送到 DPTR 中,然后调用远 图 3.1.1 主程序流程图 程查表命令, 依次把数据送到 P2口, 这时再调用子程序 WRITE3, 使 LCD1601的 RS=1, R/W=0使使能端 E 产生一个下降沿脉冲, 将数据送入到数据寄存器中, 接下来执行子程序 DISPLAY1, 它的主要功能是将 TABLE 表中的字符输出到 LCD 中去。 调定好显示字符数即远程查表的次数, 就开始查表了。 采样数据存放的数据地址安排如下图所示 , 首先将 60H 中的数显示在正负号的位置上,按照 ASCII 码表,正号不显示(#20H) ,负号显示“-” (#2DH) 。 图 4.1.2数据地址 程序 3.2 A/D中断程序设计 ICL7135每一分钟完成 3次据的采集工作, 1/3秒完成后向 CPU 申请中断 ,CPU 这时暂停 工作,为中断服务 . 中断响应后关中断,将 PSW 、 ACC 压栈,判断是否首次中断,如果是首次 中断, 则将正负号标志位置入 60H , 再把万位置入 61H 中, 如果不是首次中断, 则跳到 NEXT 处,如果是第二次中断,则将千位数置入 62H 中,如果是第三次中断,再将百位数置入 63H 中, 第四次中断则将十位数置入 64H 中, 第五次中断则将小数点位置入 65H 中, 同时个位置 入 66H 中。同时清除中断次数寄存器 30H 中的值,完成中断后将 ACC 、 PSW 出栈,开中断。 图 3.2.1 中断子程序流程图 消隐的思想:每次电压采集后, CPU 将数据送到 LCD 显示,将可能出现以下几种需要消 隐的情况。 例如:2000V 档量程: 此时万位的值‘ 0’不符合人们的视觉习惯,需要把万位的值消隐掉,编程是将 #20H送入万 位,使其在 LCD 中不显示任何字符即可。同样的情况如下: 2000V 档量程: 200V 档量程: 20V 档量程: 在采集到数据之后,置数之前判断档位,是 2V 档不消隐,是其他档位时再看要消隐的位之 前有几个是零。例如 2000V 档量程, -0001.9V ,在 2次中断时判断档位是 2000V 档,第 1位是零,消隐第 2位千位。 3.3通讯模块程序设计 89C51单片机内部有一个全双工的串行通信口,即串行接收和发送缓冲器(SBUF ) ,这 两个在物理上独立的接收发送器, 既可以接收数据也可以发送数据。 但接收缓冲器只能读出 不能写入,而发送缓冲器则只能写入不能读出,它们的地址为 99H 。这个通信口既可以用于 网络通信, 亦可实现串行异步通信, 还可以构成同步移位寄存器使用。 如果在传行口的输入 输出引脚上加上电平转换器,就可方便地构成标准的 RS-232接口。 89C51的串行口有 4种 工作方式, 1种同步方式, 3种异步方式。本方式选方式 1,一帧数据有 10位,包括起始位 0、 8位数据位和 1位停止位 1。 串行口电路在发送时能自动加入起始位和停止位。 在接收时, 停止位进入 SCON 中的 RB8位。方式 1的波特率是可变的,由定时器 1的溢出率决定。由定 时器 1最好工作在方式 2上(自动重装载模式) ,这样只需对 TH1设置一次即可。数据通过 TXD 输出,在 8个位输出完毕后, SCON 寄存器的 TI 位被设为 1, CPU 只要判断 TI 是 1,接 着发送下一个字节。 需要消隐万位、千位 需要消隐万位、千位、百位 需要消隐万位 需要消隐万位、千位 需要消隐万位 波特率的设定:定时器 T1工作在方式 2的初值为: 为了减小误差,时钟振荡频率采用 11.0592MHz, 选用定时器 T1工作在方式 2作波特率 发生器,波特率为 300,设 SMOD 为 0,依公式(1.1)得初值为: 所以 TH1 = TL1 = A0H MOV SCON , #50H ; URAT 工作在方式 1上 MOV TMOD , #20H ; TIME1工作在方式 2上 MOV TH1 , #0A0H ;设置波特率为 300 本设计的中断十分重要,为了减少相互间的干扰,保证可靠性,采用查询方式判断是 否发送完毕。 A6: JBC TI , A5 ;如果发送完毕跳,清标志位,跳到 A5。 AJMP A6 ;否则跳到 A6,等待 A5: INC R0 电压检测原理 , 模数转换芯片的说明 , 与单片机的接口 , 接口程序设计 , 电路图 , 程序 , 不能实现 程序的要有实现思路 , 流程图等 (1.1) 结论 /小结 /心得体会 电压测量通过不同的接口电路可实现温度、湿度、压力等测量,广泛应用于工业领域。 本电路设计别具一格, 是一种高精度、 低功耗、 宽量程、 智能化的电压表。 可扩展键盘、 EEPROM 、 报警电路,实现电压异常记录、报警。 致谢 光阴如梭,转眼间,大学生涯将过去。遥想入学之时,恍如隔日,不免感叹时光易逝, 韶华难追。 在大学生涯即将结束之际, 谨对四年来给予我关心与支持的良师益友和亲人们致 以最诚挚的谢意 ! 参考文献 [1] 徐爱钧 . 《智能化测量控制仪表原理与设计》 (第二版) [M].北京:北京航空航天大 学出版社, 2004. [2] 吴金戌, 沈庆阳, 郭庭吉 . 《 8051单片机实践与应用》 [M].北京:清华大学出版社, 2002. [3] 高峰, 《单片微型计算机与接口技术》 [M].北京:科学出版社, 2003. [4] 刘伟, 赵俊逸, 黄勇, 《一种基予 C8051F 单片机的 SOC 型数据采录器的设计与实现》 [A ]. 天津市计算机学会单片机分会编 . 《 2003年全国单片机及嵌如入式系统学术年会论 文集(下册) 》 [C] .北京:北京航空航天大学出版社 ,2003 .790-794 [5] http://www.ic-on-line.com/ ICL7135.PDF、 MAX232.PDF范文二:单片机测电容实验
范文三:单片机测电容课程设计
范文四:单片机测电压
范文五:单片机测电压