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