回答数
5
浏览数
1853
我自己做的最小系统板 自己写的代码 所以有得地方不会和其他电路板兼容
但是ad0809是兼容的,你看一下
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar table[16] = {0x81,0xb7,0xc2,0x92,0xb4,0x98,0x88,0xb3,0x80,0x90,0xa0,0x8c,0xce,0x86,0xc8,0xe8};
sbit clk = p3^2; // 时钟输入端,最大为500khz
sbit oe = p3^3; // 输出允许端 等于1时有效
sbit eoc = p3^4; // 转化完成标志 高电平表示转化结束.
sbit st = p3^5; // 地址锁存信号.
// 控制每位数码管显示
sbit l0 = p0^0;
sbit l1 = p0^1;
sbit l2 = p0^2;
sbit l3 = p0^3;
sbit l4 = p0^4;
sbit l5 = p0^5;
sbit k1 = p0^6;
uchar a;
bit flag; // 输出方式的标志位
void delay(uint m)
{
uint i,j;
for (i=0; i<m; i++)
for (j=0; j<150; j++);
}
//初始化串口,设置成工作方式0
void initport(void)
{
//; 不用设置,初始即为工作方式0
}
// 发送一个数据
void sendbyte(uchar dat)
{
sbuf = dat;
while (!ti);
ti = 0;
}
void initled(void)
{
l0 = 0;
l1 = 0;
l2 = 0;
l3 = 0;
l4 = 0;
l5 = 0;
}
void displayled(void)
{
uint value;
//unsigned long value;
//value = (a*500)/256;
if (a < 132)
value = (a*500)/256;
else
{
value = (a*500)/256;
value = value + 256;
}
if (!flag)
{
l0 = 0; l1 = 0; l2 = 1;
sendbyte(table[value/100]&0x7f);
delay(5);
l0 = 0; l1 = 1; l2 = 0;
sendbyte(table[(value/10)%10]);
delay(5);
l0 = 1; l1 = 0; l2 = 0;
sendbyte(table[value%10]);
delay(5);
}
else
{
l0 = 0; l1 = 0; l2 = 1;
sendbyte(table[a/100]);
delay(5);
l0 = 0; l1 = 1; l2 = 0;
sendbyte(table[(a/10)%10]);
delay(5);
l0 = 1; l1 = 0; l2 = 0;
sendbyte(table[a%10]);
delay(5);
}
}
void scankey(void)
{
if (k1 == 0)
{
flag = !flag;
while (!k1);
k1 = 1;
}
}
// 初始化ad0809
void initad0809(void)
{
st = 0;
oe = 0;
}
// 读ad0809中的数据
uchar readad0809(void)
{
//eoc = 0;
oe = 0;
st = 0;
//_nop_();
st = 1; // 上升沿ad0809内部的寄存器清零
//_nop_();
st = 0; // 产生一个至少100ns的脉冲,在转换期间st为低
while (!eoc)
{
displayled();
scankey();
}
oe = 1;
return p1;
}
main()
{
//uint i;
tmod = 0x01;
ea = 1;
tr0 = 1;
et0 = 1;
flag = 0;
k1 = 1;
initled();
initport();
initad0809();
/*for (i=0; i<16; i++)
{
sendbyte(table[i]);
delay(100);
}*/
while (1)
{
a = readad0809();
}
}
void timer0(void) interrupt 1 using 1
{
th0 = 0xff;
tl0 = 0x80;
clk = !clk;
}