用AT89C51制作八位数字频率计源程序.doc

上传人:xin****828 文档编号:6626748 上传时间:2020-03-01 格式:DOC 页数:12 大小:29.50KB
返回 下载 相关 举报
用AT89C51制作八位数字频率计源程序.doc_第1页
第1页 / 共12页
用AT89C51制作八位数字频率计源程序.doc_第2页
第2页 / 共12页
用AT89C51制作八位数字频率计源程序.doc_第3页
第3页 / 共12页
点击查看更多>>
资源描述
用AT89C51制作八位数字频率计一文的完整程序清单及注释ORG 00H ;指定下条指令的地址AJMP MAIN ;跳转至MAIN50M INC 23H RETI ORG 001BH ;定时器T1中断入口,T1作定时,T0作计数 PUSH A ;累加器A压入堆栈 PUSH PSW ;状态寄存器压入堆栈 DJNZ 40H,JJ ;产生1s定时时标 MOV 40H,#0C8H DJNZ 41H,JJ CLR P3.1 ;关闭闸门 ANL 88H,#0AFH ;1s末,关闭T0和T1 MOV 20H,P1 MOV 21H,TL0 ;T0计数值送21H和22H MOV 22H,TH0 SETB P3.0 ;LS393清零 ACALL COUNT ;调用二进制转BCD码程序JJ: POP PSW POP A RETI ORG 50H ;以下程序从地址50H开始MAIN: MOV SP,#50H ;将初始值赋予SPMOV TH1,#06H ;将初始值赋予TH0 MOV TL1,#06H ;将初始值赋予TL0 MOV TMOD,#25H ;设定时器方式 SETB TR0 ;启动计数器0 SETB TR1 SETB EA SETB ET1 SETB ET0 MOV 40H,#0C8H MOV 41H,#28H MOV 30H,#78H MOV 31H,#56H MOV 32H,#34H MOV 33H,#12H MOV R2,#00H MOV 23H,#00HHERE: MOV DPTR,#TABLE ;动态扫描程序 CLR C MOV A,R2 RLC A JMP A+DPTRTABLE: AJMP PG0 AJMP PG1 AJMP PG2 AJMP PG3 AJMP PG4 AJMP PG5 AJMP PG6 AJMP PG7PG0: MOV A,33H ;显示最高位 SWAP A ANL A,#0FH ;屏蔽高四位GG: MOV DPTR,#BOOK MOVC A,A+DPTR MOV P2,#0FFH ;关闭段显示 MOV P0,#01H MOV P2,A AJMP GOPG1: MOV A,33H ANL A,#0FH MOV DPTR,#BOOK MOVC A,A+DPTR MOV P2,#0FFH MOV P0,#02H MOV P2,A AJMP GOPG2: MOV A,32H SWAP A ANL A,#0FH MOV DPTR,#BOOK MOVC A,A+DPTR MOV P2,#0FFH MOV P0,#04H MOV P2,A AJMP GOPG3: MOV A,32H ANL A,#0FH MOV DPTR,#BOOK MOVC A,A+DPTR MOV P2,#0FFH MOV P0,#08H MOV P2,A AJMP GOPG4: MOV A,31H SWAP A ANL A,#0FH MOV DPTR,#BOOK MOVC A,A+DPTR MOV P2,#0FFH MOV P0,#10H MOV P2,A AJMP GOPG5: MOV A,31H ANL A,#0FH MOV DPTR,#BOOKMOVC A,A+DPTR MOV P2,#0FFH MOV P0,#20H MOV P2,A AJMP GOPG6: MOV A,30H SWAP A ANL A,#0FH MOV DPTR,#BOOK MOVC A,A+DPTR MOV P2,#0FFH MOV P0,#40H MOV P2,A AJMP GOPG7: MOV A,30H ANL A,#0FH MOV DPTR,#BOOK MOVC A,A+DPTR MOV P2,#0FFH MOV P0,#80H MOV P2,A MOV R2,#00H AJMP GO1GO: INC R2GO1: ACALL DELAY AJMP HERE ;多(四)字节二转十,经验证运行正确 ;入口R0为二进制低位字节地址指针,R7为字节数 ;出口R1为BCD码结果低位字节地址指针COUNT: MOV R0,#20H MOV R1,#30H MOV R7,#04HBMBCD: MOV A,R0 MOV R5,A MOV A,R1 MOV R6,A MOV A,R7 MOV R3,A INC R3 CLR ACLBCD: MOV R1,A INC R1 DJNZ R3,CLBCD MOV A,R7 MOV B,#08H MUL AB MOV R3,ALP0: MOV A,R5 MOV R0,A MOV A,R7 MOV R2,A CLR CLP1: MOV A,R0 RCL A MOV R0,A INC R0 DJNZ R2,LP1 MOV A,R6 MOV R1,A MOV A,R7 MOV R2,A INC R2LP2 MOV A,R1 ADDC A,R1 DA A MOV R1,A INC R1 DJNZ R2,LP2 DJNZ R3,LP0 MOV A,R6 MOV R1,A MOV 41H,#28H MOV 40H,#0C8H MOV TH1,#06H MOV TL1,#06H MOV TH0,#00H MOV TL0,#00H MOV 23H,#00H ORL 88H,#50H ;启动T1/T0 CLR P3.0 NOP ;时间微调 NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP SETB P3.1 ;开闸门 RETDELAY: MOV 70H,#05H ;延时子程序DDE: MOV 71H,#55HDE: DJNZ 71H,DE DJNZ 70H,DDE RETBOOK: DB 0C0H,0F9H,0A4H,0B0H,99H ;字段代码 DB 92H,82H,0F8H,80H,90H END为了实现智能化的电子计数测频,实现一个宽领域、高精度的频率计,一种有效的方法是运用单片机测量频率。采用单片机、接口芯片以及分频电路实现频率的自动分频。根据计数值、分频系数,求出周期T,得到待测频率。2 C51语言使用中几个关键问题在数字频率计中,没有采用常用的汇编语言,全部软件用C语言编程。8051单片机的C语言编译器简称C51。C51程序有且仅有一个名为main的主程序。(l)用#include在C语言源程序中包含库文件。例如:#includereg51.h(2)为了能直接访问特殊功能寄存器SFR,C51提供了一种自主形式的定义方法,这是标准C语言中所没有的,仅适于单片机编程。例如:sfr TMOD=OX89;(3)对于片外的I/O扩展,用“#define,语句进行定义。如:#define PORT A XBYTE0xffc0;(4)实时中断程序的编程方法。中断函数的声明方法如下: void(void)interrupt【中断向量代号using内部寄存器组代号3 数字频率计主程序设计在主程序中声明库文件,定义8155的口地址和所有全局变量。显示函数说明以及定时器和8155的初始化。点亮启动标志灯。设置外部中断为边沿触发。设置分频系数初值并测周期。进行分频系数的判断,读周期值并将其转换成频率。调用显示程序,完成显示频率的功能。#include#include#include#define uchar unsigned char#define uint unsigned int#define COM8155XBYTE0x2000#define PA8155XBYTE0x2001#define PB8155XBYTE【0x2002#define PC8155XBYTE0x2003float fre; float mid,total,v,c,guint j=0,par=0x01,fen2=0x80,fenl=0x00.p;bit rflag1,rflag2;在使用C51语言中,absacc.h和reg51.h是不可缺少的。这两个文件定义了单片机的所有寄存器和端口。上述程序中还定义8155的各个口地址,便于C51编译器按8155的实际硬件结构,建立I/O变量名与其实际地址的对应关系。下面程序是函数说明和初始化:void main(void)(uint k=0;/*给循环变量赋初值*/void show(void);/*显示函数说明*/TMOD=0x10;/*定时器1方式1,GATE=0*/COM8155=0xof; /*8155的工作方式控制字*/PB8155=fen1;/*分频初值赋予8155的PB口*/PC8155=0x06p/*点亮启动标志灯*/PA8155=0x80;EA=1;IT1=1;ET1=1;PX1=1;/*开中断,4 数字频率计显示程序设计在显示程序中,要设定字型数码数组,判断频率值的单位,并将其分为Hz,KHz,MHz。判断频率值的整数部分和小数部分的位数,显示频率值和单位数量级标志灯。小数点处理显示程序如下:PC8155=0x07;PA8155=tables6;c=0;while(c10000)(+c;);PA8155=0x00;PC8155=0x065if(n=O)(PA8155=0x005;PA8155=0x01;);c=0;while(c1000)(+c;);if(n=1)(PA8155=0x00;PA8155=0x02;);c=0;while(c1000)(+c;);if(n=2)(PA8155=0x00;PA8155=0x04;);c=0;while(c1000)(+c;);i+;小数点处理程序中由高位到低位,逐位显示频率值。每显示一位数,要有一个C循环语句进行适当的延时,并将8155的PA口清零,保证下一次的显示。显示的方法是数组s8的每个值作为字形码数组table的下标,在table数组中找到自己对应的字形码,送至8155的PA口。最后根据n的值,确定所显示的频率值的单位数量级。5 结论本文的工作基础是应用单片机设计的数字频率计。利用C语言进行单片机应用系统数字频率计的设计,不仅编程简单,精度高,而且避免了汇编语言在进行乘除法运算时要考虑采用浮点运算的要求。与汇编语言相比编程语句大大减少。数字频率计的全部软件均经过了调试。并进行了误差分析。频率的测量范围从1Hz到1MHz,具有一定的实用价值。
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 临时分类 > 人文社科


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!