单片机期末考试编程题

更新时间:2023-08-10 03:43:01 阅读量: 工程科技 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

/***************************************

实验题目要求:

P23- P26口做输出口,接发光二极管,编写并调试程序,使其闪烁。

时间:2012年12月21日

程序撰写者:邹康

*****************************************/

#include<reg52.h>

void delay(unsigned int t) //软延时大致时间为1ms

{

unsigned int a,b;

for(a=0;a<t;a++)

for(b=0;b<120;b++);

}

void main()

{

while(1)

{

P2=~P2;

delay(1000); //延时1s

}

} /*********************************************************

实验题目要求:

P23- P26口做输出口,接发光二极管,编写并调试跑马灯程序。

时间:2012年12月21日

程序撰写者:邹康

***********************************************************/

#include<reg52.h>

void delay(unsigned int t) //延时1ms左右

{

unsigned int a,b;

for(a=0;a<t;a++)

for(b=0;b<120;b++);

}

void main()

{

unsigned char i=0,m=0;

while(1)

{

for(i=0;i<4;i++) //向左移动

{

P2=~(0x08<<i);

delay(1000);

}

m=~P2;

for(i=0;i<4;i++) //向右移动

{

P2=~(m>>i);

delay(1000);

}

}

}/*********************************

实验题目要求:

设计一个二进制减1计数器,按一次键,减1,并用4个LED显示计数结果,减至0时,重新从15开始计数。

时间:2012年12月21日

程序撰写者:邹康

**********************************/

#include<reg52.h>

sbit key1=P2^0;

sbit LED0=P2^6; //单片机板子最右边的led灯

sbit LED1=P2^5; //右边数第二个灯

sbit LED2=P2^4; //右边数第三个灯

sbit LED3=P2^3; //右边数第四个灯

char number=15;

unsigned char num[4];

void key() //通过按键对NUMBER的数值进行减计数

{

static unsigned char m=0;

if(key1==0)

{

m++;

if(m>=30)

{

number--;

if(number<0)

number=15;

m=0;

}

}

}

void number_change() //将十进制转换为二进制

{

unsigned int n=0;

unsigned char j=0;

n=number;

for(j=0;j<4;j++)

{

num[j]=n%2;

n=n/2;

}

}

void show() //通过LED将二进制显示出来

{

LED0=!num[0];

LED1=!num[1];

LED2=!num[2];

LED3=!num[3];

}

void main()

{

while(1)

{

key();

number_change();

show();

}

}/*******************************************

实验题目要求:

用1个按键控制LED的显示,要求显示3种以上的不同模式。

时间:2012年12月22日

程序撰写者:邹康

********************************************/

#include<reg52.h>

sbit led0=P2^3;

sbit led1=P2^4;

sbit led2=P2^5;

sbit led3=P2^6;

sbit mode_key=P2^0;

char mode=0;

void delay(unsigned int t)

{

unsigned int a,b;

for(a=0;a<t;a++)

for(b=0;b<120;b++);

}

void key()

{

static unsigned char m;

if(mode_key==0)

{

m++;

if(m>=30)

{

mode++;

if(mode>=3)

mode=0;

m=0;

}

}

}

void mode_1()

左右

{

unsigned char i=0,c=0;

for(i=0;i<4;i++)

{

P2|=0xf8;

c=~(0x08<<i);

P2&=c;

delay(1000);

} //延时时间大约1ms //通过按键进行模式选择 //模式一 根据开发板,LED循环右移,时间间隔1s

}

void mode_2() //模式二 根据开发板,LED一闪一灭,时间间隔1s左右 {

led0=0;

led1=0;

led2=0;

led3=0;

delay(1000);

led0=1;

led1=1;

led2=1;

led3=1;

delay(1000);

}

void mode_3() //模式三 , 先循环右移,再循环左移,时间间隔1s左右 {

unsigned char i=0,n=0,c=0;

for(i=0;i<4;i++)

{

P2|=0xf8;

P2&=~(0x08<<i);

delay(1000);

}

for(i=0;i<4;i++)

{

P2|=0xf8;

P2&=~(0x40>>i);

delay(1000);

}

}

void main()

