AT89S52语言常用程序.docx

上传人:b****4 文档编号:5682735 上传时间:2023-05-09 格式:DOCX 页数:55 大小:26.01KB
下载 相关 举报
AT89S52语言常用程序.docx_第1页
第1页 / 共55页
AT89S52语言常用程序.docx_第2页
第2页 / 共55页
AT89S52语言常用程序.docx_第3页
第3页 / 共55页
AT89S52语言常用程序.docx_第4页
第4页 / 共55页
AT89S52语言常用程序.docx_第5页
第5页 / 共55页
AT89S52语言常用程序.docx_第6页
第6页 / 共55页
AT89S52语言常用程序.docx_第7页
第7页 / 共55页
AT89S52语言常用程序.docx_第8页
第8页 / 共55页
AT89S52语言常用程序.docx_第9页
第9页 / 共55页
AT89S52语言常用程序.docx_第10页
第10页 / 共55页
AT89S52语言常用程序.docx_第11页
第11页 / 共55页
AT89S52语言常用程序.docx_第12页
第12页 / 共55页
AT89S52语言常用程序.docx_第13页
第13页 / 共55页
AT89S52语言常用程序.docx_第14页
第14页 / 共55页
AT89S52语言常用程序.docx_第15页
第15页 / 共55页
AT89S52语言常用程序.docx_第16页
第16页 / 共55页
AT89S52语言常用程序.docx_第17页
第17页 / 共55页
AT89S52语言常用程序.docx_第18页
第18页 / 共55页
AT89S52语言常用程序.docx_第19页
第19页 / 共55页
AT89S52语言常用程序.docx_第20页
第20页 / 共55页
亲,该文档总共55页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

AT89S52语言常用程序.docx

《AT89S52语言常用程序.docx》由会员分享,可在线阅读,更多相关《AT89S52语言常用程序.docx(55页珍藏版)》请在冰点文库上搜索。

AT89S52语言常用程序.docx

AT89S52语言常用程序

一、闪烁灯

#include//

sbitgate=P2^0;//定义P2-0口

voidmain(void)

{

unsignedinti,j;

while

(1)

{

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

for(j=500;j>0;j--);//双重循环,延时约1秒

gate=!

gate;//对P-0口取反,控制小灯的亮灭

}

}

 

#include

#defineuintunsignedint

sbitgate1=P2^0;//定义P2-0口

sbitgate2=P2^1;//定义P2-1口

sbitgate3=P2^2;//定义P2-2口

sbitgate4=P2^3;//定义P2-3口

voidmain(void)

{

uinti,j;

while

(1)

{

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

for(j=250;j>0;j--);//双重循环,延时约0.2秒

gate1=!

gate1;//对P-0口取反,控制小灯的亮灭

gate2=!

gate2;//对P-1口取反,控制小灯的亮灭

gate3=!

gate3;//对P-2口取反,控制小灯的亮灭

gate4=!

gate4;//对P-3口取反,控制小灯的亮灭

}

}

#include

#include

#defineunitunsignedint

#defineucharunsignedchar

sbitL0=P2^0;

sbitL1=P2^1;

sbitL2=P2^2;

sbitL3=P2^3;

uchardataBUFFER[1]={0};/*定时器计数变量*/

voidmain(void)

{

P2=0x0f;//初始化端口

EA=1;IT1=1;ET0=1;

TMOD=0x01;/*T0方式1计时0.01秒*/

TH0=-5000/256;

TL0=-5000%256;

TR0=1;/*开中断,启动定时器*/

for(;;);

}

/*定时计数器0的中断服务子程序*/

voidintserv1(void)interrupt1using1

{

TH0=-5000/256;//定时器T0的高四位赋值

TL0=-5000%256;

BUFFER[0]=BUFFER[0]+1;//定时器T0的低四位赋值

if(BUFFER[0]==100)//百分秒进位

{

L3=!

L3;

L2=!

L2;

L1=!

L1;

L0=!

L0;

}

}

二、串口的简单测试程序

#include

voidmain(void)

{

unsignedcharastring;

/*在11.0592MHz晶振下,设置串行口9600数据传输率,方式3*/

TMOD=0x20;

TL1=0xfd;TH1=0xfd;

SCON=0xd8;PCON=0x00;/*串口接收字符RI置位,允许串口接收*/

TR1=1;

while

(1)

{

while(RI==0);

RI=0;/*串口接收标志位的软件清零*/

astring=SBUF;

}

}

