文档库 最新最全的文档下载
当前位置:文档库 › AT89S52

AT89S52

AT89S52
AT89S52

/******************************************************************

DS1302时钟显示与定时控制 */

#include

#include

//#include

#define uchar unsigned char

#define uint unsigned int

sbit K1 = P2^5;sbit K2 = P2^4;

sbit K3 = P2^3;sbit K4 = P2^2;sbit K5 = P2^1;

sbit reset = P1^2;sbit sclk = P1^0;sbit io= P1^1;

sbit dq = P1^3; //定义DS18B20端口DQ

sbit dula=P2^6;sbit wela=P2^7;

sbit deng=P1^4;sbit BEEP = P1^5;

bit flag=0,dian=0,see=0,ts=0;//FLAG设置标记 dian整点标记 see屏幕锁定标

志 ts 记数

bit alarm_flag=0;

uchar date1[]={0x00,0x00,0x0b,0x00,0x00,0x0b,0x00,0x00,}; //1页数码管数据

xx-xx-xx 时间

uchar date2[]={0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x00,}; //2页数码管数据

xxxxxx-x 日期

uchar date3[]={0x0c,0x0d,0x0a,0x00,0x00,0x0b,0x00,0x00,}; //3页数码管数据

ar xx-xx

uchar date4[]={0x00,0x00,0x00,0x00,0x0b,0x00,0x00,0x0e,}; //4页数码管数据

xxxx-xxC

uchar init [] ={0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //读出1302时间存储

数组

uchar init2[] ={0x00,0x18,0x17,0x25,0x08,0x01,0x08}; // 初始时间

//秒,分,时,日,月,星期,年

uchar bj_time[] ={0x00,0x00,0x00}; //闹钟时间

//整点报时,分,时

uchar code LEDData[ ] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,

0x80,0x90,0xff,0xbf,0xc7,0xaf,0xc6,0x3f};//段

码 0xff,-,a,r,c(0x0a,0x0b,0x0c,0x0d,0x0e, 0x0f)

uchar code scan_bit[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位码

void Play_nowtime(); void alarm_time();

void Play_alarmtime(); void Time_compare();

void dateinto(); void Play_nowtemp();

void Play_nowday(); void Init_Com(); //初始化COM口

unsigned char comdat;//COM口数据

unsigned char presence ;

unsigned char data temp_data[2] = {0x00,0x00};

unsigned char data display[5] = {0x00,0x00,0x00,0x00,0x00}; //温度

/*********************************************************************** ******************/

/********阳历转换阴历********************************************************************/ unsigned char yy,mo,dd,xq,hh,mm,ss,e;//定义时间映射全局变量(专用寄存器)

bit c_moon;

data uchar year_moon,month_moon,day_moon,week;

void Conversion(bit c,uchar year,uchar month,uchar day);

/*********************************************************************** ****************/

/**********************************************************/

/* */

/* 蜂鸣器响一声 */

/* */

/**********************************************************/

void Delay(unsigned int num)//延时函数

{

while( --num );

}

void beep()

{

unsigned char y;

for (y=0;y<100;y++)

{

Delay(92);

BEEP=!BEEP; //BEEP取反

}

BEEP=1;

Delay(50); //关闭蜂鸣器

}

/**********************************************************/

//

Init_DS18B20( void )//初始化ds1820

{

dq = 1; //DQ复位

Delay(8); //稍做延时

dq = 0; //单片机将DQ拉低

Delay(90); //精确延时大于 480us

dq = 1; //拉高总线

Delay(8);

presence = dq; //如果=0则初始化成功 =1则初始化失败

Delay(100);

dq = 1;

return(presence); //返回信号,0=presence,1= no presence

}

/******************************************************************/ /**********************************************************/

ReadOneChar(void)//读一个字节

{

unsigned char i = 0;

unsigned char dat = 0;

for (i = 8; i > 0; i--)

{

dq = 0; // 给脉冲信号

dat >>= 1;

dq = 1; // 给脉冲信号

if(dq)

dat |= 0x80;

Delay(4);

}

return (dat);

}

/**********************************************************/ WriteOneChar(unsigned char dat)//写一个字节

{

unsigned char i = 0;

for (i = 8; i > 0; i--)

{

dq = 0;

dq = dat&0x01;

Delay(5);

dq = 1;

dat>>=1;

}

}

/*********************************************************/

Read_Temperature(void)//读取温度

{

Init_DS18B20();

if(presence==1)

{

deng=0; //DS18B20不正常,蜂鸣器报警

}

else

{

WriteOneChar(0xCC); // 跳过读序号列号的操作

WriteOneChar(0x44); // 启动温度转换

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的操作

WriteOneChar(0xBE); //读取温度寄存器

temp_data[0] = ReadOneChar(); //温度低8位

temp_data[1] = ReadOneChar(); //温度高8位

display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);

display[3]=display[4]/100;

display[1]=display[4]%100;

display[2]=display[1]/10;

display[1]=display[1]%10;

//LEDData[display[0]] ; //显示小数位

date4[6]=display[1]; //个位

date4[5]=display[2]; //十位

}

}

/**********************************************************/

void write_byte(uchar inbyte)

{

uchar i;

for(i=0;i<8;i++)

{

sclk=0; //写的时候低电平改变数据

if(inbyte&0x01)

io=1;

else

io=0;

sclk=1; //写的时候高电平,把数据写入ds1302

inbyte=inbyte>>1;

}

}

/**********************************************************/

/**********************************************************/ uchar read_byte() //sclk的下跳沿读数据

{

uchar i,temp=0;

io=1; //设置为输入口

for(i=0;i<7;i++)

{

sclk=0;

if(io==1)

temp=temp|0x80;

else

temp=temp&0x7f;

sclk=1; //产生下跳沿

temp=temp>>1;

}

return (temp);

}

/**********************************************************/ // 往ds1302的某个地址写入数据

/**********************************************************/ void write_ds1302(uchar cmd,uchar indata)

{

sclk=0;

reset=1;

write_byte(cmd);

write_byte(indata);

sclk=0;

reset=0;

}

/**********************************************************/ // 读ds1302某地址的的数据

/**********************************************************/ uchar read_ds1302(uchar addr)

{

uchar backdata;

sclk=0;

reset=1;

write_byte(addr); //先写地址

backdata=read_byte(); //然后读数据

sclk=0;

reset=0;

return (backdata);

}

