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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2278|回復: 4
收起左側

LCD1602和pwm直流電機的單片機程序問題

[復制鏈接]
ID:728433 發表于 2020-11-13 18:28 | 顯示全部樓層 |閱讀模式
//單獨執行電機程序,電機可以實現案件調速,單獨執行lcd顯示溫度(溫度傳感器為DS18b20)lcd屏幕也可以顯示正確的溫度
// 當把兩個程序整合成一個程序的時候,電機不能按鍵調速,lcd屏幕不能正確顯示溫度這是怎么回事

//整合之后的程序如下
  1. #include <reg52.H>
  2. #include <intrins.H>
  3. #include <math.H>

  4. #define uchar unsigned char
  5.   #define uint unsigned int
  6.   unsigned char pwm_motor_val =0;//左右電機占空比值 取值范圍0-170,0最快
  7. unsigned char pwm_t;//周期
  8. sbit led=P1^0;
  9. sbit _4IN = P3^7;//
  10. sbit key_s2 = P3^0;
  11. sbit key_s3 = P3^1;
  12. sbit dula = P2^6;
  13. sbit wela = P2^7;
  14. sbit rw = P3^6;
  15. sbit RS = P3^5;  

  16. sbit LCDEN = P3^4;

  17. void delay(unsigned int z)//毫秒級延時
  18. {
  19.         unsigned int x,y;
  20.         for(x = z; x > 0; x--)
  21.                 for(y = 114; y > 0 ; y--);
  22. }
  23. //定時器0中斷
  24. void timer0() interrupt 1
  25. {
  26.         pwm_t++;
  27.         if(pwm_t == 255)
  28.         {        _4IN = 0;
  29.                 led=1;         }
  30.         if(pwm_motor_val == pwm_t)
  31.                 {_4IN = 1;        
  32.                 led=0;        }                        
  33. }

  34. void delayUs()
  35. {
  36.     _nop_();
  37. }

  38. void delayMs(uint a)
  39. {
  40.     uint i, j;
  41.     for(i = a; i > 0; i--)
  42.         for(j = 100; j > 0; j--);
  43. }


  44. void writeComm(uchar comm)
  45. {
  46.      RS = 0;   
  47.     P0 = comm;
  48.     LCDEN = 1;
  49.      delayUs();
  50.     LCDEN = 0;
  51.     delayMs(1);
  52. }

  53. //寫數據:RS=1, RW=0;
  54. void writeData(uchar dat)
  55. {
  56.      RS = 1;
  57.      P0 = dat;
  58.      LCDEN = 1;
  59.     delayUs();
  60.     LCDEN = 0;
  61.     delayMs(1);
  62. }


  63. void init()
  64. {
  65.      rw = 0;
  66.      dula = wela = 0;
  67.     writeComm(0x38);
  68.    writeComm(0x0c);
  69.     writeComm(0x06);
  70.     writeComm(0x01);
  71. }

  72. void writeString(uchar * str, uchar length)
  73. {
  74.      uchar i;
  75.     for(i = 0; i < length; i++)
  76.     {
  77.          writeData(str[i]);
  78.      }
  79. }

  80. /**//*****************************DS18B20*******************************/
  81. sbit ds = P2^2;
  82. void dsInit()
  83. {

  84.     unsigned int i;  
  85.     ds = 0;
  86.     i = 100;  
  87.      while(i>0) i--;
  88.     ds = 1;   
  89.     i = 4;
  90.      while(i>0) i--;
  91. }

  92. void dsWait()
  93. {
  94.       unsigned int i;
  95.       while(ds);  
  96.       while(~ds);
  97.       i = 4;
  98.       while(i > 0) i--;
  99. }


  100. bit readBit()
  101. {
  102.     unsigned int i;
  103.     bit b;
  104.     ds = 0;
  105.     i++;   
  106.     ds = 1;
  107.    i++; i++;  
  108.     b = ds;
  109.     i = 8;
  110.     while(i>0) i--;
  111.     return b;
  112. }

  113. unsigned char readByte()
  114. {
  115.     unsigned int i;
  116.     unsigned char j, dat;
  117.    dat = 0;
  118.     for(i=0; i<8; i++)
  119.     {
  120.         j = readBit();

  121.         dat = (j << 7) | (dat >> 1);
  122.     }
  123.     return dat;
  124. }


  125. void writeByte(unsigned char dat)
  126. {
  127.     unsigned int i;
  128.     unsigned char j;
  129.     bit b;
  130.     for(j = 0; j < 8; j++)
  131.     {
  132.         b = dat & 0x01;
  133.         dat >>= 1;

  134.         if(b)   
  135.         {
  136.            ds = 0;          i++; i++;  
  137.             ds = 1;   
  138.             i = 8; while(i>0) i--;  
  139.         }
  140.         else  
  141.         {
  142.             ds = 0;
  143.           i = 8; while(i>0) i--;  
  144.             ds = 1;
  145.            i++; i++;
  146.         }
  147.    }
  148. }


  149. void sendChangeCmd()
  150. {
  151.     dsInit();   
  152.     dsWait();   
  153.     delayMs(1);   
  154.     writeByte(0xcc);
  155.     writeByte(0x44);
  156. }

  157. void sendReadCmd()
  158. {
  159.     dsInit();
  160.     dsWait();
  161.     delayMs(1);
  162.     writeByte(0xcc);
  163.     writeByte(0xbe);
  164. }


  165. int getTmpValue()
  166. {
  167.     unsigned int tmpvalue;
  168.     int value;
  169.     float t;
  170.     unsigned char low, high;
  171.     sendReadCmd();

  172.     low = readByte();
  173.     high = readByte();

  174.     tmpvalue = high;
  175.     tmpvalue <<= 8;
  176.     tmpvalue |= low;
  177.     value = tmpvalue;

  178.   \
  179.     t = value * 0.0625;
  180.     \
  181.     value = t * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0減0.5
  182.     return value;
  183. }

  184. void display(int v)
  185. {
  186.     unsigned char count;
  187.     unsigned char datas[] = {0, 0, 0, 0, 0};
  188.     unsigned int tmp = abs(v);
  189.     datas[0] = tmp / 10000;
  190.     datas[1] = tmp % 10000 / 1000;
  191.     datas[2] = tmp % 1000 / 100;
  192.     datas[3] = tmp % 100 / 10;
  193.     datas[4] = tmp % 10;
  194.     writeComm(0xc0+3);
  195.     if(v < 0)
  196.     {
  197.         writeString("- ", 2);
  198.    }
  199.     else
  200.     {
  201.        writeString("+ ", 2);
  202.     }
  203.     if(datas[0] != 0)
  204.     {
  205.         writeData('0'+datas[0]);
  206.     }
  207.     for(count = 1; count != 5; count++)
  208.     {
  209.         writeData('0'+datas[count]);
  210.         if(count == 2)
  211.         {
  212.             writeData('.');
  213.         }
  214.     }
  215. }
  216. /**//*****************************DS18B20*******************************/

  217. void main()
  218. {
  219.     uchar table[] = "  xianzaiwendu: ";
  220.     sendChangeCmd();
  221.     init();
  222.     writeComm(0x80);
  223.     writeString(table, 16);
  224.     while(1)
  225.     {
  226.         delayMs(1000); //溫度轉換時間需要750ms以上
  227.         writeComm(0xc0);
  228.         display(getTmpValue());
  229.         sendChangeCmd();
  230.                 TMOD |= 0x02;//8位自動重裝模塊
  231.         TH0 = 220;
  232.         TL0 = 220;//11.0592M晶振下占空比最大比值是256,輸出100HZ
  233.         TR0 = 1;//啟動定時器0
  234.         ET0 = 1;//允許定時器0中斷
  235.         EA        = 1;//總中斷允許

  236.                 if(key_s3 == 0)         //S2按下LED變暗
  237.                 {
  238.                         delay(5);
  239.                         if(key_s3 == 0)
  240.                         {
  241.                                 if(pwm_motor_val < 170)
  242.                                 {
  243.                                         pwm_motor_val=pwm_motor_val+10;
  244.                                 }
  245.                         }
  246.                 }
  247.                 if(key_s2 == 0)        //S3按鍵LED變亮
  248.                 {
  249.                         delay(5);
  250.                         if(key_s2 == 0)
  251.                         {
  252.                                 if(pwm_motor_val > 0)
  253.                                 {
  254.                                         pwm_motor_val=pwm_motor_val-10;
  255.                                 }
  256.                         }
  257.                 }               
  258.         
  259.     }
  260. }
