单片机实验报告.docx
- 文档编号:15199488
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:33
- 大小:214.13KB
单片机实验报告.docx
《单片机实验报告.docx》由会员分享,可在线阅读,更多相关《单片机实验报告.docx(33页珍藏版)》请在冰点文库上搜索。
单片机实验报告
单
片
机
实
验
报
告
姓名:
钟林春
班级:
0801205
学号:
2012212963
任课教师:
张开碧
上课地点:
S411
实验一流水灯实验
一、实验目的及要求
1、闪烁的LED;
2、从左到右的流水灯;
3、8只LED左右来回点亮;
4、LED模拟交通灯。
要求1:
LED按设定的时间间隔闪烁
要求2:
接在P0口的8个LED从左到右循环依次点亮,产生走马灯效果
要求3:
程序利用循环移位函数_crol_和_cror_形成来回滚动的效果;
二、实验原理
电路图1、
电路图2、
三、源程序
要求1:
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitLED=P1^0;
//延时
voidDelayMS(uintx)
{
uchari;
while(x--)
{
for(i=0;i<120;i++);
}
}
//主程序
voidmain()
{
while
(1)
{
LED=~LED;
DelayMS(150);
}
}
要求2:
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharled;
voiddelay(unsignedinti)
{
uintj;
uchark;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
voidmain()
{led=0x7f;//只亮第一个
delay(1000);
while
(1)
{P0=led;
delay(500);
led=_cror_(led,1);//P0逐步右移一位。
}
}
要求3:
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitled=P0^0;
uchari;
voiddelay(unsignedinti)
{
uintj;
uchark;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
voidmain()
{P0=0xfe;
delay(1000);
while
(1)
{
for(i=0;i<8;i++)
{P0=led;
delay(500);
led=_crol_(led,1);//P0逐步左移一位。
}
for(i=0;i<8;i++)
{P0=led;
delay(500);
led=_cror_(led,1);//P0逐步右移一位
}
}
}
实验二独立键盘实验
一、实验目的
1、K1-K4按键状态显示;
2、K1-K4控制LED移位;
3、单只数码管循环显示0~9;
4、K1-K4控制数码管移位显示。
要求1:
K1、K2按下时LED点亮,松开时熄灭,K3、K4按下并释放时LED点亮,
再次按下并释放时熄灭;
要求2:
按下K1时,P0口LED上移一位;
按下K2时,P0口LED下移一位;
按下K3时,P2口LED上移一位;
按下K4时,P2口LED下移一位;
要求3:
主程序中的循环语句反复将0~9的段码送至P0口,使数字0~9循环显示;
要求4:
按下K1时加1计数并增加显示位,
按下K2时减1计数并减少显示位,
按下K3时清零
二、实验原理
电路图1、电路图2、
电路图3、电路图4、
三、源程序
要求1:
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitLED1=P0^0;
sbitLED2=P0^1;
sbitLED3=P0^2;
sbitLED4=P0^3;
sbitK1=P1^0;
sbitK2=P1^1;
sbitK3=P1^2;
sbitK4=P1^3;
//延时
voidDelayMS(uintx)
{
uchari;
while(x--)for(i=0;i<120;i++);
}
//主程序
voidmain()
{
P0=0xff;
P1=0xff;
while
(1)
{
LED1=K1;
LED2=K2;
if(K3==0)
{
while(K3==0);
LED3=~LED3;
}
if(K4==0)
{
while(K4==0);
LED4=~LED4;
}
DelayMS(10);
}
}
要求2:
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharled1;
ucharled2;
sbitK1=P1^0;
sbitK2=P1^1;
sbitK3=P1^2;
sbitK4=P1^3;
//延时
voidDelayMS(uintx)
{
uchari;
while(x--)for(i=0;i<120;i++);
}
//主程序
voidmain()
{
led1=0xfe;
Led2=0xfe;
while
(1)
{
if(K1==0)
{
while(K1==0);
P0=led1;
led=_crol_(led1,1);//P0口LED上移一位。
}
if(K2==0)
{
while(K2==0);
P0=led1;
led=_cror_(led1,1);//P0口LED下移一位。
}
if(K3==0)
{
while(K3==0);
P2=led2;
Led1=_crol_(led2,1);//P0口LED上移一位。
}
if(K4==0)
{
while(K4==0);
P2=led2;
Led2=_cror_(led2,1);//P0口LED下移一位。
}
}
}
要求3:
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodedisplay[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//延时
VoidDelayMS(uintx)
{
uchari;
while(x--)for(i=0;i<120;i++);
}
//主程序
voidmain()
{
uchari;
while
(1)
{
for(i=0;i<10;i++)
{
P0=display[i];
DelayMS(500)
}
i=0;
}
}
要求4:
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitK1=P1^0;
SbitK2=P1^1;
sbitK3=P1^2;
ucharcodedisplay[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//延时
VoidDelayMS(uintx)
{
uchari;
while(x--)for(i=0;i<120;i++);
}
//主程序
voidmain()
{intnum;
uchari;
P2=1;
while
(1)
{
If(K1==0)
{while(K1==0);
num++;
If(num==10)
Num=0;
}
If(K2==0)
{while(K2==0);
Num--;
If(num==-1)
Num=0;
}
If(K3==0)
{while(K3==0);
Num=0;
}
P0=display[num];
}
}
实验三矩阵键盘实验
一、实验目的及要求
1、4X4矩阵键盘控制条形LED显示;
2、数码管显示4X4矩阵键盘按键号;
要求1:
运行本例时,按下的按键值越大点亮的LED越多
要求2:
按下任意键时,数码管都会显示其键的序号,扫描程序首先判断按键发生在哪一列,然后根据所发生的行附加不同的值,从而得到按键的序号
二、实验原理
电路图1、电路图2、
3、源程序
要求1:
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
//矩阵键盘按键特征码表
ucharcodeKeyCodeTable[]={0x11,0x12,0x14,0x18,0x21,
0x22,0x24,0x28,0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88};
//延时
voidDelayMS(uintx)
{
uchari;
while(x--)for(i=0;i<120;i++);
}
//键盘扫描
ucharKeys_Scan()
{
UcharsCode,kCode,i,k;
//低4位置0,放入4行
P1=0xf0;
//若高4位出现0,则有键按下
if((P1&0xf0)!
=0xf0)
{
DelayMS
(2);
if((P1&0xf0)!
=0xf0)
{
sCode=0xfe;//行扫描码初值
for(k=0;k<4;k++)//对4行分别进行扫描
{
P1=sCode;
if((P1&0xf0)!
=0xf0)
{
kCode=~P1;
for(i=0;i<16;i++)//查表得到按键序号并返回
if(kCode==KeyCodeTable[i])
return(i);
}
else
sCode=_crol_(sCode,1);
}
}
}
return(-1);
}
//主程序
voidmain()
{
uchari,P2_LED,P3_LED;
ucharKeyNo=-1;//按键序号,-1表示无按键
while
(1)
{
KeyNo=Keys_Scan();//扫描键盘获取按键序号KeyNo
if(KeyNo!
=-1)
{
P2_LED=0xff;
P3_LED=0xff;
for(i=0;i<=KeyNo;i++)//键值越大,点亮的LED越多
{
if(i<8)
P3_LED>>=1;
else
P2_LED>>=1;
}
P3=P3_LED;//点亮条形LED
P2=P2_LED;
}
}
}
要求2:
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0-F的码表
voidmatrixkeyscan()//矩阵键盘
{
P1=0xfe;
temp=P1;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
temp=P1;
temp=temp&0xf0;
if(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xee:
key=1,num=0;break;
case0xde:
key=2,num=1;break;
case0xbe:
key=3,num=2;break;
case0x7e:
key=4,num=3;break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfd;
temp=P1;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
temp=P1;
temp=temp&0xf0;
if(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xed:
key=5,num=4;break;
case0xdd:
key=6,num=5;break;
case0xbd:
key=7,num=6;break;
case0x7d:
key=8,num=7;break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfb;
temp=P1;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
temp=P1;
temp=temp&0xf0;
if(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xeb:
key=9,num=8;break;
case0xdb:
key=9,num=9;break;
case0xbb:
key=10;break;
case0x7b:
key=11;break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xf7;
temp=P1;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
temp=P1;
temp=temp&0xf0;
if(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xe7:
key=12;break;
case0xd7:
key=13;break;
case0xb7:
key=14;break;
case0x77:
key=15;break;
default:
break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
}
Voidmain()
{while
(1)
{matrixkeyscan();
P0=table[key];
}
}
实验四外部中断实验
一、实验目的及要求
1、INT0中断计数;
2、外部INT0中断控制LED;
3、INT0及INT1中断计数
要求1:
每次按下计数键时触发INT0中断,中断程序累加计数,计数值显示在3只数码管上,按下清零键时数码管清零
要求2:
每次按键都会触发INT0中断,中断发生时将LED状态取反,产生LED状态由按键控制的效果
要求3:
每次按下第1个计数键时,第1组计数值累加并显示在右边3只数码管上,每次按下第2个计数键时,第2组计数值累加并显示在左边3只数码管上,后两个按键分别清零。
二、实验原理
电路图1、
三、源程序
要求1:
#include
#defineucharunsignedchar
#defineuintunsignedint
//0~9的段码
ucharcodeDSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
//计数值分解后各个待显示的数位
ucharDSY_Buffer[]={0,0,0};
ucharCount=0;
sbitClear_Key=P3^6;
//数码管上显示计数值
voidShow_Count_ON_DSY()
{
DSY_Buffer[2]=Count/100;//获取3个数
DSY_Buffer[1]=Count%100/10;
DSY_Buffer[0]=Count%10;
if(DSY_Buffer[2]==0)//高位为0时不显示
{
DSY_Buffer[2]=0x0a;
if(DSY_Buffer[1]==0)//高位为0,若第二位为0同样不显示
DSY_Buffer[1]=0x0a;
}
P0=DSY_CODE[DSY_Buffer[0]];
P1=DSY_CODE[DSY_Buffer[1]];
P2=DSY_CODE[DSY_Buffer[2]];
}
//主程序
voidmain()
{
P0=0x00;
P1=0x00;
P2=0x00;
IE=0x81;//允许INT0中断
IT0=1;//下降沿触发
while
(1)
{
if(Clear_Key==0)Count=0;//清0
Show_Count_ON_DSY();
}
}
//INT0中断函数
voidEX_INT0()interrupt0
{
Count++;//计数值递增
}
要求2:
#include
#defineucharunsignedchar
#defineuintunsignedint
SbitLED=P0^0;
//主程序
voidmain()
{
IE=0x81;//允许INT0中断
IT0=1;//下降沿触发
while
(1);
}
//INT0中断函数
voidEX_INT0()interrupt0
{
LED=~LED;//控制LED亮灭
}
要求3:
#include
#defineucharunsignedchar
#defineuintunsignedint
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
intnum1,num2;
sbitK3=P3^4;//清零1
sbitK4=P3^5;//清零2
sbitwela1=P2^0;
sbitwela2=P2^1;
sbitwela3=P2^2;
sbitwela4=P2^3;
sbitwela5=P2^4;
sbitwela6=P2^5;
Voiddisplay(intnum2,intnum1);
voidmain()
{
IE=0x85;//开EA总中断,允许INT1和INT0中断,10000101
IT0=1;//下降沿触发
IT1=1;//下降沿触发
while
(1)
{
if(K3==0)
{
while(K3==0);
num1=0;
}
if(K4==0)
{
while(K4==0);
num2=0;
}
Display(num2,num1);
}
}
//INT0中断函数
voidEX_INT0()interrupt0
{
num1++;//右边的数字加1
}
voidEX_INT0()interrupt0
{
num2++;//左边的数字加1
}
Voiddisplay(intnum2,intnum1)
{bai=num1/100;//右边num1百位
shi=(num1/10)%10;//右边num1十位
ge=num1%10;
swan=num2/100;//左边num2百位,数码管十万位
wan=(num2/10)%10;
qian=num2%10;
wela1=1;//打开最高位数码管的位选
P1=table[swan];//输入段选数据,即NUM2的百位数,数码管的十万位
wela1=0;//关闭最高位数码管的位选
wela2=1;
P1=table[wan];
wela2=0;
wela3=1;
P1=table[qian];
wela3=0;
wela4=1;
P1=table[bai];
wela4=0;
wela5=1;
P1=table[shi];
wela5=0;
wela6=1;
P1=table[ge];
wela6=0;
}
实验五定时器中断实验
一、实验目的
1、定时器控制单只LED;
2、TIMER0控制流水灯;
3、定时器控制4个LED滚动闪烁;
要求1:
LED在定时器的中断例程控制下不断闪烁;
要求2:
定时器控制P0、P2口的LE
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 实验 报告