神农鼎 发表于 2023-4-4 22:01:40

KEIL C51的 reg51.h已经声明了 INT1/INT0,带新人完整复习下 KEIL C51的 reg51.h

带新人完整复习下 KEIL C51的 reg51.h

KEIL C51的 reg51.h已经声明了 INT1/INT0
/*P3*/
sbit RD   = P3^7;
sbit WR   = P3^6;
sbit T1   = P3^5;
sbit T0   = P3^4;
sbit INT1 = P3^3;
sbit INT0 = P3^2;
sbit TXD= P3^1;
sbit RXD= P3^0;

头文件新人还是打开认真看下,典型新人想当然以为别人错的例子 !
===正好带新人完整复习下 KEIL C51的 reg51.h 和 STC89系列在此基础上添加的一些寄存器。

STC做了那么多工作,当然会犯错,但新人你说STC某个错之前,你也打开头文件看下 !
===提建议可以到本坛来提,在这提是正常的技术交流,互相提高。
===在这讲STC错没关系,我们会及时纠正,本坛就是让大家来讨论哪些似是而非的问题的,就是请大家来一起互相查错一起进步的
===我们也会犯错,但你不要没测试就想当然说STC错了。
===然后一群新人被你误导,影响新人学习

下面这个案例,说 STC-ISP V6.91M 版中 STC8H 的范例程序,INT0/INT1的 上升/下降沿 演示程序错的,
说没声明 INT1, 其实   KEIL C51的 reg51.h已经声明了 INT1/INT0

/*P3*/
sbit RD   = P3^7;
sbit WR   = P3^6;
sbit T1   = P3^5;
sbit T0   = P3^4;
sbit INT1 = P3^3;
sbit INT0 = P3^2;
sbit TXD= P3^1;
sbit RXD= P3^0;




他想当然的以为这个 INT1 没定义,究竟有没有定义,你也在说别人错前,做个研究啊,程序拷贝出来,如下:


#include "reg51.h"
#include "intrins.h"

sfr   P0M1    =   0x93;
sfr   P0M0    =   0x94;
sfr   P1M1    =   0x91;
sfr   P1M0    =   0x92;
sfr   P2M1    =   0x95;
sfr   P2M0    =   0x96;
sfr   P3M1    =   0xb1;
sfr   P3M0    =   0xb2;
sfr   P4M1    =   0xb3;
sfr   P4M0    =   0xb4;
sfr   P5M1    =   0xc9;
sfr   P5M0    =   0xca;

sbit    P10   =   P1^0;
sbit    P11   =   P1^1;

void INT1_Isr() interrupt 2
{
    if (INT1)                                 //判断上升沿和下降沿
    {
      P10 = !P10;                           //测试端口
    }
    else
    {
      P11 = !P11;                           //测试端口
    }
}

void main()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;

    IT1 = 0;                                    //使能INT1上升沿和下降沿中断
    EX1 = 1;                                    //使能INT1中断
    EA = 1;

    while (1);
}


======================================================================

#include "reg51.h"
#include "intrins.h"

我们同事说程序中包含了这 2个头文件,作为初学者,不熟悉,可以打开 KEIL C51的 reg51.h 看下,有如下声明

/*P3*/
sbit RD   = P3^7;
sbit WR   = P3^6;
sbit T1   = P3^5;
sbit T0   = P3^4;
sbit INT1 = P3^3;
sbit INT0 = P3^2;
sbit TXD= P3^1;
sbit RXD= P3^0;


这有 INT1, INT0 的声明吗,作为初学者,新人,不熟悉,都可以在本坛讨论,但不要凭空想象以为别人错了

==========================================================================














神农鼎 发表于 2023-4-4 22:20:35

我没装 KEIL , 打开 我们 STC-ISP 的头文件部分,找到我们 STC89系列的头文件,
这是用 KEIL C51的 reg51.h 修改的,发现 KEIL C51 的 reg51.h 确实有这个 INT1/INT0的声明




