51マイクロコントローラエントリルーチン

1.ライトをオンにします

デバイス情報:
LED1〜LED8はMCU P2.7〜P2.0に順番に配置されています

#include <reg52.h>

sbit D1 = P2^0;  // 将P2.0口赋值给D1变量

void main()
{
    
    
	while(1)
	{
    
    
		D1 = 0;  // 让P2.0口输出低电平,从而点亮LED
		// P2 = 0xFE;  // 也可通过直接给P2口赋值实现
	}
}

2、LEDウォーターランプ

LED1〜LED8を順番にオンにすると、流水ランプになります。

#include <reg52.h>


void delay(int n)  // 延时函数
{
    
    
	int x, y;
	
	for(x = 0 ; x < n; x++)
	{
    
    
		for(y = 0 ; y < 122 ; y++);  //空跑122次大概为1ms
	}
}

void main()
{
    
    
	int i, L1, L2;
	while(1)
	{
    
    
		L1 = 0xfe;
		L2 = 0xff;
		for(i=0 ; i<8 ; i++)   //八个LED灯,所以需要移位8次
		{
    
    
			P2 = ~(L1 ^ L2);  // 点亮LED
			delay(200);
			L1 <<= 1;         // 左移一位
			L2 <<= 1;
		}
	}
}

3つ、4つのデジタルチューブディスプレイ

デバイス情報

  1. P0.0〜P0.4はデジタルチューブ位置選択終了です
  2. P1.0〜P1.7はデジタルチューブセグメントの最終選択です
  3. デジタル管は一般的な陽極デジタル管です
#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int


uchar code table[]={
    
    
	0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e
	};  // 共阳数码管码表: 0 - F
	

void delay(uint n)  // 延时函数
{
    
    
	uint x, y;
	
	for(x = 0 ; x < n; x++)
		for(y = 0 ; y < 122 ; y++);  //空跑122次大概为1ms
}

uint * split_num(uint n)  // 将四位数拆分为独立的四个数字
{
    
    
	uint nums[4];
	
	nums[0] = n / 1000;         // 千位
	nums[1] = n % 1000 / 100;   // 百位
	nums[2] = n % 100 / 10;     // 十位
	nums[3] = n % 10;           // 个位
	
	return nums;
}


void main()
{
    
    
	uint i, j, x, L1, *nums;
	
	while(1)
	{
    
    	
		for(i=0 ; i < 10000 ; i++)  // i为在数码管上显示的4位数
		{
    
    
			nums = split_num(i);      // 拆分数字
			for(x=0 ; x<100 ; x++)    // 该层循环控制数字增长速率
			{
    
    
				L1 = 0xF7;              // 初始位选
				for(j=0 ; j<4 ; j++)    // 该层让四个数码管循环显示数字,利用余晖效应制造出同时显示的效果
				{
    
    
					P1 = table[*(nums + j)];  // 段选
					P0 = L1;  								// 位选
					delay(1);                 // 延时
					L1 >>= 1;                 // 右移一位数码管
					P0 = 0x00;                // 消影
				}
			}
		}
	}
}

4、ボタン検出

デバイス情報

KEY1〜P3.6; KEY2〜P3.7; KEY3〜P3.3(INT1); KEY4〜P4.2

#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int
sbit D1 = P2^0;    // LED
sbit KEY1 = P3^6;  // KEY

void delay(uint n)  // 延时函数
{
    
    
	uint x, y;
	
	for(x = 0 ; x < n; x++)
		for(y = 0 ; y < 122 ; y++);  //空跑122次大概为1ms
}


void main()
{
    
    
	uint tmp;
	while(1)
	{
    
    	
		tmp = KEY1;     // 读取KEY的状态
		if(tmp == 0)
		{
    
    
			delay(1);     // 延时后再次读取,目的是消除抖动
			tmp = KEY1;
			if(tmp == 0)
				D1 = ~D1;   // 反转灯的状态
		}
	}
}

5つの外部割り込みボタン検出

#include <reg52.h>

sbit D1 = P2^0;    // LED
sbit KEY3 = P3^3;  // KEY(INT1)


void EX1_KEY(void)interrupt 2    // 外部中断1中断服务程序
{
    
    
	D1 = ~ D1;   // 翻转LED状态
}

void main()
{
    
    
	D1 = 0;      
	IT1 = 1;     // 设定外部中断1为边沿触发方式
	EX1 = 1;     // 开启外部中断1的中断允许
	EA = 1;      // 开启系统总的中断允许
	while(1);
}

六、タイマー

#include<reg52.h>

sbit D1 = P2^7;

void main()
{
    
    
	D1 = 0;
	TMOD = 0x01;             //设置定时器0位工作模式1(M1,M0位0,1)
	TH0 = (65536-45872)/256; //装初值11.0592M晶振定时50ms数为45872
	TL0 = (65536-45872)%256;
	TR0 = 1;                 //启动定时器0
	ET0 = 1;                 //开定时器0中断
	EA = 1;                  //开总中断
	while(1);
}

void T0_time()interrupt 1  // T0 中断服务程序
{
    
    
	TH0 = (65536-45872)/256; //重新装载初值
	TL0 = (65536-45872)%256;
	D1 = ~D1;
}

おすすめ

転載: blog.csdn.net/qq_43580193/article/details/109566546