/**********************************************************/ // 设置初始时间

/**********************************************************/ void set_ds1302(uchar addr,uchar *p,uchar n) //写入n个数据{

write_ds1302(0x8e,0x00); //写控制字,允许写操作 for(;n>0;n--)

{

write_ds1302(addr,*p);

p++;

addr=addr+2;

}

write_ds1302(0x8e,0x80); //写保护,不允许写

}

/**********************************************************/ // 读取当前时间

/**********************************************************/ void read_nowtime(uchar addr,uchar *p,uchar n)

{

for(;n>0;n--)

{

*p=read_ds1302(addr);

p++;

addr=addr+2;

}

}

/**********************************************************/ //分配数码管数据

/**********************************************************/

void dateinto()

{

if(flag==0) read_nowtime(0x81,init,7); // 非设置状态下调入数据date1[0]=((init[2]&0xf0)>>4); //时十位

date1[1]=init[2]&0x0f;

date1[3]=(init[1]&0xf0)>>4; //分十位

date1[4]=init[1]&0x0f;

date1[6]=(init[0]&0xf0)>>4; //秒十位

date1[7]=init[0]&0x0f;

date2[0]=(init[6]&0xf0)>>4; //年十位

date2[1]=init[6]&0x0f;

date2[2]=(init[4]&0xf0)>>4; //月

date2[3]=init[4]&0x0f;

date2[4]=(init[3]&0xf0)>>4; //日十位

date2[5]=init[3]&0x0f;

date2[7]=init[5]&0x0f; //星期

/**********************************************************/

yy=init[6]; //农历年0x09

mo=init[4]; //农历月0x03

dd=init[3]; //农历日0x27

Conversion(0,yy,mo,dd); //农历函数

/**********************************************************/

date4[0]=month_moon/16;

date4[1]=month_moon%16;

date4[2]=day_moon/16;

date4[3]=day_moon%16;

date3[3]=(bj_time[2]&0xf0)>>4;

date3[4]=bj_time[2]&0x0f;

date3[6]=(bj_time[1]&0xf0)>>4;

date3[7]=bj_time[1]&0x0f;

/*********************************************************/ if (init[1]==0x59)

{

ts=0; //整点提示记数此时复位

if (init[0]==0x59)

{

if (init[2]==0x23)//判断日期是否增加,修正DS1302BUG---23点后变04点

{

flag=1;

while(flag==1)

{

read_nowtime(0x81,init,7); //重复读取时间

beep();

Delay(2000);

beep();

if (init[0]==0x00) //判断是否到了00

{

init[2]=0x00; //小时变为00

set_ds1302(0x80,init,7);

flag=0;

}

}

}

}

}

/*********************************************************/

}

/**********************************************************/

// 初始化DS1302

/**********************************************************/

void init_ds1302()

{

reset=0;

sclk=0;

write_ds1302(0x80,0x00);

write_ds1302(0x90,0xa6); //一个二极管+4K电阻充电

write_ds1302(0x8e,0x80); //写保护控制字,禁止写

}

/**********************************************************/

// 主函数

/**********************************************************/

void main()

