资源描述
第二章
任务一:闪烁广告灯的设计
利用89c51单片机的端口控制两个LED(D0和D1),编写程序,实现两个LED互闪。
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit LED1=P0^0;
sbit LED2=P0^1;
void delayms(uint ms)
{
uint i;
while(ms--)
{
for(i=0;i<120;i++);
}
}
void main()
{
while(1)
{
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<reg52.h>
#include <intrins.h>
#define uint unsigned 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;
//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亮,再是D1和D6亮,最后是D0和D7亮。
闭幕式:开始D0~D7全亮,延时片刻后首先D0和D7灭,其次是 D1和D6灭,再是D2和D5灭,最后是D3和D4灭。
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={0xe7,0xc3,0x81,0x00};
void delay(uint x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=120;j>0;j--);
}
void main()
{
uint 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<reg52.h>
#define uint unsigned int
#include<intrins.h>
void delayms(uint ms)
{
uint i;
while(ms--)
{
for(i=0;i<110;i++);
}
}
void main()
{
uint i,j,xx[2]={0xaa,0xff},yy[2]={0xf0,0x0f},zz[2]={0xb6,0xff};
unsigned char aa;
while(1)
{
aa=0xfe;
for(i=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++)
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<reg52.h>
#define uint 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();
while(1)
{
P0=table[key];
}
}
任务六:多个LED数码管显示设计
使用单片机P0和P2口作为输出口,外接一个8位LED数码管,编写程序,使数码管显示“872AF635”。
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
delay(ms)
{
while(ms--)
{ int i;
for(i=0;i<110;i++);
}
}
main()
{
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);
}
}
}
任务七:查询式按键设计
将8个按键从1~8进行编号,如果其中一个键被按下,则在LED数码管上显示相应的键值。
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
main()
{
uchar a[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
P0=0xff;
while(P0!=0xff)
{ switch(P0)
{case 0xfe:
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.7作为列线。要求:未按下按键时,LED数码管显示“-”,按下按键时,在数码管上显示相应的键值。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar table[17]={0xbf,0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
uint num=0;
void delay(uint x)
{
uchar i,j;
for(i=x;i>0;i--)
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==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)
{
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;
case 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<reg52.h>
#define 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--);
}//延时函数
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)
{
case 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)
{
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)//等待按键释放
{
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;
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(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;
}
}
}
void main()
{
while(1)
{
keyscan();
if(num==0)
P0=0xbf;
else
display(num-1);
}
}
任务九:简单拨号键盘的设计
使用4*4的矩阵式键盘及8位共阳极LED数码管设计一个简单拨号键盘,要求在初始状态时,8位数码管均显示“-”,每按下一个号码后,原8位LED数码管显示的内容向左移动1位。
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned 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};
void 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)
{
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)
{
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=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:keycount++;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;
temp&=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;
}
}
}
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进行默认显示,其显示规律为左移流水->右移流水->隔灯闪烁3次花样显示;如果按下K键后,8只LED暂停默认显示,而进行闪烁显示,当显示达到5次后,继续按默认规律显示。
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uint LED_table[14]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd};
void delayms(uint ms)
{
uint i;
while(ms--)
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++)
{
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后,又恢复循环左移显示。
#include <reg52.h>
unsigned char flag=0; //状态标志位
unsigned char led =0; //LED映射位
unsigned char table[]={ //花样数组
0x00,0x81,0xc3,0xe7,
0xff,0xe7,0xc3,0x81};//先闭幕式再开幕式
void delayms(unsigned int ms); //延时函数
void sysInit(void); //系统初始化
void step0(void); //状态0
void step1(void); //状态1
void step2(void); //状态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)
{
unsigned 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;
}
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<reg52.h>//头文件
#define uchar unsigned char
#define uint unsigned int //宏定义
uchar temp,key_count;
uchar 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==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;
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,P3.3外接按键K2。编写程序,没有按下任何按键时,LED隔灯闪烁,当按键K1为奇数次时,LED进行左移流水->右移流水显示。当按下按键K1为偶数次时,LED进行拉幕式显示;当按下按键K2时,LED暂停显示,蜂鸣器发出“叮咚”的开门声音,然后LED继续花样显示(K2按键优先)。
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1=P3^2;
sbit key2=P3^3;
sbit beep=P1^0;
uchar code 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;//下降沿触发方式
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_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 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;//偶数次
展开阅读全文