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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2069|回復: 8
收起左側

STC8H1K17單片機的P1.2和P1.3端口無法輸出高低電平問題

[復制鏈接]
ID:1001745 發表于 2022-11-23 15:23 | 顯示全部樓層 |閱讀模式
用的STC8H1K17芯片,用按鍵信號控制P1.2和P1.3端口輸出高低電平,結果始終都是低電平,不受按鍵控制。更換到P1.4/P1.5/P1.6端口都不行。更換到P1.7/P5.4端口就可以。摸索了半天還沒找到問題。在此請教各位大師幫忙看看。是不是端口配置沒有配置好。拜謝!單片機源代碼如下:
  1. #include "STC8H.H"
  2. #include "inerins.h"

  3. #define ADC_POWER  0X80   //ADC電源控制位
  4. #define ADC_FLAG   0X10   //ADC完成標志位                        
  5. #define ADC_START  0X08   //ADC啟動控制位
  6. #define ADC_SPEED0 0X00   //ADC轉換速度,一次轉換需要540個時鐘
  7. #define ADC_SPEED1 0X20   //ADC轉換速度,一次轉換需要360個時鐘
  8. #define ADC_SPEED2 0X40   //ADC轉換速度,一次轉換需要180個時鐘
  9. #define ADC_SPEED3 0X60   //ADC轉換速度,一次轉換需要90個時鐘
  10. #define N 8               //ADC采樣使用遞推平均濾波算法

  11. typedef unsigned int u16;
  12. typedef unsigned char u8;    //對數據類型進行定義
  13. u16 press_delay = 0;         //按下計數器標志位
  14. u16 release_delay = 0;       //放開計數器標志位
  15. u8 key_val = 0;              //按鍵標志位
  16. u8 click_count = 0;          //按鍵的次數


  17. unsigned  int temp_buf[N+1];
  18. unsigned  int xdata BV_buf[N+1];
  19. unsigned  int  BGV=0;
  20. unsigned  int  temp=0;
  21. unsigned char num,ADCcount=0,ADCcount2=0,ADCcount3=0,ADCcount4=0;        //ADC采樣次數變量
  22. unsigned char hour=0,minute=0,second=0,time_count=0,time_count2=0,time_count3;
  23. bit flag_400ms=1,flag_1s=1,flag_5s=1;
  24. bit flag_1ms = 0;            //1ms標志位

  25. /******************************************************
  26. NTC電阻采用10K ;接線方式如下

  27. VCC---NTC(10K)---R10K---GND
  28.                   |
  29.                               |                                 
  30.                          ADC
  31. NTC使用MF52-103/3435;10K±1%精度;B值:3435±1%
  32. *****************************************************/
  33. /*******************************
  34. NTC接VCC,固定電阻接GND,阻值ADC查詢表
  35. ************************************/
  36. unsigned int code NTCcode[] = {
  37. 0x3D3,
  38. 0x3D1,
  39. 0x3CE,
  40. 0x3CB,
  41. 0x3C8,
  42. 0x3C5,
  43. 0x3C2,
  44. 0x3BE,
  45. 0x3BB,
  46. 0x3B7,
  47. 0x3B3,
  48. 0x3AF,
  49. 0x3AB,
  50. 0x3A7,
  51. 0x3A2,
  52. 0x39E,
  53. 0x399,
  54. 0x394,
  55. 0x38F,
  56. 0x389,
  57. 0x384,
  58. 0x37E,
  59. 0x378,
  60. 0x372,
  61. 0x36C,
  62. 0x366,
  63. 0x35F,
  64. 0x358,
  65. 0x352,
  66. 0x34A,
  67. 0x343,
  68. 0x033C,
  69. 0x334,
  70. 0x32C,
  71. 0x324,
  72. 0x31C,
  73. 0x314,
  74. 0x30C,
  75. 0x303,
  76. 0x2FB,
  77. 0x2F2,
  78. 0x2E9,
  79. 0x2E0,
  80. 0x2D7,
  81. 0x2CD,
  82. 0x2C4,
  83. 0x2BB,
  84. 0x2B1,
  85. 0x2A7,
  86. 0x29E,
  87. 0x294,
  88. 0x28A,
  89. 0x280,
  90. 0x276,
  91. 0x26C,
  92. 0x263,
  93. 0x259,
  94. 0x24F,
  95. 0x245,
  96. 0x23B,
  97. 0x231,
  98. 0x21F,
  99. 0x21D,
  100. 0x213,
  101. 0x209,
  102. 0x200,
  103. 0x1F6,
  104. 0x1EC,
  105. 0x1E3,
  106. 0x1D9,
  107. 0x1D0,
  108. 0x1C6,
  109. 0x1BD,
  110. 0x1B4,
  111. 0x1AB,
  112. 0x1A2,
  113. 0x199,
  114. 0x191,
  115. 0x188,
  116. 0x180,
  117. 0x177,
  118. 0x16F,
  119. 0x167,
  120. 0x15F,
  121. 0x157,
  122. 0x150,
  123. 0x148,
  124. 0x141,
  125. 0x139,
  126. 0x132,
  127. 0x12B,
  128. 0x124,
  129. 0x11E,
  130. 0x117,
  131. 0x110,
  132. 0x10A,
  133. 0x103,
  134. 0xFE,
  135. 0xF8,
  136. 0xF2,
  137. 0xEC,
  138. 0xE7,
  139. 0xE1,
  140. 0xDC,
  141. 0xD7,
  142. 0xD1,
  143. 0xCC,
  144. 0xC8,
  145. 0xC3,                        
  146. 0xBE,
  147. 0xBA,
  148. 0xB5,
  149. 0xB1,
  150. 0xAD,
  151. 0xA9,
  152. 0xA5,
  153. 0xA1,
  154. 0x9D,
  155. 0x99,
  156. 0x95,
  157. 0x92,
  158. 0x8E,
  159. 0x8B,
  160. 0x88,
  161. 0x84,
  162. 0x81,
  163. 0x7E,
  164. 0x7B,
  165. 0x78,
  166. 0x75,
  167. 0x73,
  168. 0x70,
  169. 0x6D,
  170. 0x6B,
  171. 0x68,
  172. 0x66,
  173. 0x64,
  174. 0x61,
  175. 0x5F,
  176. 0x5D,
  177. 0x5B,
  178. 0x59,
  179. 0x57,
  180. 0x55,
  181. 0x53,
  182. 0x51,
  183. };


  184. sbit LED_5=P3^6;                //電量20%亮燈指示
  185. sbit LED_6=P3^5;                //電量40%亮燈指示
  186. sbit LED_3=P3^4;                //電量60%亮燈指示
  187. sbit LED_4=P3^3;                //電量100%亮燈指示
  188. sbit  FAN=P3^7;                   //散熱風扇控制
  189. sbit  FLK=P1^3;                   //高頻控制
  190. sbit  key1=P3^2;          //按鍵1控制端口
  191. sbit  key2=P1^5;          //按鍵2控制端口
  192. sbit  EN = P1^7;        /開機控制端口
  193. sbit  HC = P1^2;            //高低檔控制

  194. /********************************************************
  195. * 函數名:    Timer0_Init()
  196. * 函數功能:  定時器技術功能

  197. *******************************************************/
  198. void Timer0_Init()
  199. {
  200. TMOD|=0x01;                   //選擇定時器0的工作模式為1,僅用TR0打開
  201. TH0  =0xfc;                   //給定時器賦初始值為1ms
  202. TL0  =0x18;           
  203. ET0  = 1;            //打開定時器0的中斷允許
  204. EA   = 1;            //打開總中斷
  205. TR0  = 1;            //打開定時器
  206. }

  207. void Timer0()interrupt 1
  208. {
  209. TH0 = 0xfc;         //給定時器賦初始值為1ms
  210. TL0 = 0x18;         
  211. flag_1ms = 1;       //1ms標志位
  212. }

  213. /***************************
  214. 初始化ADC寄存器子函數
  215. ***************************/

  216. void Init_ADC (void)
  217. {
  218. P1M1 = 0x7c;
  219. P1M0 =        0x8f;
  220. ADC_CONTR = 0XE2;
  221. ADC_CONTR = 0XE3;  
  222. }

  223. /************************************************
  224. 按鍵控制子函數
  225. * 函數名:  key_pros
  226. * 函數功能:實現key1按鍵長按開啟H的工作;
  227. ***************************************************/
  228. void key_pros()
  229. {
  230. if(flag_1ms==1)
  231. {
  232.   flag_1ms = 0;
  233.   if(key1==0)           //判斷模式按鍵是否按下
  234.   {
  235.    if(press_delay<0xffff)press_delay++;
  236.    if(press_delay==20)                 //20ms消抖處理
  237.    {
  238.     click_count++;
  239.    }
  240.    if(press_delay==3000)
  241.    {
  242.     key_val = 10;
  243.    }
  244.    release_delay = 0;
  245.   }
  246.   else
  247.   {
  248.    if(press_delay<0xff)release_delay++;
  249.    if(release_delay==200)
  250.    if(press_delay<3000)
  251.    {
  252.     key_val = click_count;
  253.         click_count = 0;
  254.    }
  255.    press_delay = 0;
  256.   }
  257.   if(key_val > 0)         //若有按鍵按下
  258.   {
  259.    if(key_val==10)         //長按1.5s
  260.    {
  261.     EN = ~EN;      //EN控制端狀態取反
  262.         LED_4 = ~LED_4;
  263.    }
  264.    else if(key_val==1)
  265.    {
  266.     HC = ~HC;     //HC控制端狀態取反
  267.         LED_3 = ~LED_3;
  268.    }
  269.    else if(key_val==2)
  270.    {
  271.     FLK = ~FLK;    //FLK控制端口狀態取反
  272.         LED_6 = ~LED_6;
  273.    }
  274.     else if(key_val==3)
  275.    {
  276.     FAN = ~FAN;           //手動開啟散熱風扇,連續按3次狀態取反關閉風扇。
  277.    }
  278.    key_val = 0;
  279.   }
  280. }
  281. }

  282. /*************************************
  283. 程序主函數
  284. *  函數名:  main
  285. *  函數功能:允許各子函數模塊并循環

  286. ****************************************/
  287. void main (void)
  288. {
  289.   Timer0_Init();     //初始化定時器
  290.   Init_ADC();       //初始化ADC
  291.    P3M0 = 0xff;
  292.    P3M1 = 0x7f;
  293.    P5M0 = 0X00;
  294.    P5M1 = 0x00;
  295.    HC = 1;
  296.    EN = 0;
  297.    FLK = 1;
  298.    FAN = 0;
  299.    LED_4 = 0;
  300.    LED_5 = 0;
  301.   while(1)
  302.   {
  303.    key_pros();     //處理按鍵功能函數
  304.   }
  305. }
