8051单片机Proteus仿真实例2(原理图+C程序)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1. INT0,INT1中断计数
原理图:
程序:
#include <reg51.h>
sbit k3=P3^4;
sbit k4=P3^5;
unsigned char code led_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; unsigned char code seg_code[]={0x20,0x10,0x08,0x04,0x02,0x01};
unsigned char led_buffer[]={0,0,0,0,0,0};
unsigned int count_a=0,count_b=0;
void delay(unsigned int x)
{
unsigned char t;
while(x--)
for(t=0;t<120;t++);
}
void display()
{
unsigned char i;
led_buffer[2]=count_a/100;
led_buffer[1]=count_a%100/10;
led_buffer[0]=count_a%10;
if(led_buffer[2]==0)
{
led_buffer[2]=10;
if(led_buffer[1]==0)
led_buffer[1]=10;
}
led_buffer[5]=count_b/100;
led_buffer[4]=count_b%100/10; led_buffer[3]=count_b%10;
if(led_buffer[5]==0)
{
led_buffer[5]=10;
if(led_buffer[4]==0)
led_buffer[4]=10;
}
for(i=0;i<6;i++)
{
P2=seg_code[i];
P1=led_code[led_buffer[i]];
delay(1);
}
}
void main()
{
IT0=1;
IT1=1;
PX0=1;
IE=0x85;
while(1)
{
k3=1;
k4=1;
if(k3==0) count_a=0;
if(k4==0) count_b=0;
display();
}
}
void int0() interrupt 0
{
count_a++;
}
void int1() interrupt 2
{
count_b++;
}
2. INT0中断计数
原理图:
程序:
#include <reg51.h>
unsigned char code led_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; unsigned char led_buffer[]={0,0,0};
unsigned count=0;
sbit key=P3^6;
void display()
{
led_buffer[2]=count/100;
led_buffer[1]=count%100/10;
led_buffer[0]=count%10;
if(led_buffer[2]==0)
{
led_buffer[2]=10;
if(led_buffer[1]==0)
led_buffer[1]=10;
}
P0=led_code[led_buffer[0]];
P1=led_code[led_buffer[1]];
P2=led_code[led_buffer[2]];
}
void main()
{
IE=0x81;
IT0=1;
while(1)
{
key=1;
if(key==0)
count=0;
display();
}
}
void int0() interrupt 0 {
count++;
}
3.LED点阵原理图:
程序:
#include <reg51.h>
sbit led1=P0^0;
sbit led2=P0^1;
void delay(long dly)
{
while(dly--);
}
void main()
{
SCON=0x50;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
PCON=0x00;
TR1=1;
RI=0;
while(1)
{
if(RI==1)
{
RI=0;
switch(SBUF)
{
case 'A':led1=~led1;led2=1;break;
case 'B':led1=1;led2=~led2;break;
case 'C':led1=~led1;led2=~led2;break;
}
}
else led1=led2=1;
delay(1000);
}
}
4.串行通信(MAX232芯片)原理图:
程序:
#include <reg51.h> sbit led1=P0^0;
sbit led2=P0^1;
void delay(long dly) {
while(dly--);
}
void main()
{
SCON=0x50;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
PCON=0x00;
TR1=1;
RI=0;
while(1)
{
if(RI==1)
{
RI=0;
switch(SBUF)
{
case 'A':led1=~led1;led2=1;break;
case 'B':led1=1;led2=~led2;break;
case 'C':led1=~led1;led2=~led2;break;
}
}
else led1=led2=1;
delay(1000);
}
}
5.MAX7221芯片原理图:
程序:
#include <reg51.h>
#include <intrins.h>
sbit DIN=P2^0;
sbit CSB=P2^1;
sbit CLK=P2^2;
unsigned char code buffer[]={2,0,1,5,10,5,10,9};
void delay(long dly)
{
while(dly--);
}
void write(unsigned char addr,unsigned char dat)
{
unsigned char i;
CSB=0;
for(i=0;i<8;i++)
{
CLK=0;
addr<<=1;
DIN=CY;
CLK=1;
_nop_();
_nop_();
CLK=0;
}
for(i=0;i<8;i++) {
CLK=0;
dat<<=1;
DIN=CY;
CLK=1;
_nop_();
_nop_();
CLK=0;
}
CSB=1;
}
void initialise()
{
write(0x09,0xff); write(0x0a,0x07); write(0x0b,0x07); write(0x0c,0x01);
}
void main()
{
unsigned char i; initialise();
delay(10);
for(i=0;i<8;i++)
write(i+1,buffer[i]); while(1);
}
6. T0控制LED实现二进制计数原理图:
程序:
#include <reg51.h>
void main()
{
TMOD=0x05;
TR0=1;
TH0=0x00;
TL0=0x00;
while(1)
{
P1=TH0;
P2=TL0;
}
}
8. 按键控制LED循环原理图:
程序:
#include <reg51.h>
#include <intrins.h>
void delay(unsigned int x)
{
while(x--);
}
void move_led()
{
if((P1&0x10)==0) P0=_cror_(P0,1);
else if((P1&0x20)==0) P0=_crol_(P0,1);
else if((P1&0x40)==0) P2=_cror_(P2,1);
else if((P1&0x80)==0) P2=_crol_(P2,1);
}
void main()
{
unsigned char key;
P0=0xfe;
P2=0xfe;
P1=0xff;
key=0xff;
while(1)
{
if(key!=P1)
{
key=P1;
move_led();
delay(15000); }
}
}
9.按键控制数码管显示
原理图:
程序:
#include <reg51.h>
unsigned char code led_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; unsigned char code led_seg[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
unsigned char led_buffer[]={0,10,10,10,10,10,10,10};
void delay(unsigned int x)
{
unsigned char t;
while(x--) for(t=0;t<120;t++);
}
void led_display()
{
unsigned char i;
for(i=0;i<8;i++)
{
P2=led_seg[i];
P0=led_code[led_buffer[i]];
delay(2);
}
}
void main()
{
unsigned char i,key_val,key_count=0;
P0=0xff;
P1=0xff;
P2=0x00;
while(1)
{
led_display();
key_val=P1;
switch(key_val)
{
case 0xfe:key_count++;
if(key_count>8) key_count=8;
led_buffer[key_count-1]=key_count;
break;
case 0xfd:if(key_count>0) led_buffer[--key_count]=10;
if(key_count==0) led_buffer[0]=0;
break;
case 0xfb:led_buffer[0]=0;
for(i=1;i<8;i++)
led_buffer[i]=10;
key_count=0;
}
while(P1!=0xff)
led_display();
}
}
10.报警器原理图:
程序:
#include <reg51.h>
sbit SOUNDER=P1^0;
sbit BUTTON=P1^7;
void delay(unsigned int x)
{
while(x--);
}
void alarm(unsigned char t)
{
unsigned char i,j;
for(i=0;i<200;i++)
{
SOUNDER=!SOUNDER;
for(j=0;j<t;j++);
delay(15);
}
}
void main()
{
SOUNDER=0;
while(1)
{
BUTTON=1;
if(BUTTON==1)
{
alarm(90);
alarm(120);
}
}
}。