只截了关键部分代码出来,其他代码都仿真过,没有问题,当加上温控函数后,就不行了,一仿真就只执行第一条语句,即高速档,我是初学者,不清楚是自己代码写错了还是怎样,自己看了好久也看不出个所以然,求大神看看,最好顺着这个代码帮我把这个温控函数的代码写出来,谢谢,重赏
单片机源程序如下:
- #include <reg52.h> //此文件中定义了单片机的一些特殊功能寄存器
- #include "temp.h"
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- int weidu;
- uchar smgwei[3];
- uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- void DigDisplay();
- void smgdelay(uint x);
- * 温度读取处理转换函数 */ (数码管上温度显示正常,证明这个函数没毛病)
- int datapros(int temp)
- {
- float tp,x;
- if(temp< 0) //当温度值为负数
- {
- smgwei[0] = 0x40; // -
- temp=temp-1;
- temp=~temp;
- tp=temp;
- temp=tp*0.0625*10+0.5;
- x=tp*0.0625+0.5;
- }
- else
- {
- smgwei[0] = 0x00;
- tp=temp;
- temp=tp*0.0625*10+0.5;
- x=tp*0.0625+0.5;
- }
- smgwei[1] = smgduan[temp % 1000 / 100 ];
- smgwei[2] = smgduan[temp % 100 / 10] | 0x80;
- smgwei[3] = smgduan[temp % 10];
- return x;
- }
- /* 温控自动档 */
- void motorauto()
- {
- weidu=datapros(Ds18b20ReadTemp()); //怀疑这句出错
- if(weidu>=30) //仿真的时候无论怎么调温度,都是执行高速档
- { //当把这里的条件调大 (如:weidu>=300)时,就只执行低速档
- third(); //高速档
- }
- else
- {
- first(); //低速档
- }
- }
- /* 数码管显示函数 */ (数码管上可以正常显示温度,这个函数也没问题)
- void DigDisplay()
- {
- uchar i;
- for(i=0;i<4;i++)
- {
- P0=0x00;
- switch(i) //位选,选择点亮的数码管,
- {
- case(0):
- LSA=0;LSB=0;LSC=0; break; //显示第0位
- case(1):
- LSA=1;LSB=0;LSC=0; break; //显示第1位
- case(2):
- LSA=0;LSB=1;LSC=0; break; //显示第2位
- case(3):
- LSA=1;LSB=1;LSC=0; break; //显示第3位
- }
- P0=smgwei[3-i]; //发送数据
- msdelay(10); //间隔一段时间扫描
- P0=0x00; //消隐
- }
- }
- /* 主函数 */
- void main()
- {
- while(1)
- motorauto();
- }
- /* while(1) 数码管上显示温度,这里仿真过,没有问题
- {
- datapros(Ds18b20ReadTemp());
- DigDisplay();
- }*/
|