找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3389|回复: 8
收起左侧

为什么我在keil上调式没出问题,然而在proteus中却出现问题呢?

[复制链接]
ID:83006 发表于 2015-6-15 23:26 | 显示全部楼层 |阅读模式
我这个是实现步进电机工作时当温度过高就停止运行与报警
我单独完成步进电机或DS18B20的超温报警时是没问题的,但是当我把这两个合在一起仿真的时候我的温度明明没超过温度上限值就直接电机停止报警了呢?
我把源程序仔细看了几遍也没发现我哪里会出错
  1. #include <reg51.h>
  2. #include<math.h>
  3. #include<INTRINS.H>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. sbit P1_0=P1^0;
  7. sbit P1_1=P1^1;
  8. sbit P1_2=P1^2;
  9. sbit P1_3=P1^3;
  10. sbit P1_4=P1^4;
  11. sbit P1_5=P1^5;
  12. sbit P1_6=P1^6;
  13. sbit P1_7=P1^7;
  14. sbit P3_0=P3^0;
  15. sbit DQ=P2^7;                                 //         DS18b20 端口
  16. sbit m_switch=P3^1;
  17. sbit Forward=P3^2;                          //正转键位
  18. sbit Reversal=P3^3;                          //逆转键位
  19. sbit F_led=P2^0;                          
  20. sbit R_led=P2^1;
  21. sbit Alarm_LED1=P2^2;
  22. sbit buzzer=P2^3;
  23. int temp;
  24. char TempH,TempL;
  25. char temp_max=30; //定义超温报警数值
  26. uchar  temporary[8];
  27. uchar stop_turing;
  28. uchar k=0;                          
  29. uchar num,flg,RRR,check;                                          //num为步数;flg为正(0)逆(1)转;RRR用于调速控制
  30. uchar output[2][4]={{0x06,0x03,0x09,0x0c},{0x09,0x03,0x06,0x0c}}; //采用 四相双四拍控制
  31.          //给个脉冲数组,正:1100(BA)-0110(DA)-0011(DC)-1001(BC) 逆BA-BC-DC-DA
  32.           //由于proteus中没三相步进电机,所以用了个四相进行仿真
  33.           //如果换成三相的电机,那数组改成 uchar output[2][3]={{0x03,0x05,0x06},{0x05,0x03,0x06}}
  34. void rotation(void);                                                                         
  35. void step(void);                         
  36. void handle_Temperature();
  37. void delay1(uint t);
  38. void delay(uint t);
  39. void alarm(void);
  40. void main()
  41. {
  42.         uchar i,j,n;
  43.         TMOD|=0x01;//定时器设置
  44.         TH0=0xef;//装初始值
  45.         TL0=0xf0;   
  46.         EA=1;// 开总中断
  47.         ET0=1;//允许定时器0中断
  48.         TR0=1;//开定时器0中断
  49.         RRR=25;                                                          //设置每步延时250ms
  50.         check=0;                                                 
  51.         stop_turing=0;
  52.         while(1)
  53.         {
  54.     if(m_switch==0)                                 //总开关
  55.         {
  56.                 if(P1!=0xff||P3_0!=1)                //判断是否有步数按下
  57.                 {
  58.                         step();
  59.                         rotation();
  60.                         if(flg==0)                          //电机运转时有正逆转的指示灯指示
  61.                         {
  62.                                 F_led=0;                   //正转灯
  63.                         }
  64.                         else
  65.                         {
  66.                                 R_led=0;                        //逆转灯
  67.                         }
  68.                         P0=0x0c;                                  //给电机打开起始位BA,如果在三相单三中则改为P0=0x06;
  69.                         for(j=0;j<num;j++)
  70.                         {
  71.                                 if(stop_turing==1)
  72.                                 {
  73.                                         break;
  74.                                 }
  75.                                 for(i=0;i<=3;i++)        //给P0口输出转动,如果在三相单三中则改为for(i=0;i<=2;i++)
  76.                                    {
  77.                                            P0=output[flg][i];
  78.                                         for(n=0;n<RRR;n++)                 //延时
  79.                                         {
  80.                                                 delay(10);
  81.                                         }
  82.                                         if(check==1)
  83.                                         {
  84.                                                 handle_Temperature();// 处理温度:
  85.                                         }
  86.                                         if(stop_turing==1)
  87.                                         {
  88.                                                 break;
  89.                                         }                                               
  90.                                    }
  91.                         }
  92.                         F_led=1;                                        //关灯
  93.                         R_led=1;
  94.                         P0=0x0f;                                //给P0口复位
  95.                 }                        
  96.         }
  97.   }   
  98. }
  99. void step(void)                                                //判断步数
  100. {
  101.         if(P1_0==0)                                          //在四相中为24步,如果换成三相中则为18步
  102.         {
  103.                 num=6;
  104.         }
  105.         else if(P1_1==0)                           //在四相中为20步,如果换成三相中则为15步
  106.         {
  107.                 num=5;
  108.         }
  109.         else if(P1_2==0)                           //在四相中为16步,如果换成三相中则为12步
  110.         {
  111.                 num=4;
  112.         }
  113.         else if(P1_3==0)                                 //在四相中为12步,如果换成三相中则为9步
  114.         {
  115.                 num=3;
  116.         }
  117.         else if(P1_4==0)                                 //在四相中为8步,如果换成三相中则为6步
  118.         {
  119.                 num=2;
  120.         }
  121.         else if(P1_5==0)                                //在四相中为4步,如果换成三相中则为3步
  122.         {
  123.                 num=1;
  124.         }
  125.         else if(P1_6==0)                                //在四相中为28步,如果换成三相中则为21步
  126.         {
  127.                 num=7;
  128.         }
  129.         else if(P1_7==0)                                //在四相中为32步,如果换成三相中则为24步
  130.         {
  131.                 num=8;
  132.         }
  133.         else if(P3_0==0)                                //在四相中为36步,如果换成三相中则为27步
  134.         {
  135.                 num=9;
  136.         }
  137.                
  138. }
  139. void rotation(void)                  //判断正逆转
  140. {
  141.         if(Forward==0)                          //正转
  142.         {
  143.                 flg=0;
  144.         }
  145.         else if(Reversal==0)           //逆转
  146.         {
  147.                 flg=1;
  148.         }
  149. }

  150. void Init_DS18B20(void)
  151. {
  152.     unsigned char x=0;
  153.         DQ = 1;    //DQ复位
  154.         delay1(8);  //稍做延时
  155.         DQ = 0;    //单片机将DQ拉低
  156.         delay1(80); //精确延时 大于 480us
  157.         DQ = 1;    //拉高总线
  158.         delay1(14);
  159.         x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  160.         delay1(20);
  161. }

  162. uchar ReadOneChar(void)        // DS18B20读一个字节
  163. {
  164.         uchar m=0;
  165.         uchar dat = 0;
  166.         for (m=8;m>0;m--)
  167.         {
  168.                   DQ = 0; // 给脉冲信号
  169.                   dat>>=1;
  170.                   DQ = 1; // 给脉冲信号
  171.                   if(DQ)
  172.                    dat|=0x80;
  173.                   delay1(5);
  174.         }
  175.         return(dat);
  176. }

  177. void WriteOneChar(uchar dat) //DS18B20写一个字节
  178. {
  179.         uchar m=0;
  180.         for (m=8; m>0; m--)
  181.         {
  182.                   DQ = 0;
  183.                   DQ = dat&0x01;//取低位
  184.                   delay1(5);
  185.                   DQ = 1;
  186.                   dat>>=1;//左移
  187.         }
  188.         delay1(5);
  189. }

  190. uint ReadTemperature(void) //DS18B20读取温度
  191. {
  192.         uchar a=0;
  193.         uint b=0;
  194.         uint t=0;
  195.         Init_DS18B20();//DS18B20初始化
  196.         WriteOneChar(0xCC); // 跳过读序号列号的操作
  197.         WriteOneChar(0x44); // 启动温度转换
  198.         delay1(200);       //延时以求信号的稳定
  199.         Init_DS18B20();    //DS18B20再次初始化
  200.         WriteOneChar(0xCC); //跳过读序号列号的操作
  201.         WriteOneChar(0xBE); //读取温度寄存器
  202.         a=ReadOneChar();   //低位
  203.         b=ReadOneChar();   //高位
  204.         b<<=8;  //b左移8位
  205.         t=a+b;  //把a与b结合,放在16位的t中
  206.         return(t);
  207. }

  208. void handle_Temperature()
  209. {

  210.           check=0;       //清标志位
  211.           temp=ReadTemperature();//读取温度值
  212.         if(temp&0x8000)
  213.     {
  214.                    temporary[0]=0xb0;//负号标志
  215.                   temp=~temp;  // 取反加1
  216.                 temp +=1;
  217.         }
  218.     TempH=temp>>4;        //由权重表知移4位就是整数位
  219.           TempL=temp&0x0F;
  220.         TempL=TempL*6/10;//小数近似处理
  221.         alarm();    //判断是否需要报警
  222.                
  223. }

  224. void alarm(void)
  225. {
  226.         if(TempH>=temp_max)//当温度高于设置的最高温报警
  227.         {       
  228.                 stop_turing=1;
  229.                 buzzer=0;
  230.                 Alarm_LED1=0;
  231.         }
  232.         else//报警解除
  233.         {
  234.                  buzzer=1;
  235.                 Alarm_LED1=1;
  236.         }
  237. }

  238. //延时函数
  239. void delay1(uint t)//短延时函数
  240. {
  241.         while(t--);
  242. }
  243. void delay(uint t) //长延时函数
  244. {
  245.          while(t--)
  246.         {
  247.                                              //大致延时1mS
  248.              delay1(245);
  249.                  delay1(245);
  250.         }
  251. }

  252. void timer0(void) interrupt 1 using 1
  253. {
  254.         TH0=0xef;//定时器重装值
  255.         TL0=0xf0;
  256.         k++;
  257.         if (k==50)
  258.     {
  259.                 k=0;
  260.                   check=1;//标志位有效,开始测温
  261.         }
  262. }
  263.                                   
复制代码


课程设计.rar

76.07 KB, 下载次数: 4

回复

使用道具 举报

ID:85547 发表于 2015-7-13 17:52 | 显示全部楼层
应该是连线问题,或者没有接上拉电阻之内的

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:73833 发表于 2015-7-13 19:55 | 显示全部楼层
给您回答问题,还得俺花钱呀

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:85513 发表于 2015-7-13 23:47 | 显示全部楼层
看了一下,是连接问题吧

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:85771 发表于 2015-7-15 17:24 | 显示全部楼层
仿真图有问题,仔细查看一下

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的积分奖励!

查看全部评分

回复

使用道具 举报

ID:74441 发表于 2015-7-26 22:09 | 显示全部楼层
DS18B20对时序有很高的要求,你先写好温度,然后再一步一步的往里面加,这东西我也写过。
回复

使用道具 举报

ID:86938 发表于 2015-7-27 10:32 | 显示全部楼层
程序冲突,18B20时间被占用了
回复

使用道具 举报

ID:86938 发表于 2015-7-27 10:40 | 显示全部楼层
调整电机行动时间在18B20外就可以啦
回复

使用道具 举报

ID:86938 发表于 2015-7-27 10:41 | 显示全部楼层
就这样啦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表