河北大学计算机科学与技术专业硬件实训——C语言控制51单片机实现LED小灯的控制

作业2

在这里插入图片描述

原理比较简单,看代码就能理解,不过多解释了。

代码
/**
   Created By RainSure at 2022/9/26


**/
#include <stdio.h>
#include <stdlib.h>
#include <reg52.h>

#define LED1 P2
// P2^0:   D8
// P2^1:   D7
// P2^2:   D6
// P2^3:   D5
// P2^4:   D4
// P2^5:   D3
// P2^6:   D2
// P2^7:   D1

unsigned char status[9] = {0x00, 0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f};
unsigned char status1[9] = {0x00, 0x7f, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe};
int flag = 0;

sbit K1 = P3^2;
sbit K2 = P3^3;

sbit K3 = P3^4;
sbit K4 = P3^5;


void get_key() // »ñÈ¡°´¼üÊäÈë
{
	if(K1 == 0)
	{
		flag = 0;
	}
	if(K2 == 0) 
	{
		flag = 1;
	}
}

void D1toD8()
{
	int i;
	for(i = 1; i <= 8; i ++) {
		int t = 2000000;  // 
		get_key();
		if(flag == 1) {	  // Èç¹ûÇл»ÎªD8toD1Ö±½ÓÇå³ýµ±Ç°×´Ì¬£¬²¢Í˳ö
			LED1 = 0xff;
			break;
		}
		while(t --){
			get_key();
			LED1 = status1[i];
			if(K3 == 0) {  // Èç¹ûÍ£Ö¹Á÷Ë®
				while(1) {
					if(K4 == 0){
						break;  // ¼ÌÐøÁ÷Ë®	
					}
				}								
			}
		}
	}	
}
void D8toD1()
{
	int i;
	for(i = 1; i <= 8; i ++) {
		
		int t = 2000000;  //
		get_key();
		if(flag == 0) {	   // Èç¹ûÇл»ÎªD1toD8Ö±½ÓÇå³ýµ±Ç°×´Ì¬£¬²¢Í˳ö
			LED1 = 0xff;
			break;
		}
		while(t --){
			get_key();
			LED1 = status[i];
			if(K3 == 0) {  // Èç¹ûÍ£Ö¹Á÷Ë®
				while(1) {
					if(K4 == 0){
						break;  // ¼ÌÐøÁ÷Ë®	
					}
				}								
			}
		}
	}
}
int main()
{
	while(1){
		if(flag == 0)	D1toD8();
		else D8toD1();
	}
	return 0;
}

作业3

在这里插入图片描述

作业3.1
代码
//#include<reg52.h>
//#include<stdio.h>
//#include<stdlib.h>
//
//
 实现D1小灯的呼吸效果
//sbit D1 = P2^7;
//
//int PWM_ON = 0;
//int PWM_FRE = 200;
//int PWM_COUNT;
//
//void Delay(int t)
//{
//	int p;
//	int i;
//	for(p = t; p > 0; p --) {
//		for(i = 0; i < 110; i ++) ;
//	}
//	// while(t --);
//}
//
//void to_init()
//{
//	TMOD = 0x01;
//	TH0 = (65536 - 5) / 256;
//	TL0 = (65536 - 5) % 256;
//	ET0 = 1;
//	EA = 1;
//	TR0 = 1;
//}
//
//void Timer0() interrupt 1
//{
//	TH0 = (65536 - 5) / 256;
//	TL0 = (65536 - 5) % 256;
//	
//	PWM_COUNT ++;
//	if(PWM_COUNT == PWM_ON) {
//		D1 = 1;
//	}
//	else if(PWM_COUNT == PWM_FRE){
//		PWM_COUNT = 0;
//		D1 = 0;
//	}
//}
//
//int main()
//{
//	D1 = 1;
//	to_init();
//	while(1) {
//		int on;
//		D1 = 1;
		PWM_ON = 0;
		PWM_COUNT = 0;
//		for(on = 0; on < PWM_FRE; on += 2) {
//			PWM_ON = on;
//			Delay(5);
//		}
//		for(on = PWM_FRE; on >= 0; on -= 2) {
//			PWM_ON = on;
//			Delay(5);
//		}
//		D1 = 1;
//	}
//}

#include<reg52.h>
#include<stdio.h>

sbit D1 = P2^7; 
 
void delay(int i)
{
	while(i --);
}
 
void main()
{
   	 int i;
	 D1 = 1;
	 while(1)
	 {
	     for(i = 10; i <= 2000;i += 10)
		   {
		       D1 = 0;		     //亮
		       delay(i); 
		       D1 = 1;         //灭
		       delay(2000 - i);
		   }			           //呼吸灯由暗变亮
		   for(i = 2000; i >= 10; i -= 10)
		   {
		       D1 = 0;		    //亮
		       delay(i); 
		       D1 = 1;       //灭
		       delay(2000 - i);
		   }	              //呼吸灯由亮变暗
	 }		
}
作业 3.2
代码
#include<stdio.h>
#include<reg52.h>

sbit D1 = P2^7;
sbit D2 = P2^6;

sbit K1 = P3^2;
sbit K2 = P3^3;

int flag = 0;

int T = 2000;
int tick = 500;

void delay1(int t)
{
  	int i;
	for(t; t > 0; t --) {
		for(i = 0; i < 410; i ++) ;
	}
}

void get_key()
{
 	if(K1 == 0) {
		delay1(50);
		if(K1 == 1) {
			flag ++;
 			if(flag > 2) flag = 2;	
		}
 		
 	}
 	if(K2 == 0) {
		delay1(50);
		if(K2 == 1) {
			flag --;
 			if(flag < 0) flag = 0;	
		}
 	}
}