三、行列键盘的输入例程

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

voiddelays(void);

ucharkbscan(void);

voidmain(void)

{

ucharkey;

while

(1)

{

key=kbscan();/*键扫描函数*/

delays();/*键消抖的延时函数*/

}

}

//键消抖的延时函数

voiddelays(void)

{

uchari;

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

}

//kbscan(void)键扫描函数

ucharkbscan(void)

{

ucharsccode,recode;

P1=0xf0;/*发全"0"行扫描码,列线输入*/

if((P1&0xf0)!

=0xf0)/*若有键按下*/

{

delays();/*延时去抖动*/

if((P1&0xf0)!

=0xf0)

{

sccode=0xfe;/*逐行扫描初值*/

while((sccode&0x10)!

=0)

{

P1=sccode;/*输出行扫描码*/

if((P1&0xf0)!

=0xf0)/*本行有键按下*/

{

recode=(P1&0xf0)|0x0f;

return((~sccode)+(~recode));/*返回特征字节码*/

}

elsesccode=(sccode<<1)|0x01;/*行扫描码左移一位*/

}

}

}

return(0);/*无键按下,返回值为0*/

}

 

四、锁定键盘的程序

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

voiddelays(void);

ucharkbscan(void);

main()

{

bitCRT;/*密码正确标志,=1密码正确*/

bitPRT;/*密码部分输入标志,=1密码部分输入*/

ucharCOUNT;/*计数单元,存放密码正确的位数*/

ucharKEY;/*被按下的键的编码*/

CRT=0;

PRT=0;

COUNT=0;

KEY=kbscan();/*键扫描函数*/

delays();/*键消抖的延时函数*/

switch(KEY)

{

case0xb7:

/*0键*/

{

if(CRT)

{

}

else/*密码不正确时*/

{

if(PRT)/*部分密码正确时*/

{

COUNT=COUNT+1;/*密码正确的位数加1*/

if(COUNT==3)/*密码所有位都正确*/

{

CRT=1;

PRT=0;

COUNT=0;

}

}

}

};break;

case0x7e:

/*1键*/

{

if(CRT)

{

/*密码正确时的操作内容*/

}

else/*密码不正确时*/

{

PRT=0;

COUNT=0;

}

};break;

case0xbe:

/*2键*/

{

if(CRT)

{

/*密码正确时的操作内容*/

}

else/*密码不正确时*/

{

if(PRT)/*部分密码正确时,说明密码错误*/

{

PRT=0;

COUNT=0;

}

else/*密码正确位数为0时,说明密码第一位正确*/

{

PRT=1;

COUNT=1;

}

}

};break;

case0xd7:

/*#键*/

{

if(CRT)/*密码正确时,锁定键盘*/

{

CRT=0;

PRT=0;

COUNT=0;

}

};break;

}

}

//键消抖的延时函数

voiddelays(void)

{

uchari;

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

}

//kbscan(void)键扫描函数

ucharkbscan(void)

{

ucharsccode,recode;

P1=0xf0;/*发全"0"行扫描码,列线输入*/

if((P1&0xf0)!

=0xf0)/*若有键按下*/

{

delays();/*延时去抖动*/

if((P1&0xf0)!

=0xf0)

{

sccode=0xfe;/*逐行扫描初值*/

while((sccode&0x10)!

=0)

{

P1=sccode;/*输出行扫描码*/

if((P1&0xf0)!

=0xf0)/*本行有键按下*/

{

recode=(P1&0xf0)|0x0f;

return((~sccode)+(~recode));/*返回特征字节码*/

}

elsesccode=(sccode<<1)|0x01;/*行扫描码左移一位*/

}

}

}

return(0);/*无键按下,返回值为0*/

}

五、单片机中的多路模拟开关例程

#include

#include

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

#defineadch0XBYTE[0x0000]

sbitP1_3=P1^3;

sbitP1_2=P1^2;

uintch0datal,ch0datah,i,light;

voidmain(void)

