{
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();
} }
总结与体会
通过这次对数字温度计的设计与制作,让我了解了设计电路的程序,也让我了解了关于数字温度计的原理与设计理念,要设计一个电路总要先用仿真成功之后才实际接线的。但是最后的成品却不一定与仿真时完全一样,因为,再实际接线中有着各种各样的条件制约着。而且,在仿真中无法成功的电路接法,在实际中因为芯片本身的特性而能够成功。所以,在设计时应考虑两者的差异,从中找出最适合的设计方法。
通过这次学习,让我对各种电路都有了大概的了解,所以说,坐而言不如立而行,对于这些电路还是应该自己动手实际操作才会有深刻理解。
从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。