久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3539|回復: 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

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

5#
ID:85771 發表于 2015-7-15 17:24 | 只看該作者
仿真圖有問題,仔細查看一下

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的積分獎勵!

查看全部評分

回復

使用道具 舉報

6#
ID:74441 發表于 2015-7-26 22:09 | 只看該作者
DS18B20對時序有很高的要求,你先寫好溫度,然后再一步一步的往里面加,這東西我也寫過。
回復

使用道具 舉報

7#
ID:86938 發表于 2015-7-27 10:32 | 只看該作者
程序沖突,18B20時間被占用了
回復

使用道具 舉報

8#
ID:86938 發表于 2015-7-27 10:40 | 只看該作者
調整電機行動時間在18B20外就可以啦
回復

使用道具 舉報

9#
ID:86938 發表于 2015-7-27 10:41 | 只看該作者
就這樣啦
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品自在在线观看 | 伊人久久麻豆 | 久久久久久久亚洲精品 | 亚洲综合久久久 | 影音先锋久久 | 国产视频久 | 国产农村妇女毛片精品久久麻豆 | 精品日韩在线 | 中文av网站 | 99免费精品视频 | 日韩欧美国产一区二区 | 91久久精品国产91久久性色tv | 日韩精品在线观看一区二区 | 久久久精品高清 | 综合自拍 | 精品美女久久久 | 成人国产网站 | 国产真实乱对白精彩久久小说 | 中文字幕在线看 | 热久久免费视频 | 午夜天堂精品久久久久 | 国产精品视频一区二区三区, | 超碰3 | 国产免费一区二区 | 久久国产精品一区二区三区 | 久久69精品久久久久久久电影好 | 亚洲品质自拍视频网站 | 91久久北条麻妃一区二区三区 | 久久久久九九九女人毛片 | 在线精品一区 | 欧美日韩一二三区 | 麻豆国产精品777777在线 | 国产欧美在线一区二区 | 精品亚洲91 | 神马久久久久久久久久 | 97精品超碰一区二区三区 | 欧美综合网| 黄色成人av | 中文字幕亚洲一区二区va在线 | 色婷婷国产精品综合在线观看 | 国产成人综合久久 |