求前辈帮忙看看51单片机和ADC0832的程序

2025-04-07 19:02:20
推荐回答(1个)
回答1:

程序修改如下,因字数限制,原注释内容删掉了

#include 

#include 

sbit GW=P2^5;

sbit SW=P2^6;

sbit CS=P2^1;

sbit CLK=P2^3;

sbit DO=P3^4;

unsigned char shi;

unsigned char ge;

unsigned char encode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void delay_ms(unsigned char x)

{

unsigned int j;//延时子程序有点改动

while(x--)

for(j=500;j>0;j--);

}

void Timer0Set(void)

{

TMOD = 0x01;

TH0 = (65536-5000)/256;

TL0 = (65536-5000)%256;

ET0 = 1;EA = 1;TR0 = 1;

}

unsigned char GetVoltage(void)

{

unsigned char tmp = 0;

unsigned char i = 0;

CLK = 0;DO = 1;

CS = 0;

for(i=0;i<3;i++)

{

CLK = 1;

CLK = 0;

}

for(i=0;i<8;i++)

{

CLK = 1;_nop_();CLK = 0;

if(DO) tmp = tmp | 1<<(7-i);

}

for(i=0;i<8;i++)

{

CLK = 1;

_nop_();

CLK = 0;

}

CS = 1;return tmp;

}

void PrintToBuffer(unsigned char digit)

{

unsigned long val= 500UL*digit/256;

ge = val/10%10;

shi = val/100;

}

main(void)

{

unsigned char digit = 0;

Timer0Set();

while(1)

{

digit = GetVoltage();

PrintToBuffer(digit);

delay_ms(40);

}

}

void Timer0_Init() interrupt 1

{

static unsigned char pos = 0;

TH0 = (65536-5000)/256;

TL0 = (65536-5000)%256;

pos++;

if(pos>1)pos=0;

if(pos==0)

{

GW=1;SW=0;//注意顺序,否则显示就不对

P0 = encode[shi] | (0x80);

}//用定时器定时,显示每一位,就不能再调延时子程序了

else

{

SW=1;GW=0;//注意顺序,否则显示就不对

P0 = encode[ge];

}

}

仿真结果