{

while(1)

{

key();

switch(mode)

{

case 0 : mode_1();break;

case 1 : mode_2();break;

case 2 : mode_3();break;

}

}/*******************************************

实验题目要求:

用1个按键控制LED的显示,要求显示3种以上的不同模式。

时间:2012年12月22日

程序撰写者:邹康

********************************************/

#include<reg52.h>

sbit led0=P2^3;

sbit led1=P2^4;

sbit led2=P2^5;

sbit led3=P2^6;

sbit mode_key=P2^0;

char mode=0;

void delay(unsigned int t)

{

unsigned int a,b;

for(a=0;a<t;a++)

for(b=0;b<120;b++);

}

void key()

{

static unsigned char m;

if(mode_key==0)

{

m++;

if(m>=30)

{

mode++;

if(mode>=3)

mode=0;

m=0;

}

}

}

void mode_1()

左右

{

unsigned char i=0,c=0;

for(i=0;i<4;i++) //延时时间大约1ms //通过按键进行模式选择 //模式一 根据开发板,LED循环右移,时间间隔1s

{

P2|=0xf8;

c=~(0x08<<i);

P2&=c;

delay(1000);

}

}

void mode_2()

{

led0=0;

led1=0;

led2=0;

led3=0;

delay(1000);

led0=1;

led1=1;

led2=1;

led3=1;

delay(1000);

}

void mode_3()

{

unsigned char i=0,n=0,c=0;

for(i=0;i<4;i++)

{

P2|=0xf8;

P2&=~(0x08<<i);

delay(1000);

}

for(i=0;i<4;i++)

{

P2|=0xf8;

P2&=~(0x40>>i);

delay(1000);

}

}

void main()

{

while(1)

{

key();

switch(mode) //模式二 //模式三 ,根据开发板,LED一闪一灭,时间间隔1s左右 先循环右移,再循环左移,时间间隔1s左右

{

case 0 : mode_1();break;

case 1 : mode_2();break;

case 2 : mode_3();break;

}

}

}

}/************************************

实验题目要求:

采用外部中断的方式实现用1个按键控制LED的显示,要求显示3种以上的不同模式。

时间:2012年12月22日

程序撰写者:邹康

*************************************/

#include<reg52.h>

sbit led0=P2^3;

sbit led1=P2^4;

sbit led2=P2^5;

sbit led3=P2^6;

unsigned char mode=0;

void delay(unsigned int t) //延时时间大约1ms

{

unsigned int a,b;

for(a=0;a<t;a++)

for(b=0;b<120;b++);

}

void mode_1() //模式一 根据开发板,LED循环右移,时间间隔1s左右

{

unsigned char i=0,c=0;

for(i=0;i<4;i++)

{

P2|=0xf8;

c=~(0x08<<i);

P2&=c;

delay(1000);

}

}

void mode_2()

{

led0=0;

led1=0;

led2=0;

led3=0;

delay(1000);

led0=1;

led1=1;

led2=1;

led3=1;

delay(1000);

}

void mode_3()

{

unsigned char i=0,n=0,c=0;

for(i=0;i<4;i++)

{

P2|=0xf8;

P2&=~(0x08<<i);

delay(1000);

}

for(i=0;i<4;i++)

{

P2|=0xf8;

P2&=~(0x40>>i);

delay(1000);

}

}

void init()

{

EA=1;

IT0=1;

EX0=1;

}

void main()

{

init();

while(1)

{ //模式二 //模式三 ,根据开发板,LED一闪一灭,时间间隔1s左右 先循环右移,再循环左移,时间间隔1s左右

switch(mode)

{

case 0:mode_1();break;

case 1:mode_2();break;

case 2:mode_3();break;

}

}

}

void come0() interrupt 0

{

mode++;

if(mode>2)

mode=0;

}/******************************************

实验题目要求:

采用外部中断的方式实现一个二进制减1计数器,按一次键,减1,

并用4个LED显示计数结果,减至0时,重新从15开始计数。

时间:2012年12月22日

程序撰写者:邹康

******************************************/

#include<reg52.h>

sbit led0=P2^6;

sbit led1=P2^5;

sbit led2=P2^4;

sbit led3=P2^3;

unsigned char num[4];

char number=15;

void init()

{

EA=1;

IT0=1;

EX0=1;

}

void num_change()

{

char i=0,n=0;

n=number;

for(i=0;i<4;i++)

{

num[i]=n%2;

n=n/2;

}

led0=!num[0];

led1=!num[1];

led2=!num[2];

led3=!num[3];

}

