1、第二章
任务一:闪烁广告灯的设计
利用89c51单片机的端口控制两个LED(D0和D1),编写程序,实现两个LED互闪。
#include
2、)
{
LED1=0;
LED2=1;
delayms(500);
LED1=1;
LED2=0;
delayms(500);
}
}
任务二:流水广告灯的设计
利用89c51单片机的端口控制8个LED(D0~D7)循环点亮,刚开始时D0点亮,延时片刻后,接着D1点亮,然后依次点亮D2->D3->D4->D5 ->D6->D7 ,然后再点亮D7->D6->D5->D4 ->D3->D2->D1->D0,重复循环。
#include
3、ed int #define uchar unsigned char uint i; uchar temp; uint a[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; void delayms(uint ms) { while(ms--) { uint j; for(j=0;j<120;j++); } } void main() { while(1) { P0=0xfe; while(P0!=0x7f) { //P1=temp;
4、 //delayms(500); P0=_crol_(P0,1); delayms(250); } temp=0x7f; while(P0!=0xfe) { P0=temp; delayms(500); temp=_cror_(temp,1); } } } 任务三:拉幕式与闭幕式广告灯的设计 利用89c51单片机的P0端口实现8个LED D0~D7的拉幕式与闭幕式广告灯设计。 拉幕式: 开始D0~D7全灭,延时片刻后首先D3和D4亮,其次是 D2和D5亮,
5、再是D1和D6亮,最后是D0和D7亮。
闭幕式:开始D0~D7全亮,延时片刻后首先D0和D7灭,其次是 D1和D6灭,再是D2和D5灭,最后是D3和D4灭。
#include
6、 i; while(1) { P1=0xff; delay(500); for(i=0;i<4;i++) { P1=table[i]; delay(500); } for(i=3;i>0;i--) { P1=table[i-1]; delay(500); } } } 任务四:复杂广告灯的设计 利用89c51单片机的端口实现8个LED(D0~D7)复杂广告灯的控制,要求显示规律为:正向流水->反向流水->隔灯闪烁3次->高四盏、低四盏闪烁2次->隔两盏闪烁3次,再重复循环。 #include
7、
8、0;i<7;i++) { P0=aa; aa=_crol_(aa,1); delayms(500); } for(i=0;i<8;i++) { P0=aa; aa=_cror_(aa,1); delayms(500); } for(i=0;i<3;i++) for(j=0;j<2;j++) { P0=xx[j]; delayms(500); } for(i=0;i<2;i++)
9、 for(j=0;j<2;j++)
{
P0=yy[j] ;
delayms(500);
}
for(i=0;i<3;i++)
for(j=0;j<2;j++)
{
P0=zz[j] ;
delayms(500);
}
}
}
任务五:单个LED数码管显示设计
使用89c51的P0口作为输出口,外接LED数码管,编写程序,使数码管循环显示从0~9的加1计数。
#include
10、 unsigned int #define uchar unsigned char uchar table[10]={ 0XC0,0XF9,0XA4,0XB0, 0X99,0X92,0X82,0XF8, 0X80,0X90}; uint key=0; void int_int() { EA=1; IT0=1; EX0=1; } void count_num() interrupt 0 { if(key==9)key=0; else key++; } void main() { int_int(); whil
11、e(1)
{
P0=table[key];
}
}
任务六:多个LED数码管显示设计
使用单片机P0和P2口作为输出口,外接一个8位LED数码管,编写程序,使数码管显示“872AF635”。
#include
12、 uchar a[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; uchar b[8]={0x08,0x07,0x02,0x0a,0x0f,0x06,0x03,0x05},j; uint i; while(1) { j=0x01; for(i=0;i<8;i++) { P2=j; P0=a[b[i]]; j=_crol_(j,1); delay(3); } } } 任
13、务七:查询式按键设计
将8个按键从1~8进行编号,如果其中一个键被按下,则在LED数码管上显示相应的键值。
#include
14、 P2=a[1]; break; case 0xfd: P2=a[2]; break; case 0xfb: P2=a[3]; break; case 0xf7: P2=a[4]; break; case 0xef: P2=a[5]; break; case 0xdf: P2=a[6]; break; case 0xbf: P2=a[7]; break; case 0x7f: P2=a[8]; } } } 任务八:LED数码管显示矩阵键盘按键的设计 设计一个4*4的矩阵键盘,以P1.0~P1.3作为行线,以P1.4~P1
15、7作为列线。要求:未按下按键时,LED数码管显示“-”,按下按键时,在数码管上显示相应的键值。
#include
16、for(j=120;j>0;j--); } keyscan() { uint temp; temp=P2; temp&=0x0f; if(temp==0x0e) { P2=0xf0; temp=P2; temp&=0xf0; switch(temp) { case 0xe0:num=1;break; case 0xd0:num=2;break; case 0xb0:num=3;break; case 0x70:num=4; } } if(temp=
17、0x0d) { P2=0xf0; temp=P2; temp&=0xf0; switch(temp) { case 0xe0:num=5;break; case 0xd0:num=6;break; case 0xb0:num=7;break; case 0x70:num=8; } } if(temp==0x0b) { P2=0xf0; temp=P2; temp&=0xf0; switch(temp) {
18、 case 0xe0:num=9;break; case 0xd0:num=10;break; case 0xb0:num=11;break; case 0x70:num=12; } } if(temp==0x07) { P2=0xf0; temp=P2; temp&=0xf0; switch(temp) { case 0xe0:num=13;break; case 0xd0:num=14;break; case 0xb0:num=15;break; c
19、ase 0x70:num=16;
}
}
return num;
}
void display(uint num)
{ if(num==0)
P0=0xbf;
P0=table[num] ;
}
main()
{
uint temp;
while(1)
{
P2=0x0f;
temp=P2;
if(temp!=0x0f)
keyscan();
display(num);
}
}
(2)
#include
20、 uchar unsigned char #define uint unsigned int sbit LED1=P2^0; sbit LED2=P2^1; uchar num; uchar code LED_code[]= { 0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e };//数码管字形码编码 void delay(uint x) { uchar i,j; for(i=x;i>0;i--) for(j=120;j>0;j-
21、); }//延时函数 void display(uchar num) { P0=LED_code[num]; }//数码管显示函数 void keyscan()//键盘扫描函数 { uchar temp; P1=0xfe;//key1-key4第一行按下 temp=P1; temp&=0xf0; if(temp!=0xf0) { delay(10);//消除抖动 temp=P1; temp&=0xf0; if(temp!=0xf0) { temp=P1; switch(temp) { cas
22、e 0xee: num=1; break; case 0xde: num=2; break; case 0xbe: num=3; break; case 0x7e: num=4; break; } } while(temp!=0xf0)//等待按键释放 { temp=P1; temp&=0xf0; } } P1=0xfd;//key5-key8第二行按下 temp=P1; temp&=0xf0; if(temp!=0xf0)
23、 { delay(10);//消除抖动 temp=P1; temp&=0xf0; if(temp!=0xf0) { temp=P1; switch(temp) { case 0xed: num=5; break; case 0xdd: num=6; break; case 0xbd: num=7; break; case 0x7d: num=8; break; } } while(temp!=0xf0)//
24、等待按键释放 { temp=P1; temp&=0xf0; } } P1=0xfb;//key9-key12第三行按下 temp=P1; temp&=0xf0; if(temp!=0xf0) { delay(10);//消除抖动 temp=P1; temp&=0xf0; if(temp!=0xf0) { temp=P1; switch(temp) { case 0xeb: num=9; break; case 0xdb: num=10;
25、 break; case 0xbb: num=11; break; case 0x7b: num=12; break; } } while(temp!=0xf0)//等待按键释放 { temp=P1; temp&=0xf0; } } P1=0xf7;//key13-key16第四行按下 temp=P1; temp&=0xf0; if(temp!=0xf0) { delay(10);//消除抖动 temp=P1; temp&=0xf0; if(
26、temp!=0xf0) { temp=P1; switch(temp) { case 0xe7: num=13; break; case 0xd7: num=14; break; case 0xb7: num=15; break; case 0x77: num=16; break; } } while(temp!=0xf0)//等待按键释放 { temp=P1; temp&=0xf0; } } }
27、void main()
{
while(1)
{
keyscan();
if(num==0)
P0=0xbf;
else
display(num-1);
}
}
任务九:简单拨号键盘的设计
使用4*4的矩阵式键盘及8位共阳极LED数码管设计一个简单拨号键盘,要求在初始状态时,8位数码管均显示“-”,每按下一个号码后,原8位LED数码管显示的内容向左移动1位。
#include
28、char uchar keycount=0,num; uchar code LED1_code[]= { 0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e };//数码管字形码编码 uchar LED2_duan[8]={0xbf,0xbf,0xbf,0xbf,0xbf,0xbf,0xbf,0xbf};//8段共阳数码管编码 uchar LED2_wei[8]= {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; v
29、oid delay(uint x) { uchar i,j; for(i=x;i>0;i--) for(j=120;j>0;j--); } void display() { uchar i; //P2=0x80; for(i=0;i<8;i++) { P2=LED2_wei[i]; P0=LED2_duan[7-i]; delay(1); } } void keyscan() { uchar temp; P3=0xfe; temp=P3; temp&=0xf0; if(temp!=0xf0)
30、 { delay(10); temp=P3; temp&=0xf0; if(temp!=0xf0) { temp=P3; switch(temp) { case 0xee:keycount++;num=0;break; case 0xde:keycount++;num=1;break; case 0xbe:keycount++;num=2;break; case 0x7e:keycount++;num=3;break; } } while(temp!=0xf0) {
31、 temp=P3; temp&=0xf0; } } P3=0xfd; temp=P3; temp&=0xf0; if(temp!=0xf0) { delay(10); temp=P3; temp&=0xf0; if(temp!=0xf0) { temp=P3; switch(temp) { case 0xed:keycount++;num=4;break; case 0xdd:keycount++;num=5;break; case 0xbd:keycount++;num=
32、6;break; case 0x7d:keycount++;num=7;break; } } while(temp!=0xf0) { temp=P3; temp&=0xf0; } } P3=0xfb; temp=P3; temp&=0xf0; if(temp!=0xf0) { delay(10); temp=P3; temp&=0xf0; if(temp!=0xf0) { temp=P3; switch(temp) { case 0xeb:keyco
33、unt++;num=8;break; case 0xdb:keycount++;num=9;break; case 0xbb:keycount++;num=10;break; case 0x7b:keycount++;num=11;break; } } while(temp!=0xf0) { temp=P3; temp&=0xf0; } } P3=0xf7; temp=P3; temp&=0xf0; if(temp!=0xf0) { delay(10); temp=P3; t
34、emp&=0xf0; if(temp!=0xf0) { temp=P3; switch(temp) { case 0xe7:keycount++;num=12;break; case 0xd7:keycount++;num=13;break; case 0xb7:keycount++;num=14;break; case 0x77:keycount++;num=15;break; } } while(temp!=0xf0) { temp=P3; temp&=0xf0; }
35、 } } void main() { uchar i; while(1) { display(); keyscan(); if(keycount!=0) { for(i=0;i<7;i++) LED2_duan[i]=LED2_duan[i+1]; LED2_duan[7]=LED1_code[num]; keycount=0; } } } 第五章 任务一:带中断控制的LED花样灯 P0端口作为输出口,外接8只LED,P3.2外接按键K。编写程序,当K未按下时,8只LED进行默认显示,其显示规律
36、为左移流水->右移流水->隔灯闪烁3次花样显示;如果按下K键后,8只LED暂停默认显示,而进行闪烁显示,当显示达到5次后,继续按默认规律显示。
#include
37、 for(i=0;i<120;i++); } void int_int() { EA=1; EX0=1; IT0=1; } void LED_shan() interrupt 0 { uint k; for(k=0;k<5;k++) { P0=0xaa; delayms(500); P0=0xff; delayms(500); } } void main() { int_int(); while(1) { uint i; for(i=0;i<14;i++) {
38、 P0=LED_table[i]; delayms(500); } for(i=0;i<3;i++) { P0=0xaa; delayms(500); P0=0xff; delayms(500); } } } 任务二:采用外中断控制的条形LED彩灯设计 P0端口作为输出口,外接条形LED。编写程序,当按键K未按下时,LED进行循环左移显示。如果第1次按下按键K后,LED进行循环右移显示。如果第2次按下按键K后,LED进行拉幕式与闭幕式花样显示。如果第3次按下按键K后,又恢复循环左移显示。 #inclu
39、de
40、oid); //状态2 void main(void) { sysInit(); //初始化系统 while(1) { switch(flag) { case 0: step0();break; case 1: step1();break; case 2: step2();break; default:break; } P0 = ~led; //将led值映射到LED灯 delayms(500); //延时500ms } } void delayms(unsigned int ms) { uns
41、igned char i; for (;ms;ms--) for (i=110;i;i--); } void sysInit(void) { EX0 = 1; //打开外部中断0 EA = 1; //打开总中断 IT0 = 1; //外部中断0下降沿触发 } void step0(void) { led <<=1; //左移 if (led==0) //溢出处理 led = 0x01; } void step1(void) { led >>=1; //右移 if (led==0) //溢出处理 led = 0x80;
42、}
void step2(void)
{
static char t;
led = table[t++]; //开幕闭幕花样显示
if (t==8)
t = 0;
}
void EX_0() interrupt 0 //外部中断0服务函数
{
flag++;
if (flag==3)
flag = 0;
}
(2)
#include
43、har code tab[]={ //开幕式闭幕式编码 0x00,0x81,0xc3,0xe7, 0xff,0xe7,0xc3,0x81}; void delay(uint ms) //延时子函数 { uint i,j; for(i=ms;i>0;i--) for(j=0;j<110;j++); } void loop_leftmove() { temp=temp<<1; if(temp==0) temp=0x01; } void loop_rightmove() { temp=temp>>1; if(temp=
44、0) temp=0x80; } void open_close() { uchar count; temp=tab[count]; count++; if(count>=8) count=0; } void init() { EA=1; EX0=1; IT0=1; temp=0; key_count=0; } void main() { init(); while(1) { switch(key_count) { case 0:loop_leftmove();break;
45、case 1:loop_rightmove();break; case 2:open_close();break; default:break; } P0=~temp; delay(250); } } void key_interrupt() interrupt 0//外部中断INT0中断服务程序 { key_count++; key_count%=3; /*if(key_count==3) key_count=0;*/ } 任务三:采用两个外中断的LED彩灯控制 P0端口作为输出口,外接8只LED,P3.2外接按键K1
46、P3.3外接按键K2。编写程序,没有按下任何按键时,LED隔灯闪烁,当按键K1为奇数次时,LED进行左移流水->右移流水显示。当按下按键K1为偶数次时,LED进行拉幕式显示;当按下按键K2时,LED暂停显示,蜂鸣器发出“叮咚”的开门声音,然后LED继续花样显示(K2按键优先)。
#include
47、tab[]={ 0xff,0xe7,0xc3,0x81, 0x00,0x81,0xc3,0xe7};//开幕式编码 uchar temp=0x01,key_count,flag,right,beep_FG; void delay(uint ms) { uint i,j; for(i=ms;i>0;i--) for(j=110;j>0;j--); } void init() { EA=1;//打开总中断 EX0=1;//打开外部中断INT0 EX1=1;//打开外部中断INT1 IT0=1;//下降沿触发方式 IT1=1;//下降沿触发方式
48、PX0=0;//设置INT0为低中断优先级 PX1=1;//设置INT1为高中断优先级 } void interval_LED() { P0=0xff; delay(500); P0=0xaa; delay(500); } void left_right_move() { if(!right) temp=_crol_(temp,1); else temp=_cror_(temp,1); if(temp==0x01) { right=0; } if(temp==0x80) right=1; } void open
49、LED() { uchar count; temp=tab[count++]; if(count==8) count=0; } void Beep() { uchar i,j,k; for(i=100;i;i--) for(j=20;j;j--) { for(k=1000;k;k--) beep=~beep; } /*for(i=100;i;i--) for(j=200;j;j--) { for(k=1000;k;k--) beep=~beep; }*/ beep_FG=0; } void
50、 main() { init(); beep=0; while(1) { if(!flag) interval_LED(); else { if(beep_FG) { Beep(); } else { switch(key_count%2) { case 1: left_right_move(); break;//奇数次按键左移右移显示 case 0: open_LED(); break;//偶数次






