ad7416.c

来自「该程序用来测试89C51与IDE硬盘的接口」· C语言 代码 · 共 170 行

C
170
字号
//AD7416 
#include <AT89X51.H>
#include <ABSACC.H>
#include <INTRINS.H>
#define uchar unsigned char
#define CSIOPBASE    0x0200
#define CTLA XBYTE[CSIOPBASE+0x0002]
#define DIRA XBYTE[CSIOPBASE+0x0006]
#define OUTA XBYTE[CSIOPBASE+0x0004]
#define INA  XBYTE[CSIOPBASE+0x0000]
#define CTLB XBYTE[CSIOPBASE+0x0003]
#define DIRB XBYTE[CSIOPBASE+0x0007]
#define OUTB XBYTE[CSIOPBASE+0x0005]
#define INB  XBYTE[CSIOPBASE+0x0001]
#define DIRC XBYTE[CSIOPBASE+0x0014]
#define OUTC XBYTE[CSIOPBASE+0x0012]
#define INC  XBYTE[CSIOPBASE+0x0010]
#define DIRD XBYTE[CSIOPBASE+0x0015]
#define OUTD XBYTE[CSIOPBASE+0x0013]
#define IND  XBYTE[CSIOPBASE+0x0011]
#define RAMSTART   XBYTE[0x2000]
#define CSLCD      XBYTE[0x0300]
//*************************************************
#define scl P1_0
#define oti P1_1
#define sda P1_2
//*************************************************
//GND-4,SERICK-PD2,SERIDA-PD1,VCC-1;		74164---PSD913F
//1,2 VCC;	3 scl_AD7416; 4 OTI; 5 sda; 
//6 scl_X1203; 7 IRQ; 8,9,10 GND;  	A0=1;A1=1;A2=0;
//*************************************************
bdata int Tcc;		//存放温度
sbit T00=Tcc^0;	sbit T01=Tcc^1;	sbit T02=Tcc^2;	sbit T03=Tcc^3;
sbit T04=Tcc^4;	sbit T05=Tcc^5;	sbit T06=Tcc^6;	sbit T07=Tcc^7;
sbit T08=Tcc^8;	sbit T09=Tcc^9;	sbit T10=Tcc^10;sbit T11=Tcc^11;
sbit T12=Tcc^12;sbit T13=Tcc^13;sbit T14=Tcc^14;sbit T15=Tcc^15;
//*************************************************
bdata uchar Bcc;
sbit a0=Bcc^0;	sbit a1=Bcc^1;	sbit a2=Bcc^2;	sbit a3=Bcc^3;
sbit a4=Bcc^4;	sbit a5=Bcc^5;	sbit a6=Bcc^6;	sbit a7=Bcc^7;
//*************************************************
void DELAYL (uchar t){	//长时间延时子程序
	uchar s;	while (t--)
	{for (s=0xff;s>0;s--)	{;}		}	}
//*************************************************
void DELAYS (uchar t){	//短时间延时子程序
	while (t--)	{;}		}
//*************************************************
uchar change(uchar d)	//16进制码转换成可供数码管显示的码值
{switch (d)
   {case 0x00:{d=0xc0;}break;	//xian 0	4个74LS164的小板子
	case 0x01:{d=0xf9;}break;	//xian 1
	case 0x02:{d=0xa4;}break;	//xian 2
	case 0x03:{d=0xb0;}break;	//xian 3
	case 0x04:{d=0x99;}break;	//xian 4
	case 0x05:{d=0x92;}break;	//xian 5	
	case 0x06:{d=0x82;}break;	//xian 6
	case 0x07:{d=0xf8;}break;	//xian 7
	case 0x08:{d=0x80;}break;	//xian 8
	case 0x09:{d=0x90;}break;	//xian 9
	case 0x0a:{d=0x88;}break;	//xian a
	case 0x0b:{d=0x83;}break;	//xian b
	case 0x0c:{d=0xc6;}break;	//xian c
	case 0x0d:{d=0xa1;}break;	//xian d
	case 0x0e:{d=0x86;}break;	//xian e
	case 0x0f:{d=0x8e;}break;	//xian f
	default:{d=0xff;};    }	return (d);}
//*************************************************
void show(uchar h)	//P1.0,P1.1模拟串行口使数码管显示
{	if((h&0x01)==0x01){OUTD=0x02;OUTD=0x06;}else{OUTD=0x00;OUTD=0x04;}
	if((h&0x02)==0x02){OUTD=0x02;OUTD=0x06;}else{OUTD=0x00;OUTD=0x04;}	
	if((h&0x04)==0x04){OUTD=0x02;OUTD=0x06;}else{OUTD=0x00;OUTD=0x04;}	
	if((h&0x08)==0x08){OUTD=0x02;OUTD=0x06;}else{OUTD=0x00;OUTD=0x04;}	
	if((h&0x10)==0x10){OUTD=0x02;OUTD=0x06;}else{OUTD=0x00;OUTD=0x04;}	
	if((h&0x20)==0x20){OUTD=0x02;OUTD=0x06;}else{OUTD=0x00;OUTD=0x04;}	
	if((h&0x40)==0x40){OUTD=0x02;OUTD=0x06;}else{OUTD=0x00;OUTD=0x04;}	
	if((h&0x80)==0x80){OUTD=0x02;OUTD=0x06;}else{OUTD=0x00;OUTD=0x04;}	}
