ding731868572 发表于 2019-10-28 10:07:56

STC8F1K08单片机,按照手册上先使能上拉,还是读不到IO的电平

本帖最后由 ding731868572 于 2019-10-28 10:49 编辑

1.最近STC8F1K08单片机,来做433M无线接收,用的P5.5口作为数据接收口,按照手册上的要求读IO电平,读到的总是1怎么回事?
2.P5.4 P5.5那两个IO口电平只有1v,电平有点不太对,读IO时,那个口线那里要加上拉电阻吗?,下面是原理图,和代码
#include "config.h"
#include "timer.h"
#include "EEPROM.H"


sbit SHDN= P5^4;        //


sbit key1 = P3^1;
sbit key2 = P3^2;
sbit key3 = P3^3;

#define   KEY1   0x60
#define   KEY2   0x61
#define   KEY3   0x62


u8 read_key2;
u32 test =0;
u16 test1 =0;

/* =============================================
PnM1PnM0
0   0准双向IO口 (传统8051模式 ,弱上拉)
        0   1推挽输出 强上拉
        1   0高阻输入 电流既不能输入,也不能输出
        1   1开漏输出,内部上拉电阻断开
============================================= */
void RF_code_process(void);



// ===================== 主函数 =====================
void main(void)
{

        //所有I/O口全设为准双向,弱上拉模式
        P3M0=0x00;        P3M1=0x00;//P3端口I/O口全设为准双向,弱上拉模式
        P5M0=0x00;        P5M1=0x00;//P5端口I/O口全设为准双向,弱上拉模式   

   
        Timer0Init();                //50微秒@12.000MHz
        EA = 1;        //允许总中断
       
       key2 = 1;   //读取端口前先使能内部弱上拉电阻
        _nop_();    //等待两个时钟
        _nop_();
      read_key2 = key2;//读取端口状态
   while(1)
    {
               
      RF_code_process();
               
               
       if(test==20000)
        {
                        test= 0;
                        key2 = !key2;   //测试定时器时间
                        key3 = !key3;
        }
   }
       
}

monarchess 发表于 2019-10-29 09:24:46

楼主问题解决了吗?可以加Q细聊   2593903262

ding731868572 发表于 2019-10-29 10:01:58

monarchess 发表于 2019-10-29 09:24
楼主问题解决了吗?可以加Q细聊   2593903262

好的,加你了

health 发表于 2019-10-29 10:29:22

用高阻输入啊,不能接上拉也不能开内部上拉。

小李非刀 发表于 2019-10-29 11:20:10

作为测试,值需要一条指令测试下:
void main(void)
{
   P3M0 = 0;
    P3M0 = 1;
   while(1)
{
      P30 = P55:
}
}

这样,P3.0输出状态一直跟着P5.5输入,双踪示波器就可以看到结果。

ding731868572 发表于 2019-10-29 13:20:29