復制代碼


回復

使用道具 舉報

ID:584814 發表于 2020-11-16 10:33 | 顯示全部樓層
前面有 sbit dula = P2^6; sbit wela = P2^7; 長著象是數碼管
后面是 uchar table[] = "  xianzaiwendu: ";... writeComm(0x80);writeString(table, 16); 看著象1602
你確定是用了兩個屏并且都不顯示么  
回復

使用道具 舉報

ID:213173 發表于 2020-11-16 19:21 | 顯示全部樓層
這是因為程序構架不合理造成的相互干擾所致。特別是樓主把定時器初始化語句放在主循環while(1)中,使得定時中斷不能正常運行。
回復

使用道具 舉報

ID:728433 發表于 2020-11-19 19:56 | 顯示全部樓層
wulin 發表于 2020-11-16 19:21
這是因為程序構架不合理造成的相互干擾所致。特別是樓主把定時器初始化語句放在主循環while(1)中,使得定時 ...

//首先謝謝您的解答
//改用DHT11溫濕度傳感器后,聽了您的建議更改了程序
//由于我的知識儲備不夠出現了一下問題,電機可以調速,但是LCD屏幕還是不顯示DHT11溫濕度傳感器的數據,希望您撥冗幫助
程序如下
  1. #include <reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
  2. #include <intrins.h>
  3. #include <math.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. unsigned int i;
  7. unsigned char pwm_motor_val =0;//左右電機占空比值 取值范圍0-170,0最快
  8. unsigned char pwm_t;//周期
  9. sbit led=P1^0;
  10. sbit _4IN = P2^4;//
  11. sbit key_s2 = P3^0;
  12. sbit key_s3 = P3^1;        
  13. sbit RS = P3^5;   //定義端口
  14. sbit RW = P3^6;
  15. sbit EN = P3^4;
  16. sbit DU = P2^0;
  17. sbit WE = P2^1;

  18. sbit Data = P3^7;//定義數據線
  19. uchar rec_dat[15];   //用于顯示的接收數據數組

  20. #define RS_CLR RS=0
  21. #define RS_SET RS=1

  22. #define RW_CLR RW=0
  23. #define RW_SET RW=1

  24. #define EN_CLR EN=0
  25. #define EN_SET EN=1

  26. #define DataPort P0
  27. void delay(unsigned int z)//毫秒級延時
  28. {
  29.         unsigned int x,y;
  30.         for(x = z; x > 0; x--)
  31.                 for(y = 114; y > 0 ; y--);
  32. }

  33. void cmg88()//關數碼管,點陣函數
  34. {
  35. DU=1;  
  36. P0=0X00;
  37. DU=0;
  38. }
  39. /*------------------------------------------------
  40. uS延時函數,含有輸入參數 unsigned char t,無返回值
  41. unsigned char 是定義無符號字符變量,其值的范圍是
  42. 0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
  43. 長度如下 T=tx2+5 uS
  44. ------------------------------------------------*/
  45. void DelayUs2x(unsigned char t)
  46. {   
  47. while(--t);
  48. }
  49. /*------------------------------------------------
  50. mS延時函數,含有輸入參數 unsigned char t,無返回值
  51. unsigned char 是定義無符號字符變量,其值的范圍是
  52. 0~255 這里使用晶振12M,精確延時請使用匯編
  53. ------------------------------------------------*/
  54. void DelayMs(unsigned char t)
  55. {
  56.      
  57. while(t--)
  58. {
  59.      //大致延時1mS
  60.      DelayUs2x(245);
  61.          DelayUs2x(245);
  62. }
  63. }
  64. /*------------------------------------------------
  65.               判忙函數
  66. ------------------------------------------------*/
  67. bit LCD_Check_Busy(void)
  68. {
  69. DataPort= 0xFF;
  70. RS_CLR;
  71. RW_SET;
  72. EN_CLR;
  73. _nop_();
  74. EN_SET;
  75. return (bit)(DataPort & 0x80);
  76. }
  77. /*------------------------------------------------
  78.               寫入命令函數
  79. ------------------------------------------------*/
  80. void LCD_Write_Com(unsigned char com)
  81. {  
  82. while(LCD_Check_Busy()); //忙則等待
  83. RS_CLR;
  84. RW_CLR;
  85. EN_SET;
  86. DataPort= com;
  87. _nop_();
  88. EN_CLR;
  89. }
  90. /*------------------------------------------------
  91.               寫入數據函數
  92. ------------------------------------------------*/
  93. void LCD_Write_Data(unsigned char Data)
  94. {
  95. while(LCD_Check_Busy()); //忙則等待
  96. RS_SET;
  97. RW_CLR;
  98. EN_SET;
  99. DataPort= Data;
  100. _nop_();
  101. EN_CLR;
  102. }

  103. /*------------------------------------------------
  104.                 清屏函數
  105. ------------------------------------------------*/
  106. void LCD_Clear(void)
  107. {
  108. LCD_Write_Com(0x01);
  109. DelayMs(5);
  110. }
  111. /*------------------------------------------------
  112.               寫入字符串函數
  113. ------------------------------------------------*/
  114. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
  115. {     
  116. if (y == 0)
  117.          {     
  118.          LCD_Write_Com(0x80 + x);     //表示第一行
  119.          }
  120. else
  121.          {      
  122.          LCD_Write_Com(0xC0 + x);      //表示第二行
  123.          }        
  124. while (*s)
  125.          {     
  126. LCD_Write_Data( *s);     
  127. s ++;     
  128.          }
  129. }
  130. /*------------------------------------------------
  131.               寫入字符函數
  132. ------------------------------------------------*/
  133. void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
  134. {     
  135. if (y == 0)
  136.          {     
  137.          LCD_Write_Com(0x80 + x);     
  138.          }   
  139. else
  140.          {     
  141.          LCD_Write_Com(0xC0 + x);     
  142.          }        
  143. LCD_Write_Data( Data);  
  144. }
  145. /*------------------------------------------------
  146.               初始化函數
  147. ------------------------------------------------*/
  148. void LCD_Init(void)
  149. {
  150.    LCD_Write_Com(0x38);    /*顯示模式設置*/
  151.    DelayMs(5);
  152.    LCD_Write_Com(0x38);
  153.    DelayMs(5);
  154.    LCD_Write_Com(0x38);
  155.    DelayMs(5);
  156.    LCD_Write_Com(0x38);  
  157.    LCD_Write_Com(0x08);    /*顯示關閉*/
  158.    LCD_Write_Com(0x01);    /*顯示清屏*/
  159.    LCD_Write_Com(0x06);    /*顯示光標移動設置*/
  160.    DelayMs(5);
  161.    LCD_Write_Com(0x0C);    /*顯示開及光標設置*/
  162.    }
  163.    

  164. /*------------------------------------------------
  165.               DHT11延時函數
  166. ------------------------------------------------*/
  167. void DHT11_delay_us(uchar n)
  168. {
  169.     while(--n);
  170. }

  171. void DHT11_delay_ms(uint z)
  172. {
  173.    uint i,j;
  174.    for(i=z;i>0;i--)
  175.       for(j=110;j>0;j--);
  176. }
  177. /*------------------------------------------------
  178.               DHT11開始信號
  179. ------------------------------------------------*/
  180. void DHT11_start()
  181. {
  182.    Data=1;
  183.    DHT11_delay_us(2);
  184.    Data=0;
  185.    DHT11_delay_ms(20);   //延時18ms以上
  186.    Data=1;
  187.    DHT11_delay_us(30);
  188. }
  189. /*------------------------------------------------
  190.               接收八位二進制
  191. ------------------------------------------------*/
  192. uchar DHT11_rec_byte()      //接收一個字節
  193. {
  194.    uchar i,dat=0;
  195.   for(i=0;i<8;i++)    //從高到低依次接收8位數據
  196.    {         
  197.       while(!Data);   //等待50us低電平過去
  198.       DHT11_delay_us(8);     //延時60us,如果還為高則數據為1,否則為0
  199.       dat<<=1;           //移位使正確接收8位數據,數據為0時直接移位
  200.       if(Data==1)    //數據為1時,使dat加1來接收數據1
  201.          dat+=1;
  202.       while(Data);  //等待數據線拉低   
  203.     }  
  204.     return dat;
  205. }
  206. /*------------------------------------------------
  207.               接收40bit數據
  208. ------------------------------------------------*/
  209. void DHT11_receive()      //接收40位的數據
  210. {
  211.     uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
  212.     DHT11_start();

  213.     if(Data==0)
  214.     {
  215.         
  216.         while(Data==0);   //等待拉高     
  217.                
  218.         DHT11_delay_us(40);  //拉高后延時80us
  219.         R_H=DHT11_rec_byte();    //接收濕度高八位  
  220.         R_L=DHT11_rec_byte();    //接收濕度低八位  
  221.         T_H=DHT11_rec_byte();    //接收溫度高八位  
  222.         T_L=DHT11_rec_byte();    //接收溫度低八位
  223.         revise=DHT11_rec_byte(); //接收校正位
  224.                         
  225.         DHT11_delay_us(25);    //結束

  226.         if((R_H+R_L+T_H+T_L)==revise)      //校正
  227.         {
  228.             RH=R_H;
  229.             RL=R_L;
  230.             TH=T_H;
  231.             TL=T_L;
  232.         }
  233.         /*數據處理,方便顯示*/
  234.         rec_dat[0]='0'+(RH/10);
  235.         rec_dat[1]='0'+(RH%10);
  236.                 rec_dat[2] =' ';
  237.                 rec_dat[3] = 'R' ;
  238.                 rec_dat[4] = 'H';
  239.         rec_dat[5]=' ';
  240.         rec_dat[6]=' ';
  241.         rec_dat[7]=' ';
  242.         rec_dat[8]=' ';
  243.         rec_dat[9]='0'+(TH/10);
  244.         rec_dat[10]='0'+(TH%10);
  245.                 rec_dat[11] =' ';
  246.                 rec_dat[12] = 'C';
  247.                 rec_dat[13] = ' ' ;
  248.         rec_dat[14]=' ';
  249.     }
  250. }
  251. void timer0() interrupt 1
  252. {        
  253.         
  254.         TH0 = 220;
  255.         TL0 = 220;//11.0592M晶振下占空比最大比值是256,輸出100HZ
  256.         pwm_t=pwm_t+1;
  257.         if(pwm_t == 255)
  258.         {        _4IN = 0;
  259.                 led=1;         }
  260.         if(pwm_motor_val == pwm_t)
  261.                 {_4IN = 1;        
  262.                 led=0;        }
  263.                                  
  264. }

  265. /*------------------------------------------------
  266.                     主函數
  267. ------------------------------------------------*/
  268. void main(void)
  269. {
  270.         uint i;
  271.         cmg88();//關數碼管,點陣函數

  272.         LCD_Init();
  273.         LCD_Clear();//清屏
  274.         DHT11_delay_ms(1500);    //DHT11上電后要等待1S以越過不穩定狀態在此期間不能發送任何指令
  275.         TMOD = 0x02;//8位自動重裝模塊
  276. //        TH0 = 220;
  277. //        TL0 = 220;//11.0592M晶振下占空比最大比值是256,輸出100HZ
  278.         EA        = 1;//總中斷允許
  279.         TR0 = 1;//啟動定時器0
  280.         ET0 = 1;//允許定時器0中斷
  281.         while (1)
  282.          {
  283.                DHT11_receive();
  284.             
  285.          
  286.                 for(i=0;i<15;i++)
  287.                 {
  288.                            LCD_Write_Char(i,1,rec_dat[i]);
  289.                 }        
  290.                   //LCD_Write_Char(0,0,'T');
  291.                   //LCD_Write_Char(0,1,'H');
  292.                    //LCD_Write_String(0,1,"HELLO");
  293.                 if(key_s3 == 0)         //S2按下LED變暗
  294.                 {
  295.                         delay(5);
  296.                         if(key_s3 == 0)
  297.                         {
  298.                                 if(pwm_motor_val < 170)
  299.                                 {
  300.                                         pwm_motor_val=pwm_motor_val+10;
  301.                                 }
  302.                         }
  303.                 }
  304.                 if(key_s2 == 0)        //S3按鍵LED變亮
  305.                 {
  306.                         delay(5);
  307.                         if(key_s2 == 0)
  308.                         {
  309.                                 if(pwm_motor_val > 0)
  310.                                 {
  311.                                         pwm_motor_val=pwm_motor_val-10;
  312.                                 }
  313.                         }
  314.                 }               
  315.         
  316.          }
  317. }
