51单片机学习案例——自学使用

下列代码为自行学习时的复盘总结,有需要可以参考,第一行会写大概功能。
持续更新中…

#include <REGX51.H>   //功能:交通灯  190925 
sbit LED=P1^0;
void delay(unsigned int i)
{
 while(i--);
}
void main()
{
 while(1)
	 {
	  P1=0xDE;  //A green B  red
	  delay(50000);
	  delay(50000);
	  delay(50000);
	  delay(50000);
	  delay(20000);
	
	  P1=0xEE; // A yellow B red    
	  delay(50000);
	
	  P1=0xF3;   // A red B green 
	  delay(50000);
	  delay(50000);
	  delay(11000);
	
	  P1=0xF5;    // A red B yellow 
	  delay(50000);
	  
	 }
}

#include <REGX51.H>	   //功能:24秒倒计时响蜂鸣器  190924
sbit LED=P1^0 ;    //灯 
sbit Be=P2^0;		 //蜂鸣器 
sbit QC=P3^2 ;		//取消键,把线连到这个位置,按下后暂停	 
sbit KS=P3^3;		//开始键,按下后开始 
void delay (unsigned int i )
{ while(i--);
 }
void main ()
{
 unsigned int T_count=0;
 unsigned char count;
 LED=1;
 Be=1;
 QC=1;
 KS=1;
 TMOD=0x01;
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 while(KS);
 TR0=1;
 count=48;   //设置秒数,48为24s
 while(1)
 {
	  if(TF0==1)
	  {
	   TF0=0;
	   TH0=(65536-50000)/256;
	   TL0=(65536-50000)%256;
	   T_count++;
		   if(T_count==48) 	//设置秒数,48为24s
		   {
		    T_count=0;
		    LED=~LED;
		    count--;
			    if(count==0)
			    {
				     while(QC)
				     {
				     Be=0;
				     delay(200);
				     Be=1;
				     delay(200);
				     }
			     Be=1;
			     while(KS);
			     count=10;
			     }
		     }
	     }
     }
   }
#include <REG51.H>   // 功能: 显示数字,按下一个按键变下一位数  191028
sbit AX=P3^2;		//	 按下按键 
void delay1s(unsigned char i)
{ 
 for (i=0;i<20;i++)
 {
  TH1=0x3c;
  TL1=0xb0;
  TR1=1;
  while(!TF1);
  TF1=0;  
 } 
}
void main ()
{
 unsigned char code disp[]={0xC0,0xF9,0xA4,0xB0,0x99,
            0x92,0x82,0xF8,0x80,0x90}; 
 unsigned char two;
 TMOD=0x10;
 P2=0x00;
 while(1)
 {
  for(two=0;two<10;two++)
  {
   while(AX);
   while(!AX);
   delay1s(20);
   P0=disp[two];
   }
  } 
}
#include <REGX51.H>  //用数组在数码管显示学号   191104
void delay (unsigned char i)
{
 while(i--);
 }
