单片机考试程序题.docx

上传人:b****8 文档编号:10506944 上传时间:2023-02-17 格式:DOCX 页数:39 大小:21.39KB
下载 相关 举报
单片机考试程序题.docx_第1页
第1页 / 共39页
单片机考试程序题.docx_第2页
第2页 / 共39页
单片机考试程序题.docx_第3页
第3页 / 共39页
单片机考试程序题.docx_第4页
第4页 / 共39页
单片机考试程序题.docx_第5页
第5页 / 共39页
点击查看更多>>
下载资源
资源描述

单片机考试程序题.docx

《单片机考试程序题.docx》由会员分享,可在线阅读,更多相关《单片机考试程序题.docx(39页珍藏版)》请在冰豆网上搜索。

单片机考试程序题.docx

单片机考试程序题

单片机程序1双向来回流水灯

//-----------------------------------------------------------------

//名称:

八只LED双向来回点亮

//-----------------------------------------------------------------

//说明:

程序利用循环移位函数_crol_和_cror_形成LED来回滚动显示效果

//

//-----------------------------------------------------------------

#include

#include

#defineINT8Uunsignedchar

#defineINT16Uunsignedint

//-----------------------------------------------------------------

//延时

//-----------------------------------------------------------------

voiddelay_ms(INT16Ux)

{

INT8Ut;

while(x--)

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

}

//-----------------------------------------------------------------

//主程序

//-----------------------------------------------------------------

voidmain()

{

P2=0x01;

while

(1)

{

while(P2<0x80)//10000000

{

P2=_crol_(P2,1);

delay_ms(500);

}

while(P2>0x01)

{

P2=_cror_(P2,1);

delay_ms(500);

}

}

/*

INT8Ua,cishu;

a=0x01;

while

(1)

{

P2=a;

delay_ms(500);

cishu=8;

while(--cishu)

{

a=_crol_(a,1);

P2=a;

delay_ms(500);

}

cishu=8;

while(--cishu)

{

a=_cror_(a,1);

P2=a;

delay_ms(500);

}

}

*/

}

 

//----------------------------------------------2分立式数码管循环显示0-9

//名称:

分立式数码管循环显示0~9

//-----------------------------------------------------------------

//说明:

主程序中的循环语句反复将0-9的段码送P0口,形成数字0-9的

//循环显示.

//-----------------------------------------------------------------

#include

#defineINT8Uunsignedchar

#defineINT16Uunsignedint

//0~9的共阴数码管段码表

