单片机考试资料开卷.docx
- 文档编号:26312319
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:47
- 大小:22.53KB
单片机考试资料开卷.docx
《单片机考试资料开卷.docx》由会员分享,可在线阅读,更多相关《单片机考试资料开卷.docx(47页珍藏版)》请在冰豆网上搜索。
单片机考试资料开卷
每次实验提高内容的整理
2、数码管动态显示
#include
voiddelayms(unsignedchart)
{
unsignedcharj,k;
do
{
//---5*100*2us=1000us---
for(j=5;j>0;j--)
for(k=100;k>0;k--);
}
while(--t);
}
unsignedcharcodeSEGTAB[]=
{
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,
0x00,0x40,
};
unsignedcharcodeDIGTAB[]=
{
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,
};
unsignedcharLEDPointer;
unsignedcharLEDBuffer[8]={1,2,3,4,5,6,7,8};
unsignedcharcodeXUEHAO[]={"1300220207"};
voidShift(unsignedchar*s)
{
unsignedchari;
for(i=0;i<8;i++)
{
if(*(s+i)!
='\0')
{
if(*(s+i)=='')
LEDBuffer[i]=10;
else
LEDBuffer[i]=*(s+i)-'0';
}
else
return;
}
}
voidShift2(unsignedchar*s)
{
unsignedchari,temp;
}
voidmain(void)
{
unsignedchari,Flag=0;
unsignedchar*s=XUEHAO;
unsignedintmsCnt=0;//---毫秒计数变量---
unsignedintCounter=0;//---自动加1计数变量---
unsignedcharKeyCnt=0;//---按键计数加1变量---
s=XUEHAO;
while
(1)
{
P0=SEGTAB[LEDBuffer[LEDPointer]];
P2=DIGTAB[LEDPointer];
if(++LEDPointer==sizeof(LEDBuffer))LEDPointer=0;
delayms
(1);
if(++msCnt==500)
{
msCnt=0;
if(Flag==0)
{
//---添加程序段---
//---实现问题1,自动计数加1,并送数码管显示(得分B)---
LEDBuffer[3]=LEDBuffer[4]=LEDBuffer[5]=11;
LEDBuffer[0]=(Counter/100)%10;
LEDBuffer[1]=(Counter/10)%10;
LEDBuffer[2]=Counter%10;
(Counter>=1000)?
(Counter=0):
(Counter++);
LEDBuffer[7]=KeyCnt%10;
LEDBuffer[6]=(KeyCnt/10)%10;
}
//---学号左移的程序段(得分A+)---
else
{
Shift(s);
(*s=='\0')?
(s=XUEHAO):
(s++);
}
}
if(0==P1_0)
{
delayms
(1);
if(0==P1_0)
{
//---添加程序段---
//---按键计数加1,并送数码管显示(得分A)---
(KeyCnt>=100)?
(KeyCnt=0):
(KeyCnt++);
}
while(0==P1_0);
}
if(0==P1_1)
{
delayms
(1);
if(0==P1_1)
{
Flag=~Flag;
for(i=0;i<8;i++)
{
LEDBuffer[i]=10;
}
}
while(0==P1_1);
}
}
}
3、矩阵键盘
#include
voiddelayms(unsignedchart)
{
unsignedcharj,k;
do
{
for(j=5;j>0;j--)
for(k=100;k>0;k--);
}
while(--t);
}
unsignedcharcodeSEGTAB[]=
{
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,
0x77,0x7C,0x39,0x5E,0x79,0x71,
0x00,0x40,
};
unsignedcharcodeDIGTAB[]=
{
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,
};
unsignedcharLEDPointer;
unsignedcharLEDBuffer[8]={17,17,17,17,17,17,17,17};
#defineKEYBOARDP1
voidmain(void)
{
unsignedcharBianMa;//---定义的键盘按键编码变量---
unsignedcharKeyValue;//---定义的键盘编码转化为数字的变量---
unsignedcharFlag=0;//---定义的数码管闪烁控制标志---
unsignedintmsCnt=0;//---定义的毫秒计数变量---
while
(1)
{
P2=DIGTAB[LEDPointer];
P0=SEGTAB[LEDBuffer[LEDPointer]];
if(++LEDPointer==sizeof(LEDBuffer))LEDPointer=0;
delayms
(1);
//---
(2)此处添加实现中间2个数码管以0.5秒闪烁显示效果的程序段---
if(0!
=Flag)
{
if(++msCnt==500)
{
msCnt=0;
//---此处添加中间2个数码管闪烁的程序---
if(Flag!
=0)
{
if(LEDBuffer[4]!
=17)LEDBuffer[4]=17;
elseLEDBuffer[4]=16;
if(LEDBuffer[3]!
=17)LEDBuffer[3]=17;
elseLEDBuffer[3]=16;
}
}
}
KEYBOARD=0xF0;
if(0xF0!
=(KEYBOARD&0xF0))
{
delayms(5);
if(0xF0!
=(KEYBOARD&0xF0))
{
BianMa=KEYBOARD&0xF0;
KEYBOARD=0x0F;
BianMa|=(KEYBOARD&0x0F);
LEDBuffer[7]=BianMa/16;
LEDBuffer[6]=BianMa%16;
//---
(1)此处添加按键编码转化为数字或字母的程序段(得分B)---
switch(BianMa)
{
case0xEE:
KeyValue=1;LEDBuffer[0]=1;break;
case0xDE:
KeyValue=2;LEDBuffer[0]=2;break;
case0xBE:
KeyValue=3;LEDBuffer[0]=3;break;
case0xED:
KeyValue=4;LEDBuffer[0]=4;break;
case0xDD:
KeyValue=5;LEDBuffer[0]=5;break;
case0xBD:
KeyValue=6;LEDBuffer[0]=6;break;
case0xEB:
KeyValue=7;LEDBuffer[0]=7;break;
case0xDB:
KeyValue=8;LEDBuffer[0]=8;break;
case0xBB:
KeyValue=9;LEDBuffer[0]=9;break;
case0x7E:
KeyValue=10;LEDBuffer[0]=10;break;
case0x7D:
KeyValue=11;LEDBuffer[0]=11;break;
case0x7B:
KeyValue=12;LEDBuffer[0]=12;break;
case0x77:
KeyValue=13;LEDBuffer[0]=13;break;
//?
?
?
?
}
//---
(1)此处添加将转化为数字或字母数据送到数码管上显示的程序---
//LEDBuffer[?
]=?
?
?
//---
(2)此处添加获取D键操作的程序段---
if(0x0D==KeyValue)
{
//---数码管闪烁标志控制程序段---
if(Flag==0)Flag=1;
elseFlag=0;
}
//---(3)此处添加实现10以内的简单计算器的加减乘除功能的程序段---
//......
//......
}
while(0x0F!
=(KEYBOARD&0x0F));
}
}
}
4、外部中断
#include
voiddelayms(unsignedchart)
{
unsignedchari,j;
do
{
for(i=5;i>0;i--)
for(j=200;j>0;j--);
}
while(--t);
}
unsignedcharcodeSEGTAB[]=
{
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,
0x77,0x7C,0x39,0x5E,0x79,0x71,
0x00,0x40,
};
unsignedcharcodeDIGTAB[]=
{
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,
};
unsignedcharLEDPointer;
unsignedcharLEDBuffer[8]={17,17,17,17,17,17,17,17};
unsignedcharKeyCnt=0;//按键次数变量
unsignedintmsCnt;//
unsignedcharCnt;//
unsignedintSpeed=200;
unsignedintspd[]={100,200,500};//流水灯流速
unsignedcharDir=0;//
voidmain(void)
{
unsignedchari;
IT0=1;
EX0=1;
IT1=1;//---
(1)添加外部中断1的初始化程序段---
EX1=1;//......
EA=1;//
while
(1)
{
P2=DIGTAB[LEDPointer];
P0=SEGTAB[LEDBuffer[LEDPointer]];
if(++LEDPointer==sizeof(LEDBuffer))LEDPointer=0;
delayms
(1);
//---(3)数码管流水灯显示效果程序段---
if(++msCnt>=Speed)
{
msCnt=0;
if(Dir==0)
{
if(++Cnt==sizeof(LEDBuffer)-2)Cnt=0;
}
else
{
if(Cnt--==0)Cnt=sizeof(LEDBuffer)-2;//右流水显示的程序判断
//......
}
for(i=0;i LEDBuffer[Cnt]=8; } } } voidINT0__ISR(void)interrupt0//---外部中断0中断服务程序--- { if(P3^2==0) { delayms(10); if(P3^2==0) //--- (2)去抖动,并判断是否真的按下--- //...... //...... { KeyCnt++; LEDBuffer[7]=(KeyCnt/10)%10; LEDBuffer[6]=(KeyCnt/1)%10; Speed=spd[KeyCnt%3]; //---(3)流水速度调节程序段--- //...... } Dir=1; }//--- (2)清标志,--- //...... } voidINT1_ISR(void)interrupt2//---外部中断1中断服务程序--- { if(P3^3==0) { delayms(10); if(P3^3==0) //--- (2)去抖动,并判断是否真的按下--- //...... //...... { KeyCnt--; LEDBuffer[7]=(KeyCnt/10)%10; LEDBuffer[6]=(KeyCnt/1)%10; Speed=spd[KeyCnt%3]; //---(3)流水速度调节程序段--- //...... } Dir=1; }//--- (2)清标志,--- //...... //--- (1)添加外部中断1的中断服务程序段--- //...... //---(3)流水方向调节程序 } 5、定时器 #include voiddelayms(unsignedchart) { unsignedchari,j; do { for(i=5;i>0;i--) for(j=200;j>0;j--); } while(--t); } unsignedcharcodeSEGTAB[]= { 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F, 0x77,0x7C,0x39,0x5E,0x79,0x71, 0x00,0x40, }; unsignedcharcodeDIGTAB[]= { 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80, }; unsignedcharLEDPointer; unsignedcharLEDBuffer[8]={17,17,17,17,17,17,17,17}; unsignedcharKeyCnt; unsignedintmsCnt; unsignedcharSecond99=99; unsignedcharSecond; unsignedcharMinute; unsignedcharHour; unsignedcharKeyFunction=0; voidT0_ISR(void)interrupt1 { TH0=(65536-922)/256;//---fosc=11.0592MHz,重载T0产生10ms的定时初值--- TL0=(65536-922)%256; //--- (1)重载T0定时1ms的初值--- //...... P2=DIGTAB[LEDPointer]; P0=SEGTAB[LEDBuffer[LEDPointer]]; if(++LEDPointer==sizeof(LEDBuffer))LEDPointer=0; //---产生1秒定时--- msCnt++; if(msCnt==1000) { msCnt=0; //--- (2)添加定时器T0产生00~99秒倒计时,在右边的数码管上显示程序段--- if(Second99>0) { Second99--; LEDBuffer[1]=Second99/10; LEDBuffer[0]=Second99%10; } //---(3)实现数字钟功能--- //...... if(KeyFunction==0) {if(++Second==60) { Second=0; Minute++; } if(Minute==60) { Minute=0; Hour++; } if(Hour==24) Hour=0; LEDBuffer[7]=(Hour/10)%10; LEDBuffer[6]=(Hour/1)%10; LEDBuffer[4]=(Minute/10)%10; LEDBuffer[3]=(Minute/1)%10; LEDBuffer[1]=(Second/10)%10; LEDBuffer[0]=(Second/1)%10; } } //...(4)设定时钟时,闪烁显示--- if(KeyFunction! =0) { if(0==(msCnt%250)) { switch(KeyFunction) { case0: break; case1: if(LEDBuffer[7]==16) { LEDBuffer[7]=(Hour/10)%10; LEDBuffer[6]=(Hour/1)%10; } else { LEDBuffer[7]=16; LEDBuffer[6]=16; } break; case2: if(LEDBuffer[4]==16) { LEDBuffer[4]=(Minute/10)%10; LEDBuffer[3]=(Minute/1)%10; } else { LEDBuffer[4]=16; LEDBuffer[3]=16; } break; case3: if(LEDBuffer[1]==16) { LEDBuffer[1]=(Second/10)%10; LEDBuffer[0]=(Second/1)%10; } else { LEDBuffer[1]=16; LEDBuffer[0]=16; } break; } } } } voidmain(void) { //TMOD //|GATE,C/T,M1,M0|GATE,C/T,M1,M0| //----T1------T0--- TMOD=0x01; TH0=(65536-922)/256;//---fosc=11.0592MHz,设置T0产生10ms的定时初值--- TL0=(65536-922)%256; //--- (1)初始化T0定时1ms的初值--- //...... TR0=1; ET0=1; EA=1; while (1) { //---按键K3实现功能切换(时/分/秒)--- if(P3_2==0) { //---去抖动,并判断K3是否真得按下--- //... delayms(10); if(P3_2==0) { if(++KeyFunction==4)KeyFunction=0; } //---等待按键k3释放--- while(P3_2==0); } //---按键K4实现数字调节(小时调节范围0~23,分秒调节范围0~59)--- if(P3_3==0) { //---去抖动,并判断K4是否真得按下--- //... delayms(10); if(P3_3==0) { switch(KeyFunction) { case1: if(++Hour==24)Hour=0; LEDBuffer[7]=(Hour/10)%10; LEDBuffer[6]=(Hour/1)%10; break; case2: if(++Minute==60)Minute=0; LEDBuffer[4]=(Minute/10)%10; LEDBuffer[3]=(Minute/1)%10; break; case3: if(++Second==60)Second=0; LEDBuffer[1]=(Second/10)%10; LEDBuffer[0]=(Second/1)%10; break; } } //---等待按键K4释放--- //...... while(P3_3==0); } } } //---问题1: 重新将定时器T0初始化为定时1ms,并消除数码管显示闪烁现象(得分C)--- //---问题2: 利用定时器T0产生00
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 考试 资料 开卷