找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2122|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

STC8H1K17單片機(jī)的P1.2和P1.3端口無(wú)法輸出高低電平問(wèn)題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1001745 發(fā)表于 2022-11-23 15:23 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
用的STC8H1K17芯片,用按鍵信號(hào)控制P1.2和P1.3端口輸出高低電平,結(jié)果始終都是低電平,不受按鍵控制。更換到P1.4/P1.5/P1.6端口都不行。更換到P1.7/P5.4端口就可以。摸索了半天還沒(méi)找到問(wèn)題。在此請(qǐng)教各位大師幫忙看看。是不是端口配置沒(méi)有配置好。拜謝!單片機(jī)源代碼如下:
  1. #include "STC8H.H"
  2. #include "inerins.h"

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

  11. typedef unsigned int u16;
  12. typedef unsigned char u8;    //對(duì)數(shù)據(jù)類型進(jìn)行定義
  13. u16 press_delay = 0;         //按下計(jì)數(shù)器標(biāo)志位
  14. u16 release_delay = 0;       //放開(kāi)計(jì)數(shù)器標(biāo)志位
  15. u8 key_val = 0;              //按鍵標(biāo)志位
  16. u8 click_count = 0;          //按鍵的次數(shù)


  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采樣次數(shù)變量
  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標(biāo)志位

  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,阻值A(chǔ)DC查詢表
  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;                   //散熱風(fēng)扇控制
  189. sbit  FLK=P1^3;                   //高頻控制
  190. sbit  key1=P3^2;          //按鍵1控制端口
  191. sbit  key2=P1^5;          //按鍵2控制端口
  192. sbit  EN = P1^7;        /開(kāi)機(jī)控制端口
  193. sbit  HC = P1^2;            //高低檔控制

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

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

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

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

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

  223. /************************************************
  224. 按鍵控制子函數(shù)
  225. * 函數(shù)名:  key_pros
  226. * 函數(shù)功能:實(shí)現(xiàn)key1按鍵長(zhǎng)按開(kāi)啟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)         //長(zhǎng)按1.5s
  260.    {
  261.     EN = ~EN;      //EN控制端狀態(tài)取反
  262.         LED_4 = ~LED_4;
  263.    }
  264.    else if(key_val==1)
  265.    {
  266.     HC = ~HC;     //HC控制端狀態(tài)取反
  267.         LED_3 = ~LED_3;
  268.    }
  269.    else if(key_val==2)
  270.    {
  271.     FLK = ~FLK;    //FLK控制端口狀態(tài)取反
  272.         LED_6 = ~LED_6;
  273.    }
  274.     else if(key_val==3)
  275.    {
  276.     FAN = ~FAN;           //手動(dòng)開(kāi)啟散熱風(fēng)扇,連續(xù)按3次狀態(tài)取反關(guān)閉風(fēng)扇。
  277.    }
  278.    key_val = 0;
  279.   }
  280. }
  281. }

  282. /*************************************
  283. 程序主函數(shù)
  284. *  函數(shù)名:  main
  285. *  函數(shù)功能:允許各子函數(shù)模塊并循環(huán)

  286. ****************************************/
  287. void main (void)
  288. {
  289.   Timer0_Init();     //初始化定時(shí)器
  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();     //處理按鍵功能函數(shù)
  304.   }
  305. }
復(fù)制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:213173 發(fā)表于 2022-11-23 16:44 | 只看該作者
你的端口模式配置錯(cuò)誤,按鍵輸入通常用準(zhǔn)雙向模式,輸出端口用準(zhǔn)雙向或推挽模式。
void Init_ADC (void)
{
        P1M1 = 0x7c;
        P1M0 = 0x8f;
        ADC_CONTR = 0XE2;
        ADC_CONTR = 0XE3;  
}
回復(fù)

使用道具 舉報(bào)

板凳
ID:77589 發(fā)表于 2022-11-23 17:14 | 只看該作者
肯定是IO口工作模式設(shè)置錯(cuò)誤,沒(méi)有用過(guò)這款MCU,沒(méi)法具體給出建議。好好去看一下這款MCU的Datasheet
回復(fù)

使用道具 舉報(bào)

地板
ID:430492 發(fā)表于 2022-11-23 17:22 | 只看該作者
同意樓主兩位壇友的觀點(diǎn),好好看看數(shù)據(jù)手冊(cè)吧!
回復(fù)

使用道具 舉報(bào)

5#
ID:430492 發(fā)表于 2022-11-23 17:38 | 只看該作者
P1M1 &= 0xF3;   //P1.2,P1.3位為0;設(shè)置為推挽模式
P1M0 &= 0xFF;   //P1.2,P1.3位為1;設(shè)置為推挽模式
回復(fù)

使用道具 舉報(bào)

6#
ID:1001745 發(fā)表于 2022-11-23 17:38 | 只看該作者
wulin 發(fā)表于 2022-11-23 16:44
你的端口模式配置錯(cuò)誤,按鍵輸入通常用準(zhǔn)雙向模式,輸出端口用準(zhǔn)雙向或推挽模式。
void Init_ADC (void)
...

謝謝大師指導(dǎo),我剛剛?cè)タ戳艘?guī)格書(shū)了。要重新配置端口:“P1M1=0X00;P1M0=0X00”就可以了。但是又出現(xiàn)新問(wèn)題了,原先的EN端口能正常輸出5V的高電平,但是現(xiàn)在EN端口只能輸出2.9V的高電平。
回復(fù)

使用道具 舉報(bào)

7#
ID:1001745 發(fā)表于 2022-11-23 17:39 | 只看該作者
Longan.Wang 發(fā)表于 2022-11-23 17:14
肯定是IO口工作模式設(shè)置錯(cuò)誤,沒(méi)有用過(guò)這款MCU,沒(méi)法具體給出建議。好好去看一下這款MCU的Datasheet

謝謝大師回復(fù),我也是剛剛?cè)腴T(mén)學(xué)習(xí)單片機(jī)。所以不精通。不過(guò)看了一下規(guī)格書(shū)確實(shí)需要重新配置端口。
回復(fù)

使用道具 舉報(bào)

8#
ID:1001745 發(fā)表于 2022-11-23 17:40 | 只看該作者
cooleaf 發(fā)表于 2022-11-23 17:22
同意樓主兩位壇友的觀點(diǎn),好好看看數(shù)據(jù)手冊(cè)吧!

好的,謝謝你建議
回復(fù)

使用道具 舉報(bào)

9#
ID:1034262 發(fā)表于 2022-11-24 09:53 | 只看該作者
先簡(jiǎn)單測(cè)試。IO懸空,示波器觀察。
void main(void)
{
     P1M1 = 0x00;
     P1M0 = 0x00;
     while(1)
     {
           P1 = ~P1;
     }
}
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表