小李非刀 发表于 2019-10-29 11:20
作为测试,值需要一条指令测试下:
void main(void)
{


好的,我测试下

ding731868572 发表于 2019-11-1 15:42:42

小李非刀 发表于 2019-10-29 11:20
作为测试,值需要一条指令测试下:
void main(void)
{



定时器实际测试没问题了,eeprom读写遇到了问题

STC8F1K08的eeprom读写

#define EE_ADDRESS1        0x1C00//在第7k的位置写eeprom数据

void        DisableEEPROM(void)
{
        IAP_CONTR = 0;                        //禁止ISP/IAP操作
        IAP_CMD   = 0;                        //去除ISP/IAP命令
        IAP_TRIG= 0;                        //防止ISP/IAP命令误触发
        IAP_ADDRH = 0xff;                //清0地址高字节
        IAP_ADDRL = 0xff;                //清0地址低字节,指向非EEPROM区,防止误操作
       
//        IAP_CONTR = 0;                              //关闭IAP功能
//    IAP_CMD = 0;                              //清除命令寄存器
//    IAP_TRIG = 0;                               //清除触发寄存器
//    IAP_ADDRH = 0x80;                           //将地址设置到非IAP区域
//    IAP_ADDRL = 0;
}
void EEPROM_SectorErase(u16 EE_address)
{
        F0 = EA;
        EA = 0;                //禁止中断
        IAP_ADDRH = EE_address / 256;                        //送扇区地址高字节(地址需要改变时才需重新送地址)
        IAP_ADDRL = EE_address % 256;                        //送扇区地址低字节
        IAP_CONTR = ENABLE_IAP;
        IAP_CMD   = CMD_ERASE;
        IAP_TRIG= 0x5a;        IAP_TRIG= 0xa5;
        _nop_();
        DisableEEPROM();
        EA = F0;                //重新允许中断
}
void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u16 number)
{
        F0 = EA;
        EA = 0;                //禁止中断
        IAP_CONTR = ENABLE_IAP;
        IAP_CMD   = CMD_READ;
        do
        {
                IAP_ADDRH = EE_address / 256;                //送地址高字节(地址需要改变时才需重新送地址)
                IAP_ADDRL = EE_address % 256;                //送地址低字节
                IAP_TRIG= 0x5a;        IAP_TRIG= 0xa5;
                _nop_();
                *DataAddress = IAP_DATA;                        //读出的数据送往
                EE_address++;
                DataAddress++;
        }while(--number);

        DisableEEPROM();
        EA = F0;                //重新允许中断
}
void EEPROM_write_n(u16 EE_address,u8 *DataAddress,u16 number)
{
        F0 = EA;
        EA = 0;                //禁止中断
        IAP_CONTR = ENABLE_IAP;
        IAP_CMD   = CMD_PROGRAM;
        do
        {
                IAP_ADDRH = EE_address / 256;                //送地址高字节(地址需要改变时才需重新送地址)
                IAP_ADDRL = EE_address % 256;                //送地址低字节
                IAP_DATA= *DataAddress;                        //送数据到IAP_DATA,只有数据改变时才需重新送
                IAP_TRIG= 0x5a;        IAP_TRIG= 0xa5;
                _nop_();
                EE_address++;
                DataAddress++;
        }while(--number);

        DisableEEPROM();
        EA = F0;                //重新允许中断
       


}

ADDR_BUF=0x01;
ADDR_BUF=0x02 ;
EEPROM_SectorErase(EE_ADDRESS1); //扇区擦除
EEPROM_write_n(EE_ADDRESS1, ADDR_BUF, 20);//写数据       

版主 我这样写数据好像没写成功,看手册上STC8F1K08S2 iap方式读写的起始地址0X0000 ~ 结束地址0X0FFF   MOVC的读写起始地址 0x2000~0x2fff
我现在的读写方式是IAP方式是吗?起始地址是不是只能选0X0000 ~ 0X0FFF之间;选完之后程序的运行地址是从哪里开始的?

小李非刀 发表于 2019-11-27 12:51:53

ding731868572 发表于 2019-11-1 15:42
定时器实际测试没问题了,eeprom读写遇到了问题

STC8F1K08的eeprom读写


STC的程序区与IAP访问EEPROM区是分开编址的,都是从0x0000开始。MOVC访问(C语言中的CODE指定的内容)要加上偏移地址,并且只能读,不能写。

nade 发表于 2019-11-27 13:14:47

这么巧用同用STC8F1K08加公司433射频芯片,你用的哪家射频芯片

ding731868572 发表于 2019-11-27 16:20:48

nade 发表于 2019-11-27 13:14
这么巧用同用STC8F1K08加公司433射频芯片,你用的哪家射频芯片

深圳市精美润有限公司的发射和接收芯片,你用的哪家的,STC8F1K08的eeprom那块的代码能给参考下吗

nade 发表于 2019-11-27 16:34:13

ding731868572 发表于 2019-11-27 16:20
深圳市精美润有限公司的发射和接收芯片,你用的哪家的,STC8F1K08的eeprom那块的代码能给参考下吗 ...

自己公司射频芯片,我们卖芯片技术支持也帮人家开发,没用到eeprom.不过stc官方例程都有啊
#include "reg51.h"
#include "intrins.h"

//测试工作频率为11.0592MHz

sfr   IAP_DATA    =   0xC2;
sfr   IAP_ADDRH   =   0xC3;
sfr   IAP_ADDRL   =   0xC4;
sfr   IAP_CMD   =   0xC5;
sfr   IAP_TRIG    =   0xC6;
sfr   IAP_CONTR   =   0xC7;

#define WT_30M          0x80
#define WT_24M          0x81
#define WT_20M          0x82
#define WT_12M          0x83
#define WT_6M         0x84
#define WT_3M         0x85
#define WT_2M         0x86
#define WT_1M         0x87

void IapIdle()
{
    IAP_CONTR = 0;                              //关闭IAP功能
    IAP_CMD = 0;                              //清除命令寄存器
    IAP_TRIG = 0;                               //清除触发寄存器
    IAP_ADDRH = 0x80;                           //将地址设置到非IAP区域
    IAP_ADDRL = 0;
}

char IapRead(int addr)
{
    char dat;

    IAP_CONTR = WT_12M;                         //使能IAP
    IAP_CMD = 1;                              //设置IAP读命令
    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    _nop_();
    dat = IAP_DATA;                           //读IAP数据
    IapIdle();                                  //关闭IAP功能

    return dat;
}

void IapProgram(int addr, char dat)
{
    IAP_CONTR = WT_12M;                         //使能IAP
    IAP_CMD = 2;                              //设置IAP写命令
    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_DATA = dat;                           //写IAP数据
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    _nop_();
    IapIdle();                                  //关闭IAP功能
}

void IapErase(int addr)
{
    IAP_CONTR = WT_12M;                         //使能IAP
    IAP_CMD = 3;                              //设置IAP擦除命令
    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    _nop_();                                    //
    IapIdle();                                  //关闭IAP功能
}

void main()
{
    IapErase(0x0400);
    P0 = IapRead(0x0400);                     //P0=0xff
    IapProgram(0x0400, 0x12);
    P1 = IapRead(0x0400);                     //P1=0x12

    while (1);
}

ding731868572 发表于 2019-11-27 16:36:53

nade 发表于 2019-11-27 16:34
自己公司射频芯片,我们卖芯片技术支持也帮人家开发,没用到eeprom.不过stc官方例程都有啊
#include "reg ...

你们公司叫什么名字?上传下发射和接收的芯片手册看看

nade 发表于 2019-11-27 16:44:41

ding731868572 发表于 2019-11-27 16:36
你们公司叫什么名字?上传下发射和接收的芯片手册看看

私信给你

ding731868572 发表于 2019-11-27 16:47:42

nade 发表于 2019-11-27 16:44
私信给你

你私信个联系方式,我现在私信不了,积分太少

nade 发表于 2019-11-27 16:49:25

ding731868572 发表于 2019-11-27 16:47
你私信个联系方式,我现在私信不了,积分太少

qq525613558
页: [1]
查看完整版本: STC8F1K08单片机,按照手册上先使能上拉,还是读不到IO的电平