//*************************************************
void SHOW_T(void){	//显示当前温度
	int a,b;uchar c,d,m,n,o;	a=Tcc/64;b=a%4;a=a/4;
	c=(uchar)a;d=(uchar)b;
	m=c/100;	n=(c%100)/10;	o=(c%100)%10;
	m=change(m);	n=change(n);	o=change(o&0x8f);
	show(m);	show(n);	show(o);
	switch (d){
   		case 0:{show(0xc0);show(0xc0);}break;	//0.00
		case 1:{show(0xa4);show(0x92);}break;	//0.25
		case 2:{show(0x92);show(0xc0);}break;	//0.50
		case 3:{show(0xf8);show(0x92);}break;	//0.75
		default : {show(0xc0);show(0xc0);}    }	//
	}
//*************************************************
void START(void) 	//start 开始条件
	{scl=0;sda=1;scl=1;_nop_();_nop_();sda=0;scl=0;}
//*************************************************
void STOP(void){ 	//stop 结束条件
	scl=0;sda=0;_nop_();_nop_();scl=1;sda=1;}
//*************************************************
void S_OUT(uchar dd){	//write 串行输出到传感器(以MCU为中心)
	Bcc=dd;scl=0;
	sda=a7;scl=1;_nop_();scl=0;
	sda=a6;scl=1;_nop_();scl=0;
	sda=a5;scl=1;_nop_();scl=0;
	sda=a4;scl=1;_nop_();scl=0;
	sda=a3;scl=1;_nop_();scl=0;
	sda=a2;scl=1;_nop_();scl=0;
	sda=a1;scl=1;_nop_();scl=0;
	sda=a0;scl=1;_nop_();scl=0;
	sda=1; scl=1;_nop_();scl=0;}
//*************************************************
uchar S_IN(void){ 	//read 从传感器串行输入一位
	sda=1;
	scl=1;a7=sda;scl=0;_nop_();
	scl=1;a6=sda;scl=0;_nop_();
	scl=1;a5=sda;scl=0;_nop_();
	scl=1;a4=sda;scl=0;_nop_();
	scl=1;a3=sda;scl=0;_nop_();
	scl=1;a2=sda;scl=0;_nop_();
	scl=1;a1=sda;scl=0;_nop_();
	scl=1;a0=sda;scl=0;_nop_();
	sda=1;scl=1;_nop_();scl=0;
	return(Bcc); 		}
//*************************************************
void SL_IN(void){ 	//read 从传感器串行输入两位
	sda=1;
	scl=1;T15=sda;scl=0;_nop_();
	scl=1;T14=sda;scl=0;_nop_();
	scl=1;T13=sda;scl=0;_nop_();
	scl=1;T12=sda;scl=0;_nop_();
	scl=1;T11=sda;scl=0;_nop_();
	scl=1;T10=sda;scl=0;_nop_();
	scl=1;T09=sda;scl=0;_nop_();
	scl=1;T08=sda;scl=0;_nop_();
	sda=1;scl=1;_nop_();scl=0;
	scl=1;T07=sda;scl=0;_nop_();
	scl=1;T06=sda;scl=0;_nop_();
	scl=1;T05=sda;scl=0;_nop_();
	scl=1;T04=sda;scl=0;_nop_();
	scl=1;T03=sda;scl=0;_nop_();
	scl=1;T02=sda;scl=0;_nop_();
	scl=1;T01=sda;scl=0;_nop_();
	scl=1;T00=sda;scl=0;_nop_();
	sda=1;scl=1;_nop_();scl=0;	}
//*************************************************
main(){		//存放温度
	CTLA=0x00;DIRA=0xff;	
	CTLB=0x00;DIRB=0xff;
	DIRC=0xff;DIRD=0x06;
	OUTC=0x00;show(0xC0);show(0xC0);show(0xC0);show(0xC0);
	show(0xC0);show(0xC0);show(0xC0);show(0xC0);
	DELAYL(0xff);DELAYS(0xff);OUTC=0xff;
	//*************************************************
	START();S_OUT(0x96);S_OUT(0x01);S_OUT(0x1a);STOP();
	//设置配置寄存器;OTI有效电平;比较/中断方式;工作/睡眠方式;
	START();S_OUT(0x96);S_OUT(0x02);S_OUT(0x19);S_OUT(0x00);STOP();
	//比较器最高温度设置;25
	START();S_OUT(0x96);S_OUT(0x03);S_OUT(0x14);S_OUT(0x00);STOP();
	//比较器最低温度设置;20
	//*************************************************
	
	//*************************************************
	START();S_OUT(0x97);S_OUT(0x03);SL_IN();STOP();
	//从温度寄存器中读出两字节温度数据;
	SHOW_T();	//显示当前温度
	while(1){
		START();S_OUT(0x97);S_OUT(0x03);SL_IN();STOP();
		//从温度寄存器中读出两字节温度数据;
		SHOW_T();DELAYL(0xff);DELAYL(0xff);}//显示当前温度
}
	

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?