数字温湿度计设计(12864) 下载本文

{

tempset=temph*10+templ;//温度是正数 } else {

tempset=(10-temph)-templ;//温度是负数 }

humiset=humih*10+humil; mstcnt++;

if(mstcnt==8)//扫描数码管,每2S秒扫描一次 {

mstcnt=0;

if((dispbitcnt==2)||(dispbitcnt==6))//显示小数点 {

P1=dispcode[dispbuf[dispbitcnt]]&0xfb; } else {

P1=dispcode[dispbuf[dispbitcnt]]; }

P2=dispbitcode[dispbitcnt]; dispbitcnt++;

if(dispbitcnt==8) {

dispbitcnt=0; } } }

char s_write_byte(unsigned char value)//写一个字节的数据 {

unsigned char i,error=0; for(i=0x80;i>0;i/=2) {

if(i&value) DATA=1; else DATA=0; SCK=1; _nop_(); _nop_(); _nop_(); SCK=0; }

DATA=1;

SCK=1;

error=DATA; SCK=0;

return error; }

char s_read_byte(unsigned char ack)//读一个字节的数据 {

unsigned char i,val=0; DATA=1;

for(i=0x80;i>0;i/=2) {

SCK=1; if(DATA) {

val=(val|i); }

SCK=0; }

DATA=!ack;//ack为低电平时表示数据发送完毕 SCK=1; _nop_(); _nop_(); _nop_(); SCK=0; DATA=1; return val; }

void s_transstart(void)//传输启动时序 {

DATA=1;SCK=0; _nop_(); SCK=1; _nop_(); DATA=0; _nop_(); SCK=0; _nop_(); _nop_(); _nop_(); SCK=1; _nop_(); DATA=1; _nop_(); SCK=0;

}

void s_connectionreset(void)//通讯复位时序 {

unsigned char i; DATA=1;SCK=0; for(i=0;i<9;i++) {

SCK=1; SCK=0; }

s_transstart(); }

char s_measure(unsigned char *p_value,unsigned char *p_checksum,

unsigned char mode)//测量函数

{

unsigned error=0; unsigned int i; s_transstart(); switch(mode) {

case TEMP:error+=s_write_byte(MEASURE_TEMP);break;//写湿度指令 case HUMI:error+=s_write_byte(MEASURE_HUMI);break;//写温度指令 default :break; }

for(i=0;i<65535;i++)

if(DATA==0) break;通讯完毕,数据线被拉底 if(DATA) {

error+=1; }

*(p_value) =s_read_byte(ACK);//读出数据的高八位 *(p_value+1)=s_read_byte(ACK);//读出数据的低八位 return error; }

void calc_sth11(float *p_humidity,float *p_temperature)//转换物理量,从而得到想要的数据值 {

const float C1=-4.0; const float C2=0.0405; const float C3=-0.0000028; const float T1=0.01; const float T2=0.00008; float rh=*p_humidity; float t=*p_temperature;

float rh_lin; float rh_true; float t_c; t_c=t*0.01-40;

rh_lin=C3*rh*rh+C2*rh+C1;

rh_true=(t_c-25)*(T1+T2*rh)+rh_lin; if(rh_true<0.1) rh_true=0.1; *p_temperature=t_c; *p_humidity=rh_true; }

void main()//主函数 {

value humi_val,temp_val;

unsigned char error,checksum; unsigned int i;

s_connectionreset();//通讯复位 TMOD=0x02;//中断初始化 TH0=0x06; TL0=0x06; TR0=1; ET0=1; EA=1; while(1) {

error=0;

error+=s_measure((unsigned char*)&humi_val.i,&checksum,HUMI); error+=s_measure((unsigned char*)&temp_val.i,&checksum,TEMP); if(error!=0)//如果error=1,从新复位 {

s_connectionreset(); } else {

humi_val.f=(float)humi_val.i; temp_val.f=(float)temp_val.i;

calc_sth11(&humi_val.f,&temp_val.f); display(humi_val.f,temp_val.f); s_connectionreset(); }

for(i=0;i<40000;i++); s_connectionreset();

} }

总结与体会

通过这次对数字温度计的设计与制作,让我了解了设计电路的程序,也让我了解了关于数字温度计的原理与设计理念,要设计一个电路总要先用仿真成功之后才实际接线的。但是最后的成品却不一定与仿真时完全一样,因为,再实际接线中有着各种各样的条件制约着。而且,在仿真中无法成功的电路接法,在实际中因为芯片本身的特性而能够成功。所以,在设计时应考虑两者的差异,从中找出最适合的设计方法。

通过这次学习,让我对各种电路都有了大概的了解,所以说,坐而言不如立而行,对于这些电路还是应该自己动手实际操作才会有深刻理解。

从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。