{

EA=1;PT0=1;//开外中断,并设置定时器;

ET0=1;

IT0=1;IT1=1;

EX0=1;EX1=1;ET2=1;

T2CON=0x08;

TMOD=0x21;

TH0=0xB9;//设置定时器的初值;

TL0=0xB0;

TR0=1;

TI=1;

ch0datah=0;

ch0datal=0;

P1_3=0;//设置控制端口的初值;

P1_2=0;

while

(1){}//等待外部的控制信号;

}

voidintsvr1(void)interrupt1//定时器1模拟外部控制信号的进入

{

TH0=0xB9;

TL0=0xB0;

TR0=1;

light=light+1;

if(light>1000)

{

P1_3=!

P1_3;//MAX333的控制信号取反,工作方式变化;

P1_2=!

P1_2;

light=0;//标志位显示当前的工作状态;

}

}

六、单片机控制的数码管显示

#include

#include

#include

#include

#defineDIGPORTXBYTE[0x8000]/*定义字位口*/

#defineWORDPORTXBYTE[0x4000]/*定义字型口*/

#defineucharunsignedchar

/*定义共阴极字型编码表(数字0~9)*/

ucharcodeTABLE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

//显示:

得到字型和字位口的地址后,向不同的字位送数据,进行数据的显示。

//数码管显示计数值个位

uchardigit;

uchardisp,delay;//对计数值取余数

main()

{

TMOD=0x60;/*T0方式1计时0.01秒*/

TH1=0;

TL1=0;

EA=1;ET1=0;TR1=1;/*开中断,启动定时器*/

for(;;)

{

/*数码管显示计数值低位*/

digit=0x08;

disp=TL1%10;

DIGPORT=digit;

WORDPORT=TABLE[disp];

for(delay=0;delay<=200;delay++);

//…显示其它位的数据

}

}

七、单片机的数字时钟例程

#include

#include

#defineunitunsignedint

#defineucharunsignedchar

/*定义字型字位口*/

#defineDIGPORTXBYTE[0x8000]

#defineWORDPORTXBYTE[0x4000]

/*定义P1口各管脚*/

sbitK0=P1^0;

sbitK1=P1^1;

sbitK2=P1^2;

sbitBEEP=P1^3;

sbitL0=P1^4;

sbitL1=P1^5;

sbitL2=P1^6;

sbitL3=P1^7;

uchardataBUFFER[2]={0,0};/*显示缓冲区(依次为低位,高位)*/

uchardataCLOCK[4]={0,0,0,0};/*存放时钟时间(依次为百分秒,秒,分和时位)*/

uchardataSECOND[2]={0,0};/*存放秒表时间(依次为百分秒,秒)*/

uchardataREVERSE[4]={0,0,0,0};/*存放倒计时时间(依次为百分秒,秒,分和时位)*/

/*定义运行状态*/

uchardataSTATE=0;

/*STATE=0,秒表*/

/*STATE=1,倒计时分调整*/

/*STATE=2,倒计时小时调整*/

/*STATE=3,倒计时运行*/

/*STATE=4or7,时钟运行*/

/*STATE=5,时钟分调整*/

/*STATE=6,时钟时调整*/

bitbdataSND=0;/*秒表START*/

bitbdataRST=0;/*秒表RESET*/

bitbdataSTP=0;/*倒计时STOP*/

/*数码管显示编码"0"-"9","A","-"*/

ucharcodeTABLE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x40};

voiddisplay(void)

{

uchari;/*显示缓冲区首址*/

uchardelay;/*显示延时*/

uchardisp;/*显示内容*/

uchardigit;/*定义数码管显示位*/

digit=0x08;

for(i=0;i<2;i++)/*秒表,显示百分秒和秒*/

{

if(BUFFER[i]>100)disp=BUFFER[i]%10+10;

elsedisp=BUFFER[i]%10;

DIGPORT=digit;

WORDPORT=TABLE[disp];

for(delay=0;delay<=200;delay++);

digit=digit>>1;

disp=BUFFER[i]/10;

DIGPORT=digit;

WORDPORT=TABLE[disp];

for(delay=0;delay<=200;delay++);

digit=digit>>1;

}

}

 

voidtimer0(void)interrupt1using1

