当温度低于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; } |