找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1068|回复: 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. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
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 | 只看该作者
同意楼主两位坛友的观点,好好看看数据手册吧!
回复

使用道具 举报

5#
ID:430492 发表于 2022-11-23 17:38 | 只看该作者
P1M1 &= 0xF3;   //P1.2,P1.3位为0;设置为推挽模式
P1M0 &= 0xFF;   //P1.2,P1.3位为1;设置为推挽模式
回复

使用道具 举报

6#
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的高电平。
回复

使用道具 举报

7#
ID:1001745 发表于 2022-11-23 17:39 | 只看该作者
Longan.Wang 发表于 2022-11-23 17:14
肯定是IO口工作模式设置错误,没有用过这款MCU,没法具体给出建议。好好去看一下这款MCU的Datasheet

谢谢大师回复,我也是刚刚入门学习单片机。所以不精通。不过看了一下规格书确实需要重新配置端口。
回复

使用道具 举报

8#
ID:1001745 发表于 2022-11-23 17:40 | 只看该作者
cooleaf 发表于 2022-11-23 17:22
同意楼主两位坛友的观点,好好看看数据手册吧!

好的,谢谢你建议
回复

使用道具 举报

9#
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 单片机教程网

快速回复 返回顶部 返回列表