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

標(biāo)題: 為什么我在keil上調(diào)式?jīng)]出問(wèn)題,然而在proteus中卻出現(xiàn)問(wèn)題呢? [打印本頁(yè)]

作者: 50527978    時(shí)間: 2015-6-15 23:26
標(biāo)題: 為什么我在keil上調(diào)式?jīng)]出問(wèn)題,然而在proteus中卻出現(xiàn)問(wèn)題呢?
我這個(gè)是實(shí)現(xiàn)步進(jìn)電機(jī)工作時(shí)當(dāng)溫度過(guò)高就停止運(yùn)行與報(bào)警
我單獨(dú)完成步進(jìn)電機(jī)或DS18B20的超溫報(bào)警時(shí)是沒(méi)問(wèn)題的,但是當(dāng)我把這兩個(gè)合在一起仿真的時(shí)候我的溫度明明沒(méi)超過(guò)溫度上限值就直接電機(jī)停止報(bào)警了呢?
我把源程序仔細(xì)看了幾遍也沒(méi)發(fā)現(xiàn)我哪里會(huì)出錯(cuò)
  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;                          //正轉(zhuǎn)鍵位
  18. sbit Reversal=P3^3;                          //逆轉(zhuǎn)鍵位
  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; //定義超溫報(bào)警數(shù)值
  26. uchar  temporary[8];
  27. uchar stop_turing;
  28. uchar k=0;                          
  29. uchar num,flg,RRR,check;                                          //num為步數(shù);flg為正(0)逆(1)轉(zhuǎn);RRR用于調(diào)速控制
  30. uchar output[2][4]={{0x06,0x03,0x09,0x0c},{0x09,0x03,0x06,0x0c}}; //采用 四相雙四拍控制
  31.          //給個(gè)脈沖數(shù)組,正:1100(BA)-0110(DA)-0011(DC)-1001(BC) 逆BA-BC-DC-DA
  32.           //由于proteus中沒(méi)三相步進(jìn)電機(jī),所以用了個(gè)四相進(jìn)行仿真
  33.           //如果換成三相的電機(jī),那數(shù)組改成 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;//定時(shí)器設(shè)置
  44.         TH0=0xef;//裝初始值
  45.         TL0=0xf0;   
  46.         EA=1;// 開(kāi)總中斷
  47.         ET0=1;//允許定時(shí)器0中斷
  48.         TR0=1;//開(kāi)定時(shí)器0中斷
  49.         RRR=25;                                                          //設(shè)置每步延時(shí)250ms
  50.         check=0;                                                 
  51.         stop_turing=0;
  52.         while(1)
  53.         {
  54.     if(m_switch==0)                                 //總開(kāi)關(guān)
  55.         {
  56.                 if(P1!=0xff||P3_0!=1)                //判斷是否有步數(shù)按下
  57.                 {
  58.                         step();
  59.                         rotation();
  60.                         if(flg==0)                          //電機(jī)運(yùn)轉(zhuǎn)時(shí)有正逆轉(zhuǎn)的指示燈指示
  61.                         {
  62.                                 F_led=0;                   //正轉(zhuǎn)燈
  63.                         }
  64.                         else
  65.                         {
  66.                                 R_led=0;                        //逆轉(zhuǎn)燈
  67.                         }
  68.                         P0=0x0c;                                  //給電機(jī)打開(kāi)起始位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口輸出轉(zhuǎn)動(dòng),如果在三相單三中則改為for(i=0;i<=2;i++)
  76.                                    {
  77.                                            P0=output[flg][i];
  78.                                         for(n=0;n<RRR;n++)                 //延時(shí)
  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;                                        //關(guān)燈
  93.                         R_led=1;
  94.                         P0=0x0f;                                //給P0口復(fù)位
  95.                 }                        
  96.         }
  97.   }   
  98. }
  99. void step(void)                                                //判斷步數(shù)
  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)                  //判斷正逆轉(zhuǎn)
  140. {
  141.         if(Forward==0)                          //正轉(zhuǎn)
  142.         {
  143.                 flg=0;
  144.         }
  145.         else if(Reversal==0)           //逆轉(zhuǎn)
  146.         {
  147.                 flg=1;
  148.         }
  149. }

  150. void Init_DS18B20(void)
  151. {
  152.     unsigned char x=0;
  153.         DQ = 1;    //DQ復(fù)位
  154.         delay1(8);  //稍做延時(shí)
  155.         DQ = 0;    //單片機(jī)將DQ拉低
  156.         delay1(80); //精確延時(shí) 大于 480us
  157.         DQ = 1;    //拉高總線
  158.         delay1(14);
  159.         x=DQ;      //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗
  160.         delay1(20);
  161. }

  162. uchar ReadOneChar(void)        // DS18B20讀一個(gè)字節(jié)
  163. {
  164.         uchar m=0;
  165.         uchar dat = 0;
  166.         for (m=8;m>0;m--)
  167.         {
  168.                   DQ = 0; // 給脈沖信號(hào)
  169.                   dat>>=1;
  170.                   DQ = 1; // 給脈沖信號(hào)
  171.                   if(DQ)
  172.                    dat|=0x80;
  173.                   delay1(5);
  174.         }
  175.         return(dat);
  176. }

  177. void WriteOneChar(uchar dat) //DS18B20寫一個(gè)字節(jié)
  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); // 跳過(guò)讀序號(hào)列號(hào)的操作
  197.         WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換
  198.         delay1(200);       //延時(shí)以求信號(hào)的穩(wěn)定
  199.         Init_DS18B20();    //DS18B20再次初始化
  200.         WriteOneChar(0xCC); //跳過(guò)讀序號(hào)列號(hào)的操作
  201.         WriteOneChar(0xBE); //讀取溫度寄存器
  202.         a=ReadOneChar();   //低位
  203.         b=ReadOneChar();   //高位
  204.         b<<=8;  //b左移8位
  205.         t=a+b;  //把a(bǔ)與b結(jié)合,放在16位的t中
  206.         return(t);
  207. }

  208. void handle_Temperature()
  209. {

  210.           check=0;       //清標(biāo)志位
  211.           temp=ReadTemperature();//讀取溫度值
  212.         if(temp&0x8000)
  213.     {
  214.                    temporary[0]=0xb0;//負(fù)號(hào)標(biāo)志
  215.                   temp=~temp;  // 取反加1
  216.                 temp +=1;
  217.         }
  218.     TempH=temp>>4;        //由權(quán)重表知移4位就是整數(shù)位
  219.           TempL=temp&0x0F;
  220.         TempL=TempL*6/10;//小數(shù)近似處理
  221.         alarm();    //判斷是否需要報(bào)警
  222.                
  223. }

  224. void alarm(void)
  225. {
  226.         if(TempH>=temp_max)//當(dāng)溫度高于設(shè)置的最高溫報(bào)警
  227.         {       
  228.                 stop_turing=1;
  229.                 buzzer=0;
  230.                 Alarm_LED1=0;
  231.         }
  232.         else//報(bào)警解除
  233.         {
  234.                  buzzer=1;
  235.                 Alarm_LED1=1;
  236.         }
  237. }

  238. //延時(shí)函數(shù)
  239. void delay1(uint t)//短延時(shí)函數(shù)
  240. {
  241.         while(t--);
  242. }
  243. void delay(uint t) //長(zhǎng)延時(shí)函數(shù)
  244. {
  245.          while(t--)
  246.         {
  247.                                              //大致延時(shí)1mS
  248.              delay1(245);
  249.                  delay1(245);
  250.         }
  251. }

  252. void timer0(void) interrupt 1 using 1
  253. {
  254.         TH0=0xef;//定時(shí)器重裝值
  255.         TL0=0xf0;
  256.         k++;
  257.         if (k==50)
  258.     {
  259.                 k=0;
  260.                   check=1;//標(biāo)志位有效,開(kāi)始測(cè)溫
  261.         }
  262. }
  263.                                   