復制代碼
回復

使用道具 舉報

ID:213173 發表于 2022-11-23 16:44 | 顯示全部樓層
你的端口模式配置錯誤,按鍵輸入通常用準雙向模式,輸出端口用準雙向或推挽模式。
void Init_ADC (void)
{
        P1M1 = 0x7c;
        P1M0 = 0x8f;
        ADC_CONTR = 0XE2;
        ADC_CONTR = 0XE3;  
}
回復

使用道具 舉報

ID:77589 發表于 2022-11-23 17:14 | 顯示全部樓層
肯定是IO口工作模式設置錯誤,沒有用過這款MCU,沒法具體給出建議。好好去看一下這款MCU的Datasheet
回復

使用道具 舉報

ID:430492 發表于 2022-11-23 17:22 | 顯示全部樓層
同意樓主兩位壇友的觀點,好好看看數據手冊吧!
回復

使用道具 舉報

ID:430492 發表于 2022-11-23 17:38 | 顯示全部樓層
P1M1 &= 0xF3;   //P1.2,P1.3位為0;設置為推挽模式
P1M0 &= 0xFF;   //P1.2,P1.3位為1;設置為推挽模式
回復

使用道具 舉報

ID:1001745 發表于 2022-11-23 17:38 | 顯示全部樓層
wulin 發表于 2022-11-23 16:44
你的端口模式配置錯誤,按鍵輸入通常用準雙向模式,輸出端口用準雙向或推挽模式。
void Init_ADC (void)
...

