原理比较简单,看代码就能理解,不过多解释了。
/**
Created By RainSure at 2022/9/26
**/
#include
#include
#include
#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;
}
//#include
//#include
//#include
//
//
实现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
#include
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);
} //呼吸灯由亮变暗
}
}
#include
#include
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;
}
#include
#include
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();
}
}
注意在Keil中将频率设置为11.0592,否则可能会通信失败,单片机将无法接收到发送的字符。
/**
* Craeted by RainSure at 2022/09/29
*
**/
#include
#include
#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;
}