void Delay(int t)
{
	while(t --);
}

void light1() // 亮度1
{
	D1 = 0;
	Delay(tick);
	D1 = 1;
	Delay(T - tick);
}

void light2() // 亮度2
{
	D1 = 0;
	Delay(tick * 2);
	D1 = 1;
	Delay(T - tick * 2);
}

void light3() // 亮度3
{
	D1 = 0;
	Delay(tick * 3);
	D1 = 1;
	Delay(T - tick * 3);
}

void solve()
{
	if(flag == 0) {
		// D2 = 1;
		light1();
	}else if(flag == 1) {
		// D2 = 0;
		light2();
	}else if(flag >= 2) {
		// D2 = 1;
		light3();
	}
}
int main()
{
	D1 = 1; // 小灯一开始是灭的
	while(1) {
		get_key();
		solve();
	}
	return 0;
}
作业3.3
代码
#include<stdio.h>
#include<reg52.h>

sbit D1 = P2^7;
sbit K1 = P3^2;
sbit K2 = P3^3;

// 按下K1小灯持续变亮,直到最亮; 按下K2小灯变暗,直到完全熄灭

int on = 0;  // 设置占空比
int flag = 0; // 0代表亮度上升,1代表亮度下降
int T = 2000; // 设置周期总时间

void Delay(int t)
{
	while(t --);
}

void get_key()
{
	if(K1 == 0) {
		flag = 0;
	}
	if(K2 == 0) {
		flag = 1;
	}
}

void turn_on_light()
{
	if(on < 0) on = 0;
	if(on > T) on = T;
	D1 = 0;
	Delay(on);
	D1 = 1;
	Delay(T - on);
}

void increasing_light()  // 小灯变亮
{
	while(on <= T) {
		turn_on_light();
		on += 10;
	}
	turn_on_light();
}

void decreasing_light()  // 小灯变暗
{
	while(on >= 0) {
		turn_on_light();
		on -= 10;
	}
	turn_on_light();
}

void solve()
{
	if(flag == 0) {
		increasing_light();
	}else if(flag == 1) {
		decreasing_light();
	}
}

int main()
{
	while(1) {
		get_key();
		solve();
	}	
}

作业4

在这里插入图片描述
注意在Keil中将频率设置为11.0592,否则可能会通信失败,单片机将无法接收到发送的字符。

代码
/**
 * Craeted by RainSure at 2022/09/29
 * 
**/

#include<stdio.h>
#include<reg52.h>

#define LED1 P2
#define LED2 P0
sbit LED17 = P3^6;
int flag;
unsigned char receiveData;

char status1[18] = {0x00, 0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};  // 控制LED1
// char status2[18] = {0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f, 0xff};  // 控制LED2
char status2[18] = {0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe, 0xff};  // 控制LED2

//void Delay(int t)
//{
//	// while(t --);
//	int i;
//	for(t; t > 0; t --) {
//		for(i = 0; i < 110; i ++) ;
//	}
//}

void Bright()  // 保持常亮
{
	LED1 = 0x00;
	LED2 = 0x00;
	LED17 = 0;
}

void Flash()  // 保持闪烁
{
	int t = 2000000;
	while(t --) {
		LED1 = 0x00;
		LED2 = 0x00;
		LED17 = 0;
	}
	t = 2000000;
	while(t --) {
		LED1 = 0xff;
		LED2 = 0xff;
		LED17 = 1;
	}
}

void D1toD17() // D1到D17流水
{
	int i;
	for(i = 1; i <= 17; i ++) {
		int t = 2000000;
		while(t --)	{
			LED1 = status1[i];
			LED2 = status2[i];
			if(i == 17) LED17 = 0;
			else LED17 = 1;
		}
	}
}

void D17toD1() // D17到D1流水
{
	int i;
	for(i = 17; i >= 1; i --) {
		int t = 2000000;
		while(t --)	{
			LED1 = status1[i];
			LED2 = status2[i];
			if(i == 17) LED17 = 0;
			else LED17 = 1;
		}
	}
}

//void UsartInit()
//{
//	SCON = 0x50;
//	TMOD = 0x20;
//	PCON = 0x80;
//	TH1 = 0xFD;
//	TL1 = 0xFD;
//	ES = 1;
//	EA = 1;
//	TR1 = 1;
//}
//
//void Usart() interrupt 4
//{
//	RI = 0;
//	receiveData = SBUF;
//	flag = 1;
//}

void initDate()
{
	SCON=0x50;//数据位8位,停止位1位,起始位1位
	//波特率设置 
	TMOD=0x20;//用到定时/计数器的方式2
	TH1=0xFD;
	TL1=0xFD;
	TR1=1; //启动定时器
}


void recived()
{
	char commit;
	
	while(1)
	{
		if(RI=='1')
		{
			RI=0;
			commit=SBUF;
			if(commit == '1')
			{
				// send("hello");
				Bright();
			}
			if(commit == '2')
			{
				// send("haha");
				Flash();
			}
			if(commit == '3')
			{
				D1toD17();
			}
			if(commit == '4')
			{
				D17toD1();
			}	
		}
	}
}

int main()
{

 	while(1)
	{
		// UsartInit();
		initDate();
		recived();	
//		switch(receiveData)
//		{
//		//	printf("%c\n", receiveData);
//			case '1' : Bright(); break;
//			case '2' : Flash(); break;
//			case '3' : D1toD17(); break;
//			case '4' : D17toD1(); break;
//			default : break;
//		}
	}
	return 0;
}
  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rain Sure

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值