KEIL C51的 reg51.h已经声明了 INT1/INT0,带新人完整复习下 KEIL C51的 reg51.h
带新人完整复习下 KEIL C51的 reg51.hKEIL 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 的声明吗,作为初学者,新人,不熟悉,都可以在本坛讨论,但不要凭空想象以为别人错了
==========================================================================
我没装 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
INT0、INT1以及P3口的第二功能定义在Keil C51的reg51.h里面都是默认定义
Keil开发环境下,ASM代码则可直接使用,甚至都不需要包含其它头文件
C代码则只需要包含reg51.h或者reg52.h就可使用
STC的那个源程序是直接包含的keil C51 的 reg51.h
初学者误会的多/初学者错误很正常,STC 的例程错误还是比较少的
本视频就是个典型误会STC错的案例
学习了,赞!! IT1 = 0; //使能INT1上升沿和下降沿中断
这一行的注释不准确
页:
[1]