int wz[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
int led[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void main()

{
	 while(1)
	 { 
	 P0=wz[0];
	 P1=led[5];
	 delay(100);
	 P0=wz[1];
	 P1=led[9];
	 delay(100);
	 P0=wz[2];
	 P1=led[5];
	 delay(100);
	 P0=wz[3];
	 P1=led[0];
	 delay(100);
	 P0=wz[4];
	 P1=led[1];
	 delay(100);
	 P0=wz[5];
	 P1=led[0];
	 delay(100);
	 P0=wz[6];
	 P1=led[2];
	 delay(100);
	 P0=wz[7];
	 P1=led[1];
	 delay(100);
	 }
}
#include <REGX51.H>   //时钟电路 可显示时间  由于晶振问题其实时间不是很准  191107
void delay1ms()   //5ms的话,时间会一直显示在刷新 
{
 TH0=(65536-1000)/256;
 TL0=(65536-1000)%256;
 TR0=1;
 while(!TF0);
 TF0=0;
 }
unsigned char i,h=18,m=36,s=20;    //想要显示的时间在这里设置,时分秒
int wz[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
int led[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
void main()
{
 
 TMOD=0x01;
 while(1)
 {
	 for(i=0;i<125;i++)
	 { 
	 P0=wz[0];
	 P1=led[s%10];
	 delay1ms();
	 P0=wz[1];
	 P1=led[s/10];
	 delay1ms();
	
	 P0=wz[2];
	 P1=led[10];    //显示-
	 delay1ms();
	
	 P0=wz[3];
	 P1=led[m%10];
	 delay1ms();
	 P0=wz[4];
	 P1=led[m/10];
	 delay1ms();
	
	 P0=wz[5];
	 P1=led[10];    //显示-
	 delay1ms();
	
	 P0=wz[6];
	 P1=led[h%10];
	 delay1ms();
	 P0=wz[7];
	 P1=led[h/10];
	 delay1ms();
	 }
				 s++;    //时间+
				 if(s==60)
				 {
				   s=0;
				   m++;
					 if(m==60)
					 {m=0;
					   h++;	
						 if(h>=23)
						 {h=0;
						  }
					 }
				 }
   }
}

上个代码效果图
效果图

#include <REGX51.H>				//功能:用74HC138模块三位连接,显示时钟,类似上一个
void delay5ms()
{
 TH0=(65536-1000)/256;
 TL0=(65536-1000)%256;
 TR0=1;
 while(!TF0);
 TF0=0;
 }
unsigned char i,h=18,m=36,s=20;
int wz[8]={0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00};
int led[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
void main()
{
 
 TMOD=0x01;
 while(1)
 {
	 for(i=0;i<125;i++)
	 { 
	 P0=wz[0];
	 P1=led[s%10];
	 delay5ms();		 //显示秒
	 P0=wz[1];
	 P1=led[s/10];
	 delay5ms();
	
	 P0=wz[2];
	 P1=led[10];    //显示-
	 delay5ms();
	
	 P0=wz[3];
	 P1=led[m%10];
	 delay5ms();
	 P0=wz[4];			   //显示分
	 P1=led[m/10];
	 delay5ms();
	
	 P0=wz[5];
	 P1=led[10];    //显示-
	 delay5ms();
	
	 P0=wz[6];
	 P1=led[h%10];
	 delay5ms();			 //显示时
	 P0=wz[7];
	 P1=led[h/10];
	 delay5ms();
	 }
				 s++;    //时间+
				 if(s==60)
				 {
				   s=0;
				   m++;
					 if(m==60)
					 {m=0;
					   h++;	
						 if(h>=23)
						 {h=0;
						  }
					 }
				 }
   }
}

连线效果
周末休息了继续更新

#include<REGX51.H>				  //功能:利用8*8点阵模块实现图形交替显示	 191111
void delayms(unsigned int i)
{
	unsigned char k;
	while(i--)
	for(k=0;k<120;k++);			   //120次空操作
}
void main()        
{        
unsigned char code led[]={0x00,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0x00};		//显示z
unsigned char code s[]={0x00,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x00};		//显示另一边的z
unsigned char w,i,z;
	 while(1)
	 { 
	 for(z=0;z<200;z++)				   //做200次后变另一个图形
	  {
	  w=0x01;
		   for(i=0;i<8;i++)				   //8位行列
		   {
		    P0=w;						   //行数据送到P0口;
		    P1=led[i];					   //列数据送到P1口;
		    delayms(1);
		    w<<=1;
		    P0=0xff;  					   //关显示
		   }
	   }
	 for(z=0;z<200;z++)
	  {
	  w=0x01;
	   for(i=0;i<8;i++)
	   {
	    P0=w;
	    P1=s[i];
	    delayms(1);
	    w<<=1;
	    P0=0xff;  
	   }
	  }
	 }
}

今日份 学中断 更新

#include <REGX51.H> //功能:中断的利用;主程序是流水灯,按下K1之后中断,全亮3秒所有灯,然后继续变回流水灯
#include <INTRINS.H>    // 191113
sbit K1=P3^2;
void delay (unsigned char q)
{
 unsigned int i;
 while(q--)
 {
  for(i=0;i<120;i++);
 }
}
void time50ms(unsigned char i)   //定义0.05秒
{
 unsigned int k;
 for(k=0;k<i;k++)
 {
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
  TR0=1;
  while(!TF0);
  TF0=0;
 }
}
void main()
{
 TMOD=0X01;  //设置T0,定时,方式1
 EX0=1;		//外部中断0允许位
 IT0=1;		//下降沿触发
 PX0=1;
 EX1=1;
 IT1=0;
 EA=1;
 P0=0XFE;  //流水灯初值
 while(1)
 {
  time50ms(10);
  P0=_crol_(P0,1);
 }
}
void int_0() interrupt 0 
{
 unsigned char i,j;
 delay(10);
 j=P0;  	//保护现场
	 for(i=0;i<3;i++)		//全亮三秒 
	 {
	 P0=0x00;
	 time50ms(20);		//一秒
	 }
 P0=j;	//恢复
}
void int_1() interrupt 2 using 2
{
 unsigned char i,j;
 j=P0;
 for(i=0;i<3;i++)
 {
 P0=0x00;              //全亮
 time50ms(10);
 P0=0xff;             //全灭
 time50ms(10);
 }
 while(!K2);
 P0=j;
}

又一个周末,今日进阶中断,和上一个类似,不过主程序代码不同

#include <REGX51.H> //功能:中断的利用;主程序是交通灯,按下K1之后中断,A口亮绿灯,按K2为全红灯
#include <INTRINS.H>    // 191118
sbit K1=P3^2;
sbit K2=P3^3;
void delay (unsigned char q)
{
 unsigned int i;
 while(q--)
 {
  for(i=0;i<120;i++);
 }
}
void time50ms(unsigned char i)   //定义0.05秒
{
 unsigned int k;
 for(k=0;k<i;k++)
 {
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
  TR0=1;
  while(!TF0);
  TF0=0;
 }
}
void main()
{
 TMOD=0X01;  //设置T0,定时,方式1
 EX0=1;  //外部中断0允许位
 IT0=1;  //下降沿触发
 PX0=1;
 EX1=1;
 IT1=0;
 EA=1;
 P0=0XFE;  //流水灯初值
 while(1)
 {
   P0=0xDE;  //A green B  red
   delay(50000);
   delay(50000);
   delay(50000);
   delay(50000);
   delay(20000);
 
   P0=0xEE; // A yellow B red    
   delay(50000);
 
   P0=0xF3;   // A red B green 
   delay(50000);
   delay(50000);
   delay(11000);
 
   P0=0xF5;    // A red B yellow 
   delay(50000);
 }
}
void int_0() interrupt 0 
{
 unsigned char i,j;
  delay(10);
  j=P0; 
   for(i=0;i<4;i++)
   {
     P0=0xDF; 
   time50ms(20);   
   }
   P0=j;
}
void int_1() interrupt 2
{
  unsigned char i,j;
  delay(10);
  j=P0; 
 for(i=0;i<8;i++)
 {
    P0=0xf6;
 time50ms(20);
 }
 P0=j; 
}

又一个周末休息,继续冲。之前学了中断的功能,这次把这个功能利用在时钟里,并实现一些效果

#include <REGX51.H>		//功能:时钟中断功能,可实现清零效果和暂停并恢复 
void delay5ms()     //191118 1125 1127
{
 TH0=(65536-1000)/256;
 TL0=(65536-1000)%256;
 TR0=1;
 while(!TF0);
 TF0=0;
 }
 sbit K1=P3^2; 
 sbit K2=P3^3;
 bit zt=0;
unsigned char count,h=11,m=9,s=20;
int wz[8]={0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00};
int led[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
void chushih()
{
	 TMOD=0x11;
	 TH1=(65536-50000)/256;
   	 TL1=(65536-50000)%256;
 	 TR1=1;	
	 while(!TF1);
 	 TF1=0;
	 EA=1;
	 ET1=1;
	 EX0=1;
	 EX1=1;
}
void xianshi()
{
   	P0=wz[0];
	 P1=led[s%10];
	 delay5ms();		 //显示秒
	 P0=wz[1];
	 P1=led[s/10];
	 delay5ms();
	
	 P0=wz[2];
	 P1=led[10];    //显示-
	 delay5ms();
	
	 P0=wz[3];
	 P1=led[m%10];
	 delay5ms();
	 P0=wz[4];			   //显示分
	 P1=led[m/10];
	 delay5ms();
	
	 P0=wz[5];
	 P1=led[10];    //显示-
	 delay5ms();
	
	 P0=wz[6];
	 P1=led[h%10];
	 delay5ms();			 //显示时
	 P0=wz[7];
	 P1=led[h/10];
	 delay5ms();

}
void shizhongz() interrupt 3     //时间变化 
{
	TH1=(65536-50000)/256;
   	TL1=(65536-50000)%256;
	count++;
	if (count==20){
	count=0;
	 			s++;    //时间+
				 if(s==60)
				 {
				   s=0;
				   m++;
					 if(m==60)
					 {m=0;
					   h++;	
						 if(h>=23)
						 {h=0;
						  }
					 }
				 } 
				 }
}
void qingl()  interrupt 0     //清零,按下P3^2对应的键即可 
{  
  s=0;
  m=0;
  h=0;
  count=0;   
}
void zant() interrupt 2     //暂停,按下P3^3对应的键即可,再按下可以恢复时间 
{
   	 zt=~zt;
	 if(zt==1) TR1=0;
	 else TR1=1;
} 
void main()      //主时钟程序 
{
 chushih();
 while(1)
 {	 
	 xianshi();					 
   }
}

又过一个周末,上周末LPL全明星太快乐了,继续学习

#include <REGX51.H>				  //功能:LED显示矩阵键盘上的案件号0~F
void delayms(unsigned  int i)			   //延时   191202 1204
{
	unsigned char k;
	while(i--)
	for(k=0;k<120;k++);
}
char scan_key();
void main()
{
	unsigned char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
	unsigned char i;
	P1=0xff;
	P0=0xff;
	while(1)
	{
	i=scan_key();
	if(i==-1)continue;
	else 
	P1=led[i];
	}
}
char scan_key()
{
	char i,temp,m,n;
	bit find=0;
	P2=0xf0;
	i=P0;
	i&=0x0f;
	if(i!=0x0f)
	{
	delayms(10);
	i=P0;
	i&=0x0f;
		if(i!=0x0f)
		{ 
		for(i=0;i<4;i++)
		{
			P2=0xfe<<i;
			temp=~P0;
			temp=temp&0x0f;
			if(temp!=0x00)
			{
				m=i;
				find=1;
				switch(temp)
				{
				case 0x01:n=0;break;
				case 0x02:n=1;break;
				case 0x04:n=2;break;
				case 0x08:n=3;break;
				default:break;
				}
				break;
			}
		}
	}
	}
	if(find==0) return -1;
	else return(n*4+m);
}

单片机结课,在时钟的基础上做了个课程设计

#include <REGX51.H>      //功能:利用3位74HC138的三位连接做的时钟
//大概功能有,设置闹钟,闹钟到点会响5秒,整点蜂鸣    191209 1211
sbit bee=P2^7;    // 蜂鸣器 
sbit k2=P3^0;    // 闹钟设置键 
sbit k1=P3^1;    //蜂鸣器清除键 
sbit shih=P3^2;
sbit shim=P3^3;
char count,h=9,m=59,s=56;
sbit deng=P2^0;
char mm=0,hh=0,a=0,b=0;
int d=30;
int ms;
int wz[8]={0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00};
char num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(int i)  //延时 
{
while(i--);
}
void int0_int() interrupt 0
{	   
	if(a==0)
	{

	delay(10);
	m=m+1;    //实时时间 分 修改 
	if(m==60)
	{m=0;
	}}
	if(a==1)
	{
		delay(10);
	mm=mm+1;  //闹钟时间 分 修改 
	if(mm==60)
	{mm=0;
	}}
}	

void int1_int() interrupt 2
{	   
	if(a==0){

		delay(10);
	h=h+1;  //实时时间 小时 修改
	if(h==24)
	{h=0;
	}}
	
	if(a==1){
		delay(10);
	hh=hh+1;  //闹钟时间 小时 修改
	if(hh==24)
	{hh=0;
	}}
}	

void timer_1() interrupt 3  //定时器中断 实时时间 
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
count++;
if(count==20)
	{count=0;
		s=s+1;
  		if(s>=60)
	 	{m=m+1;
	 	s=0;
	 	}

		if(m==60)
	 	{h=h+1;
	 	m=0;
	 	}

	 	if(h==24)
	 	{h=0;
	 	}		
	}
}

void beep()     //蜂鸣器鸣叫 
{   bee=0;
	delay(50);
	bee=1;
	delay(50);
}
	
void main()	
{   TMOD=0x10;  //初始化 
	ET1=1;
	EX0=1;
	EX1=1;
	EA=1;
	TR1=1;
	IT0=1;
	IT1=1;
	
while(1)
{				
	if((mm==m)&&(hh==h)&&(s<5)&&(b==0))//判断闹钟时间是否到? 
		{
			beep();  //蜂鸣器鸣叫10s ,k1键按下后清除 
		}
		
	if(k1==0)    //判断K1是否按下,(K1蜂鸣器清除键,b为标志 ) 
		{
		b=1-b;
		while(k1==0);	  //等待按键释放
		}
		
	if(k2==0)  //判断K2是否按下	 (K2闹钟设置键,a为标志)
		{
		a=a+1;
		if(a==2){a=0;}
		while(k2==0);
		}
	if((m==0)&&(s<1)&&(b==0))	 //整点报时,响1秒
	{
		beep();
	}	
	if(a==0)      //显示实时时间  
		{
		deng=0xff;	
		P0=num[s%10];		//段选接P0
	  	P1=wz[0];			//位选接P1
		delay(d); 
		P0=num[s/10];
	  	P1=wz[1];
		delay(d);
			
		if(b==0)
			{P0=0x40;}
	  	else{P0=0xc0;}
		P1=wz[2];
		delay(d);
			
	   	P0=num[m%10];
	  	P1=wz[3];	
		delay(d);
		P0=num[m/10];
	  	P1=wz[4];
	   	delay(d);
			
		P0=0x40;
	  	P1=wz[5];
		delay(d);
			
		P0=num[h%10];
	  	P1=wz[6];
		delay(d);
		P0=num[h/10];
	  	P1=wz[7];						
		delay(d);
		}

	if(a==1)              //显示闹钟时间 
		{
		deng=0x00;	
		P0=num[mm%10];
	 	 P1=wz[0];
		delay(d); 
	
	   	P0=num[mm/10];
	  P1=wz[1];
	    delay(d);			
			
		if(b==0){P0=0x40;}
	  	else{P0=0xc0;}
		P1=wz[2];
		delay(d);	
		
	   	P0=num[hh%10];
	  	P1=wz[3];	
		delay(d);
		P0=num[hh/10];
	  	P1=wz[4];
	   	delay(d);
			
		P0=0x78;
	  	P1=wz[5];
		delay(d);
			
		P0=0x79;
	  	P1=wz[6];
		delay(d);
			
	   	P0=0x6d;
	  	P1=wz[7];						
		delay(d);
		}
  }	
}
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值