proteus效果
交通灯
proteus电路搭建图
数码管使用移位寄存器进行控制,led使用74hc245进行控制是为了防倒灌。
keil代码
#include"reg51.h"
sbit clock1=P2^1;//时钟位
sbit H1=P2^0;
sbit clock2=P2^3;//时钟位
sbit H2=P2^2;
sbit key1=P3^2;
sbit key2=P3^3;
unsigned char code_seg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极数码管0~1
int sum1=0;
int sum2=0;
void Key1() interrupt 0{ //按键一中断
if(key1==0){
unsigned long i;
for(i=0;i<700;i++){ //消抖
;
}
if(key1==0){
sum1++;}
}
}
void Key2() interrupt 2{ //按键二中断
if(key2==0){
unsigned long i;
for(i=0;i<700;i++){ //消抖
;
}
if(key2==0){
sum2++;}
}
}
void control(unsigned char continues){ //按键控制
if(sum1==1){
while(1){
P1=0x21;//全为红灯
if(sum1==2){sum1=0;P1=continues;sum2=0;break;} //再次按下跳出循环
}
}
if(sum2==1){
while(1){
P1=0x42;//全为黄灯
if(sum2==2){sum2=0;P1=continues;sum1=0;break;}//再次按下跳出循环
}
}
}
void seg71s_S_N(unsigned int date_seg71_s_n){ //南北数码管显示
unsigned int datas=date_seg71_s_n/10;//十位
unsigned int data_1=date_seg71_s_n%10;//个位
unsigned char bits[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
unsigned int i;
//unsigned int a;
for(i=0;i<8;i++){
clock1=0; //拉低时钟
if(code_seg[datas]&bits[i]){ //循环八次显示十位
H1=1;
}
else{
H1=0;
}
clock1=1; //拉高时钟
}
for(i=0;i<8;i++){
clock1=0;
if(code_seg[data_1]&bits[i]){ //循环八次显示个位
H1=1;
}
else{
H1=0;
}
clock1=1;
}
}
void seg71s_E_W(unsigned int date_seg71_e_w){ //东西数码管显示
unsigned int datas=date_seg71_e_w/10;
unsigned int data_1=date_seg71_e_w%10;
unsigned char bits[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
unsigned int i;
//unsigned int a;
for(i=0;i<8;i++){
clock2=0;
if(code_seg[datas]&bits[i]){
H2=1;
}
else{
H2=0;
}
clock2=1;
}
for(i=0;i<8;i++){
clock2=0;
if(code_seg[data_1]&bits[i]){
H2=1;
}
else{
H2=0;
}
clock2=1;
}
}
void Delay(void);
void main(void){ //主函数
unsigned char light[4]={0x81,0x41,0x24,0x22};//LED灯
unsigned int b=0;
unsigned int c=0;
unsigned int i=0;
unsigned int a=0;
IT0=1;
EX0=1;
IT1=1;
EX1=1;
EA=1;
key1=1;
key2=1;
while(1){
for(i=0;i<4;i++){
P1=light[i];
if(i%2){
for(a=3;a>0;a--){
control(light[i]);
seg71s_S_N(a);
seg71s_E_W(a);
Delay();
}
}
else{
for(a=27;a>0;a--){
if(i<2){
b=a;
c=a+3;
}
else{
b=a+3;
c=a;
}
control(light[i]);
seg71s_S_N(c);
seg71s_E_W(b);
Delay();
}
}
}
}
}
void Delay(void){
unsigned long i;
for(i=0;i<15700;i++){
;
}
}
为完成课程设计因此没有使用时钟做延迟(欢迎大家修改)