#ifndef __STC89C5xRC_RDP_H__
#define __STC89C5xRC_RDP_H__

/////////////////////////////////////////////////

/* The following is STC additional SFR */

/* sfrAUXR= 0x8e; */
/* sfrAUXR1 = 0xa2; */
/* sfrIPH   = 0xb7; */

sfrP4= 0xe8;
sbit P46 = P4^6;
sbit P45 = P4^5;       //ISP下载需勾选"ALE脚用作P4.5口"
sbit P44 = P4^4;
sbit P43 = P4^3;
sbit P42 = P4^2;
sbit P41 = P4^1;
sbit P40 = P4^0;

sfrXICON = 0xc0;

sfrWDT_CONTR = 0xe1;

sfr ISP_DATA= 0xe2;
sfr ISP_ADDRH = 0xe3;
sfr ISP_ADDRL = 0xe4;
sfr ISP_CMD   = 0xe5;
sfr ISP_TRIG= 0xe6;
sfr ISP_CONTR = 0xe7;

/* Above is STC additional SFR */

/*--------------------------------------------------------------------------
REG51F.H

Header file for 8xC31/51, 80C51Fx, 80C51Rx+
Copyright (c) 1988-1999 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.

Modification according to DataSheet from April 1999
- SFR's AUXR and AUXR1 added for 80C51Rx+ derivatives
--------------------------------------------------------------------------*/

/*BYTE Registers*/
sfr P0   = 0x80;
sbit P00 = P0^0;
sbit P01 = P0^1;
sbit P02 = P0^2;
sbit P03 = P0^3;
sbit P04 = P0^4;
sbit P05 = P0^5;
sbit P06 = P0^6;
sbit P07 = P0^7;
sfr P1   = 0x90;
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;
sfr P2   = 0xA0;
sbit P20 = P2^0;
sbit P21 = P2^1;
sbit P22 = P2^2;
sbit P23 = P2^3;
sbit P24 = P2^4;
sbit P25 = P2^5;
sbit P26 = P2^6;
sbit P27 = P2^7;
sfr P3   = 0xB0;
sbit P30 = P3^0;
sbit P31 = P3^1;
sbit P32 = P3^2;
sbit P33 = P3^3;
sbit P34 = P3^4;
sbit P35 = P3^5;
sbit P36 = P3^6;
sbit P37 = P3^7;
sfr PSW= 0xD0;
sfr ACC= 0xE0;
sfr B    = 0xF0;
sfr SP   = 0x81;
sfr DPL= 0x82;
sfr DPH= 0x83;
sfr PCON = 0x87;
sfr TCON = 0x88;
sfr TMOD = 0x89;
sfr TL0= 0x8A;
sfr TL1= 0x8B;
sfr TH0= 0x8C;
sfr TH1= 0x8D;
sfr IE   = 0xA8;
sfr IP   = 0xB8;
sfr SCON = 0x98;
sfr SBUF = 0x99;

/*80C51Fx/Rx Extensions*/
sfr AUXR   = 0x8E;
sfr AUXR1= 0xA2;
sfr SADDR= 0xA9;
sfr IPH    = 0xB7;
sfr SADEN= 0xB9;
sfr T2CON= 0xC8;
sfr T2MOD= 0xC9;
sfr RCAP2L = 0xCA;
sfr RCAP2H = 0xCB;
sfr TL2    = 0xCC;
sfr TH2    = 0xCD;

/* PCA SFR
sfr CCON   = 0xD8;
sfr CMOD   = 0xD9;
sfr CCAPM0 = 0xDA;
sfr CCAPM1 = 0xDB;
sfr CCAPM2 = 0xDC;
sfr CCAPM3 = 0xDD;
sfr CCAPM4 = 0xDE;
sfr CL   = 0xE9;
sfr CCAP0L = 0xEA;
sfr CCAP1L = 0xEB;
sfr CCAP2L = 0xEC;
sfr CCAP3L = 0xED;
sfr CCAP4L = 0xEE;
sfr CH   = 0xF9;
sfr CCAP0H = 0xFA;
sfr CCAP1H = 0xFB;
sfr CCAP2H = 0xFC;
sfr CCAP3H = 0xFD;
sfr CCAP4H = 0xFE;
*/

