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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

Proteus仿真1602部分全部都是高電平怎么辦啊?

查看數: 5559 | 評論數: 4 | 收藏 0
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發布時間: 2019-4-18 16:19

正文摘要:

新手小白的問題 如圖,1602引腳均為高電平,是怎么回事啊? 下面是程序: #include<reg52.h> #include <intrins.h> //#include <math.h>    //Keil library #define uchar unsigned c ...

回復

ID:515587 發表于 2019-4-23 10:37
wulin 發表于 2019-4-20 21:40
你這個程序怎么搞得這么亂,整理了好半天才通過編譯。

謝謝您
ID:213173 發表于 2019-4-20 21:40
你這個程序怎么搞得這么亂,整理了好半天才通過編譯。



  1. #include<reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char

  4. #define noACK 0                       //繼續傳輸數據,用于判斷是否結束通訊
  5. #define ACK   1            //結束數據傳輸;
  6.                                                  //地址 命令  讀/寫
  7. #define STATUS_REG_W 0x06   //000  0011    0
  8. #define STATUS_REG_R 0x07   //000  0011    1
  9. #define MEASURE_TEMP 0x03   //000  0001    1
  10. #define MEASURE_HUMI 0x05   //000  0010    1
  11. #define RESET        0x1e  //000   1111    0

  12. #define LCD_COMMAND         0     // Command
  13. #define LCD_DATA            1      // Data
  14. #define LCD_CLEAR_SCREEN    0x01     // 清屏
  15. #define LCD_HOMING          0x02      // 光標返回原點

  16. #define LCD_SHOW            0x04   //顯示開
  17. #define LCD_HIDE            0x00    //顯示關
  18. #define LCD_CURSOR          0x02    //顯示光標
  19. #define LCD_NO_CURSOR       0x00   //無光標        
  20. #define LCD_FLASH           0x01    //光標閃動
  21. #define LCD_NO_FLASH        0x00   //光標不閃動

  22. #define LCD_AC_UP           0x02
  23. #define LCD_AC_DOWN         0x00      // default
  24. #define LCD_MOVE            0x01      // 畫面可平移
  25. #define LCD_NO_MOVE         0x00      //default

  26. enum {TEMP,HUMI};
  27. sbit DATA = P1^1;
  28. sbit SCK = P1^0;
  29. sbit RS = P2^0;
  30. sbit RW = P2^1;
  31. sbit E = P2^2;
  32. sfr DBPort = 0x80;    //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.數據端口
  33. /********     DS1602函數聲明     ********/
  34. void LCD_Initial();
  35. void GotoXY(unsigned char x, unsigned char y);
  36. void Print(unsigned char *str);
  37. void LCD_Write(bit style, unsigned char input);
  38. /********     SHT10函數聲明      ********/
  39. void s_connectionreset(void);
  40. char s_measure(unsigned char *p_value,unsigned char *p_checksum, unsigned char mode);
  41. void calc_sth10(float *p_humidity ,float*p_temperature);
  42. char s_softreset(void);
  43. /***********************************************************************************************************************************************************/
  44. //寫字節程序
  45. char s_write_byte(unsigned char value)   
  46. {
  47.         unsigned char i,error=0;
  48.         for(i=0x80;i>0;i>>=1)            //高位為1,循環右移
  49.         {
  50.                 if (i&value) DATA=1;          //和要發送的數相與,結果為發送的位
  51.                 else DATA=0;                        
  52.                 SCK=1;                          
  53.                 _nop_();_nop_();_nop_();        //延時3us
  54.                 SCK=0;
  55.         }
  56.         DATA=1;                           //釋放數據線
  57.         SCK=1;                           
  58.         error=DATA;                       //檢查應答信號,確認通訊正常
  59.         _nop_();_nop_();_nop_();
  60.         SCK=0;        
  61.         DATA=1;
  62.         return error;                     //error=1 通訊錯誤
  63. }
  64. //讀字節程序
  65. char s_read_byte(unsigned char ack)
  66. {
  67.         unsigned char i,val=0;
  68.         DATA=1;                           //釋放數據線
  69.         for(i=0x80;i>0;i>>=1)             //高位為1,循環右移
  70.         {
  71.                 SCK=1;                        
  72.                 if(DATA) val=(val|i);        //讀一位數據線的值
  73.                 SCK=0;      
  74.         }
  75.         DATA=!ack;                        //如果是校驗,讀取完后結束通訊;
  76.         SCK=1;                           
  77.         _nop_();_nop_();_nop_();          //延時3us
  78.         SCK=0;   
  79.         _nop_();_nop_();_nop_();      
  80.         DATA=1;                           //釋放數據線
  81.         return val;
  82. }
  83. //啟動傳輸
  84. void s_transstart(void)
  85. {
  86.         DATA=1; SCK=0;                   //準備
  87.         _nop_();
  88.         SCK=1;
  89.         _nop_();
  90.         DATA=0;
  91.         _nop_();
  92.         SCK=0;
  93.         _nop_();_nop_();_nop_();
  94.         SCK=1;
  95.         _nop_();
  96.         DATA=1;   
  97.         _nop_();
  98.         SCK=0;   
  99. }
  100. //連接復位
  101. void s_connectionreset(void)
  102. {
  103.         unsigned char i;
  104.         DATA=1;SCK=0;                    //準備
  105.         for(i=0;i<9;i++)                  //DATA保持高,SCK時鐘觸發9次,發送啟動傳輸,通迅即復位
  106.         {
  107.                 SCK=1;
  108.                 SCK=0;
  109.         }
  110.         s_transstart();                   //啟動傳輸
  111. }
  112. //軟復位程序
  113. /*
  114. char s_softreset(void)
  115. {
  116.         unsigned char error=0;
  117.         s_connectionreset();              //啟動連接復位
  118.         error+=s_write_byte(RESET);       //發送復位命令
  119.         return  error;                     //error=1 通訊錯誤
  120. }*/
  121. /*讀狀態寄存器
  122. char s_read_statusreg(unsigned char*p_value, unsigned char *p_checksum)
  123. //----------------------------------------------------------------------------------
  124. // reads the status register with checksum(8-bit)
  125. {
  126.        unsignedchar error=0;
  127.        s_transstart();                   //transmission start
  128.        error=s_write_byte(STATUS_REG_R);//send command to sensor
  129.        *p_value=s_read_byte(ACK);        //read status register (8-bit)
  130.        *p_checksum=s_read_byte(noACK);   //read checksum (8-bit)
  131.        returnerror;                     //error=1 incase of no response form the sensor
  132. }
  133. //寫狀態寄存器
  134. char s_write_statusreg(unsigned char*p_value)
  135. // writes the status register with checksum(8-bit)
  136. {
  137.        unsignedchar error=0;
  138.        s_transstart();                   //transmission start
  139.        error+=s_write_byte(STATUS_REG_W);//sendcommand to sensor
  140.        error+=s_write_byte(*p_value);    //send value of status register
  141.        returnerror;                     //error>=1in case of no response form the sensor
  142. }                                                                                                                              */
  143.          
  144. //溫濕度測量
  145. char s_measure(unsigned char *p_value,unsigned char *p_checksum, unsigned char mode)
  146. // 進行溫度或者濕度轉換,由參數mode決定轉換內容;
  147. {
  148. // enum{TEMP,HUMI};          //已經在頭文件中定義
  149.         unsigned char error=0;
  150.         unsigned int i;
  151.         s_transstart();                   //啟動傳輸
  152.         switch(mode)                     //選擇發送命令
  153.         {     
  154.                 case TEMP : error+=s_write_byte(MEASURE_TEMP);break;                 //測量溫度
  155.                 case HUMI :error+=s_write_byte(MEASURE_HUMI); break;                //測量濕度
  156.                 default     : break;
  157.         }
  158.         for(i=0;i<65535;i++) if(DATA==0) break; //等待測量結束
  159.         if(DATA)error+=1;                // 如果長時間數據線沒有拉低,說明測量錯誤
  160.         *(p_value)=s_read_byte(ACK);    //讀第一個字節,高字節 (MSB)
  161.         *(p_value+1)=s_read_byte(ACK);    //讀第二個字節,低字節 (LSB)
  162.         *p_checksum=s_read_byte(noACK); //read CRC校驗碼
  163.         return error;  // error=1 通訊錯誤
  164. }
  165. //溫濕度值標度變換及溫度補償
  166. void calc_sth10(float *p_humidity ,float*p_temperature)
  167. {
  168.         const float C1=-4.0;              // 12位濕度精度 修正公式
  169.         const float C2=+0.0405;           // 12位濕度精度 修正公式
  170.         const float C3=-0.0000028;        // 12位濕度精度 修正公式
  171.         const float T1=+0.01;             // 14位溫度精度 5V條件 修正公式
  172.         const float T2=+0.00008;          // 14位溫度精度 5V條件  修正公式
  173.         float rh=*p_humidity;             // rh:      12位濕度
  174.         float t=*p_temperature;           // t:       14位溫度
  175.         float rh_lin;                     // rh_lin: 濕度 linear值
  176.         float rh_true;                    // rh_true: 濕度 ture值
  177.         float t_C;                        // t_C   : 溫度 ℃
  178.         t_C=t*0.01- 40;                  //補償溫度
  179.         rh_lin=C3*rh*rh+ C2*rh + C1;     //相對濕度非線性補償
  180.         rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;   //相對濕度對于溫度依賴性補償
  181.         if(rh_true>100)rh_true=100;       //濕度最大修正
  182.         if(rh_true<0.1)rh_true=0.1;       //濕度最小修正
  183.         *p_temperature=t_C;               //返回溫度結果
  184.         *p_humidity=rh_true;              //返回濕度結果
  185. }
  186. //從相對溫度和濕度計算露點
  187. /*float calc_dewpoint(float h,float t)
  188. {
  189.         floatlogEx,dew_point;
  190.         logEx=0.66077+7.5*t/(237.3+t)+(log10(h)-2);
  191.         dew_point= (logEx - 0.66077)*237.3/(0.66077+7.5-logEx);
  192.         returndew_point;
  193. }                                                                         */
  194. /***********************************************************************************************************************************************************/

  195. //內部等待函數**************************************************************
  196. unsigned char LCD_Wait(void)
  197. {
  198.    RS=0;
  199.    RW=1;    _nop_();
  200.    E=1;    _nop_();           
  201.    E=0;
  202.    return DBPort;  
  203. }
  204. //向LCD寫入命令或數據********************************************************
  205. void LCD_Write(bit style, unsigned char input)
  206. {
  207.         E=0;
  208.         RS=style;
  209.         RW=0;
  210.         _nop_();
  211.         DBPort=input;
  212.         _nop_();//注意順序
  213.         E=1;      
  214.         _nop_();//注意順序
  215.         E=0;      
  216.         _nop_();
  217.         LCD_Wait();
  218. }
  219. //設置顯示模式************************************************************

  220. void LCD_SetDisplay(unsigned char DisplayMode)
  221. {
  222.    LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
  223. }
  224. //設置輸入模式************************************************************


  225. void LCD_SetInput(unsigned char InputMode)
  226. {
  227.    LCD_Write(LCD_COMMAND, 0x04|InputMode);
  228. }
  229. //初始化LCD************************************************************
  230. void LCD_Initial()
  231. {
  232.    E=0;
  233.    LCD_Write(LCD_COMMAND,0x38);          //8位數據端口,2行顯示,5*7點陣
  234.    LCD_Write(LCD_COMMAND,0x38);
  235.    LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //開啟顯示, 無光標
  236.    LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
  237.    LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);       //AC遞增, 畫面不動
  238. }
  239. //液晶字符輸入的位置************************
  240. void GotoXY(unsigned char x, unsigned char y)
  241. {
  242.    if(y==0)
  243.        LCD_Write(LCD_COMMAND,0x80|x);
  244.    if(y==1)
  245.        LCD_Write(LCD_COMMAND,0x80|(x-0x40));
  246. }
  247. //將字符輸出到液晶顯示
  248. void Print(unsigned char *str)
  249. {
  250.    while(*str!='\0')
  251.     {
  252.        LCD_Write(LCD_DATA,*str);
  253.        str++;
  254.     }
  255. }

  256. typedef union                            //定義共用同類型
  257. {   
  258.         unsigned int i;
  259.         float f;
  260. } value;
  261. //延時函數
  262. void delay(int z)           //z為毫秒數
  263. {
  264.         int x,y;
  265.         for(x=z;x>0;x--)
  266.                 for(y=125;y>0;y--);
  267. }
  268. void main()
  269. {
  270.         unsigned int temp,humi;
  271.         value humi_val,temp_val;           //定義兩個共同體,一個用于濕度,一個用于溫度
  272.         //floatdew_point;                      //用于記錄露點值
  273.         unsigned char error;                 //用于檢驗是否出現錯誤
  274.         unsigned char checksum;                   //CRC                    
  275.         uchar wendu[6];                               //用于記錄溫度
  276.         uchar shidu[6];                                 //用于記錄濕度
  277.        
  278.        
  279.         LCD_Initial();                                     //初始化液晶            
  280.         GotoXY(0,0);                                //選擇溫度顯示位置
  281.         Print("TEMP:     %C");                     //5格空格
  282.         GotoXY(0,1);                                //選擇濕度顯示位置
  283.         Print("HUMI:     %RH");                  //5格空格
  284.         s_connectionreset();                      //啟動連接復位
  285.         while(1)
  286.         {
  287.                 error=0;                                 //初始化error=0,即沒有錯誤
  288.                 error+=s_measure((unsigned char*)&temp_val.i,&checksum,TEMP); //溫度測量
  289.                 error+=s_measure((unsigned char*)&humi_val.i,&checksum,HUMI); //濕度測量
  290.                 if(error!=0) s_connectionreset();                 ////如果發生錯誤,系統復位
  291.                 else
  292.                 {
  293.                         humi_val.f=(float)humi_val.i;                   //轉換為浮點數
  294.                         temp_val.f=(float)temp_val.i;                   //轉換為浮點數
  295.                         calc_sth10(&humi_val.f,&temp_val.f);            //修正相對濕度及溫度
  296.                         //dew_point=calc_dewpoint(humi_val.f,temp_val.f);//計算e dew_point
  297.                         temp=temp_val.f*10;
  298.                         humi=humi_val.f*10;
  299.                         GotoXY(5,0);                                    //設置溫度顯示位置
  300.                         wendu[0]=temp/1000+'0';               //溫度百位
  301.                         wendu[1]=temp%1000/100+'0';      //溫度十位     
  302.                         wendu[2]=temp%100/10+'0';                     //溫度個位
  303.                         wendu[3]=0x2E;                                       //小數點
  304.                         wendu[4]=temp%10+'0';                           //溫度小數點后第一位        
  305.                         Print(wendu);                                    //輸出溫度            
  306.                         GotoXY(5,1);                                    //設置濕度顯示位置                                 
  307.                         shidu[0]=humi/1000+'0';                //濕度百位
  308.                         shidu[1]=humi%1000/100+'0';        //濕度十位     
  309.                         shidu[2]=humi%100/10+'0';                //濕度個位
  310.                         shidu[3]=0x2E;                                        //小數點
  311.                         shidu[4]=humi%10+'0';                      //濕度小數點后第一位
  312.                         Print(shidu);                                      //輸出濕度        
  313.                 }  
  314.                 delay(800);                             //等待足夠長的時間,以現行下一次轉換                    
  315.         }
  316. }
