单片机学习(1)------基本输入输出

1、
题目:P1口接8个发光二极管作为输出指示,编程实现是8个发光二极管按一定的频率亮、灭闪烁。
代码:

#include<reg51.h>  			//特殊功能寄存器的声明
void delay(unsigned int d)  //延时函数
{
	while(--d>0);  
}
void main()
{
	while(1)    		//代表永真
	{
		P1=0xff;	    //灭
		delay(10000);
		P1=0x00;
		delay(10000);	 //亮
	}
}

电路图
在这里插入图片描述
2、流水灯设计
P1口接8个发光二极管作为输出指示,编程实现8个灯(每次点亮两个灯)从低到高(即从D1到D8,左循环)流水灯的显示闪烁。

代码


#include<reg51.h>
void delay(unsigned int d)
{
	while(--d>0);
}
void main()
{
	unsigned char m=3;
	unsigned char n=252;
	unsigned char i=0;
	while(1)
	{
		if(i==7)
		{
			P1=126;
			n=252;
			m=3;
			i=0;
			delay(50000);
		}
		else
		{
			P1=n;
			n=n-m;
			m=2*m;
			i=i+1;
			delay(50000);
		}
	}
}

电路图
在这里插入图片描述
3、
题目:在Proteus环境下,设计基于51单片机(采用AT89C51)控制电路。利用51单片机的P1口和P3口作为两位共阴极LED数码管静态显示的控制口,编程实现使两个LED显示器静态轮流显示“12”、“‒ ‒” 和 “Ab”,延时时间采用软件延时。
代码:

#include<reg51.h>
#define uchar unsigned char
uchar code table[]={0x06,0x5B,0x40,0x40,0x77,0x7C};
void delay(unsigned int d)
{
	while(--d>0);
}
void display(unsigned int a,unsigned int b)
{
	P1=table[a];
	P3=table[b];
}
void main()
{
	while(1)
	{
		display(0,1);
		delay(900000);
		display(2,3);
		delay(900000);
		display(4,5);
		delay(900000);	
	}
}

电路图:
在这里插入图片描述
4、数码管动态显示
题目:在Proteus环境下,设计基于51单片机(采用AT89C51)控制电路。通过单片机的P1口作为段口,P3口为位口构成6位LED动态显示的硬件电路,编程实现在6位LED显示器上动态显示“123456”。

代码:

#include<reg51.h>
#define uchar unsigned char
uchar code table[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d};
void delay(unsigned int d)
{
	while(--d>0);
}
void display()
{
	uchar bitcode,i;
	bitcode=0xfe;
	for(i=0;i<6;i++)
	{
		P3=bitcode;
		P1=table[i];
		delay(150);
		bitcode=bitcode<<1;
		bitcode=bitcode|0x01;
	}
}
void main(void)
{
	while(1)
	{
		display();
	}
}

电路图
在这里插入图片描述
5、编程实现:开始是所有灯都亮,按下S1键,灯变为500ms闪烁,再按一下,变为全亮。(相当于S1为一个控制开关,控制着灯的亮、灭闪烁)
代码

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit S1=P3^2;   //输出按键 位定义
bit key=0;      //定义位,做选择标志
void dlxms(uint xms)
{
	uint t1,t2;
	for(t1=0;t1<xms;t1++)
		for(t2=0;t2<110;t2++);
}
void keyscan()//键扫描
{
	S1=1;   //读取时先写1
	if(S1==0)
	{
		dlxms(10);		   //去抖动
		if(S1==0)
		{
			dlxms(10);
			key=~key;     
			while(S1==0); //判断按键是否抬起。
		}
	}
}
void main()
{
	P1=0x00;  //灯全亮
	while(1)
	{
		keyscan();
		if(key==0)
		{
			P1=0x00;
		}
		else{
			dlxms(500);
			P1=~P1;
		}
	}

}

电路图
在这里插入图片描述
所有代码和电路图:https://download.csdn.net/download/qq_43556844/15087276

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值