📄 endad74.c
字号:
#include <reg51.h>
#include <intrins.h>
#include <absacc.h>
/*全局符号定义*/
#define HIGH 1
#define LOW 0
#define FALSE 0
#define TRUE ~FALSE
#define fuction
#define end_if
#define end_for
#define byte unsigned char
#define uchar unsigned char
#define uint unsigned int
sbit SCL=P1^0;
sbit SDA=P1^1;
sbit WDI=P1^2; /**/
#define PA8255 XBYTE[0X8000]
#define PB8255 XBYTE[0X8001]
#define PC8255 XBYTE[0X8002]
#define COM8255 XBYTE[0X8003]
uchar idata dis_buf[4]={12,2,3,4};
uchar code table[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00};
int data temp=0;/*温度*/
uchar idata ja,jb;
/*@@本函数只有一条指令,根据需要可增加延时指令*/
void fuction delay(void){
_nop_() ;
_nop_();
}
/*@@提供iic总线工作时序的起始位*/
void fuction I_start(void){
SDA=HIGH;
delay();
SCL=HIGH;
delay();
SDA=LOW;
delay();
SCL=LOW;
delay();
}
/*@@提供iic总线工作时序的停止位*/
void fuction I_stop(viod){
SDA=LOW;
delay();
SCL=HIGH;
delay();
SDA=HIGH;
delay();
SCL=LOW;
delay();
}
/*iic总线初始化,main()函数中应先调本函数,在调其他函数.*/
void fuction I_init(viod){
SCL=LOW;
I_stop();
}
/*提供iic总线的时钟信号,并返回时钟电平位高期间sda信号线上的状态,本函数可用于发送也可用于接收*/
bit fuction I_clock(viod){
bit sample;
SCL=HIGH;
delay();
sample=SDA;
SCL=LOW;
delay();
return(sample);
}
/*向iic总线发送8位数据,并请求一个应答信号ack.如收到ack则返回1(ture),否则返回0(false).*/
bit fuction I_send(byte I_data){
register byte i;
/*发送8位数据*/
for(i=0;i<8;i++){
SDA=(bit)(I_data&0x80);
I_data=I_data<<1;
I_clock();
end_for}
/*请求应答信号*/
SDA=HIGH;
return(~I_clock());
}
/*从iic总线接收8位数据,并将接收到的8位数据作为一个字节返回,
不回送应答信号ack,主函数在调用本函数之前应保证sda信号处于浮置态,即使8051的p1.7置1*/
byte fuction I_receive(void){
byte I_data=0;
register byte i;
for(i=0;i<8;i++){
I_data*=2;
if(I_clock())
I_data++;
end_if
end_for}
return(I_data);
}
/*向iic总线发送一个应答信号ack,一般用于连续数据的读取时.*/
void fuction I_Ack(viod){
SDA=LOW;
I_clok();
SDA=HIGH;
}
/*提供5ms延时(时钟频率12mhz).*/
void fuction wait_5ms(void){
register int i;
for(i=0;i<100;i++)
;
end_for
}
/*@@@主应答子程序*/
void ack(void){
SDA=LOW;
delay();
SCL=HIGH;
delay();
SCL=LOW;
delay();
SDA=HIGH;
}
/*@@@主无应答子程序*/
void noack(void)
{SDA=HIGH;
delay();
SCL=HIGH;
delay();
SCL=LOW;
delay;
SDA=LOW;
}
/*@@@检查从应答子程序*/
bit check(void)
{
bit sample;
SDA=HIGH;
delay();
SCL=HIGH;
delay();
sample=SDA;
SCL=LOW;
if(sample)
return(sample);
}
/*@@@写一个字节子程序*/
void write(uchar wr_data)
{ uchar i;
for(i=0;i<8;i++)
{
SDA=(bit)(wr_data&0x80);
wr_data<<=1;
SCL=HIGH;
delay();
delay();
SCL=LOW;
}
SDA=HIGH;
}
/*@@@读一个字节程序*/
uchar read(void)
{
uchar i;
bit sample;
uchar re_data=0;
for(i=0;i<8;i++){
re_data*=2;
SCL=HIGH;
delay();
sample=SDA;
SCL=LOW;
if(sample)
re_data++;
}
return(re_data);
}
//--------------------------------------
void dl_ms()
{ uint data d;
for(d=0;d<400;d++);
}
void display(uchar idata *p)
{uchar sel,i;
COM8255=0X80;
sel=0x01;
for(i=0;i<4;i++){
PA8255=table[*p];
PB8255=~sel;
dl_ms();
p--;
sel=sel<<1;
}
}
//----------------------------------------------
/*@@@读ad7416子程序*/
void rd_ad(uchar add)
{ uchar conh=1;
switch(conh){
case 1:
I_start();
write(add);
if(check())break;
write(0x00);
if(check())break;
I_stop();
I_start();
write(add+1);
if(check())break;
ja=read();
ack();
jb=read();
noack();
I_stop();
default:
break;
}
}
//-------------------------------------------------
void main(void)
{ uchar i;
for(;;){
for( i=0;i<4;i++) {
rd_ad(0x92);
temp=ja;
temp<<=2;
temp=temp|jb>>6;}
temp=temp/4;
dis_buf[1]=temp%10;
dis_buf[2]=temp/10 ;
if(dis_buf[2]>10)dis_buf[2]/=10;
else if(dis_buf[2]==10)dis_buf[2]=0;
dis_buf[3]=temp/100;
display(dis_buf+3);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -