delay_ms(300);//延时一下每个灯亮300ms
}
for(a=0;a<8;a++)//循环8次
{
P1=~(0x80>>a);//依次点亮led
delay_ms(300);//延时一下每个灯亮300ms
}
}
}
7外部中断
#include"reg52.h"
sbitled1=P1^0;
voiddelay_ms(intz)
{
inta;
for(;z>0;z--)
for(a=110;a>0;a--);
}
voidmain(void)
{EA=1;//打开总中断
EX0=1;//打开中断0
IT0=0;//触发方式=1高电平触发=0低电平触发
EX1=1;//打开中断1
IT1=0;//
while
(1)
{
led1=0;
delay_ms(200);
led1=1;
delay_ms(200);
}
}
voidint0()interrupt0
{
led1=0;
}
voidint1()interrupt2
{
led1=0;
delay_ms(500);
led1=1;
delay_ms(500);
}
8单个数码管
#include"reg52.h"
sbitw1=P2^4;
sbitw2=P2^5;
sbitw3=P2^6;
sbitw4=P2^7;
unsignedcharsmg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0-9数组
voiddelay_ms(intz)//延时函数
{
inta;
for(;z>0;z--)
for(a=110;a>0;a--);
}
/*
主函数
*/
voidmain(void)
{
w1=0;//打开第一位数码管控制正极的三极管
while
(1)
{
P0=smg[];//显示下标为k的数
scankey();//扫描按键状态
}
}
9两位数码管
#include"reg52.h"
sbitw1=P2^4;
sbitw2=P2^5;
unsignedcharsmg[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
};//0-9数组291625334
voiddelay_ms(intz)//延时函数
{
inta;
for(;z>0;z--)
for(a=110;a>0;a--);
}
/*
主函数
*/
voidmain(void)
{ints=39;
while
(1)
{
w1=0;//打开第一位数码管的正极
P0=smg[s/10];//送入要显示的数据到数码管
delay_ms
(2);//延时一会
P0=0xff;//
w1=1;//第一位数码管的正极也就失去了正极
w2=0;//打开第二位数码管的正极
P0=smg[s%10];//送入要显示的数据到数码管
delay_ms
(2);//延时一会
P0=0xff;
w2=1;
}
}
10按键控制四位数码管
#include"reg52.h"
sbitw1=P2^4;
sbitw2=P2^5;
sbitw3=P2^6;
sbitw4=P2^7;
sbitk1=P3^2;
sbitk2=P3^3;
unsignedcharsmg[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
};//0-9数组291625334
intk=0;
voiddelay_ms(intz)//延时函数
{
inta;
for(;z>0;z--)
for(a=110;a>0;a--);
}
voiddisplay(unsignedints)
{
w1=0;//打开第一位数码管的正极
P0=smg[s/1000];//送入要显示的数据到数码管
delay_ms
(2);//延时一会
P0=0xff;//
w1=1;//第一位数码管的正极也就失去了正极
w2=0;//打开第二位数码管的正极
P0=smg[s%1000/100];//送入要显示的数据到数码管
delay_ms
(2);//延时一会
P0=0xff;
w2=1;
w3=0;//打开第一位数码管的正极
P0=smg[s%1000%100/10];//送入要显示的数据到数码管
delay_ms
(2);//延时一会
P0=0xff;//
w3=1;//第一位数码管的正极也就失去了正极
w4=0;//打开第二位数码管的正极
P0=smg[s%1000%100%10];//送入要显示的数据到数码管
delay_ms
(2);//延时一会
P0=0xff;
w4=1;
}
/*
主函数
*/
voidmain(void)
{
while
(1)
{if(k1==0)
{
delay_ms(5);
if(k1==0)
{
k=k+50;
if(k>2000)k=0;
while(k1==0)display(k);
}
}
if(k2==0)
{
delay_ms(5);
if(k2==0)
{
k=k-50;
if(k<0)k=2000;
while(k2==0)display(k);
}
}
display(k);
}
}
11定时器
#include"reg52.h"
sbitw1=P2^4;
sbitw2=P2^5;
sbitw3=P2^6;
sbitw4=P2^7;
unsignedcharsmg[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
};//0-9数组291625334
intm,c,f;
voiddelay_ms(intz)//延时函数
{
inta;
for(;z>0;z--)
for(a=110;a>0;a--);
}
voiddisplay(unsignedints,l)
{
w1=0;//打开第一位数码管的正极
P0=smg[s/10];//送入要显示的数据到数码管
delay_ms
(2);//延时一会
P0=0xff;//
w1=1;//第一位数码管的正极也就失去了正极
w2=0;//打开第二位数码管的正极
P0=smg[s%10];//送入要显示的数据到数码管
delay_ms
(2);//延时一会
P0=0xff;
w2=1;
w3=0;//打开第一位数码管的正极
P0=smg[l/10];//送入要显示的数据到数码管
delay_ms
(2);//延时一会
P0=0xff;//
w3=1;//第一位数码管的正极也就失去了正极
w4=0;//打开第二位数码管的正极
P0=smg[l%10];//送入要显示的数据到数码管
delay_ms
(2);//延时一会
P0=0xff;
w4=1;
}
/*
主函数
*/
voidmain(void)
{
TMOD=0x01;//设置定时器模式
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while
(1)
{
display(f,m);
}
}
voidmiaodata()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
c++;
if(c==20)
{
c=0;
m++;
if(m==60)
{
m=0;
f++;
if(f==60)
{
f=0;
}
}
}
}
12串口通信
#include
#defineucharunsignedchar
#definebaud96009600UL
#definebaud1920019200UL
#definefosc11059200UL//其中,UL代表unsignedlong
#definebaud_96001
sbitdj=P1^0;
sbitm0=P1^1;
sbitm1=P1^2;
intfx;//初始化舵机在中间
voiddelay(inta)
{
for(a=110;a>0;a--);
}
voidstop()
{
m0=0;
m1=0;
}
voidup()
{
m0=0;
m1=1;
}
voiddn()
{
m0=1;
m1=0;
}
voidserial_init(void)
{
TMOD=0x21;//T1工作在方式2
SCON=0x50;//SM1=1串口通信在模式1,REN=1并启动串口。
#ifbaud_9600
PCON=0;//波特率不加倍
TH1=256-(fosc*1)/(baud9600*12*32);
TL1=256-(fosc*1)/(baud9600*12*32);
#else
PCON=0x80;//波特率加倍
TH1=256-(fosc*2)/(baud19200*12*32);
TL1=256-(fosc*2)/(baud19200*12*32);
#endif
//如果PCON=0x80则fosc*2即波特率加倍
TR1=1;//定时器1开始计时
ES=1;//串口开启
EA=1;//总总断开启
TH0=(65536-100)/256;//高8位装值
TL0=(65536-100)%256;//低8位装值
EA=1;//总中断开启
ET0=1;//定时器0开启
TR0=1;//定时器0开始计数
}
voidDelay1000ms()//@12.000MHz
{
unsignedchari,j,k;
i=46;
j=153;
k=245;
do
{
do
{
while(--k);
}while(--j);
}while(--i);
}
inti=2;
ucharBuffer[5];
voidmain()
{
serial_init();
stop();
while
(1)
{
//if(p32==0)
//delay(5);
//if(p32==0)
//{
//fx++;
//if(fx==3)fx=0;
//while(p32==0);
//}
//fx=1;
//delay(10);
//fx=0;
//delay(20);
//dj=1;
//delay(20);
//dj=0;
Delay1000ms();
}
}
//SBUF=Buffer[4];
//while(!
TI);
//TI=0;
voidUSART()interrupt4
{
if(RI)
{
Buffer[i]=SBUF;
P1=SBUF;
SBUF=P1;
while(!
TI);
TI=0;
RI=0;
}
i--;
if(i<0)
{
i=2;//Buffer[2]Buffer[1]Buffer[1]
if(Buffer[0]==0xf1)up();//前//数据自行定义上位机发送0xffffff范围内的数据对应0xffffff
if(Buffer[0]==0xf2)stop();//前停止
if(Buffer[0]==0xf3)dn();//后
if(Buffer[0]==0xf4)stop();//后停止
if(Buffer[0]==0xf5)fx=1;
if(Buffer[0]==0xf6)fx=0;
if(Buffer[0]==0xf7)fx=2;
if(Buffer[0]==0xf6)fx=0;
//
//if(Buffer[1]==0xf1)P1&=0xEF;
//if(Buffer[1]==0xf2)P1|=0x10;
//if(Buffer[1]==0xf3)P1&=0xdF;
//if(Buffer[1]==0xf4)P1|=0x20;
//if(Buffer[1]==0xf5)P1&=0xbF;
//if(Buffer[1]==0xf6)P1|=0x40;
}
}
intcont;
voidtime0()interrupt1
{
TH0=(65536-100)/256;//高8位装值
TL0=(65536-100)%256;//低8位装值50000
cont++;
if(fx==0)
if(cont<=185)dj=0;elsedj=1;//0
//
if(fx==1)
if(cont<=190)dj=0;elsedj=1;//右45
//
if(fx==2)
if(cont<=180)dj=0;elsedj=1;//右45
if(cont==200)cont=0;
}
13直流电机正反转
#include"reg52.h"
sbitdianjizuo=P3^0;
sbitdianjiyou=P3^1;
sbitzhengzhuan=P3^2;
sbitfanzhuan=P3^3;
sbittingzhi=P3^4;
voidmain()
{
while
(1)
{
if(zhengzhuan==0)
{
dianjizuo=1;
dianjiyou=0;
}
if(fanzhuan==0)
{
dianjizuo=0;
dianjiyou=1;
}
if(tingzhi==0)
{
dianjizuo=1;
dianjiyou=1;
}
}
}
14交通灯
#include
#include
#defineucharunsignedchar
ucharSMG[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchara,b,num,numt=60;
sbitnblv=P1^0;
sbitnbhuang=P1^1;
sbitnbhong=P1^2;//南北
sbitdxhong=P1^3;
sbitdxlv=P1^4;
sbitdxhuang=P1^5;//东西
voiddelay(intz)
{
inta;
for(;z>0;z--)
for(a=110;a>0;a--);
}
voiddisplay(ints)
{
P2=0x01;//打开位选
P0=~SMG[s/10];
delay(5);
P0=0xff;
P2=0x02;//打开位选
P0=~SMG[s%10];
delay(5);
P0=0xff;
}
voidinit()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
voidmain()
{
init();
while
(1)
{
display(numt);
}
}
voidtime0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a++;
b++;
if(b==20)
{
b=0;
numt--;//数码管倒计时
if(numt==0)numt=60;