{

P1=0xff;

TMOD=0x01;

TH0=0x4c; //50ms定时

TL0=0x00;

EA=1;

ET0=1;

TR0=1;

deng=1;

flag=0;

see=0;

BEEP=1;

beep();

ts=0;

init_ds1302(); //初始化ds1302

//Init_Com(); //初始化COM口

while(1)

{

see=0;

Read_Temperature();//温度

/*********************************************************时间错误检测复位芯片*/

if (init[0]>0x60) set_ds1302(0x80,init2,7);

if (init[1]>0x60) set_ds1302(0x80,init2,7);

if (init[2]>0x24) set_ds1302(0x80,init2,7);

if (init[3]>0x31) set_ds1302(0x80,init2,7);

if (init[4]>0x12) set_ds1302(0x80,init2,7);

if (init[5]>0x07) set_ds1302(0x80,init2,7);

/*********************************************************串口收发

if ( RI )

{

unsigned char i;

comdat = SBUF; //接收数据 SBUF 为单片机的接收发送缓冲寄存器

RI = 0;

if (comdat=='r') //COM读时间命令定义为r

{

for (i=0;i<7;i++)

{

SBUF=init[i];

Delay(250);

}

SBUF=date4[0]; //以下发送农历日期

Delay(250);

SBUF=date4[1];

Delay(250);

SBUF=date4[2];

Delay(250);

SBUF=date4[3];

Delay(250);

SBUF=2; //发送完毕最后发个2表示一下

Delay(250);

}

if (comdat=='s') //COM写时间命令定义为s

{

Delay(50);

init2[6]=SBUF; //把字符转为ASCII值

Delay(50);

}

if (SBUF=='e')

{

set_ds1302(0x80,init2,7); //接收最后2完毕,则设置时间

beep();

}

}

********************************************************/

if(K5==0) //K5+K2调整时间

{

if(K2==0)

{

flag=1;

deng=0;

Delay(40000);

beep();

while(flag==1)

{

Play_nowtime();

if(!K1) //小时

{

init[2]=init[2]+0x01;

if (init[2]==0x0a) init[2]=0x10;

if (init[2]==0x1a) init[2]=0x20;

if (init[2]==0x24) init[2]=0x00;

Delay(20000); //减慢增加速度

}

if(!K2) //分钟

{

init[1]=init[1]+0x01;

if (init[1]==0x0a) init[1]=0x10;

if (init[1]==0x1a) init[1]=0x20;

if (init[1]==0x2a) init[1]=0x30;

if (init[1]==0x3a) init[1]=0x40;

if (init[1]==0x4a) init[1]=0x50;

Delay(20000); //减慢增加速度

}

if(!K3) //秒

{

init[0]=init[0]+0x01;

if (init[0]==0x0a) init[0]=0x10;

if (init[0]==0x1a) init[0]=0x20;

if (init[0]==0x2a) init[0]=0x30;

if (init[0]==0x3a) init[0]=0x40;

if (init[0]==0x4a) init[0]=0x50;

if (init[0]==0x5a) init[0]=0x00;

Delay(20000); //减慢增加速度

}

if(!K5) //k4退出

{

flag=0;

deng=1;

set_ds1302(0x80,init,7);

beep();

Delay(30000);

beep();

}

}

}

}

/**********************************************************/ if(K5==0) //K5+K1调整日期

{

if(K1==0)

{

flag=1;

deng=0;

Delay(40000);

beep();

while(flag==1)

{

Play_nowday();

if(!K1) //年

{

init[6]=init[6]+0x01;

if (init[6]==0x1a) init[6]=0x20;

if (init[6]==0x2a) init[6]=0x30;

if (init[6]==0x3a) init[6]=0x40;

if (init[6]==0x4a) init[6]=0x50;

if (init[6]==0x5a) init[6]=0x60;

if (init[6]==0x6a) init[6]=0x70;

if (init[6]==0x7a) init[6]=0x80;

if (init[6]==0x8a) init[6]=0x90;

if (init[6]==0x9a) init[6]=0x00;

Delay(25000); //减慢增加速度

}

if(!K2) //月

{

init[4]=init[4]+0x01;

if (init[4]==0x0a) init[4]=0x10;

if (init[4]==0x13) init[4]=0x01;

Delay(25000); //减慢增加速度

}

if(!K3) //日

{

init[3]=init[3]+0x01;

if (init[3]==0x0a) init[3]=0x10;

if (init[3]==0x1a) init[3]=0x20;

if (init[3]==0x2a) init[3]=0x30;

if (init[3]==0x32) init[3]=0x01;

Delay(25000); //减慢增加速度

}

if(!K4) //星期

{

init[5]=init[5]&0x0f;

init[5]=init[5]+0x01;

if (init[5]>0x06) init[5]=0x00;

Delay(25000); //减慢增加速度}

if(!K5) //k5退出

{

flag=0;

deng=1;

set_ds1302(0x80,init,7);

beep();

Delay(30000);

beep();

}

}

}

}

/**********************************************************/ if(K5==0) //K5+K3时钟芯片复位

{

if(K3==0)

{

if(K4==0)

{

Delay(20000);

set_ds1302 (0x80,init2,7);

deng=0;

beep();

Delay(10000); //1

deng=1;

beep();

Delay(10000); //2

deng=0;

beep();

Delay(10000);

deng=1;

}

}

Delay(50000);

}

/**********************************************************/ //调整闹钟时间K5+K4

if(K5==0)

{

if(K4==0)

{

flag=1;

deng=0;

Delay(40000);

beep();

while (flag)

{

Play_alarmtime();

if(!K1) //加小时

{

bj_time[2]=bj_time[2]+0x01;

if (bj_time[2]==0x0a) bj_time[2]=0x10;

if (bj_time[2]==0x1a) bj_time[2]=0x20;

if (bj_time[2]==0x24) bj_time[2]=0x00;

Delay(25000); //减慢增加速度

}

if(!K2) //加分钟

{

bj_time[1]=bj_time[1]+0x01;

if (bj_time[1]==0x0a) bj_time[1]=0x10;

if (bj_time[1]==0x1a) bj_time[1]=0x20;

if (bj_time[1]==0x2a) bj_time[1]=0x30;

if (bj_time[1]==0x3a) bj_time[1]=0x40;

if (bj_time[1]==0x4a) bj_time[1]=0x50;

if (bj_time[1]==0x5a) bj_time[1]=0x00;

Delay(25000); //减慢增加速度

}

if(!K4)

{

alarm_flag=~alarm_flag;

beep();

Delay(25000);

if(alarm_flag) //alarm_flag=1,开定时

{

date3[2]=0x0b; //显示--字符

date1[5]=0x0f;

//显示--字符 -.

Play_alarmtime(); //查看报警时间

}

else

{

date3[2]=0x0a; //不显示--字符

date1[5]=0x0b;

Play_alarmtime(); //查看报警时间 }

}

if(!K5) //退出

{

deng=1;

flag=0;

beep();

Delay(30000);

beep();

}

}

}

}

/**********************************************************/

//K1看日期

if (K1==0)

{

Play_nowday();

see=1;

}

/**********************************************************/

//K2看农历和温度

if (K2==0)

{

Play_nowtemp();

see=1;

}

/**********************************************************/

//看报警时间和设置报警开关

if(K3==0)

{

Play_alarmtime();

see=1;

if(!K4)

{

alarm_flag=~alarm_flag;

beep();

Delay(25000);

if(alarm_flag) //alarm_flag=1,开定时

{

date3[2]=0x0b; //显示--字符

date1[5]=0x0f;

//显示--字符 -.

Play_alarmtime(); //查看报警时间

}

else

{

date3[2]=0x0a; //不显示--字符

date1[5]=0x0b;

Play_alarmtime(); //查看报警时间 }

}

}

/**********************************************************/ //设置整点报时开关

if(!K4)

{

dian=!dian; //整点报时开关

if (dian==1)

{

date1[2]=0x0f;

deng=0;

beep();

Delay(10000); //1

deng=1;

beep();

Delay(10000); //2

deng=0;

Delay(10000);

deng=1;

//响2声表示关闭整点

}

else

{

beep(); //响一声表示关闭整点

date1[2]=0x0b;

}

Delay(25000);

}

/*********************************************************/ if(flag==0)

{

if (see==0)

{

if (date1[7]==2)

Play_nowday();

else if (date1[7]==3)

Play_nowday();

else if (date1[7]==4)

Play_nowday();

else if (date1[7]==5)

Play_nowtemp();

else if (date1[7]==6)

Play_nowtemp();

else if (date1[7]==7)

Play_nowtemp();

else

Play_nowtime();

}

}

/*********************************************************/ Time_compare(); //闹钟比较

/*********************************************************/ //整点比较

/*********************************************************/ if(dian==1)

{

if(flag==0)

{

if (init[1]==0x00)

{

if (init[0]==0x00)//整点提示

if (ts==0) //59分时复位

{

{

deng=0;

beep();

Delay(15000); //整点提示音

beep();

deng=1;

Delay(35000);

ts=1; //表示响过一次

}

}

}

}

}

}

}

/*************************程序结束********************************/

/*********************************************************/

// 显示当前时间

/**********************************************************/

void Play_nowtime()

{

uchar i;

dateinto();

for(i=0;i<8;i++)

{

P0=LEDData[date1[i]]; //显示

dula=1;

dula=0;

P0=scan_bit[i];

wela=1;

wela=0;

Delay(120);

}

P0=0xff;

dula=1;

dula=0; //关闭显示//亮度相同

}

/*********************************************************/

// 显示当前日期

/**********************************************************/

void Play_nowday()

{

uchar i;

dateinto();

for(i=0;i<8;i++)

{

if (i==1)

P0=LEDData[date2[i]]-0x80;

else if (i==3)

P0=LEDData[date2[i]]-0x80;

else

P0=LEDData[date2[i]]; //显示

dula=1;

dula=0;

P0=scan_bit[i];

wela=1;

wela=0;

Delay(120);

}

P0=0xff;

dula=1;

dula=0; //关闭显示//亮度相同

}

/*********************************************************/ // 显示当前温度

/**********************************************************/ void Play_nowtemp()

{

uchar i;

dateinto();

for(i=0;i<8;i++)

{

P0=LEDData[date4[i]]; //显示

dula=1;

dula=0;

P0=scan_bit[i];

wela=1;

wela=0;

Delay(120);

}

P0=0xff;

dula=1;

dula=0; //关闭显示//亮度相同

}

//********************************************************/ // 报警时间显示

/********************************************************/ void Play_alarmtime()

{

uchar i;

dateinto();

for(i=0;i<8;i++)

{

P0=LEDData[date3[i]];

dula=1;

dula=0;

P0=scan_bit[i];

wela=1;

wela=0;

Delay(120);

}

P0=0xff;

dula=1;

dula=0; //关闭显示

}

/********************************************************/

// 时间比较

/*********************************************************/

void Time_compare()

{

if(alarm_flag)

{

if(init[2]==bj_time[2])

{

if(init[1]==bj_time[1])

{

Delay(15000);

deng=0;

beep();

Delay(15000);

deng=1;

if(!K5)

{

alarm_flag=0;

}

}

}

}

}

/*********************************************************************** ******************/

/********阳历转换阴历********************************************************************/

AT89S52单片机应用中英文翻译

本科毕业设计(论文)AT89S52单片机应用中英文翻译 专业名称:电气工程及其自动化 年级班级: 学生姓名: 指导老师: 二O一二年六月九日

AT89S52 MCU Applications Function Characteristic Description The AT89S52 is a low-power, high-performance CMOS 8-bit microcontroller with 8K bytes of in-system programmable Flash memory. The device is manufactured using Atmel’s high-density nonvolatile memory technology and is compatible with the indus-try-standard 80C51 instruction set and pinout. The on-chip Flash allows the program memory to be reprogrammed in-system or by a conventional nonvolatile memory pro-grammer. By combining a versatile 8-bit CPU with in-system programmable Flash on a monolithic chip, the Atmel AT89S52 is a powerful microcontroller which provides a highly-flexible and cost-effective solution to many embedded control applications.The AT89S52 provides the following standard features: 8K bytes of Flash, 256 bytes of RAM, 32 I/O lines, Watchdog timer, two data pointers, three 16-bit timer/counters, a six-vector two-level interrupt architecture, a full duplex serial port, on-chip oscillator, and clock circuitry. In addition, the AT89S52 is designed with static logic for operation down to zero frequency and supports two software selectable power saving modes. The Idle Mode stops the CPU while allowing the RAM, timer/counters, serial port, and interrupt system to continue functioning. The Power-down mode saves the RAM con-tents but freezes the oscillator, disabling all other chip functions until the next interrupt or hardware reset. Pin Description VCC :Supply voltage. GND :Ground. Port 0:Port 0 is an 8-bit open drain bidirectional I/O port. As an output port, each pin can sink eight TTL inputs. When 1s are written to port 0 pins, the pins can be used as high-impedance inputs. Port 0 can also be configured to be the multiplexed low-order address/data bus during accesses to external program and data memory. In this mode, P0 has internal pull-ups. Port 0 also receives the code bytes during Flash programming and outputs the code bytes dur-ing program verification. External pull-ups are required during program verification. Port 1:Port 1 is an 8-bit bidirectional I/O port with internal pull-ups. The Port 1 output

单片机AT S 介绍

AT89S52简介 AT89S52是一个8位单片机,片内ROM全部采用FLASH ROM技术,与MCS-51系列完全兼容,它能以3V的超低电压工作,晶振时钟最高可达24MHz。AT89S52是标准的40引脚双列直插式集成电路芯片,有4个八位的并行双向I/O端口,分别记作P0、P1、P2、P3。第31引脚需要接高电位使单片机选用内部程序存储器;第9引脚是复位引脚,要接一个上电手动复位电路;第40脚为电源端VCC,接+5V电源,第20引脚为接地端VSS,通常在VCC和VSS引脚之间接0.1μF高频滤波电容。第18、19脚之间接上一个12MHz的晶振为单片机提供时钟信号。 AT89S52单片机说明如下: 此芯片是一种高性能低功耗的采用CMOS工艺制造的8位微控制器,它提供下列标准特征:8K字节的程序存储器,256字节的RAM,32条I/O线,2个16位定时器/计数器, 一个5中断源两个优先级的中断结构,一个双工的串行口, 片上震荡器和时钟电路。 引脚说明: ·V CC:电源电压 ·GND:地 ·P0口:P0口是一组8位漏极开路型双向I/O口,作为输出口用时,每个引脚能驱动8个TTL逻辑门电路。当对0端口写入1时,可以作为高阻抗输入端使用。 当P0口访问外部程序存储器或数据存储器时,它还可设定成地址数据总线复用的形式。在这种模式下,P0口具有内部上拉电阻。 在EPROM编程时,P0口接收指令字节,同时输出指令字节在程序校验时。程序校验时需要外接上拉电阻。 ·P1口:P1口是一带有内部上拉电阻的8位双向I/O口。P1口的输出缓冲能接受或输出4个TTL逻辑门电路。当对P1口写1时,它们被内部的上拉电阻拉升为高电平,此时可以作为输入端使用。当作为输入端使用时,P1口因为内部存在上拉电阻,所以当外部被拉低时会输出一个低电流(I IL)。 ·P2口:P2是一带有内部上拉电阻的8位双向的I/O端口。P2口的输出缓冲能驱动4个TTL逻辑门电路。当向P2口写1时,通过内部上拉电阻把端口拉到高电平,此时可以用作输入口。作为输入口,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出电流(I IL)。 P2口在访问外部程序存储器或16位地址的外部数据存储器(例如MOVX @DPTR)时,P2口送出高8位地址数据。在这种情况下,P2口使用强大的内部上拉电阻功能当输出1时。当利用8位地址线访问外部数据存储器时(例MOVX @R1),P2口输出特殊功能寄存器的内容。当EPROM编程或校验时,P2口同时接收高8位地址和一些控制信号。 ·P3口:P3是一带有内部上拉电阻的8位双向的I/O端口。P3口的输出缓冲能驱动4个TTL逻辑门电路。当向P3口写1时,通过内部上拉电阻把端口拉到高电平,此时可以用作输入口。作为输入口,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出电流(I IL)。

AT89S52单片机

AT89S52 是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。AT89S52具有以下标准功能:40个引脚,8k字节Flash,256字节RAM, 32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。8 位微控制器 8K 字节在系统可编程 Flash AT89S52。 本次设计是用89S52单片机为核心实现报警控制,所以我们要先对89S52的各个引脚及其功能有一个全面的认识。 89S51单片机的引脚功能介绍 如图2所示为89S52单片机40引脚双列直插形式,各引脚功能如下: 图289S52引脚图 1 电源和晶振: Vcc——AT89S52电源正端输入,接+5V。 Vss——电源地端。

XTAL1——输入到振荡器的反相放大器。 XTAL2——反相放大器的输出,输入到内部时钟发生器。 % 当用外部振荡器时,XTAL2不用,XTAL1接收振荡器信号。 2 控制线,共4根。 (1)输入: RST——复位输入。晶振工作时,RST脚持续2 个机器周期高电平将使单片机复位。 EA/Vpp——访问外部程序存储器控制信号。为使能从0000H 到FFFFH的外部程序存储器读取指令,EA必须接GND。为了执行内部程序指令,EA应该接VCC。在flash编程期间,EA也接收12伏VPP电压。 (2)输入,输出: ALE/PROG——地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8 位地址的输出脉冲。在flash编程时,此引脚(PROG)也用作编程输入脉冲。在一般情况下,ALE 以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。然而,特别强调,在每次访问外部数据存储器时,ALE脉冲将会跳过。如果需要,通过将地址为8EH的SFR的第0位置“1”,ALE操作将无效。这一位置“1”,ALE 仅在执行MOVX 或MOVC指令时有效。否则,ALE 将被微弱拉高。这个ALE 使能标志位(地址为8EH的SFR的第0位)的设置对微控制器处于外部执行模式下无效。 (3)输出: PSEN——外部程序存储器选通信号(PSEN)是外部程序存储器选通信号。当AT89S52从外部程序存储器执行外部代码时,PSEN在每个机器周期被激活两次,而在访问外部数据存储器时,PSEN将不被激活。 3 I/O口:4个口,32根 单片机51系列共有四个8位双向并行I/O通道口,分别是P0、P1、P2、P3,各具有特殊的电路结构,每位均有自己的锁存器、输出驱动器和输入缓冲器。这种结构,在数据输出时可锁存,即输出新的数据之前,通道口上原数据一直保持不变,但对输入信息是不锁存的,因此从外部输入的信息必须保持到取数指令执行完为止。在这四个8位双向并行I/O通道口中,我们应该选择哪一个通道口作为输入信号和输出信号的端口呢下面我们先来了解一下四个通道口的结构。 " (1)P0口介绍 P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻

单片机原理第2章习题解答

第2章思考题及习题2参考答案 一、填空 1. 在AT89S52单片机中,如果采用6MHz晶振,一个机器周期为。答:2μs 2. AT89S52单片机的机器周期等于个时钟振荡周期。答:12 3. 内部RAM中,位地址为40H、88H的位,该位所在字节的字节地址分别为 和。答:28H,88H 4. 片内字节地址为2AH单元最低位的位地址是;片内字节地址为A8H单元的最低位的位地址为。答:50H,A8H 5. 若A中的内容为63H,那么,P标志位的值为。答:0 6. AT89S52单片机复位后,R4所对应的存储单元的地址为,因上电时PSW= 。这时当前的工作寄存器区是组工作寄存器区。答:04H,00H,0。 7. 内部RAM中,可作为工作寄存器区的单元地址为 H~ H。答:00H,1FH 8. 通过堆栈操作实现子程序调用时,首先要把的内容入栈,以进行断点保护。调用子程序返回指令时,再进行出栈保护,把保护的断点送回到,先弹出的是原来中的内容。答:PC, PC,PCH 9. AT89S52单片机程序存储器的寻址范围是由程序计数器PC的位数所决定的,因为AT89S52单片机的PC是16位的,因此其寻址的范围为 KB。答:64 10. AT89S52单片机复位时,P0~P3口的各引脚为电平。答:高 11. AT89S52单片机使用片外振荡器作为时钟信号时,引脚XTAL1接,引脚XTAL2的接法是。答:片外振荡器的输出信号,悬空 12. AT89S52单片机复位时,堆栈指针SP中的内容为,程序指针PC中的内容为 。答:07H,0000H 二、单选 1. 程序在运行中,当前PC的值是。 A.当前正在执行指令的前一条指令的地址 B.当前正在执行指令的地址。 C.当前正在执行指令的下一条指令的首地址 D.控制器中指令寄存器的地址。 答:C 2. 判断下列哪一种说法是正确的?

AT89S52 基本性能介绍

主要性能 ● 与MCS-51单片机产品兼容 ● 8K字节在线系统可编程Flash存储器 ● 1000次擦写周期 ● 4.0V-5.5V工作电压 ● 全静态操作:0Hz~33Hz ● 三级加密程序存储器 ● 256*8字节的内部数据存储器 ● 32个可编程I/O口线 ● 三个16位定时器/计数器 ● 八个中断源 ● 全双工UART串行通道 ● 低功耗空闲和掉电模式 ● 掉电后中断可唤醒 ● 看门狗定时器 ● 双数据指针 ● 掉电标识符 ● 快速编程周期 ● 灵活ISP编程(字节和模式) ● 绿色(-免费)工作包操作 1功能特性描述 AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K 在线系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 AT89S52具有以下标准功能:8k字节Flash,256字节RAM,32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。 2. 引脚结构 3. 引脚描述 3.1 VCC : 电源 3.2 GND: 地

外文资料翻译 --AT89S52单片机简介

外文文献及翻译 A brief introduction of AT89S52 2.Pin Description 2.1 VCC: Supply voltage. 2.2 GND: Ground. 2.3 Port 0: Port 0 is an 8-bit open drain bidirectional I/O port. As an output port, each pin can sink eight TTL inputs. When 1s are written to port 0 pins, the pins can be used as high-impedance inputs. Port 0 can also be configured to be the multiplexed low-order address/data bus during accesses to external program and data memory. In this mode, P0 has internal pull-ups. Port 0 also receives the code bytes during Flash programming and outputs the code bytes during program verification. External pull-ups are required during program verification. 2.4 Port 1: Port 1 is an 8-bit bidirectional I/O port with internal pull-ups. The Port 1 output buffers can sink/source four TTL inputs. When 1s are written to Port 1 pins, they are pulled high by the internal pulled-ups and can be used as inputs. As inputs, Port 1 pins that are externally being pulled low will source current (IIL) because of the internal pull-ups. In addition, P1.0 and P1.1 can be configured to be the timer/counter 2 external count input (P1.0/T2) and the timer/counter 2 trigger input (P1.1/T2EX), respectively, as shown in the following table. Port 1 also receives the low-order address bytes during Flash programming and output buffers can sink/source four TTL inputs. When 1s are written to Port 2 pins, they are pulled high by the internal pull-ups and can be used as inputs. As inputs, Port 2 pins that are externally being pulled low will source current (I IL) Because of the internal pull-ups. Port 2 emits the high-order address byte during fetches from external program memory and during accesses to external data memory that use 16-bit addresses (MOBX@DPTR). In this application, Port 2 uses strong internal pull-ups when emitting 1s. During accesses to external data memory that use 8-bit addresses (MOVX@RI),Port 2 emits the contents of the P2 Special Function Register. Port 2 also receives the high-order address bits and some control signals during Flash programming and verification. 2.6 Port 3: Port 3 is an 8-bit bidirectional I/O port with internal pull-ups. The Port 3 output buffers can sink/source four TTL inputs. When 1s are written to Port 3 pins, they are pulled high by the internal pull-ups and can be used as inputs. As inputs, Port

AT89C52单片机简介

AT89C52是51系列单片机的一个型号,它是ATMEL公司生产的。 AT89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATME L公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,功能强大的AT89C52单片机可为您提供许多较复杂系统控制应用场合。 AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89C52可以按照常规方法进行编程,但不可以在线编程(S系列的才支持在线编程)。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。 兼容MCS51指令系统· 8k可反复擦写(>1000次)Flash ROM · 32个双向I/O口· 256x8bit内部RAM · 3个16位可编程定时/计数器中断· 时钟频率0-24MHz · 2个串行中断· 可编程UART串行通道 · 2个外部中断源· 共6个中断源 · 2个读写中断口线· 3级加密位 — · 低功耗空闲和掉电模式· 软件设置睡眠和唤醒功能 AT89C52P为40 脚双列直插封装的8 位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc52 相同,其主要用于会聚调整时的功能控制。功能包括对会聚主IC 内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。主要管脚有:XTAL1(19 脚)和XTAL2(18 脚)为振荡器输入输出端口,外接12MHz 晶振。RST/Vpd(9 脚)为复位输入端口,外接电阻电容组成的复位电路。VCC(40 脚)和VSS(20 脚)为供电端口,分别接+5V电源的正负端。P0~P3 为可编程通用I /O 脚,其功能用途由软件定义,在本设计中,P0 端口(32~39 脚)被定义为N1 功能控制端口,分别与N1的相应功能管脚相连接,13 脚定义为IR输入端,10 脚和1

AT89C52单片机介绍

AT89C52单片机介绍 在众多的单片机系列中,AT89C52是一种低功耗、高性能CMOS8位微控制器,具有8K在系列可编程Flash存储器。使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,也适用于常规编程。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89C52为众多嵌入式控制应用系统提供高灵活、超高效的解决方案。 AT89C52具有以下标准功能:8K字节Flash,256字节RAM,32位I/O口线,3个16位定时器/计数器,一个响亮2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89C52可降至0HZ静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。AT89C52单片机为很多嵌入式控制系统提供了一种灵活性高且廉价的方案。故此选用AT89C52单片机。 1 AT89C52单片机 1.1 AT89C52单片机的硬件结构 如图3-1所示,为AT89C52的硬件结构图。AT89C52单片机的内部结构与MCS-51系列单片机的构成基本相同。CPU是由运算器和控制器所构成的。运算器主要用来对操作数进行算术、逻辑运算和位操作的。控制器是单片机的指挥控制部件,主要任务的识别指令,并根据指令的性质控制单片机各功能部件,从而保证单片机各部分能自动而协调地工作。它的程序存储器为8K字节可重擦写Flash闪速存储器,闪烁存储器允许在线+5V电擦除、电写入或使用编程器对其重复编程。数据存储器比51系列的单片机相比大了许多为256字节RAM。AT89C52单片机的指令系统和引脚功能与MCS-51的完全兼容。

AT89S52单片机简介

AT89S52 单片机简介 AT89S52为ATMEL所生产的一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flsah存储器。 (一)、AT89S52主要功能列举如下: 1、拥有灵巧的8位CPU和在系统可编程Flash 2、晶片内部具时钟振荡器(传统最高工作频率可至12MHz) 3、内部程序存储器(ROM)为8KB 4、内部数据存储器(RAM)为256字节 5、32个可编程I/O口线 6、8个中断向量源 7、三个16位定时器/计数器 8、三级加密程序存储器 9、全双工UART串行通道 (二)、AT89S52各引脚功能介绍: VCC: AT89S52电源正端输入,接+5V。 VSS: 电源地端。 XTAL1: 单芯片系统时钟的反相放大器输入端。

XTAL2: 系统时钟的反相放大器输出端,一般在设计上只要在XTAL1和XTAL2上接上一只石英振荡晶体系统就可以动作了,此外可以在两引脚与地之间加入一 20PF的小电容,可以使系统更稳定,避免噪声干扰而死机。 RESET: AT89S52的重置引脚,高电平动作,当要对晶片重置时,只要对此引脚电平提升至高电平并保持两个机器周期以上的时间,AT89S51便能完成系统重置的各项动作,使得内部特殊功能寄存器之内容均被设成已知状态,并且至地址0000H处开始读入程序代码而执行程序。 EA/Vpp: "EA"为英文"ExternalAccess"的缩写,表示存取外部程序代码之意,低电平动作,也就是说当此引脚接低电平后,系统会取用外部的程序代码(存于外部EPROM中)来执行程序。因此在8031及8032中,EA引脚必须接低电平,因为其内部无程序存储器空间。如果是使用8751内部程序空间时,此引脚要接成高电平。此外,在将程序代码烧录至8751内部EPROM时,可以利用此引脚来输入21V的烧录高压(Vpp)。 ALE/PROG: ALE是英文"AddressLatchEnable"的缩写,表示地址锁存器启用信号。 AT89S52可以利用这支引脚来触发外部的8位锁存器(如74LS373),将端口0的地址总线(A0~A7)锁进锁存器中,因为AT89S52是以多工的方式送出地址及数据。平时在程序执行时ALE引脚的输出频率约是系统工作频率的1/6,因此可以用来驱动其他周边晶片的时基输入。此外在烧录8751程序代码时,此引脚会被当成程序规划的特殊功能来使用。 PSEN: 此为"ProgramStoreEnable"的缩写,其意为程序储存启用,当8051被设成为读取外部程序代码工作模式时(EA=0),会送出此信号以便取得程序代码,通

at89s52单片机的引脚图及各引脚功能说明

AT89S52 单片机的引脚图及各引脚功能说明 由于本书所有的例程均是基于AT89S52 单片机开发的,这里着重介绍AT89S52 各个引脚及功能。这些关系到在后面学习例程时对原理图的理解,读者要特别重视。而对于存储器、定时器、中断系统等部分内容,读者可参考介绍MCS-51单片机的相关书籍。 AT89S52 是Atmel公司生产的一种低功耗、高性能CMOS 8位微控制器,具有8 位在系统可编程Flash存储器。AT89S52 使用Atme 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash 允许程序存储器在系统可编程,也适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52 为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 AT89S52 具有PDIP、PLCC、TQFP3 种封装形式以适用于不同的使用场合。各封装引脚定义如图所示。 ?

? 图 AT89S52引脚图 下面简单介绍AT89S52 各引脚的功能,更多信息请查阅Atmel公司的技术文档。 VCC:电源。 GND:地。 P0 口:P0 口是一个8 位漏极开路的双向I/O 口。作为输出口,每位能驱动8 个TTL逻辑电平。对P0 端口写“1”时,引脚用做高阻抗输入。当访问外部程序和数据存储器时,P0 口也被作为低8 位地址/数据复用。在这种模式下,P0 具有内部上拉电阻。在Flash编程时,P0 口也用来接收指令字节;在程序校验时,输出指令字节。在程序校验时,需要外部上拉电阻。 P1 口:P1 口是一个具有内部上拉电阻的8 位双向I/O 口,P1 输出缓冲器能驱动4 个TT 逻辑电平。当对P1 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。当作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。此外,和分别作为定时器/计数器2 的外部计数输入(T2)和定时器/计数器2的触发输入(T2EX),具体如表1-1 所示。在Flash编程和校验时,P1口接收低8 位地址字节。 P2 口:P2 口是一个具有内部上拉电阻的8 位双向I/O 口,P2 输出缓冲器能驱动4 个TT 逻辑电平。对P2 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输

AT89S52单片机应用

原文 Title:AT89S52 MCU APPLICATIONS Function Characteristic Description The AT89S52 is a low-power, high-performance CMOS 8-bit microcontroller with 8K bytes of in- system programmable Flash memory. The device is manufactured using Atmel ’high-density nonvolatile memory technology and is compatible with the indus-try-standard 80C51 instruction set and pinout. The on-chip Flash allows the program memory to be reprogrammed in-system or by a conventional nonvolatile memory pro-grammer. By combining a versatile 8-bit CPU with in-system programmable Flash on a monolithic chip, the Atmel AT89S52 is a powerful microcontroller which provides a highly-flexible and cost-effective solution to many embedded control applications.The AT89S52 provides the following standard features: 8K bytes of Flash, 256 bytes of RAM, 32 I/O lines, Watchdog timer, two data pointers, three 16-bit timer/counters, a six-vector two-level interrupt architecture, a full duplex serial port, on-chip oscillator, and clock circuitry. In addition, the AT89S52 is designed with static logic for operation down to zero frequency and supports two software selectable power saving modes. The Idle Mode stops the CPU while allowing the RAM, timer/counters, serial port, and interrupt system to continue functioning. The Power-down mode saves the RAM con-tents but freezes the oscillator, disabling all other chip functions until the next interrupt or hardware reset. Watchdog Timer The WDT is intended as a recovery method in situations where the CPU may be subjected to software upsets. The WDT consists of a 14-bit counter and the Watchdog Timer Reset (WDTRST) SFR. The WDT is defaulted to disable from exiting reset. To enable the WDT, a user must write 01EH and 0E1H in sequence to the WDTRST register (SFR location 0A6H). When the WDT is enabled, it will increment every machine cycle while the oscillator is running. The WDT timeout period is dependent on the external clock frequency. There is no way to disable the WDT except through reset (either hardware reset or WDT overflow reset). When WDT over-flows, it will drive an output RESET HIGH pulse at the RST pin. In Power-down mode the oscillator stops, which means the WDT also stops. While in Power-down mode, the user does not need to service the WDT. There are two methods of

AT89S52芯片详细介绍

上集成了中央处理单元CPU、随机存储器RAM、只读存储器ROM、定时器/计数器和多种输入/输出(I/O),如并行I/O、串行I/O和A/D转换器等。就其组成而言一块单片机就是一台计算机。典型的结构如图1-1所示。由于它具有许多适用于控制的指令和硬件支持而广泛应用于工业控制、仪器仪表、外设控制、顺序控制器中,所以又称为微控制单元(MCU)。 MCS-51系列单片机,是Intel公司继MCS-48系列单片机之后,在1980年推出的高档8位单片机。当时MCS-51系列产品有8051、8031、8751、80C51、80C31等型号。它们的结构基本相同,其主要差别反映在寄存器的配置上有所不同。8051内部没有4K字节的掩膜ROM程序存储器,8031片内没有程序存储器,而8751是将8051片内的ROM换成EPROM。 ATMEL89系列单片机是ATMEL公司的以8031核构成的8位Flash单片机系列。这个系列单片机的最大特点就是在片内含有Flash存储器, AT89S52单片机是一种低功耗高性能的CMOS8位微控制器,内置8KB可在线编程闪存。该器件采用Atmel 公司的高密度非易失性存储技术生产,其指令与工业标准的80C51指令集兼容。片内程序存储器允许重复在线编程,允许程序存储器在系统内通过SPI串行口改写或用同用的非易失性存储器改写。通过把通用的8位CPU与可在线下载的Flash集成在一个芯片上,AT89S52便成为一个高效的微型计算机。它的应用范围广,可用于解决复杂的控制问题,且成本较低。其结构框图如图1-2所示。 1.2 特性 AT89S52的主要特性如下: 兼容MCS51产品 8K字节可擦写1000次的在线可编程ISP 闪存 4.0V到 5.5V的工作电源范围 全静态工作:0Hz ~24MHz 3级程序存储器加密 256字节内部RAM 32条可编程I/O线 3个16位定时器/计数器 8个中断源 UART串行通道 低功耗空闲方式和掉电方式 通过中断终止掉电方式 看门狗定时器

AT89S52单片机资料和最小系统

AT89S52单片机的最小系统 AT89S52单片机的引脚(P1口) —: 准双向I/O口(内置了上拉电阻) 输出时一切照常,在作输入口用时要先对其写“1”。 —: 准双向I/O口(内置了上拉电阻) 输出时一切照常,仅在作输入口用时要先对其写“1”。 —: 准双向I/O口(内置了上拉电阻) 输出时一切照常,仅在作输入口用时要先对其写“1”。在读数据之前,先要向相应的锁存器做写1操作的I/O口称为准双向口; —: 双向I/O (内置场效应管上拉) 寻址外部程序存储器时分时作为双向8位数据口和输出低8位地址复用口;不接外部程序存储器时可作为8位准双向I/O口使用。 —: 双向I/O (内置了上拉电阻) 寻址外部程序存储器时输出高8位地址;不接外部程序存储器时可作为8位准双向I/O 口使用。

—: 双功能口(内置了上拉电阻) 它具有特定的第二功能。在不使用它的第二功能时它就是普通的通用准双向I/O口。 引脚第二功能 RxD: 串行口接收数据输入端 TxD: 串行口发送数据输出端 INT0: 外部中断0输入端 INT1: 外部中断1输入端 T0: 外部计数0脉冲输入端 T1: 外部计数1脉冲输入端 WR: 写外设控制信号输出端 RD: 读外设控制信号输出端 51单片机的8个特殊引脚 Vcc, GND: 电源端 XTAL1, XTAL2: 片内振荡电路输入、输出端 RESET: 复位端正脉冲有效(宽度10 mS) EA/Vpp: 寻址外部ROM控制端。低有效 片内有ROM时应当接高电平。 ALE/PROG: 地址锁存允许控制端。 PSEN:选通外部ROM的读(OE)控制端。低有效 51单片机的4个8位的I/O口 —:8位数据口和输出低8位地址复用口 (复用时是双向口;不复用时也是准双向口) —: 通用I/O口(准双向口) —: 输出高8位地址 (用于寻址时是输出口;不寻址时是准双向口) —: 具有特定的第二功能(准双向口) 注意:在不外扩ROM/RAM时,P0~P3均可作通用I/O口使用,而且都是准双向I/O口! P0口需外接上拉电阻 P1—P3 可接也可不接 在用作输入时都需要先置”1”

AT89S52简介及其keil使用

一、单片机系统结构 1.1总体结构 AT89S52是一种低功耗、高性能CMOS 8位微控制器,具有8K 在系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52在众多嵌入式控制应用系统中得到广泛应用。 1.1.1系统组成 单片机上集成了中央处理单元CPU、随机存储器RAM、只读存储器ROM、定时器/计数器和多种输入/输出(I/O),如并行I/O、串行I/O和A/D转换器等。就其组成而言一块单片机就是一台计算机。典型的结构如图1-1所示。由于它具有许多适用于控制的指令和硬件支持而广泛应用于工业控制、仪器仪表、外设控制、顺序控制器中,所以又称为微控制单元(MCU)。 AT89S52单片机是一种低功耗高性能的CMOS8位微控制器,内置8KB 可在线编程闪存。该器件采用Atmel公司的高密度非易失性存储技术生产,其指令与工业标准的80C51指令集兼容。片内程序存储器允许重复在线编程,允许程序存储器在系统内通过SPI串行口改写或用同用的非易失性存储器改写。通过把通用的8位CPU与可在线下载的Flash集成在一个芯片上,AT89S52便成为一个高效的微型计算机。它的应用范围广,可用于解决复杂的控制问题,且成本较低。其结构框图如图所示。 1.1.2单片机工作原理AT89S52的主要特性如下: 兼容MCS51产品 8K字节可擦写1000次的在线可编程ISP 闪存 4.0V到 5.5V的工作电源范围 全静态工作:0Hz ~24MHz

AT89S52简介及其最小系统

AT89S52 AT89S52——低功耗高性能CMOS 8位单片机,片内8k Bytes ISP(In-system programmable)的可反复擦写1000次的FLASH只读程序存储器,器件采用ATMEL 公司之高密度、非易失性存储技术制造,兼容标准 MCS-51指令系统及80C51引脚结构,片上Flash允许程序存储器在系统可编程,亦适于常规编程器。单芯片上,拥有8 位CPU及在系统可编程FLASH,使AT89S52为众多嵌入式控制应用系统提供高灵活、超有效之解决方案。 AT89S52之特点:40个引脚,8k Bytes Flash片内程序存储器,256 bytes 的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。

AT89C52——低电压高性能CMOS 8位单片机,片内8k bytes的可反复擦写的FLASH只读程序存储器及256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器及FLASH存储单元,功能强大之AT89C52单片机可为您提供许多较复杂系统控制之应用场合。 AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89C52可按照常规方法进行编程,亦可在线编程。其将通用之微处理器及Flash存储器结合,特别是可反复擦写的FLASH存储器可有效降低开发成本。 AT89C52及AT89S52之别,在于C及S, C表示需用并行编程器下载(接线多且复杂),S表示可支持ISP下载,可在89S52系统板上面预留ISP下载接口, ISP下载线可方便地自制,一74HC373,若干电阻,连接电脑并口就可用软件将hex文件下载至89S52。相比较AT89C52及AT89S52 ,以方便计,选用AT89S52。 图3 DIP—40封装89S52引脚图 AT89S52功能:8k字节FLASH,256字节RAM,32位I/O口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一6向量2级中断结构,全双

相关文档