【无标题】

51单片机实验笔记(AT89C51)

一.时钟电路与复位电路

时钟电路:cap(电容)(在时钟电路里一般设置为22pf)和cry(水晶体)(一般设置为12M

image-20211114170020020

上电复位(电阻res)

image-20211114170715596

按键复位及上电复位:

image-20211116172045248

二.流水灯的实现

共阳极、共阴极(共阴极接反了)

image-20211116172353832

#include<reg51.h>
unsigned char leddat[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//00000001 00000010 00000100 00001000
void delay(unsigned int n)
{
	unsigned int i=0,j=0;
	for(i=0;i<n;i++)
	{
		for(j=0;j<120;j++);
	}
}
void led()
{
	int i=0;
	for(i=0;i<8;i++)
	{
		P2=~leddat[i];//取反,是因为低电平有效,此处为共阳极流水灯
		delay(100);
	}
}

void main()
{
	while(1)
	{
		led();
	}
}

三.数码管的使用(7seg)

数码管的结构和原理(共阴极和共阳极)

image-20211116173118838

image-20211116173230862

image-20211116173246595

静态显示与动态显示

image-20211116173553928

image-20211116173607980

实验演示电路

静态:

image-20211116175919502

#include<reg51.h>
unsigned char leddat[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴0-9
void delay(unsigned int n)
{
	unsigned int i=0,j=0;
	for(i=0;i<n;i++)
	{
		for(j=0;j<120;j++);
	}
}
void seg()
{
	int i=0;
	for(i=0;i<10;i++)
	{
		P2=leddat[i];
		delay(1000);
	}
}

void main()
{
	while(1)
	{
		seg();
	}
}

动态:显示hellocathode(阴极)

image-20211116182333291

#include<reg51.h>
unsigned char str[]={0x76,0x79,0x38,0x38,0x3F};//hello
unsigned char wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//位
void delay(unsigned int n)
{
	unsigned int i=0,j=0;
	for(i=0;i<n;i++)
	{
		for(j=0;j<120;j++);
	}
}
void seg()
{
	int i=0;
	for(i=0;i<5;i++)
	{
		P3=~wei[i];//取反,是因为低电平有效
		P2=str[i];
		delay(5);//视差
	}
}

void main()
{
	while(1)
	{
		seg();
	}
}

添加74ls138译码器:将8位口减少为三位

image-20211116183526047

#include<reg51.h>
unsigned char str[]={0x76,0x79,0x38,0x38,0x3F};
unsigned char wei[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};//译码器
void delay(unsigned int n)
{
	unsigned int i=0,j=0;
	for(i=0;i<n;i++)
	{
		for(j=0;j<120;j++);
	}
}
void seg()
{
	int i=0;
	for(i=0;i<5;i++)
	{
		P3=wei[i];//译码器已经取反,此处不需取反
		P2=str[i];
		delay(5);
	}
}

void main()
{
	while(1)
	{
		seg();
	}
}

四.键盘原理及按键的实现(button)

image-20211116183754678

image-20211116183841001

image-20211116183848520

image-20211116183855283

image-20211116195518088

#include<reg51.h>
sbit key0=P1^0;
unsigned char leddat[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴0-9
int num=0;
int flag=0;
void delay(unsigned int n)
{
	unsigned int i=0,j=0;
	for(i=0;i<n;i++)
	{
		for(j=0;j<120;j++);
	}
}
void key()
{
	//if(key0==0)
	//{
	//delay(200);
	//if(key0==0)
	//{
	//	num++;
	//}
	//}
	if(key0==0&&flag==0)
	{
		flag=1;
	}
	if(flag==1&&key0==1)
	{
		num++;
		flag=0;
	}
	
}
void seg()
{
	P2=leddat[num];
	if(num==10)
		num=0;
}

void main()
{
	while(1)
	{
		key();
		seg();
	}
}

image-20211116203701539

#include"reg51.h"
unsigned char s[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6f};
unsigned char num=0;

void delay(unsigned int n)
{ 
  unsigned char i=0,j=0;
  for (i=0;i<n;i++)
  {
   for (j=0;j<120;j++);
  }
}

void key_scan()
{ 
 unsigned char temp0=0,temp1=0,temp;
  P1=0xf0;
  if(P1!=0xf0)
  {
   delay(20);
   temp0=P1;
   P1=0x0f;
   if(P1!=0x0f)
   {
	 delay(20);
     temp1=P1;
   }
  }
   temp=temp0+temp1;
   if(temp==0xee)
   {
    num=0;
   }
   if(temp==0xed)
   {
    num=1;
   }
}

void display()
{
 P2=s[num] ;
}
void main()
{
	while(1)
	{
	  key_scan();
	  display();
	}
} 

五.定时器/计数器

image-20211117220158163

image-20211117220218306

image-20211117220232243

image-20211117220241948

image-20211117220251966

image-20211117220352691

image-20211117220416042

工作方式1,16位定时器,定时50ms,每隔50ms进入一次中断,在中断中应该重置初值

#include"reg51.h"
unsigned char s[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴0-9
unsigned int count=0;
void inittimer()
{
	TMOD=0x01;//0000 0001
	TH0=(65536-50000)/256;//50ms=50000us   256=2^8 初值>>8 高八位右移,用于存储高八位
	TL0=(65536-50000)%256;//存入低八位
	ET0=1;//开启定时器0中断
	EA=1;//开启总中断
	TR0=1;//启动定时器0
}
void display()
{
	P2=s[count];
	if(count==10)
	{
		count=0;
	}
}

void main()
{
	inittimer();
	while(1)
	{
		display();
	}
}

void timer_isr() interrupt 1 //0表示外部中断,1表示定时器中断0,2表示外部中断1,3表示定时器中断1,4表示串口中断
{
	TH0=(65536-50000)/256;//
	TL0=(65536-50000)%256;//应该重新置入初值
	count++;//对应段码数组
}

image-20211117215412375

定时1s:

#include"reg51.h"
unsigned char s[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴0-9
unsigned int count=0,num=0;
void inittimer()
{
	TMOD=0x01;//0000 0001
	TH0=(65536-50000)/256;//50ms=50000us   256=2^8 初值>>8 高八位右移,用于存储高八位
	TL0=(65536-50000)%256;//存入低八位
	ET0=1;//开启定时器0中断
	EA=1;//开启总中断
	TR0=1;//启动定时器0
}
void display()
{
	P2=s[num];
	if(num==10)
	{
		num=0;
	}
}

void main()
{
	inittimer();
	while(1)
	{
		display();
	}
}

void timer_isr() interrupt 1 //0表示外部中断,1表示定时器中断0,2表示外部中断1,3表示定时器中断1,4表示串口中断
{
	TH0=(65536-50000)/256;//
	TL0=(65536-50000)%256;//应该重新置入初值
    count++;
    if(count==20)//定时1s
    {
        num++;//对应段码数组
        count=0;
    }
	
}

计数器(只能连接p3.4和p3.5)

#include"reg51.h"
unsigned char s[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴0-9
unsigned int num=0;
void initcounter()
{
	TMOD=0x06;//0000 0110 工作方式2,计数
	TH0=256-3;//计数3次
	TL0=256-3;
	ET0=1;//开启定时计数器0中断
	EA=1;//开启总中断
	TR0=1;//启动定时计数器0
}
void display()
{
	P2=s[num];
	if(num==10)
	{
		num=0;
	}
}

void main()
{
	initcounter();
	while(1)
	{
		display();
	}
}

void counter_isr() interrupt 1 //0表示外部中断,1表示定时器中断0,2表示外部中断1,3表示定时器中断1,4表示串口中断
{
	num++;
}

image-20211117225135866

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值