謝謝大師指導,我剛剛去看了規格書了。要重新配置端口:“P1M1=0X00;P1M0=0X00”就可以了。但是又出現新問題了,原先的EN端口能正常輸出5V的高電平,但是現在EN端口只能輸出2.9V的高電平。
回復

使用道具 舉報

ID:1001745 發表于 2022-11-23 17:39 | 顯示全部樓層
Longan.Wang 發表于 2022-11-23 17:14
肯定是IO口工作模式設置錯誤,沒有用過這款MCU,沒法具體給出建議。好好去看一下這款MCU的Datasheet

謝謝大師回復,我也是剛剛入門學習單片機。所以不精通。不過看了一下規格書確實需要重新配置端口。
回復

使用道具 舉報

ID:1001745 發表于 2022-11-23 17:40 | 顯示全部樓層
cooleaf 發表于 2022-11-23 17:22
同意樓主兩位壇友的觀點,好好看看數據手冊吧!

好的,謝謝你建議
回復

使用道具 舉報

ID:1034262 發表于 2022-11-24 09:53 | 顯示全部樓層
先簡單測試。IO懸空,示波器觀察。
void main(void)
{
     P1M1 = 0x00;
     P1M0 = 0x00;
     while(1)
     {
           P1 = ~P1;
     }
}
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久在线视频播放免费视频 | 91偷拍精品一区二区三区 | 精品一区二区久久久久久久网精 | 国产精品综合网 | 国产精品高清一区二区三区 | 国产精品精品久久久 | 日韩精品区 | 国产精品美女久久久久aⅴ国产馆 | 日本免费一区二区三区四区 | 超碰超碰 | 曰批视频在线观看 | 日日天天 | 日日干干夜夜 | 99热最新 | 国产乱码一二三区精品 | 精精国产xxxx视频在线播放 | 亚洲最大的成人网 | 日韩精品成人一区二区三区视频 | 日韩高清一区 | 艹逼网| 天天草视频 | 亚洲九色| 成年人在线视频 | 精品一区二区三区视频在线观看 | 久久欧美高清二区三区 | 日本黄色免费视频 | 国产一区二区三区在线免费观看 | 在线观看中文字幕视频 | 亚洲国产成人精品女人 | 中文字幕日韩一区 | 日韩欧美在线观看 | av手机免费在线观看 | 久久国产精品一区二区 | 精品1区2区 | 操人网站 | 国产日韩欧美在线播放 | 久久久夜| 中文字幕高清 | 三级在线观看 | 国产高清免费 | 色视频成人在线观看免 |