为什么proteus仿真时数码管没显示结果? 120

//实验名:可调恒流源电路设计//采用STC10F08XE单片机//输出电流范围2~20mA,最小刻度0.5mA,精度0.01mA//恒流源部分由MC34063芯片构成,... //实验名:可调恒流源电路设计//采用 STC10F08XE 单片机//输出电流范围2~20mA,最小刻度0.5mA,精度0.01mA//恒流源部分由MC34063芯片构成,经滑动变阻器改变电流大小//***********************************************************************************************#include <REG51.H> #include <intrins.h> #include <math.h>#define uint unsigned int #define uchar unsigned char #define AD_Data P1 sbit AD_CS = P3^4; sbit AD_RD = P3^5; sbit AD_WR = P3^6; sbit AD_INTR = P3^7; unsigned char data dis_digit,dis_index; uchar code dis_code[]={ 0xC0,/*0*/ 0xF9,/*1*/ 0xA4,/*2*/ 0xB0,/*3*/ 0x99,/*4*/ 0x92,/*5*/ 0x82,/*6*/ 0xF8,/*7*/ 0x80,/*8*/ 0x90,/*9*/0x88,/*10*/0x83,/*11*/0xc6,/*12*/0xa1,/*13*/0x86,/*14*/0x8e,/*15*/}; //0-9 off unsigned char data dis_buf[8]; uchar BF,SF,GW,SW,a=0; uint Data; /*************启动AD转换子程序*************/void AD_Start(void) { AD_CS=0; //允许进行A/D转换AD_WR=0; _nop_(); AD_WR=1; //WR由低变高,此时AD开始转换while(AD_INTR); //查询转换结束产生INTR信号(低电平有效) //DelayMs(1);AD_CS=1; //停止AD转换} /*************读取A/D数据子程序*************/AD_Read() { AD_Data=0xff; AD_CS=0; //允许读取AD_RD=0; //读取转换数据结果_nop_(); Data=AD_Data; //数据存储到Data中AD_RD=1; AD_CS=1; //停止A/D数据读取return(Data); }void Data_Process() { BF=39*Data%10; SF=39*Data/10%10; GW=39*Data/100%10; SW=39*Data/1000%10; dis_buf[0] = dis_code[BF]; dis_buf[1] = dis_code[SF]; dis_buf[2] = dis_code[GW]&0x7f; dis_buf[3] = dis_code[SW]; } void timer0() interrupt 1 { a++; if(a%5==1) { EA=0; TH0 = 0x00; TL0 = 0x00; AD_Start(); AD_Read(); Data_Process(); EA=1; } ;} void timer1() interrupt 3 //定时器0,中断服务程序,用于数码管的动态扫描//dis_index,显示索引,用于标识当前显示的数码管和缓冲区的偏移量//dis_digit,位选通值,传送至P2口用于选通当前数码管的数值,如等于0xfe时//选通P2.0口数码管//dis_buf,显示缓冲区基地址{ TH1 = 0xFC; TL1 = 0x17; P2 = 0xff;//关闭所有数码管 P0 = dis_buf[dis_index];//显示代码传送到P0口P2 = dis_digit; dis_digit = _crol_(dis_digit,1); //位选通值左移,下次中断时选通下一位数码管dis_index++; dis_index &= 0x03; }//数码管全部扫描完一遍后,回到第一个重新开始扫描 /*************主函数入口*************/void main() { P0 = 0xff; P2 = 0xff; TMOD = 0x11; TH0 = 0xDC; TL0 = 0x17; TH1 = 0xFC; TL1 = 0x17; EA = 1; ET0 = 1; ET1 = 1; dis_buf[0] = dis_code[0x0]; dis_buf[1] = dis_code[0x0]; dis_buf[2] = dis_code[0x0]; dis_buf[3] = dis_code[0x0]; dis_digit = 0xfe; dis_index = 0; TR0 = 1; TR1 = 1; while(1) { }; } /*************程序结束*************/ 展开
 我来答
realint
2018-11-21
知道答主
回答量:2
采纳率:0%
帮助的人:1018
展开全部

自己也遇到这个问题,现在已经解决了,供大家参考

  1. 要加这5个电阻  而且电阻的大小也不能差太多(我用4个1K   一个470)

  2. 每个段码输出后都要消隐  如下: (我自己段码在P1口   位选在P2.0-2.3)

P2=0xfe;

P1=tab[count/1000];

delay(6);

P1=0xff;

P2=0xfd;

P1=tab[count%1000/100];

delay(5);

P1=0xff;

P2=0xfb;

P1=tab[count%100/10];

delay(5);

P1=0xff;

P2=0xf7;

P1=tab[count%10];

delay(5);

P1=0xff;

ZESTRON
2024-09-04 广告
电子失效分析是指对电子元件或系统进行系统调查,以确定失效原因。通过显微镜、光谱学和电气测试等技术,分析人员可以查明导致故障的缺陷或问题。此过程包括检查物理损坏、分析电气特性和进行环境测试以确定根本原因。电子故障分析在半导体制造、汽车电子和消... 点击进入详情页
本回答由ZESTRON提供
知无不道
2018-05-26 · TA获得超过5838个赞
知道大有可为答主
回答量:8244
采纳率:84%
帮助的人:1303万
展开全部
P0口是开漏输出,要么加上拉电阻,否则,不会有正常逻辑电平输出,要么换其它I/O口,简单起见还是换I/O口吧。
更多追问追答
追问
还是不可以呀,能不能在图上圈出来具体要改的地方,或者帮我看看是不是程序出错了
追答
如果换口还不行,那就是程序问题了,还是要自己来排错,这样才能提高。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式