用的STC8H1K17芯片,用按键信号控制P1.2和P1.3端口输出高低电平,结果始终都是低电平,不受按键控制。更换到P1.4/P1.5/P1.6端口都不行。更换到P1.7/P5.4端口就可以。摸索了半天还没找到问题。在此请教各位大师帮忙看看。是不是端口配置没有配置好。拜谢!单片机源代码如下:
- #include "STC8H.H"
- #include "inerins.h"
- #define ADC_POWER 0X80 //ADC电源控制位
- #define ADC_FLAG 0X10 //ADC完成标志位
- #define ADC_START 0X08 //ADC启动控制位
- #define ADC_SPEED0 0X00 //ADC转换速度,一次转换需要540个时钟
- #define ADC_SPEED1 0X20 //ADC转换速度,一次转换需要360个时钟
- #define ADC_SPEED2 0X40 //ADC转换速度,一次转换需要180个时钟
- #define ADC_SPEED3 0X60 //ADC转换速度,一次转换需要90个时钟
- #define N 8 //ADC采样使用递推平均滤波算法
- typedef unsigned int u16;
- typedef unsigned char u8; //对数据类型进行定义
- u16 press_delay = 0; //按下计数器标志位
- u16 release_delay = 0; //放开计数器标志位
- u8 key_val = 0; //按键标志位
- u8 click_count = 0; //按键的次数
- unsigned int temp_buf[N+1];
- unsigned int xdata BV_buf[N+1];
- unsigned int BGV=0;
- unsigned int temp=0;
- unsigned char num,ADCcount=0,ADCcount2=0,ADCcount3=0,ADCcount4=0; //ADC采样次数变量
- unsigned char hour=0,minute=0,second=0,time_count=0,time_count2=0,time_count3;
- bit flag_400ms=1,flag_1s=1,flag_5s=1;
- bit flag_1ms = 0; //1ms标志位
- /******************************************************
- NTC电阻采用10K ;接线方式如下
- VCC---NTC(10K)---R10K---GND
- |
- |
- ADC
- NTC使用MF52-103/3435;10K±1%精度;B值:3435±1%
- *****************************************************/
- /*******************************
- NTC接VCC,固定电阻接GND,阻值ADC查询表
- ************************************/
- unsigned int code NTCcode[] = {
- 0x3D3,
- 0x3D1,
- 0x3CE,
- 0x3CB,
- 0x3C8,
- 0x3C5,
- 0x3C2,
- 0x3BE,
- 0x3BB,
- 0x3B7,
- 0x3B3,
- 0x3AF,
- 0x3AB,
- 0x3A7,
- 0x3A2,
- 0x39E,
- 0x399,
- 0x394,
- 0x38F,
- 0x389,
- 0x384,
- 0x37E,
- 0x378,
- 0x372,
- 0x36C,
- 0x366,
- 0x35F,
- 0x358,
- 0x352,
- 0x34A,
- 0x343,
- 0x033C,
- 0x334,
- 0x32C,
- 0x324,
- 0x31C,
- 0x314,
- 0x30C,
- 0x303,
- 0x2FB,
- 0x2F2,
- 0x2E9,
- 0x2E0,
- 0x2D7,
- 0x2CD,
- 0x2C4,
- 0x2BB,
- 0x2B1,
- 0x2A7,
- 0x29E,
- 0x294,
- 0x28A,
- 0x280,
- 0x276,
- 0x26C,
- 0x263,
- 0x259,
- 0x24F,
- 0x245,
- 0x23B,
- 0x231,
- 0x21F,
- 0x21D,
- 0x213,
- 0x209,
- 0x200,
- 0x1F6,
- 0x1EC,
- 0x1E3,
- 0x1D9,
- 0x1D0,
- 0x1C6,
- 0x1BD,
- 0x1B4,
- 0x1AB,
- 0x1A2,
- 0x199,
- 0x191,
- 0x188,
- 0x180,
- 0x177,
- 0x16F,
- 0x167,
- 0x15F,
- 0x157,
- 0x150,
- 0x148,
- 0x141,
- 0x139,
- 0x132,
- 0x12B,
- 0x124,
- 0x11E,
- 0x117,
- 0x110,
- 0x10A,
- 0x103,
- 0xFE,
- 0xF8,
- 0xF2,
- 0xEC,
- 0xE7,
- 0xE1,
- 0xDC,
- 0xD7,
- 0xD1,
- 0xCC,
- 0xC8,
- 0xC3,
- 0xBE,
- 0xBA,
- 0xB5,
- 0xB1,
- 0xAD,
- 0xA9,
- 0xA5,
- 0xA1,
- 0x9D,
- 0x99,
- 0x95,
- 0x92,
- 0x8E,
- 0x8B,
- 0x88,
- 0x84,
- 0x81,
- 0x7E,
- 0x7B,
- 0x78,
- 0x75,
- 0x73,
- 0x70,
- 0x6D,
- 0x6B,
- 0x68,
- 0x66,
- 0x64,
- 0x61,
- 0x5F,
- 0x5D,
- 0x5B,
- 0x59,
- 0x57,
- 0x55,
- 0x53,
- 0x51,
- };
- sbit LED_5=P3^6; //电量20%亮灯指示
- sbit LED_6=P3^5; //电量40%亮灯指示
- sbit LED_3=P3^4; //电量60%亮灯指示
- sbit LED_4=P3^3; //电量100%亮灯指示
- sbit FAN=P3^7; //散热风扇控制
- sbit FLK=P1^3; //高频控制
- sbit key1=P3^2; //按键1控制端口
- sbit key2=P1^5; //按键2控制端口
- sbit EN = P1^7; /开机控制端口
- sbit HC = P1^2; //高低档控制
- /********************************************************
- * 函数名: Timer0_Init()
- * 函数功能: 定时器技术功能
- *******************************************************/
- void Timer0_Init()
- {
- TMOD|=0x01; //选择定时器0的工作模式为1,仅用TR0打开
- TH0 =0xfc; //给定时器赋初始值为1ms
- TL0 =0x18;
- ET0 = 1; //打开定时器0的中断允许
- EA = 1; //打开总中断
- TR0 = 1; //打开定时器
- }
- void Timer0()interrupt 1
- {
- TH0 = 0xfc; //给定时器赋初始值为1ms
- TL0 = 0x18;
- flag_1ms = 1; //1ms标志位
- }
- /***************************
- 初始化ADC寄存器子函数
- ***************************/
- void Init_ADC (void)
- {
- P1M1 = 0x7c;
- P1M0 = 0x8f;
- ADC_CONTR = 0XE2;
- ADC_CONTR = 0XE3;
- }
- /************************************************
- 按键控制子函数
- * 函数名: key_pros
- * 函数功能:实现key1按键长按开启H的工作;
- ***************************************************/
- void key_pros()
- {
- if(flag_1ms==1)
- {
- flag_1ms = 0;
- if(key1==0) //判断模式按键是否按下
- {
- if(press_delay<0xffff)press_delay++;
- if(press_delay==20) //20ms消抖处理
- {
- click_count++;
- }
- if(press_delay==3000)
- {
- key_val = 10;
- }
- release_delay = 0;
- }
- else
- {
- if(press_delay<0xff)release_delay++;
- if(release_delay==200)
- if(press_delay<3000)
- {
- key_val = click_count;
- click_count = 0;
- }
- press_delay = 0;
- }
- if(key_val > 0) //若有按键按下
- {
- if(key_val==10) //长按1.5s
- {
- EN = ~EN; //EN控制端状态取反
- LED_4 = ~LED_4;
- }
- else if(key_val==1)
- {
- HC = ~HC; //HC控制端状态取反
- LED_3 = ~LED_3;
- }
- else if(key_val==2)
- {
- FLK = ~FLK; //FLK控制端口状态取反
- LED_6 = ~LED_6;
- }
- else if(key_val==3)
- {
- FAN = ~FAN; //手动开启散热风扇,连续按3次状态取反关闭风扇。
- }
- key_val = 0;
- }
- }
- }
- /*************************************
- 程序主函数
- * 函数名: main
- * 函数功能:允许各子函数模块并循环
- ****************************************/
- void main (void)
- {
- Timer0_Init(); //初始化定时器
- Init_ADC(); //初始化ADC
- P3M0 = 0xff;
- P3M1 = 0x7f;
- P5M0 = 0X00;
- P5M1 = 0x00;
- HC = 1;
- EN = 0;
- FLK = 1;
- FAN = 0;
- LED_4 = 0;
- LED_5 = 0;
- while(1)
- {
- key_pros(); //处理按键功能函数
- }
- }
复制代码 |