/*BIT Registers*/
/*PSW   */
sbit CY   = PSW^7;
sbit AC   = PSW^6;
sbit F0   = PSW^5;
sbit RS1= PSW^4;
sbit RS0= PSW^3;
sbit OV   = PSW^2;
sbit F1   = PSW^1;
sbit P    = PSW^0;

/*TCON*/
sbit TF1= TCON^7;
sbit TR1= TCON^6;
sbit TF0= TCON^5;
sbit TR0= TCON^4;
sbit IE1= TCON^3;
sbit IT1= TCON^2;
sbit IE0= TCON^1;
sbit IT0= TCON^0;

/*IE   */
sbit EA   = IE^7;
sbit EC   = IE^6;
sbit ET2= IE^5;
sbit ES   = IE^4;
sbit ET1= IE^3;
sbit EX1= IE^2;
sbit ET0= IE^1;
sbit EX0= IE^0;

/*IP   */
/*sbit PPC= IP^6;*/
sbit PT2= IP^5;
sbit PS   = IP^4;
sbit PT1= IP^3;
sbit PX1= IP^2;
sbit PT0= IP^1;
sbit PX0= IP^0;

/*P3*/
sbit RD   = P3^7;
sbit WR   = P3^6;
sbit T1   = P3^5;
sbit T0   = P3^4;
sbit INT1 = P3^3;
sbit INT0 = P3^2;
sbit TXD= P3^1;
sbit RXD= P3^0;

/*SCON*/
sbit SM0= SCON^7; // alternatively "FE"
sbit FE   = SCON^7;
sbit SM1= SCON^6;
sbit SM2= SCON^5;
sbit REN= SCON^4;
sbit TB8= SCON^3;
sbit RB8= SCON^2;
sbit TI   = SCON^1;
sbit RI   = SCON^0;
            
/*P1*/
/* PCA
sbit CEX4 = P1^7;
sbit CEX3 = P1^6;
sbit CEX2 = P1^5;
sbit CEX1 = P1^4;
sbit CEX0 = P1^3;
sbit ECI= P1^2;
*/

sbit T2EX = P1^1;
sbit T2   = P1^0;

/*T2CON*/
sbit TF2   = T2CON^7;
sbit EXF2= T2CON^6;
sbit RCLK= T2CON^5;
sbit TCLK= T2CON^4;
sbit EXEN2 = T2CON^3;
sbit TR2   = T2CON^2;
sbit C_T2= T2CON^1;
sbit CP_RL2= T2CON^0;

/*CCON*/
/*PCA
sbit CF    = CCON^7;
sbit CR    = CCON^6;

sbit CCF4= CCON^4;
sbit CCF3= CCON^3;
sbit CCF2= CCON^2;
sbit CCF1= CCON^1;
sbit CCF0= CCON^0;
*/

/////////////////////////////////////////////////

#endif


zhp 发表于 2023-4-5 12:38:50

INT0、INT1以及P3口的第二功能定义在Keil C51的reg51.h里面都是默认定义
Keil开发环境下,ASM代码则可直接使用,甚至都不需要包含其它头文件
C代码则只需要包含reg51.h或者reg52.h就可使用

STC的那个源程序是直接包含的keil C51 的 reg51.h
初学者误会的多/初学者错误很正常,STC 的例程错误还是比较少的
本视频就是个典型误会STC错的案例

WHX 发表于 2023-4-5 12:41:17

学习了,赞!!

ACLX51 发表于 2023-4-6 08:42:35

    IT1 = 0;                                    //使能INT1上升沿和下降沿中断

这一行的注释不准确
页: [1]
查看完整版本: KEIL C51的 reg51.h已经声明了 INT1/INT0,带新人完整复习下 KEIL C51的 reg51.h