单片机红黄绿灯控制.doc
文本预览下载声明
实验2 红黄绿灯控制
实验目的
掌握独立键盘、LED数码管的电路连接和编程方法。
实验设备
AT89c51基本实验单元、计算机设备系统、独立键盘、数码管
实验原理
实验说明
编写程序,按KEY1只有红灯亮;按KEY2只有黄灯亮;按KEY3只有绿灯亮。
开始后led数码管显示0,每按一次独立键盘的KEY1,数码管显示加1直至到9以后再循环从0到9.
程序流程图
(i)
(ii)
参考程序
内容(1)代码:
#includereg51.h
sbit red=P1^4;
sbit yel=P1^5;
sbit gre=P1^6;
sbit dg=P1^7;
sbit D24=P2^4;
sbit key1=P2^0;
sbit key2=P2^1;
sbit key3=P2^2;
void delay(int);
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//实验室的板子数码管用此段码 {0xc0,0xf3,0x98,0x92,0xa3,0x86,0x84,0xdc,0x80,0x82} ;
void main()
{
unsigned int sum=0;
P0=table[sum];
D24=0;
while(1)
{
if(key1==0)
{
delay(100);
if(key1==0)
{
red=0;
yel=1;
gre=1;
}
while(!key1);
}
if(key2==0)
{
delay(100);
if(key2==0)
{
red=1;
yel=0;
gre=1;
}
while(!key2);
}
if(key3==0)
{
delay(100);
if(key3==0)
{
red=1;
yel=1;
gre=0;
}
while(!key3);
}
P0=0xff;
P0=table[sum];
}
}
void delay(int m)
{
int i,j;
for(i=0;im;i++)
for(j=0;j110;j++);
}
内容(2)代码:只要在每个按键的判断句里面加上:
sum++;if(sum9) sum=0;
实验步骤:
根据实验原理图编写程序,用“Keil uVision4”编译软件进行编译,如未通过,修改程序,直至通过。
用STC-ISP.EXE软件将所编程序的“hex”码下载到试验板子的STC89C52芯片中。
运行程序,按实验板右下侧的KEY1、KEY2、KEY3,观察Led中的红绿黄灯的亮灭情况,如果不符合要求,改写程序 ,按照步骤(1)开始重新做实验,直至成功。
按同样的方法调试编写程序内容(2)的程序,直至调试成功。
思考题
参考程序在运行时必须一次按键,如何修改为只按KEY1键,每按一次是对应的红黄绿灯依次点亮一个?
答案:将原来代码里面KEY2和KEY3的内容全部删除,并将KEY1按键判断语句以内的内容改为: if(sum=9) sum=0;
if(sum%3==0){red=1;yel=1;gre=0;}
if(sum%3==1){red=1;yel=0;gre=1;}
if(sum%3==2){red=0;yel=1;gre=1;}
如果没有电路原理图,如何通过编程来获取LED数码管的段码?
答:首先,全部赋高电平(或低电平)判定该数码管是属于共阴极还是共阳极的数码管,如果高电平亮则说明是共阴极的,反之则是共阳极的。然后,一位一位的按照亮的电平来赋值(每次保证只有一个地方亮),将对应的赋值与亮的位置记录下来,然后将要显示的数字所对应的亮的地方的对应赋值做“或”运算,得出的就是对应的数字的段码。
实验原理图
显示
计数清0
大于9
计数加1
仅红灯亮
K1键按下
判定按键
程序运行
K2键按下
K3键按下
仅亮黄灯
仅亮绿灯
计数加1
计数加1
大于9
大于9
计数清0
计数清0
显示
Y
N
N
N
N
Y
Y
Y
Y
Y
N
N
显示全部