大神们求助啊,菜鸟一枚,做自动量程电压表,仿真的时候数码管就是不显示数字,看不出程序哪里有问题,求助啊!

weixin_41838104 2018-04-06 01:21:51
#include<reg51.h>
#define uchar unsigned char;
uchar code dispbitcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/*定义0~9的显示段码*/
uchar code dispbitcode1[]={0x78,0x3e,0x3f}; /*定义‘out’的显示段码*/
uchar dispbuf[4]; /*定义4个存储空间*/
uchar i,j;
uchar getdata;
unsigned long temp;/*定义暂存空间*/
uchar range;
bit range_ok; /*量程合适标志为1时表示量程合适*/
float muli;
sbit ST=P3^0; /*定义单片机和ADC的控制信号*/
sbit OE=P3^1;
sbit EOC=P3^2;
sbit CLK=P3^3;
sbit P34=P3^4; /*定义数码管显示模块位选*/
sbit P35=P3^5;
sbit P36=P3^6;
sbit P37=P3^7;
sbit P17=P1^7; /*定义数码管显示小数点段位*/
/*延时函数*/
void Delay(unsigned int i)
{
unsigned int j;
for(;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}

/*
函数:切换量程
量程有0-3 共4档输入量程i 应在0-3之间
硬件操作对应于P0.1 P0.2 P0.3
*/
APPL_Range()
{
range=range&0x07;
if(range>4) range=0;/*量程选择错误复位为0 档*/
P2=P2&0xf8; /*将其值放入P2.0 P2.1 P2.2*/
P2=P2|range;
}
/*数码管显示函数*/
void Display()
{
P1=dispbitcode[dispbuf[3]];
P34=0;
P35=1;
P36=1;
P37=1;
Delay(10);
P1=0x00;
P1=dispbitcode[dispbuf[2]];
P17=1; /*置小数点位*/
P34=1;
P35=0;
P36=1;
P37=1;
Delay(10);
P1=0x00;
P1=dispbitcode[dispbuf[1]];
P34=1;
P35=1;
P36=0;
P37=1;
Delay(10);
P1=0x00;
P1=dispbitcode[dispbuf[0]];
P34=1;
P35=1;
P36=1;
P37=0;
Delay(10);
P1=0x00;
}
void main()
{
range=0; /*选择最高量程100V 为默认量程*/
muli=20;
range_ok=0;
while(1)
{
if(range_ok==0)
{APPL_Range();}
range_ok=1;
ST=0;
OE=0;
ST=1; /*启动A/D转换*/
ST=0;
while(EOC==0);
OE=1;
getdata=P0;
OE=0;
temp=getdata*1.0/255*500; /*数据处理*/
temp=temp*muli;
dispbuf[0]=temp%10;
dispbuf[1]=temp/10%10;
dispbuf[2]=temp/100%10;
dispbuf[3]=temp/1000;

if(getdata>=255)
{
range_ok=0;
if(range>0)
{range--;} /*超量程未到100V 档升量程 */
else /*若超过100V,显示溢出*/
{
dispbuf[0]=0;
dispbuf[1]=1;
dispbuf[2]=2;
P1=dispbitcode1[dispbuf[2]];
P34=1;
P35=0;
P36=1;
P37=1;
Delay(10);
P1=0x00;
P1=dispbitcode1[dispbuf[1]];
P34=1;
P35=1;
P36=0;
P37=1;
Delay(10);
P1=0x00;
P1=dispbitcode1[dispbuf[0]];
P34=1;
P35=1;
P36=1;
P37=0;
Delay(10);
P1=0x00;
}
}
else /*判断是否可降低量程*/
{
switch(range)
{
case 0: if(getdata<0x85){range++;range_ok=0;} /*小于50 伏?*/
else muli=20;
break;

case 1:if(getdata<0x85){range++;range_ok=0;} /*小于25伏?*/
else muli=10;
break;

case 2:if(getdata<0x35){range++;range_ok=0;} /*小于5 伏?*/
else muli=5;
break;

case 3:muli=1;
break;
}
Display();
}
}
void t1(void) interrupt 3 using 0
{
TH1=(65536-200)/256;
TL1=(65536-200)%256;
CLK=~CLK;
}
}
...全文
1092 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
楼爱风 2018-04-14
  • 打赏
  • 举报
回复
最好不要用仿真,直接在开发板上调,连接逻辑分析仪抓信号,打开IAP执行单步调试,打断点,就知道你的寄存器状态,程序怎么跑的。
wcjlg2010n 2018-04-13
  • 打赏
  • 举报
回复
应该是没有从0808获得数据,你单步调试看看吧
赵4老师 2018-04-08
  • 打赏
  • 举报
回复
万用表、示波器、逻辑分析仪、观音菩萨。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