{

/*重置定时初值*/

TH0=-5000/256;

TL0=-5000%256;

/*时钟处理*/

CLOCK[0]=CLOCK[0]+1;

if((CLOCK[0]==50)&&(STATE>=4))

{

L0=!

L0;

}

if(CLOCK[0]==100)

{

if(STATE>=4)L0=!

L0;

CLOCK[0]=0;

CLOCK[1]=CLOCK[1]+1;

if(CLOCK[1]==60)

{

CLOCK[1]=0;

CLOCK[2]=CLOCK[2]+1;

if(CLOCK[2]==60)

{

CLOCK[2]=0;

CLOCK[3]=CLOCK[3]+1;

if(CLOCK[3]==24)

{

CLOCK[3]=0;

}

}

}

}

}

voidtimer2(void)interrupt5using3

{

TF2=0;

TH2=-5000/256;

TL2=-5000%256;

/*秒表处理*/

if(STATE==0)

{

SECOND[0]=SECOND[0]+1;

if(SECOND[0]==50)

{

L1=!

L1;

}

if(SECOND[0]==100)

{

L1=!

L1;

SECOND[0]=0;

SECOND[1]=SECOND[1]+1;

if(SECOND[1]==100)

{

SECOND[1]=0;

}

}

}

/*倒计时处理*/

if(STATE==3)

{

REVERSE[0]=REVERSE[0]+1;

if(REVERSE[0]==50)

{

L2=!

L2;

}

if(REVERSE[0]==100)

{

L2=!

L2;

REVERSE[0]=0;

REVERSE[1]=REVERSE[1]+1;

if(REVERSE[1]==60)

{

REVERSE[1]=00;

REVERSE[2]=REVERSE[2]-1;

if((REVERSE[2]==0)&&(REVERSE[3]==0))

{

TR2=0;

STP=1;

BEEP=0;

}

elseif(REVERSE[2]==0xff)

{

REVERSE[2]=59;

REVERSE[3]=REVERSE[3]-1;

}

}

}

}

}

 

voidintsvr1(void)interrupt2using2

{

if(STATE==5)

{

CLOCK[2]=CLOCK[2]+1;

if(CLOCK[2]==60)CLOCK[2]=0;

}

if(STATE==6)

{

CLOCK[3]=CLOCK[3]+1;

if(CLOCK[3]==24)CLOCK[3]=0;

}

}

voidtimer1(void)interrupt3using3

{

if(STATE==0)

{

if(RST)

{

SECOND[0]=0;

SECOND[1]=0;

L1=1;

RST=0;

}

else

{

if(SND)TR2=1;

else

{

L1=1;

TR2=0;

RST=1;

}

SND=!

SND;

}

}

elseif(STATE==1)

{

REVERSE[2]=REVERSE[2]+1;

if(REVERSE[2]==60)REVERSE[2]=0;

}

elseif(STATE==2)

{

REVERSE[3]=REVERSE[3]+1;

if(REVERSE[3]==24)REVERSE[3]=0;

}

else

{

if(STP)

{

BEEP=1;

L2=1;

STP=0;

}

elseTR2=0;

}

}

 

voidmain(void)

{

ucharstabak;/*上一次程序运行的状态*/

P1=0x0f;

EA=1;IT1=1;ET0=1;

TMOD=0x61;/*T1方式2计数,T0方式1计时*/

TH0=-5000/256;TL0=-5000%256;

TH1=0xff;TL1=0xff;

T2CON=0;TH2=-5000/256;TL2=-5000%256;

K0=1;K1=1;K2=1;

STATE=P1&0x07;

stabak=STATE;

for(;;)

{

switch(STATE)

{

case0:

/*STATE=0,秒表*/

{

EX1=0;ET1=1;ET2=1;TR1=1;SND=1;

L1=1;L0=0;L2=0;

SECOND[0]=0;

SECOND[1]=0;

}break;

case1:

/*STATE=1,倒计时分调整*/

{

EX1=0;ET1=1;ET2=1;TR1=1;TR2=0;

L2=1;L0=0;L1=0;

REVERSE[0]=0;

REVERSE[1]=0;

}break;

case2:

/*STATE=2,倒计时小时调整*/

{

EX1=0;ET1=1;ET2=1;TR1=1;TR2=0;

L2=1;L0=0;L1=0;

REVERSE[0]=0;

REVERSE[1]=0;

}break;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2