codeINT8USEG_CODE[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

//-----------------------------------------------------------------

//延时函数

//-----------------------------------------------------------------

voiddelay_ms(INT16Ux)

{

INT8Ut;while(x--)for(t=0;t<120;t++);

}

//-----------------------------------------------------------------

//主程序

//-----------------------------------------------------------------

voidmain()

{

inti;

while

(1)

{

P0=SEG_CODE[i];

i=(++i)%10;

delay_ms(1000);

}

}

 

//-----------------------------------------------------------------

//名称:

3集成式数码管动态扫描显示

//-----------------------------------------------------------------

//说明:

本例使用动态扫描显示方法在8位数码管上显示指定数组内容

//

//-----------------------------------------------------------------

#include

#defineINT8Uunsignedchar

#defineINT16Uunsignedint

//共阳数码管0~9的数字段码表

codeINT8USEG_CODE[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

//待显示到数码管的8个数字

codeINT8Uarray[]={2,0,1,5,1,0,0,8};

//-----------------------------------------------------------------

//延时函数

//-----------------------------------------------------------------

voiddelay_ms(INT16Ux)

{

INT8Ut;while(x--)for(t=0;t<120;t++);

}

//-----------------------------------------------------------------

//主程序

//-----------------------------------------------------------------

voidmain()

{

INT8Ui;

while

(1)

{

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

{

//P2=0;//这句话有什么用,如果将这句话注释掉会有什么后果?

P0=SEG_CODE[array[i]];

P2=0x01<

delay_ms(5);

}

 

}

}

 

//-----------------------------------------------------------------

//名称:

4.按键调节数码管数字显示

//-----------------------------------------------------------------

//说明:

本例通过按键加减数码管所显示的数字,调节过程中数码管闪烁显示.

//确定后恢复正常显示,按下取消时将恢复到调节之前的值.

//

//-----------------------------------------------------------------

#include

#defineINT8Uunsignedchar

#defineINT16Uunsignedint

//调节按键定义

sbitK1=P3^4;//加

sbitK2=P3^5;//减

sbitK3=P3^6;//确定

sbitK4=P3^7;//取消

//数字0~9的数码管段码表

INT8UcodeSEG_CODE[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

INT16UCount=2314;

INT16UTemp;

INT8Uarray[]={0,0,0,0};

INT8UAdjust=0;

INT8UPre_key=0xF0;

 

//-----------------------------------------------------------------

//延时函数

//-----------------------------------------------------------------

voiddelay_ms(INT16Ux)

{

INT8Ut;while(x--)for(t=0;t<120;t++);

}

//-----------------------------------------------------------------

//数位分解函数(分解为4个数位)

//使用循环减法的分解速度优于使用/与%分解

//-----------------------------------------------------------------

voidINT_TO_4Digit(INT16Un)

{

array[0]=0;

while(n>=1000)

{

array[0]++;

n=n-1000;

}

array[1]=0;

while(n>=100)

{

array[1]++;

n=n-100;

}

array[2]=0;

while(n>=10)

{

array[2]++;

n=n-10;

}

array[3]=n;

 

}

//-----------------------------------------------------------------

//按键处理函数

//-----------------------------------------------------------------

voidkey_handle()

{

P3=P3|0xf0;

if(Pre_key==(P3&0xf0))

return;

Pre_key=P3&0xf0;

if(!

K1)

{

delay_ms(10);

if(!

K1)

{

if(Temp==0)

Temp=Count;

Count++;

Adjust=1;

while(!

K1);

}

}

if(!

K2)

{

delay_ms(10);

if(!

K2)

{

if(Temp==0)

Temp=Count;

Count--;

Adjust=1;

}

}

if(!

K3)

{

delay_ms(10);

if(!

K3)

{

Temp=0;

Adjust=0;

}

}

if(!

K4)

{

delay_ms(10);

if(!

K4)

{

if(Adjust)

Count=Temp;

Temp=0;

Adjust=0;

}

}

 

}

//-----------------------------------------------------------------

//主程序

//-----------------------------------------------------------------

voidmain()

{

INT8Ui;INT8Ut;

while

(1)

{//1.正常刷新显示---------------------------------------------

INT_TO_4Digit(Count);

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

{

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

{

P3=P3&0xF0;

P0=SEG_CODE[array[t]];

P3=P3|(1<

delay_ms

(2);

}

key_handle();

}

if(Adjust)

{

P0=0xff;

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

{

delay_ms(10);

key_handle();

}

}

 

//2.处于调节状态---------------------------------------------

 

}

}

 

//-----------------------------------------------------------------

//名称:

5数码管显示4×4键盘矩阵按键序号

//-----------------------------------------------------------------

//说明:

按下任意一按键时,数码管会显示它在键盘矩阵上的序号0-F,

//扫描程序首先判断按键发生在哪一列,然后根据所发生的行附加

//不同的值,从而得到键盘按键序号.

//

//-----------------------------------------------------------------

#include

#defineINT8Uunsignedchar

#defineINT16Uunsignedint

//0~F的共阳数码管段码,最后一个是黑屏

constINT8USEG_CODE[]=

{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,

0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF

};

sbitBEEP=P3^0;

//上次按键和当前按键序号,该矩阵中序号范围为0-15,0xFF表示无按键

INT8UPre_key=0xff,key=0xff;

//-----------------------------------------------------------------

//延时函数

//-----------------------------------------------------------------

voiddelay_ms(INT16Ux)

{

INT8Ut;while(x--)for(t=0;t<120;t++);

}

//-----------------------------------------------------------------

//键盘矩阵扫描子程序

//-----------------------------------------------------------------

voidKeys_Scan()

{

P1=0x0f;

delay_ms

(1);

if(P1==0x0f)

{

key=0xff;

return;

}

switch(P1)

{

case0x0e:

key=0;break;

case0x0d:

key=1;break;

case0x0b:

key=2;break;

case0x07:

key=3;break;

default:

key=0xff;return;

}

P1=0xf0;

delay_ms

(1);

switch(P1)

{

case0xe0:

key=key+0;break;

case0xd0:

key=key+4;break;

case0xb0:

key=key+8;break;

case0x70:

key=key+12;break;

default:

key=0xff;return;

}

}

//-----------------------------------------------------------------

//蜂鸣器子程序

//-----------------------------------------------------------------

voidBeep()

{

INT8Ui;

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

{

BEEP=~BEEP;

delay_ms

(1);

}

BEEP=0;

}

//-----------------------------------------------------------------

//主程序

//-----------------------------------------------------------------

voidmain()

{

P0=0XFF;

while

(1)

{

Keys_Scan();

if(key!

=0xff)

{

P0=SEG_CODE[key];

Beep();

while(Keys_Scan(),key!

=0xff);

}

}

}

 

#include6.定时器每一秒亮灭数码管

#defineuintunsignedint;

//uinti;

sbitled=P2^0;

voidmain()

{

intj;

led=0;

//定时器0中断初始化

TMOD=0X01;//00000001将定时器0的工作方式设置为方式1/

//中断开关

//EA=1;//中断总开关

//ET0=1;//打开定时器0中断开关

TR0=1;//定时器0开始定时

while

(1)

{

/***************查询方式触发定时器溢出*/

if(TF0==1)

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

j++;

P1=j;

if(j==500)

{

j=0;

led=~led;

}

//TR0=1;

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

}

}

/*中断方式

voidtimer()interrupt1//定时器0的中断服务函数

{

//inti;

TH0=(65536-50000)/256;//重装定时器0寄存器的初值

TL0=(65536-50000)%256;

i++;

P1=i;

if(i==5)

{

i=0;

led=~led;

}

//TR0=1;

}*/

 

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

7.用定时器0的方式1实现第一个发光二极管以200ms间隔闪烁,用定时器

1的方式1实现数码管前两位59S的循环计时

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

#include

#defineucharunsignedchar

#defineuintunsignedint

ucharcodedulatable[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

ucharcodewelatable[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

sbitled1=P1^7;

uintshuzhi,temp1,temp2;

voiddelay(uintxms);

voiddisplay();

voidInit_timer0();

voidInit_timer1();

 

voidmain()

{

Init_timer0();

Init_timer1();

/****************初始化定时器

TMOD=0x11;

EA=1;

ET0=1;

ET1=1;

TR0=1;

TR1=1;

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

while

(1)

{

display();

}

}

voidInit_timer0()

{

//uintb;

//b=TMOD;

TMOD|=0x01;

EA=1;

ET0=1;

TR0=1;

}

voidInit_timer1()

{

//uintb;

//b=TMOD;

TMOD|=0x10;

EA=1;

ET1=1;

TR1=1;

}

voiddisplay()

{

uintgewei=0,shiwei=0;

shiwei=shuzhi/10;

gewei=shuzhi%10;

P0=0;

P0=dulatable[gewei];

P2=welatable[0];

delay(5);

P0=0;

P0=dulatable[shiwei];

P2=welatable[1];

delay(5);

}

voiddelay(uintxms)

{

uinta,b;

for(a=xms;a>0;a--)

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

}

voidtimer()interrupt1

{

//uinta;

TH0=(65535-10000)/256;

TL0=(65535-10000)%256;

temp1++;

if

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1