UAV2101~UAV2105编程与仿真51MCU初学者训练

发布时间 2023-10-09 22:05:46作者: 一郎哥哥

练习001:51单片机Proteus仿真:点亮一个灯

1、器件清单

Proteus关键词元器件
CAP 固定电容
CAP-ELEC 电解电容
AT89C51 AT89C51单片机
CRYSTAL 晶振
BUTTON 复位按键
RES 电阻
RESPACK 排阻
LED-YELLOW 黄色发光二极管

2、电路

3、代码

#include <reg51.h>   //单片机头文件
sbit LED=P0^0;       //定义LED为端口P0^0
void main()          //主程序
{
    while(1)         //无限循环
    {
        LED=0;       //P0^0输出低电平,发光二极管点亮
        //LED=1;     //P0^0输出高电平,发光二极管关闭
    }
}

练习002:51单片机Proteus仿真:流水灯

1、器件清单(参考练习001)

2、电路

1、画一条总线

2、将线路连接到总线

按住ctrl划线,画斜线连接线需要把“自动连接器”也称“自动连线”按钮放开。

3、将相应节点一一连接

Tool–Property Assignment Tool属性赋值工具

3、代码

#include <reg52.h>   //单片机头文件
void Delay();		 //延时子程序说明
void main()          //主程序
{    
    unsigned char i; 
    unsigned char temp;
    P0=0xff;		 //二进制11111111
    while(1)         //无限循环
    {
        temp=0x80;   //二进制10000000
        for(i=0;i<8;i++)
        {
            P0=~temp;         //取反
            Delay();		  //延时
            temp=temp>>1      //右移一位
        }
    }
}
/*延时子程序使LED在变化时有一个停留时间,通过一个外循环和内循环的空操作,共循环255×255次*/
void Delay()
{
    unsigned char i,j; 
    for(i=0;i<255;i++)		//外循环255次
        for(j=0;j<255;j++); //内循环255次
}

练习003:51单片机Proteus仿真:一位数码管计数

1、器件清单

Proteus关键词元器件
AT89C51 AT89C51单片机
RES 电阻
BUTTON 按键
7SEG-COM-AN-GRN 数码管(绿色)

 数码管接线结构图

数码管有两种,共阴和共阳,很好区分的,公共端在上边的就是共阳的,习惯上画VCC时是放在上边的,公共端在下边的就是共阴了,画地时习惯上放在下边的。再说数码管的7段,从上边的横开始起叫A,按顺时针方向依此为ABCDEFG,最后说左边的引脚,从上边开始向下,依此是ABCDEFG。这样就对应上了,根据显示数字的需要在各段加有效电平就显示出相应的数字了。如下面的图是一种测试方法。左边的两个就是共阳的,右边的一个就是共阴的。

2、电路

  自动

 手动

3、代码

一位数码管自动计数代码

#include <reg51.h>

unsigned char code Tab[]={0xC0,0xF9,0xA4,0XB0,0x99,0x92,0x82,0xF8,0x80,0x90};
                                    //0-9,共阳数码管码段表

void Delay()//简单延时子程序
{
	unsigned char i,j;
	for(i=0;i<255;i++)
		for(j=0;j<255;j++);
}
void main()//主程序
{
	unsigned char i=1;
	while(1)
	{
		P0=Tab[i];//送相应码段表值
		Delay();
		i++;
		if(i>9) i=0;
	}
}

一位数码管手动计数代码

#include <reg51.h>

unsigned char code Tab[]={0xC0,0xF9,0xA4,0XB0,0x99,0x92,0x82,0xF8,0x80,0x90};
                                    //0-9,共阳数码管码段表
unsigned char p=1;

void Delay()//简单延时子程序
{
	unsigned char i;
	for(i=300;i>0;i--);
}
void main()//主程序
{
	EA=1;//开总允许开关
	IT0=1;EX0=1;//开外部中断0和外部中断0允许分开关
	IT1=1;EX1=1;//开外部中断1和外部中断1允许分开关
	while(1)
	{
		P0=Tab[p]; //输出码段表
		Delay();
	}
}
void intersvr0(void) interrupt 0 using 1 //外部中断0处理子程序
{
	p++;
	if(p>9) p=9;
}
void intersvr1(void) interrupt 2 using 1 //外部中断1处理子程序
{
	p--;
	if(p<1) p=1;
}