蓝桥杯单片机CT107D基础练习代码
1.LED跑马灯
系统上电后,关闭 8 个 LED 灯。
循环实现 LED 跑马灯控制,控制要求为:
首先,8 个 LED 灯同时闪烁 3 次;
然后,从 L1 灯至 L8 灯依次点亮;
接着,从 L1 灯至 L8 灯依次熄灭。
#include "stc15f2k60s2.h"
#define uint unsigned int
#define uchar unsigned char
void datatake();
void delay_ms(uint xx)
{
uint i,j;
for(i=0;i<xx;i++)
for(j=0;j<900;j++);
}
void hc(uchar aa)
{
switch(aa)
{
case 0:P2=P2&0x1f;break;
case 4:P2=P2&0x1f|0x80;break;
case 5:P2=P2&0x1f|0xa0;break;
case 6:P2=P2&0x1f|0xc0;break;
case 7:P2=P2&0x1f|0xe0;break;
}
}
//
void init()
{
hc(5);P0=0x00;
hc(4);P0=0xff;
hc(0);
}
void main()
{
init();
while(1)
{
datatake();
}
}
//
void datatake()
{
uchar i;
hc(4);
for(i=0;i<3;i++)
{
P0=0x00;
delay_ms(500);
P0=0xff;
delay_ms(500);
}
for(i=0;i<8;i++)
{
P0=0xff<<(i+1);
delay_ms(500);
}
for(i=0;i<8;i++)
{
P0=(P0|(0x01<<i));
delay_ms(500);
}
hc(0);
}
2.蜂鸣器与继电器
系统上电后,关闭蜂鸣器,关闭继电器,关闭 8 个 LED 灯。
循环实现以下功能:
首先,8 个 LED 灯同时闪烁 3 次;
接着,从 L1 灯至 L8 灯依次点亮;
然后,继电器吸合,延时片刻,继电器断开;
接着,从 L1 灯至 L8 灯依次熄灭;
蜂鸣器鸣叫一短时间;
#include "stc15f2k60s2.h"
#define uint unsigned int
#define uchar unsigned char
void datatake();
/
void delay_ms(uint xx)
{
uint i,j;
for(i=0;i<xx;i++)
for(j=0;j<900;j++);
}
void hc(uchar aa)
{
switch(aa)
{
case 0:P2=P2&0x1f;break;
case 4:P2=P2&0x1f|0x80;break;
case 5:P2=P2&0x1f|0xa0;break;
case 6:P2=P2&0x1f|0xc0;break;
case 7:P2=P2&0x1f|0xe0;break;
}
}
//
void init()
{
hc(5);P0=0x00;
hc(4);P0=0xff;
hc(0);
}
void main()
{
init();
while(1)
{
datatake();
}
}
//
void datatake()
{
uchar i;
hc(4);
for(i=0;i<3;i++)
{
P0=0x00;
delay_ms(500);
P0=0xff;
delay_ms(500);
}
for(i=0;i<8;i++)
{
P0=0xff<<(i+1);
delay_ms(500);
}
hc(5);
P0=0x10;
delay_ms(1000);
P0=0x00;
hc(4);
for(i=0;i<8;i++)
{
P0=(P0|(0x01<<i));
delay_ms(500);
}
hc(5);
P0=0x40;
delay_ms(1000);
P0=0x00;
}
3.数码管静态显示
系统上电后,关闭蜂鸣器,关闭继电器,关闭 8 个 LED 灯。
循环实现以下功能:
8 个数码管从左至右,逐个数码管依次显示“0”到“9”的 10 个数字。
即左边第 1 个数码管依次显示“0”到“9”,其他数码管熄灭;接着左边第 2 个数码管依次显示“0”到“9”,其他数码管熄灭…依次类推,直到 8 个数码管显示完成。
8 个数码管同时显示“0”到“9”的 10 个数字和“A”到“F”的 6 个字母。
#include "stc15f2k60s2.h"
#define uchar unsigned char
#define uint unsigned int
uchar code leddata[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xc0,0x86,0x8e};
void display();
/
void delay_ms(uint xx)
{
uint i,j;
for(i=0;i<xx;i++)
for(j=0;j<900;j++);
}
void hc(uchar aa)
{
switch(aa)
{
case 0:P2=P2&0x1f;break;
case 4:P2=P2&0x1f|0x80;break;
case 5:P2=P2&0x1f|0xa0;break;
case 6:P2=P2&0x1f|0xc0;break;
case 7:P2=P2&0x1f|0xe0;break;
}
}
/
void init()
{
hc(5);P0=0x00;
hc(4);P0=0xff;
hc(0);
}
void main()
{
init();
while(1)
{
display();
}
}
/
void display()
{
uchar i,j;
for(i=0;i<8;i++)
{
hc(6);P0=0x01<<i;
hc(7);
for(j=0;j<10;j++)
{
P0=leddata[j];
delay_ms(50);
P0=0xff;
}
}
hc(6);P0=0xff;
hc(7);
for(i=0;i<16;i++)
{
P0=leddata[i];
delay_ms(500);
P0=0xff;
}
}
4.数码管动态显示
系统上电后,关闭蜂鸣器,关闭继电器,关闭 8 个 LED 灯。
在 8 位数码管中,左边 4 位数码管显示年份“2018”,接着 2 位是分隔符“–”,靠右的2 位数码管显示月份。从 1 月份开始,每隔一段时间加 1 个月,到 12 月之后又从 1 月开始递增,如此循环往复
//使用了定时器功能
#include "stc15f2k60s2.h"
#define uchar unsigned char
#define uint unsigned int
uchar code leddata[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
uchar month=1; //月份
uint count=0; //定时器计数
void display();
//
void Timer0Init(void) //50??@12.000MHz
{
AUXR &= 0x7F; //?????12T??
TMOD &= 0xF0; //???????
TL0 = 0xB0; //??????
TH0 = 0x3C; //??????
TF0 = 0; //