復(fù)制代碼


課程設(shè)計(jì).rar

76.07 KB, 下載次數(shù): 4


作者: zhanghanli007    時(shí)間: 2015-7-13 17:52
應(yīng)該是連線問(wèn)題,或者沒(méi)有接上拉電阻之內(nèi)的
作者: dingmingzhou    時(shí)間: 2015-7-13 19:55
給您回答問(wèn)題,還得俺花錢呀
作者: liudeyi    時(shí)間: 2015-7-13 23:47
看了一下,是連接問(wèn)題吧
作者: DIY小炫    時(shí)間: 2015-7-15 17:24
仿真圖有問(wèn)題,仔細(xì)查看一下
作者: 時(shí)光溢彩    時(shí)間: 2015-7-26 22:09
DS18B20對(duì)時(shí)序有很高的要求,你先寫好溫度,然后再一步一步的往里面加,這東西我也寫過(guò)。
作者: h1314258    時(shí)間: 2015-7-27 10:32
程序沖突,18B20時(shí)間被占用了
作者: h1314258    時(shí)間: 2015-7-27 10:40
調(diào)整電機(jī)行動(dòng)時(shí)間在18B20外就可以啦
作者: h1314258    時(shí)間: 2015-7-27 10:41
就這樣啦




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产欧美精品一区二区 | 久久里面有精品 | 精品久久久久一区二区国产 | 色综合久 | 久久精品色欧美aⅴ一区二区 | h视频免费观看 | 亚洲欧美一区二区三区1000 | 亚洲国产精品福利 | h视频在线播放 | 亚洲精品一二区 | 欧美日韩中文国产一区发布 | 国产精品1区2区 | 成人毛片在线视频 | 亚洲www啪成人一区二区麻豆 | 欧美精品91爱爱 | 91视视频在线观看入口直接观看 | 欧美日韩精品一区二区三区视频 | 欧美视频第二页 | 嫩草视频在线免费观看 | 国产精品久久久久久久久 | 精品不卡| 成人免费视频在线观看 | 精品99在线 | 伊人精品在线 | 久久高清 | 日韩欧美国产精品一区二区三区 | 91av视频 | 欧美日韩高清免费 | av男人天堂影院 | 国产偷录视频叫床高潮对白 | 成年无码av片在线 | 欧美一区二区大片 | 亚洲精品一区中文字幕乱码 | 国产在线观看一区二区 | 久久精品亚洲精品国产欧美kt∨ | 亚洲一区二区三区在线 | av电影一区 | 日韩亚洲视频在线 | 成人午夜激情 | 亚洲精品电影网在线观看 | 亚洲午夜在线 |