當溫度低于30度時,單片機控制P2.3輸出低電平,可是燈泡不亮,是程序問題還是原理圖呀
主程序如下:#include<reg52.h>
#include "LCD.h" #include "DS18B20.h" #include "DS1302.h" sbit outv=P2^0; //電機轉動時PWM輸出口; sbit ctr =P2^3; //控制加熱設備輸出 uchar flag2=1; uchar tflag=1; uchar timeflag=0; uchar per=10; //PWM低電平所占時間 void initall(); void chesu(); void initT0(); void DispTemp(uint tem); void DispTime(); void DispSP(); /*****************主函數**********************/ void main() { initall(); while(1) { DispTemp(gettemp()); DispTime(); if(timeflag) DispSP(); } } /******************溫度顯示函數*******************/ void DispTemp(uint tem) { if(tflag) //第一次調用溫度顯示函數 { tflag=0; write_string(0,10,"Tem:"); } if(tem<300) //隨著溫度的改變,PWM的占空比發生變化,同時加熱設備也發生變化 { per=10; ctr=0; } else { ctr=1; if(tem>=300&&tem<=330) per=5; else per=0; } write_com(0x80+14); write_data(tem/100+48); write_data(tem%100/10+48); write_data('.'); write_data(tem%10+48); write_data(0); //顯示攝氏度 } /***************DS1302時間顯示函數*********************/ void DispTime() { uchar j; gettime(); write_com(0x80); for(j=0;j<8;j++) write_data(buf[j]); } /*******************初始化****************************/ void initall() { initLCD(); if((read(0x83)==0x00)&(read(0x81)==0x80)) //判斷1302的秒的第8位是否為1,即是否處于低功耗狀態(振蕩器停止) { write(0x8E,0x00);//取消寫保護 write(0x80,0x00); write(0x8E,0x80);//寫保護 } initT0(); outv=0; write_string(1,0,"Speed: 000r/min"); } /**********************中斷初始化**********************/ void initT0() { TMOD=0x51; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TH1=0; TL1=0; EA=1; ET0=1; TR0=1;TR1=1; } /*****************中斷函數*********************/ void T0_time() interrupt 1 { uchar times; times++; if(times%20>per) outv=1; else outv=0; TH0=(65536-50000)/256; TL0=(65536-50000)%256; if(times==200) { times=0; timeflag=1; } } /*******************電機轉速顯示函數*********************************/ void DispSP() { uint count=0; timeflag=0; write_com(0xc0+7); count=TH1*256+TL1; write_data(count*6/100+48); write_data(count*6%100/10+48); write_data(count*6%10+48); TH1=0; TL1=0; } |