復制代碼

回復

使用道具 舉報

ID:213173 發表于 2020-11-20 10:45 | 顯示全部樓層
1279095941 發表于 2020-11-19 19:56
//首先謝謝您的解答
//改用DHT11溫濕度傳感器后,聽了您的建議更改了程序
//由于我的知識儲備不夠出現 ...

單一應用程序功能正常,多個應用程序隨意組合往往會在執行時間上發生沖突。通常為了按鍵能及時響應運用中斷,往往更加劇了沖突。為了避免這類沖突需要在時間上排序,把占時較長的連續執行的模塊拆分成多個時間段分時執行。這樣在主循環周期內,每個子函數都能執行到全部或部分。感覺上多個應用程序在同時執行。
給你寫個示例。只用定時器控制主循環周期,4個子函數輪流執行互不干擾。 無標題.jpg

溫度表 按鍵仿真.zip (135.35 KB, 下載次數: 5)
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲激情一区二区 | 国产精品久久久久久久久久久久久 | 9999久久| 一级毛片免费视频观看 | 精品一二区 | 成人动慢 | 中文成人在线 | 久久久久久亚洲精品不卡 | 日韩一区中文字幕 | 国产1区| 久久精品综合 | 国产精品久久午夜夜伦鲁鲁 | aaa天堂 | 久久久久久久国产精品 | 黄色片网此 | 男女啪啪高潮无遮挡免费动态 | 久久久国产一区 | 精品一区二区三区在线观看 | 国产自产c区 | 国产精品一区二区三区在线 | 国产电影一区二区在线观看 | 在线观看你懂的网站 | 丝袜一区二区三区 | 一级在线观看 | 中文字幕在线观看一区 | 人人玩人人添人人澡欧美 | 欧美色图综合网 | 色一级片| 免费在线观看一级毛片 | 欧美中文一区 | 国产成人精品一区二区三区四区 | 午夜播放器在线观看 | 日韩成人精品一区二区三区 | 99久久久久国产精品免费 | 久久久久成人精品免费播放动漫 | 国产精品a久久久久 | 四色永久 | 亚洲国产中文字幕 | 亚洲国产成人精品女人久久久 | 欧美极品在线观看 | 欧美国产一区二区三区 |