AT89S52语言常用程序.docx
- 文档编号:11268410
- 上传时间:2023-02-26
- 格式:DOCX
- 页数:55
- 大小:26.01KB
AT89S52语言常用程序.docx
《AT89S52语言常用程序.docx》由会员分享,可在线阅读,更多相关《AT89S52语言常用程序.docx(55页珍藏版)》请在冰豆网上搜索。
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;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AT89S52 语言 常用 程序