void main()

{

init();

while(1)

{

num_change();

}

}

void come0() interrupt 0

{

number--;

if(number<0)

number=15;

}/************************************

实验题目要求:

采用外部中断的方式实现用1个按键控制LED的显示,要求显示3种以上的不同模式。

时间:2012年12月22日

程序撰写者:邹康

*************************************/

#include<reg52.h>

sbit led0=P2^3;

sbit led1=P2^4;

sbit led2=P2^5;

sbit led3=P2^6;

unsigned char mode=0;

void delay(unsigned int t) //延时时间大约1ms

{

unsigned int a,b;

for(a=0;a<t;a++)

for(b=0;b<120;b++);

}

void mode_1() //模式一 根据开发板,LED循环右移,时间间隔1s左右

{

unsigned char i=0,c=0;

for(i=0;i<4;i++)

{

P2|=0xf8;

c=~(0x08<<i);

P2&=c;

delay(1000);

}

}

void mode_2()

{

led0=0;

led1=0;

led2=0;

led3=0;

delay(1000);

led0=1;

led1=1;

led2=1;

led3=1;

delay(1000);

}

void mode_3()

{

unsigned char i=0,n=0,c=0;

for(i=0;i<4;i++)

{

P2|=0xf8;

P2&=~(0x08<<i);

delay(1000);

}

for(i=0;i<4;i++)

{

P2|=0xf8;

P2&=~(0x40>>i); //模式二 //模式三 ,根据开发板,LED一闪一灭,时间间隔1s左右 先循环右移,再循环左移,时间间隔1s左右

delay(1000);

}

}

void init()

{

EA=1;

IT0=1;

EX0=1;

}

void main()

{

init();

while(1)

{

switch(mode)

{

case 0:mode_1();break;

case 1:mode_2();break;

case 2:mode_3();break;

}

}

}

void come0() interrupt 0

{

mode++;

if(mode>2)

mode=0;

}/****************************************

实验题目要求:

设计1个秒计数器,每秒计1次数,在LED上显示出来,计至16清零后重新计数

时间:2012年12月22日

程序撰写者:邹康

******************************************/

#include<reg52.h>

unsigned int k=0;

char number=0;

unsigned char num[4];

sbit led0=P2^3;

sbit led1=P2^4;

sbit led2=P2^5;

sbit led3=P2^6;

void init()

{

EA=1;

ET0=1;

TMOD=0X01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TR0=1;

}

void num_change()

{

unsigned char i=0,n=0;

n=number;

for(i=0;i<4;i++)

{

num[i]=n%2;

n=n/2;

}

led0=!num[0];

led1=!num[1];

led2=!num[2];

led3=!num[3];

}

void main()

{

init();

while(1)

{

num_change();

}

}

void time0() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

k++;

if(k>=20)

{

k=0;

number++;

if(number>15)

number=0;

}

}/********************************************

实验题目要求:

在上题基础上用按键控制秒计数器的启停,按一次键开始计数,按2次停止计数,按3次又开始计数…。

时间:2012年12月22日

程序撰写者:邹康

********************************************/

#include<reg52.h>

sbit led0=P2^3;

sbit led1=P2^4;

sbit led2=P2^5;

sbit led3=P2^6;

sbit keyz=P2^0;

unsigned char flag=0;

unsigned char k=0,number=0;

unsigned char num[4];

void init()

{

EA=1;

ET0=1;

TH0=(65536-50000)%256;

TL0=(65536-50000)/256;

}

void key()

{

unsigned int m=0;

if(keyz==0)

{

m++;

if(m>=30)

{

flag=!flag;

m=0;

}

}

}

void num_change()

{

unsigned char i=0,n=0; n=number;

for(i=0;i<4;i++) {

num[i]=n%2; n=n/2; }

led0=!num[0];

led1=!num[1];

led2=!num[2];

led3=!num[3];

}

void main()

{

init();

while(1)

{

key();

if(flag==0) TR0=1; else

TR0=0;

num_change(); }

}

void time0() interrupt 1 {

TH0=(65536-50000)%256; TL0=(65536-50000)/256; k++;

if(k>19)

{

number++; if(number>15) number=0; k=0;

}

}

本文来源:https://www.bwwdw.com/article/ddlj.html

Top