电子科学综合设计
主程序的主要功能是负责多点温度数据的实时采集、传输,处理和显示。其程序流程如图所示。
初始化 生成地址字节1001000,循环次数3
(2)温度计算模块设计
向设置/状态寄存器设置为连续工作方式 启动转换 地址字节加02H 循环次数减1为0? N 延时1S以上等待结生成地址字节1001000,循环次数读温度数据并存储 地址字节加02H 循环次数减1为0? N N 读温度数据并存储及显示 计算温度子程序将从DS1621中读取的温度值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图5-2所示。
36
电子科学综合设计
开始 N 温度零下? Y 温度值取补码置“—”标志 置“+”标
3.3电路图
计算小数位温度BCD计算整数位温度BCD 结束
3.4源程序 #include
#define uchar unsigned char #define uint unsigned int
#define DiSdata P0 //七段码数据输出口
37
电子科学综合设计
#define discan P2 //扫描数据输出口 sbit DIN=P0^7; //小数点控制 sbit Scl=P3^0; //串行时钟 sbit
Sda=P3^1;
//串行数据
sbit alarm1=P1^7; sbit alarm2=P1^6; uint i; uint h; uint temp;
uchar dath[2]; //温度输入口 uchar ff2,ff1=0,t3=0;
uchar code dis_7[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40}; //共阴LED段码表 \灭%uchar code scan_con[5]={0xfd,0xfb,0xf7,0xef,0xdf}; //LED显示控制,对应0的LED有效
uchar data display[5]={0x00,0x00,0x00,0x00,0x002}; //显示单元数据,共6个数据和一个运算暂用
uchar data display1[5]={0x01,0x02,0x03,0x04,0x052}; uchar data DD[4]={0x90,0x92,0x94}; //
void delay_us(uint t) //延时函数 {
for (;t>0;t--); } //
scan() //LED扫描函数 {
uchar k; for(k=0;k<5;k++) }
{ }
discan=scan_con[k]; //控制位送P2口 DiSdata=dis_7[display[k]]; //数据位送P0口 if (k==3){DIN=1;} else
DIN=0; //小数点显示
delay_us(150);
38
电子科学综合设计
//
void delay(void) //延时函数 { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
} //
void i_start(void) // 开始 { Sda=1; Scl=1; delay(); Sda=0; delay(); Scl=0; } //
void i_stop(void) // 终止 { Sda=0; Scl=1; delay(); Sda=1; delay(); Scl=0; Sda=0; } //
bit i_clock(void) //应答信号 { bit sample; Scl=1; delay();
sample=Sda;
39
电子科学综合设计
_nop_(); _nop_(); Scl=0; delay(); return(sample);
} //
void i_ack(void) { Sda=0; i_clock(); Sda=1;
} //
bit i_send(uchar i_data) // 发送 { uchar i; for(i=0;i<8;i++) { Sda=(bit)(i_data & 0x80); i_data=i_data<<1;
i_clock();
} Sda=1;
return(~i_clock()); } //
uchar i_receive(void) //I2C接收 { uchar i_data=0; uchar i; for(i=0;i<8;i++) { i_data<<=1; Scl=0;delay(); Scl=1;delay() ; i_data|=Sda;
}
40