No.44798 作者:方家伟 邮件:huohua9902@21cn.com ID:16113 登陆:1次 文章数:3篇 最后登陆IP:202.103.243.98 最后登陆:2003/11/15 11:09:33 注册:2003/11/14 18:38:15 财富:109 发帖时间:2003/11/14 18:41:16 发贴者IP:202.103.243.98 标题:方家伟:小测试! 摘要:No.44798小测试! 此程序在wave下能通过编译,看谁能在此程序找出最多逻辑错误! ; 8052 8通道扫描转换,温度采集控制程序 ; ; ;20h 扫描通道 ;21h 正在操作的扫描通道 ;22h.0 显示通道1 ;22h.1 显示通道2 ;22h.2 显示通道3 ;22h.3 显示通道4 ;22h.4 收到发送标志 ;22h.5 收到第一帧 ;23h.0 全速扫描 ;23h.1 0.5s ;23h.2 1s ;23h.3 5s ;23h.4 允许显示 ;23h.5 发送允许 ;23h.6 温度采集控制标志 ;30h 显示通道1的数据 ;31h 显示通道2的数据 ;32h 显示通道3的数据 ;33h 显示通道4的数据 ;34h 显示计数 ;35h 延时计数,即delay1ms调用次数 ;36h 当前采集的数据 ;37h 用于加在adc0809上的采集通道地址 ;r3 显示时间控制 ;r5 r4 计数标志 ;r6做为模拟转换的地址位 ;10100101 ----发送标志 a5h ;01111000-----电压采集控制标志 78h ;00011110-----温度控制标志 1eh ;11110000 00001111-----发送出错 f00fh ;关闭除串行口以外的中断 org 0000h ljmp main org 0003h reti org 000bh reti org 0013h reti org 001bh reti org 0023h ljmp comr;串行中断跳转 ; ; ; 初始化ram,串行模式,计数器t1模式 ; ; org 100h main: clr a mov p2,a ;p1为0 mov 21h,a mov 22h,a mov 23h,a mov 30h,a mov 31h,a mov 32h,a mov 33h,a mov 34h,a mov 35h,a mov 36h,a mov 37h,a ;设置当前采集通道地址为00h mov a,#0ffh mov p0,a ;p0,p1,p2为ffh mov p1,a mov p2,a mov 20h,a ;20h,采集通道标志全为一 setb 21h.0 ;设置当前采集通道为第一通道 setb 23h.2 ;每一通道的采集时间间隔为1 setb 23h.4 ;允许显示 mov pcon,#00h ;smod为0 mov tmod,#20h ;t1计数模式为8位再装入 mov scon,#50h ;通讯方式1,允许中断 mov th1,#0fdh ;设通讯波特率为9600bit/s mov tl1,#0fdh setb tr1 ;启动计时器t1 setb ea ;启用中断 setb es ;启用串行口中断 ; ; ; 主程序 ; ; start: jb 23h.6,start lcall test ;采集当前通道 lcall nextq ;转向下一通道 lcall send ;发送数据 lcall senddelay ;延时 lcall display ;显示 ajmp start ; ; ; 采集子程序 ; ; test: mov a,37h ;取采集地址 mov p2,a ;送到p2,将地址加载到adc0809 setb p2.3 ;地址锁存 nop nop clr p2.3 ; setb p2.4 ;转换开始 nop nop clr p2.4 ; nop nop nop nop wait: jb p3.7,movd ;等待结束 ajmp wait ; movd: setb p2.5 ;输出允许 mov a,p0 ;取数据 mov 36h,a ;送到36h clr p2.5 ;关闭输出 clr a ; mov p2,a ;结束转换,复原 p0 p1 p2 p3 mov a,#0ffh mov p1,a mov p0,a mov p3,a ret ; ; ; 取下一位采集地址 ; ; nextq: jb 21h.0,nq1 ;取当前采集通道 jb 21h.1,nq2 jb 21h.2,nq3 jb 21h.3,nq4 jb 21h.4,nq5 jb 21h.5,nq6 jb 21h.6,nq7 jb 21h.7,nq0 ljmp main ;没有当前采集通道,出错返回 nq1: inc 37h ;先加1 jnb 20h.1,nq2 ;如果1通道不用采集,跳转到2通道,检测状态 mov 21h,#00h ;清除0通道标志 setb 20h.1 ;设置1通道标志 ret nq2: inc 37h jnb 20h.2,nq3 mov 21h,#00h setb 21h.2 ret nq3: inc 37h jnb 20h.3,nq4 mov 21h,#00h setb 21h.3 ret nq4: inc 37h jnb 20h.4,nq5 mov 21h,#00h setb 21h.4 ret nq5: inc 37h jnb 20h.5,nq6 mov 21h,#00h setb 21h.5 ret nq6: inc 37h jnb 20h.6,nq6 mov 21h,#00h setb 21h.6 ret nq7: inc 37h jnb 20h.7,nq0 mov 21h,#00h setb 21h.0 ret nq0: mov 37h,#00h jnb 20h.1,nq1 mov 21h,#00h setb 21h.0 ret ; ; ; 发送数据 ; ; send: jb 23h.5,sende ;如果允许发送,跳转到sende执行 ret sende: clr ren ;禁止接收 mov a,21h ;取当前通道 mov sbuf,a ;送到sbuf发送 waits1: jnb ti,waits1 ;等待结束 clr ti ; mov a,36h ;取当前采集的数据 waits2: jnb ti,waits2 clr ti setb ren ;允许接收 ret ; ; ; 发送之后的延时 ; ; senddelay: jnb 23h.4,delayt ;如果允许显示,则不延时 ret delayt: jnb 23h.0,sd1 mov 35h,#01h sjmp sd sd1: jnb 23h.1,sd2 mov 35h,#0ch sjmp sd sd2: jnb 23h.2,sd3 mov 35h,#19h sjmp sd sd3: jnb 23h.3,errordplay mov 35h,#7ch sd: lcall delay1ms djnz 35h,sd ret ; ; ; 显示子程序 ; ; display: jnb 23h.0,pt11 ;全速扫描,不显示 ret pt11: jnb 23h.1,pt2 ;0.5秒间隔 mov 35h,#0ch ;设置显示循环次数 sjmp ep pt2: jnb 23 ......
>>返回讨论的主题
|