|
十万火急!!!请教各位大虾有关TLC2543 A/D转换的问题,望不吝赐教!!!~
[复制链接]
TLC2543输出至MCU后,在HD7279控制下的数码管显示的数值不稳定,一直在变化!
以下是小生写的程序:
#include <absacc.h>
#include <reg51.h>
#include <math.h>
#include <stdio.h>
#include <reg51.h>
#include <intrins.h>
sbit cs= P1^4; // cs at P1.4
sbit clk=P1^5; // clk 连接于 P1.5
sbit dat=P1^2; // dat 连接于 P1.2
sbit key=P1^3; // key 连接于 P1.3
sbit AD_CLK= P3^0;
sbit AD_INT= P3^1;
sbit AD_OUT= P3^2;
sbit AD_CS = P3^3;
#define uint unsigned int
#define uchar unsigned char
void long_delay(void); // 长延时
void short_delay(void); // 短暂延时
void delay10ms(unsigned char); // 延时10MS
void write7279(unsigned char, unsigned char); // 写入到HD7279
unsigned char read7279(unsigned char); // 从HD7279读出
void send_byte(unsigned char); // 发送一个字节
unsigned char receive_byte(void); // 接收一个字节
long tlc2543_out(uchar port);
void tlc2543(void);
unsigned int tmr,rg,rs,rb,rq;
unsigned long advalue0,advalue3;
float advalue1,advalue2;
//****** HD7279A 指令 ******
#define CMD_RESET 0xa4
#define CMD_TEST 0xbf
#define DECODE0 0x80
#define DECODE1 0xc8
#define UNDECODE 0x90
#define RLC 0xa3
#define RRC 0xa2
#define RL 0xa1
#define RC 0xa0
#define HIDE 0x98
#define FLASH 0x88
#define SEGON 0xe0
#define SEGOFF 0xc0
#define CMD_READ 0x15
/**************************************
名称:delay
功能:延时模块
*************************************/
void long_delay(void)
{
unsigned char i;
for (i=0;i<0x30;i++);
}
void short_delay(void)
{
unsigned char i;
for (i=0;i<8;i++);
}
void delay(uchar n)
{
uchar i;
for(i=0;i<n;i++)
{
_nop_();
}
}
void delay10ms(unsigned char time)
{
unsigned char i;
unsigned int j;
for (i=0;i<time;i++)
{
for(j=0;j<0x390;j++)
{
if (!key)
{
// key_number=read7279(CMD_READ); // 读出键码
// write7279(DECODE1,key_number&0x0f);
// key_int();
}
}
}
}
void send_byte( unsigned char out_byte)
{
unsigned char i;
cs=0;
long_delay();
for (i=0;i<8;i++)
{
if (out_byte&0x80)
{
dat=1;
}
else
{
dat=0;
}
clk=1;
short_delay();
clk=0;
short_delay();
out_byte=out_byte*2;
}
dat=0;
}
void write7279(unsigned char cmd, unsigned char dta)
{
send_byte (cmd);
send_byte (dta);
}
void dispData()
{
rq= (advalue3/1000);
rb= (advalue3- rq*1000)/100;
rs= (advalue3 - rq*1000 -rb*100)/10;
rg= (advalue3 - rq*1000 -rb*100 - rs*10);
write7279(DECODE1+4,rg);
write7279(DECODE1+5,rs);
write7279(DECODE1+6,rb);
write7279(DECODE1+7,rq);
// for (j=0;j<4;j++)
// write7279(DECODE1+7-j,digit[j]&0x0f);
}
/**************************************
名称:tlc2543_out
功能:TLC2543模块
*************************************/
long tlc2543_out(unsigned char port)
{
unsigned int i;
long ad=0;
AD_CLK=0;
AD_CS=0;
for(i=0;i<12;i++)
{
if(AD_OUT)
ad|=0x01;
AD_INT=(bit)(port&0x80);
AD_CLK=1;
delay(3);
AD_CLK=0;
delay(3);
ad=ad<<1;
}
AD_CS=1;
ad=ad>>1;
return ad;
}
void tlc2543()
{
uint ad;
while(1)
{
ad=tlc2543_out(0);
delay10ms(300);
advalue0=ad;
advalue1=advalue0*0.001220703125;
advalue2=advalue1*1000;
advalue3=advalue2;
delay10ms(300);
dispData();
write7279(FLASH,0xff);
}
}
//***MAIN***//
void main()
{
while (1)
{
for (tmr=0;tmr<0x2000;tmr++);
send_byte(CMD_RESET);
tlc2543();
}
}
此贴希望尽快回复,否则将在二十四小时后自动删除!
|
|