復制代碼



ID:515587 發表于 2019-4-20 13:47
wc86110 發表于 2019-4-18 16:50
芯片載入程序沒有?

載入了的
ID:96682 發表于 2019-4-18 16:50
芯片載入程序沒有?

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲人成一区二区三区性色 | 欧州一区二区 | 精品国产免费人成在线观看 | 999久久久久久久久6666 | 欧美一区二区久久 | 国产欧美精品一区二区 | 国产精品久久九九 | 日韩欧美国产一区二区 | 亚洲成人一区 | 亚洲精品中文字幕在线 | 久久国产精99精产国高潮 | 国产免费拔擦拔擦8x高清 | 欧美综合一区二区三区 | 久久四虎| 国产成人免费 | 国产精品美女在线观看 | 久草视频观看 | 欧美国产精品 | 久草免费在线视频 | 亚洲综合一区二区三区 | 国产日韩一区二区三免费 | 欧美精品区 | 婷婷久久综合 | 久久久网| 久久精品久久久 | 亚洲一区二区久久久 | 国产精品色婷婷久久58 | 91黄色免费看 | 第一区在线观看免费国语入口 | 亚洲国产精品久久人人爱 | 中文字幕欧美日韩一区 | 精品国产91亚洲一区二区三区www | 在线午夜 | 最新免费黄色网址 | 国产欧美精品一区 | 精品1区2区 | 99免费精品 | 欧美九九 | 亚洲成人综合社区 | 欧美日韩综合视频 | 午夜av成人 |