| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 813 人关注过本帖
标题:偶用adc0804作的数字电压表, 学adc的朋友看一看!
只看楼主 加入收藏
wuyong
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2005-6-9
收藏
 问题点数:0 回复次数:0 
偶用adc0804作的数字电压表, 学adc的朋友看一看!
用adc0804做的万用表! ;AD 0804控制程序:转动电位器,数码管后三位依次显示000-255,此程序可以做一个温度计, 一个电压表... ;*************************************************************************** ;* sxj1974@163.com (51c51 test web) http://www.8951.com/ * ;* Create by :石学军 http://www.51c51.com/ 更多例程请登陆网站 * ;*************************************************************************** ;//定义ADC的连接端口 ad_cs equ P3.6 ;芯片选择 ad_wr equ P2.0 ;转换开始 ad_rd equ P3.7 ;RD=LOW,数字信号输出 ad_input_port equ p1 ;定义数据位 Counter EQU 59H ;计数器,显示程序通过它得知现正显示哪个数码管 FIRST EQU P2.4 ;第一位数码管的位控制 SECOND EQU P2.5 ;第二位数码管的位控制 THEER EQU P2.6 ; 第三位数码管的位控制 DISPBUF EQU 5AH ;显示缓冲区为5AH和5BH

org 0000h ajmp main ORG 000BH ;定时器T0的入口 AJMP DISP ;显示程序 org 0030h main: MOV SP,#5FH ;设置堆栈 MOV P1,#0FFH MOV P0,#0FFH MOV P2,#0FFH ;初始化,所显示器,LED灭 MOV TMOD,#00000001B ;定时器T0工作于模式1(16位定时/计数模式) MOV TH0,#HIGH(65536-2000) MOV TL0,#LOW(65536-2000) SETB TR0 ;开定时器0 SETB EA ;开总中断 SETB ET0 ;开定时器0中断 MOV Counter,#0 ;计数器初始化 LOOP: lcall adc_demo ;调用AD子程序 ajmp LOOP

;//========================================== ;// 启动AD转换 ;//========================================== Adc_Start: clr ad_cs nop clr ad_wr nop setb ad_wr nop setb ad_cs nop ret ;//========================================== ;// 读AD转换 ;//========================================== Adc_Read: mov ad_input_port,#0ffh clr ad_cs nop clr ad_rd nop nop mov a,AD_INPUT_PORT nop setb ad_rd nop setb ad_cs ret ;//========================================== ;// AD转换读取延时程序,显示读到的数值 ;//========================================== Adc_Dem lcall Adc_Start lcall delay1ms lcall adc_read MOV B,#100 ;AD转换出的值除100商为百位数 DIV AB ; 取百位数 余数在B寄存器 MOV DISPBUF,A ;把百位存入百位寄存器DISPBUF MOV A,B ;余数再送A MOV B,#10 ;余数除10商为十位数 DIV AB ; 除法,余数在寄存器B MOV DISPBUF+1,A ;A是十位数存第二位显示寄存器 MOV DISPBUF+2,B ; B是个位数存第三位显示寄存器 RET

DISP: ;定时器T0的中断响应程序动态扫描 PUSH ACC ;ACC入栈 PUSH PSW ;PSW入栈 MOV TH0,#HIGH(65536-2000);定时时间为2000个周期,约2170微秒 MOV TL0,#LOW(65536-2000) SETB FIRST SETB SECOND ;关显示 SETB THEER MOV A,#DISPBUF ;显示缓冲区首地址 ADD A,Counter MOV R0,A MOV A,@R0 ;根据计数器的值取相应的显示缓冲区的值 MOV DPTR,#DISPTAB ;字形表首地址 MOVC A,@A+DPTR ;取字形码 MOV P0,A ;将字形码送P0位(段口) MOV A,Counter ;取计数器的值 JZ DISPFIRST ;如果是0则显示第一位 DEC A JZ DISPSECOND ;如果是1显示第二位 CLR THEER ;否则显示第3位 AJMP DISPNEXT DISPFIRST: CLR FIRST ;显示第一位 AJMP DISPNEXT DISPSECOND: CLR SECOND DISPNEXT: INC Counter ;计数器加1 MOV A,Counter DEC A ;如果计数器计到3,则让它回0 DEC A DEC A JZ RSTCOUNT AJMP DISPEXIT RSTCOUNT: MOV Counter,#0 ;计数器的值回0 DISPEXIT: POP PSW POP ACC RETI DISPTAB:db 28h,7eh,0a2h,62h,74h,61h,21h,7ah,20h,60h ;字形代码表 ;0 1 2 3 4 5 6 7 8 9 delay1ms: ;延时子程序 mov r7,#10 MM:mov r6,#50 djnz r6,$ ;2us djnz r7,MM ret end

图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: adc 数字电压表 朋友 
2005-06-09 16:08
快速回复:偶用adc0804作的数字电压表, 学adc的朋友看一看!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018129 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved