最近一直在忙单片机的课设作业,一开始本来是想卖一些的但是好像也没人看的上我的垃圾代码,就摆出来大家看着玩吧。简单介绍一下就是实现一个红绿灯功能,还包括了诸如东西方向常红灯南北方向常绿灯,持续性黄灯闪烁,以及红绿时长改变的功能。一开始写的是所有的功能进行完一个周期后实现对应功能,后来闲着没事,多写了个紧急模式,这样就可以再不论什么情况都可以直接改变状态的办法了。代码可能没有注释,因为版本问题啊中文注释再keil里面显示乱码,就没写。如果有大冤种看到这篇了并且想拿去用的话,有不会的地方可以评论区就好。下面是代码
#include <REGX51.H>
unsigned char DONGXI_S=0,DONGXI_MS=0,NANBEI_S=0,NANBEI_MS=0,DONGXI_S_HONG=30,DONGXI_S_LV=60,DONGXI_S_HUANG=63,NANBEI_S_HONG=63,NANBEI_S_LV=30,NANBEI_S_HUANG=33;
unsigned char JINJI=20,JINJI_MS;
sbit led_dongxi_hong = P2^5;sbit led_dongxi_lv=P2^3;sbit led_dongxi_huang=P2^4;
sbit led_nanbei_hong=P0^5;sbit led_nanbei_lv=P0^3;sbit led_nanbei_huang=P0^4;
sbit smg_dongxi_1=P3^3;
sbit smg_dongxi_2=P3^4;
sbit smg_nanbei_11=P3^5;
sbit smg_nanbei_12=P2^2;
sbit smg_dongxi_11=P3^6;
sbit smg_dongxi_12=P3^7;
sbit smg=P1;
//char code SMG[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
char code SMG[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
sbit smg_nanbei_1=P3^1;
sbit smg_nanbei_2=P3^0;
unsigned char time=0,moshi=0;
void delay(unsigned char i)
{
while(i--)
{
unsigned char n, j;
n= 2;
j = 15;
do
{
while (--j);
} while (--n);
}
}
unsigned char key_scan()
{
if(P2_6==0)
{
delay(1);
while(P2_6==0);
moshi=1;
}
if(P2_1==0)
{
delay(1);
while(P2_1==0);
moshi=2;
}
if(P2_7==0)
{
delay(1);
while(P2_7==0);
moshi=3;
}
if(P2_0==0)
{
delay(1);
while(P2_0==0);
moshi=4;
}
return moshi;
}
void init()
{
EX0=1;
IT0=1;
}
void init_0() interrupt 0
{
TR0=0;
ET0=0;
led_nanbei_huang=1;
led_nanbei_hong=1;
led_nanbei_lv=1;
led_dongxi_huang=1;
led_dongxi_hong=1;
led_dongxi_lv=1;
smg_dongxi_1=1;
smg_dongxi_2=1;
smg_nanbei_1=1;
smg_nanbei_2=1;
smg_dongxi_11=1;
smg_dongxi_12=1;
smg_nanbei_11=1;
smg_nanbei_12=1;
P1=0X00;
DONGXI_S=-1;
}
void TIMER_0() interrupt 1
{
TL0 = (65536-45872)%256;
TH0 = (65536-45872)/256;
DONGXI_MS++;
NANBEI_MS++;
if(DONGXI_MS==20)
{
DONGXI_S++;
DONGXI_MS=0;
}
}
void main()
{
P0_0=0;
smg_dongxi_1=0;
smg_dongxi_2=0;
smg_nanbei_1=0;
smg_nanbei_2=0;
// P1=0XFF;
P1=0X00;
time=DONGXI_S_HONG+3;
init();
TMOD = 0x01;
TL0 = (65536-45872)%256;
TH0 = (65536-45872)/256;
TF0 = 0;
TR0 = 1;
ET0=1;
EA=1;
while(1)
{
key_scan();
while(moshi==0)
{
time=DONGXI_S_HONG+3;
while(0<DONGXI_S&&DONGXI_S<=DONGXI_S_HONG)
{
led_dongxi_hong=0;
led_dongxi_lv=1;
led_dongxi_huang=1;
smg_dongxi_1=0;
delay(1);
P1=SMG[(DONGXI_S/10)];
delay(1);
smg_dongxi_1=1;
// P1=0XFF;
P1=0x00;
delay(1);
smg_dongxi_2=0;
delay(1);
P1=SMG[(DONGXI_S%10)];
delay(1);
smg_dongxi_2=1;
// P1=0XFF;
P1=0X00;
smg_dongxi_11=0;
delay(1);
P1=SMG[(DONGXI_S/10)];
delay(1);
smg_dongxi_11=1;
// P1=0XFF;
P1=0X00;
delay(1);
smg_dongxi_12=0;
delay(1);
P1=SMG[(DONGXI_S%10)];
delay(1);
smg_dongxi_12=1;
// P1=0XFF;
P1=0X00;
led_nanbei_hong=1;
led_nanbei_lv=0;
led_nanbei_huang=1;
smg_nanbei_1=0;
delay(1);
P1=SMG[(DONGXI_S/10)];
delay(1);
smg_nanbei_1=1;
// P1=0XFF;
P1=0X00;
delay(1);
smg_nanbei_2=0;
delay(1);
P1=SMG[(DONGXI_S%10)];
delay(1);
smg_nanbei_2=1;
// P1=0XFF;
P1=0X00;
smg_nanbei_11=0;
delay(1);
P1=SMG[(DONGXI_S/10)];
delay(1);
smg_nanbei_11=1;
// P1=0XFF;
P1=0X00;
delay(1);
smg_nanbei_12=0;
delay(1);
P1=SMG[(DONGXI_S%10)];
delay(1);
smg_nanbei_12=1;
// P1=0XFF;
P1=0X00;
key_scan();
}
while(DONGXI_S_HONG<DONGXI_S&&DONGXI_S<=time)
{
led_dongxi_hong=1;
led_dongxi_lv=0;
led_dongxi_huang=1;
smg_dongxi_1=0;
delay(1);
P1=SMG[(DONGXI_S-DONGXI_S_HONG)/10];
delay(1);
smg_dongxi_1=1;
// P1=0XFF;
P1=0X00;
delay(1);
smg_dongxi_2=0;
delay(1);
P1=SMG[(DONGXI_S-DONGXI_S_HONG)%10];
delay(1);
smg_dongxi_2=1;
// P1=0XFF;
P1=0X00;
smg_dongxi_11=0;
delay(1);
P1=SMG[(DONGXI_S-DONGXI_S_HONG)/10];
delay(1);
smg_dongxi_11=1;
// P1=0XFF;
P1=0X00;
delay(1);
smg_dongxi_12=0;
delay(1);
P1=SMG[(DONGXI_S-DONGXI_S_HONG)%10];
delay(1);
smg_dongxi_12=1;
// P1=0XFF;
P1=0X00;
led_nanbei_hong=1;
led_nanbei_lv=1;
led_nanbei_huang=0;
smg_nanbei_1=0;
delay(1);
P1=SMG[(DONGXI_S-DONGXI_S_HONG)/10];
delay(1);
smg_nanbei_1=1;
// P1=0XFF;
P1=0X00;
delay(1);
smg_nanbei_2=0;
delay(1);
P1=SMG[(DONGXI_S-DONGXI_S_HONG)%10];
delay(1);
smg_nanbei_2=1;
// P1=0XFF;
P1=0X00;
smg_nanbei_11=0;
delay(1);
P1=SMG[(DONGXI_S-DONGXI_S_HONG)/10];
delay(1);
smg_nanbei_11=1;
// P1=0XFF;
P1=0X00;
delay(1);
smg_nanbei_12=0;
delay(1);
P1=SMG[(DONGXI_S-DONGXI_S_HONG)%10];
delay(1);
smg_nanbei_12=1;
// P1=0XFF;
P1=0X00;
key_scan();
}
while(time<DONGXI_S&&DONGXI_S<=DONGXI_S_LV)
{
led_dongxi_hong=1;
led_dongxi_lv=0;
led_dongxi_huang=1;
smg_dongxi_1=0;
delay(1);
P1=SMG[(DONGXI_S-DONGXI_S_HONG)/10];
delay(1);
smg_dongxi_1=1;
// P1=0XFF;
P1=0X00;
delay(1);
smg_dongxi_2=0;
delay(1);
P1=SMG[(DONGXI_S-DONGXI_S_HONG)%10];
delay(1);
smg_dongxi_2=1;
// P1=0XFF;
P1=0X00;
smg_dongxi_11=0;
delay(1);
P1=SMG[(DONGXI_S-DONGXI_S_HONG)/10];
delay(1);
smg_dongxi_11=1;
// P1=0XFF;
P1=0X00;
delay(1);
smg_dongxi_12=0;
delay(1);
P1=SMG[(DONGXI_S-DONGXI_S_HONG)%10];
delay(1);
smg_dongxi_12=1;
// P1=0XFF;
P1=0X00;
led_nanbei_hong=0;
led_nanbei_lv=1;
led_nanbei_huang=1;
smg_nanbei_1=0;
delay(1);
P1=SMG[(DONGXI_S-time)/10];
delay(1);
smg_nanbei_1=1;
// P1=0XFF;
P1=0X00;
delay(1);
smg_nanbei_2=0;
delay(1);
P1=SMG[(DONGXI_S-time)%10];
delay(1);
smg_nanbei_2=1;
// P1=0XFF;
P1=0X00;
smg_nanbei_11=0;
delay(1);
P1=SMG[(DONGXI_S-time)/10];
delay(1);
smg_nanbei_11=1;
// P1=0XFF;
P1=0X00;
delay(1);
smg_nanbei_12=0;
delay(1);
P1=SMG[(DONGXI_S-time)%10];
delay(1);
smg_nanbei_12=1;
// P1=0XFF;
P1=0X00;
key_scan();
}
while(DONGXI_S_LV<DONGXI_S&&DONGXI_S<=DONGXI_S_HUANG)
{
led_dongxi_hong=1;
led_dongxi_lv=1;
led_dongxi_huang=0;
smg_dongxi_1=0;
delay(1);
P1=SMG[(DONGXI_S-DONGXI_S_LV)/10];
delay(1);
smg_dongxi_1=1;
// P1=0XFF;
P1=0X00;
delay(1);
smg_dongxi_2=0;
delay(1);
P1=SMG[(DONGXI_S-DONGXI_S_LV)%10];
delay(1);
smg_dongxi_2=1;
// P1=0XFF;
P1=0X00;
smg_dongxi_11=0;
delay(1);
P1=SMG[(DONGXI_S-DONGXI_S_LV)/10];
delay(1);
smg_dongxi_11=1;
// P1=0XFF;
P1=0X00;
delay(1);
smg_dongxi_12=0;
delay(1);
P1=SMG[(DONGXI_S-DONGXI_S_LV)%10];
delay(1);
smg_dongxi_12=1;
// P1=0XFF;
P1=0X00;
led_nanbei_hong=0;
led_nanbei_lv=1;
led_nanbei_huang=1;
smg_nanbei_1=0;
delay(1);
P1=SMG[(DONGXI_S-time)/10];
delay(1);
smg_nanbei_1=1;
// P1=0XFF;
P1=0X00;
delay(1);
smg_nanbei_2=0;
delay(1);
P1=SMG[(DONGXI_S-time)%10];
delay(1);
smg_nanbei_2=1;
// P1=0XFF;
P1=0X00;
smg_nanbei_11=0;
delay(1);
P1=SMG[(DONGXI_S-time)/10];
delay(1);
smg_nanbei_11=1;
// P1=0XFF;
P1=0X00;
delay(1);
smg_nanbei_12=0;
delay(1);
P1=SMG[(DONGXI_S-time)%10];
delay(1);
smg_nanbei_12=1;
// P1=0XFF;
P1=0X00;
key_scan();
}
if(DONGXI_S_HUANG<=DONGXI_S)
{
DONGXI_S=0;
}
key_scan();
}
while(moshi==1)
{
led_dongxi_hong=0;
led_dongxi_lv=1;
led_dongxi_huang=1;
led_nanbei_hong=1;
led_nanbei_lv=0;
led_nanbei_huang=1;
delay(1);
smg_dongxi_1=0;
P1=SMG[0];
delay(1);
smg_dongxi_1=1;
// P1=0XFF;
P1=0X00;
delay(1);
smg_dongxi_2=0;
delay(1);
P1=SMG[0];
delay(1);
smg_dongxi_2=1;
// P1=0XFF;
P1=0X00;
smg_nanbei_1=0;
delay(1);
P1=SMG[0];
delay(1);
smg_nanbei_1=1;
// P1=0XFF;
P1=0X00;
delay(1);
smg_nanbei_2=0;
delay(1);
P1=SMG[0];
delay(1);
smg_nanbei_2=1;
// P1=0XFF;
P1=0X00;
delay(1);
smg_dongxi_11=0;
P1=SMG[0];
delay(1);
smg_dongxi_11=1;
// P1=0XFF;
P1=0X00;
delay(1);
smg_dongxi_12=0;
delay(1);
P1=SMG[0];
delay(1);
smg_dongxi_12=1;
// P1=0XFF;
P1=0X00;
smg_nanbei_11=0;
delay(1);
P1=SMG[0];
delay(1);
smg_nanbei_11=1;
// P1=0XFF;
P1=0X00;
delay(1);
smg_nanbei_12=0;
delay(1);
P1=SMG[0];
delay(1);
smg_nanbei_12=1;
// P1=0XFF;
P1=0X00;
key_scan();
}
while(moshi==2)
{
led_dongxi_hong=1;
led_dongxi_lv=1;
led_dongxi_huang=0;
delay(500);
led_dongxi_hong=1;
led_dongxi_lv=1;
led_dongxi_huang=1;
delay(500);
led_nanbei_hong=1;
led_nanbei_lv=1;
led_nanbei_huang=0;
delay(500);
led_nanbei_hong=1;
led_nanbei_lv=1;
led_nanbei_huang=1;
delay(500);
key_scan();
}
while(moshi==3)
{
TR0 = 0;
led_dongxi_hong=1;
led_dongxi_lv=1;
led_dongxi_huang=1;
led_nanbei_hong=1;
led_nanbei_lv=1;
led_nanbei_huang=1;
DONGXI_S_HONG=DONGXI_S_HONG+10;
if(DONGXI_S_HONG>50)
{
DONGXI_S_HONG=10;
}
DONGXI_S=0;
moshi=0;
TR0 = 1;
ET0=1;
DONGXI_S=0;
}
if(moshi==4)
{
moshi=0;
TR0 = 1;
ET0=1;
DONGXI_S=0;
}
}
}
代码挺冗余的吧也懒得改了就这样了,做这个的时候倒是没有遇到什么特别离谱的bug,唯一的bug可能是紧急按键按多了程序可能就死掉了得重启。如果有大佬知道怎么解决的话麻烦大佬告诉我一声哈哈哈哈哈哈。后面还有一个万年历,过段时间发吧呢个遇到的一些bug还挺有意思的。后面慢慢发一些32啊这些的东西了,顺便悄咪咪说一句,如果有小伙伴想参加蓝桥杯单片机的话也可以找我交流。