单片机实验报告.docx
- 文档编号:29431291
- 上传时间:2023-07-23
- 格式:DOCX
- 页数:39
- 大小:22.74KB
单片机实验报告.docx
《单片机实验报告.docx》由会员分享,可在线阅读,更多相关《单片机实验报告.docx(39页珍藏版)》请在冰豆网上搜索。
单片机实验报告
实验一I/O端口实验
1、当开关状态为0101(K5K6K7K8)时,四个灯循环右移,当开关状态为1010时,四个灯循环左移,当开关为其他状态时,在LED1~LED4上显示开关状态。
程序运行时,拨动开关时,显示立即跟着变化。
ORG0000H
AJMPSTART
ORG0003H
AJMPEXINT0
ORG0013H
AJMPEXINT1
ORG0030H
START:
MOVSP,#60H
MOVA,#01H
SETBIT0
CLRIE0
SETBEX0
SETBIT1
CLRIE1
SETBEX1
SETBEA
MOVR0,0E0H
MOVA,R0
LOOP:
MOVR0,A;R0中存放灯的状态
MOVA,R1;根据R1的状态来判断是否移动及如何移动
SUBBA,00H
JZLEFT
SUBBA,01H
JZRIGHT
MOVA,07FH
MOVP1,A
AJMPLOOP
LEFT:
MOVA,R0
MOVP1,A
ACALLDELAY
RLA
AJMPLOOP
RIGHT:
MOVA,R0
MOVP1,A
ACALLDELAY
RRA
AJMPLOOP
EXINT0:
MOVR1,00H
AJMPLOOP
EXINT1:
MOVR1,01H
AJMPLOOP
DELAY:
MOVR7,#5
DELAY1:
MOVR6,#200
DELAY2:
MOVR5,#250
DJNZR5,$
DJNZR6,DELAY2
DJNZR7,DELAY1
RET
END
2、模拟汽车转向指示灯:
P3.0接K5作为左转开关,P3.1接开头K6作为右转向开关,P3.4接LED1作为左转指示灯,P3.5接LED4作为右转指示灯
编程:
当K5K6状态为01时,左转向灯以1秒/次的频率闪烁
当K5K6状态为10时,右转向灯以1秒/次的频率闪烁
当K5K6状态为00或11时,左右转向灯全灭
ORG0000H
AJMPSTART
ORG0100H
START:
MOVSP,#60H
MOVA,P2
CJNEA,#04H,RIGHT
MOVA,#7FH
MOVP1,A
ACALLDELAY
MOVA,#0FFH
MOVP1,A
ACALLDELAY
AJMPSTART
RIGHT:
CJNEA,#08H,NEXT
MOVA,#0BFH
MOVP1,A
ACALLDELAY
MOVA,#0FFH
MOVP1,A
ACALLDELAY
AJMPSTART
NEXT:
MOVA,#0FFH
MOVP1,A
AJMPSTART
DELAY:
MOVR5,#5
DELAY1:
MOVR6,#200
DELAY2:
MOVR7,#250
DJNZR7,$
DJNZR6,DELAY2
DJNZR5,DELAY1
RET
END
实验四外部中断实验
P1口作输出口,连接8位发光二极管。
按键1和按键2接单片机的两个外部中断管脚,按一次按键1,发光二极管循环左移显示;按一次按键2,发光二极管循环右移显示。
移位的状态间隔0.5秒,要求用外部中断处理按键事件
#include
externunsignedcharflag=0,a;
voiddelay()
{
unsignedinti;
for(i=0;i<0xffff;i++)
{;}
}
voidexint0(void)interrupt0
{
flag=1;
}
voidexint1(void)interrupt2
{
flag=2;
}
main()
{
a=0xFE;
IT0=1;
IT1=1;
EX0=1;
EX1=1;
EA=1;
while
(1)
{
while(flag==1)
{
P1=a;
a=(a<<7)+(a>>1);//left
delay();
}
while(flag==2)
{
P1=a;
a=(a>>7)+(a<<1);//right
delay();
}
}
}
实验五定时/中断实验
1、将定时器T0设置成对外部脉冲计数方式,T0引脚每来一次外部脉冲,计数加1,计数的结果以二进制格式显示在8个发光二极管上。
#include
externunsignedchara;
voidexint0(void)interrupt1using1
{
TR0=0;
TF0=0;
a--;
TH0=0xff;
TL0=0xff;
}
main()
{
a=0xFF;
TMOD=0x0D;
TH0=0xff;
TL0=0xff;
while
(1)
{
ET0=1;
EA=1;
TR0=1;
P1=a;
}
}
2、使用T0、T1两个定时器分别控制从P1.0输出波形的高、低电平的宽度
#include
#defineTIMEINT0X11
sbitL0=P1^0;
biti=1;
voiddelay(unsignedintz)//?
?
?
±1ms
{
unsignedintx,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}
voidtimer0(void)interrupt1
{
TH0=0xFC;
TL0=0x18;
TH1=0xFE;
TL1=0x0C;
TR0=0;
TR1=1;
i=0;
}
voidtimer1(void)interrupt3
{
TH0=0xFC;
TL0=0x18;
TH1=0xFE;
TL1=0x0C;
TR1=0;
TR0=1;
i=1;
}
main()
{
TMOD=TIMEINT;
TH0=0xFC;
TL0=0x18;
TH1=0xFE;
TL1=0x0C;
ET0=1;
ET1=1;
EA=1;
TR0=1;
while
(1)
{
L0=i;
//delay(500);
}
}
实验八I/O端口直接扩展键盘实验
用8255的PA口接键盘的行线(RL0~RL7),PC0和PC1接键盘的列线,用动态扫描的方法编程检测键盘按键的状态,当有按键按下时读取按下按键的键码并显示在发光二极管上。
#include
xdataunsignedcharcom_add_at_0xf003;
xdataunsignedcharPA_at_0xf000;
xdataunsignedcharPC_at_0xf002;
unsignedchardatadisnum;
voiddelay()
{
unsignedinti;
for(i=0;i<1000;i++)
{;}
}
unsignedcharkeyin()
{
unsignedchartempdata;
PA=0x00;
tempdata=~PC;
tempdata=tempdata&0x03;
if(tempdata>0)
return1;
else
return0;
}
voidkey()
{
unsignedcharscankey=0xFE;
unsignedchari;
if(keyin())
{
delay();
delay();
if(keyin())
{
for(i=0;i<8;i++)
{
PA=scankey;
if(~PC&0x01)
{
disnum=i;
break;
}
elseif(~PC&0x02)
{
disnum=i+8;
break;
}
scankey=(scankey>>7)+(scankey<<1);
}
while(keyin())
{
;
}
}
}
}
main()
{
com_add=0x89;
disnum=0;
while
(1)
{
key();
P1=~disnum;
}
}
实验九七段数码管显示实验
电子钟程序
#include
xdataunsignedcharcom_add_at_0xf003;
xdataunsignedcharPA_at_0xf000;
xdataunsignedcharPB_at_0xf001;
unsignedcharn,e,q;
unsignedLED[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsignedchardisnum[6]={0,0,0,0,0,0};
voiddelay()
{
unsignedcharn=0xff;
while(n--)
{;}
}
voidtimer(void)interrupt1
{
TH0=0xd8;
TL0=0xf0;
disnum[0]++;
if(disnum[0]==10)
{
disnum[0]=0;
disnum[1]++;
if(disnum[1]==10)
{
disnum[1]=0;
disnum[2]++;
if(disnum[2]==10)
{
disnum[2]=0;
disnum[3]++;
if(disnum[3]==6)
{
disnum[3]=0;
disnum[4]++;
if(disnum[4]==10)
{
disnum[4]=0;
disnum[5]++;
if(disnum[5]==6)
{
disnum[5]=0;
}
}
}
}
}
}
}
voidmain()
{
e=0;
PA=0xFF;
com_add=0x80;
TMOD=0x01;
TH0=0xd8;
TL0=0xf0;
ET0=1;
EA=1;
TR0=1;
while
(1)
{
e=0x01;
for(q=0;q<6;q++)
{
PA=LED[disnum[q]];
PB=~e;
delay();
e=e<<1;
}
}
}
实验十二并行8位D/A实验
通过DAC0832输出锯齿波,初始频率为2KHz,频率可以通过按键0与按键1进行步进调节,按一下0频率增加100Hz,按一下1频率降低100Hz
#include
xdataunsignedcharAddr_0832_at_0xff00;
unsignedchardelay_time;
voiddelay()
{
unsignedchari=delay_time;
while(i--)
{;}
}
voidexint0(void)interrupt0
{
delay_time++;
}
voidexint1(void)interrupt2
{
delay_time--;
if(delay_time==0)
delay_time=10;
}
main()
{
unsignedcharj=0x00;
delay_time=10;
IT0=1;
IT1=1;
EX0=1;
EX1=1;
EA=1;
while
(1)
{
Addr_0832=j;
delay();
j=j+1;
}
}
实验十三并行8位A/D实验
将电位器输出"0-5v"接ADC0809的通道0,转换后的数字信号由8位发光二极管显示。
再将该数字信号由DAC0832转换成模拟信号,用示波器观察。
#include
xdataunsignedcharAddr_0832_at_0xff00;
xdataunsignedcharAddr_0809_at_0xf000;
voiddelay()
{
unsignedchari=40;
while(i--)
{;}
}
voidexint0(void)interrupt0
{
P1=Addr_0809;
Addr_0809=0;
}
main()
{
IT0=1;
EX0=1;
EA=1;
Addr_0809=0;
while
(1)
{
Addr_0832=Addr_0809;
delay();
}
}
步进电机实验
用8279扩展8位数码管和2*8键盘,用P1低四位作双四拍,
采用T0方式2中断。
数码管7转向,5速度级数(0-11),后四位显示步数。
按键A正反转,B加速,C减速,D启动开关。
初始0时加步数,否则减步数为0后停止,蜂鸣器(P1.4)响。
按任意键停止。
#include
#defineu8unsignedchar
#defineMotorPortP1//步进电机控制端口
#defineMinSpeed2240//每拍时间间隔(40~2240)*256us由速度级数分为12等分
#defineTIMEINT0x02//定时器方式2中断
#defineTIME0//256us中断
xdatau8COM_at_0xFF01;//8279状态字、命令字地址
xdatau8DATA_at_0xFF00;//8279读写数据口
constu8LED_TAB[]=//数码管段码
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF};
constu8STEP_TAB[]=//步进电机节拍
{0xfc,0xf6,0xf3,0xf9};
signedcharSHOW_TAB[]=//8位数码管显示区,包含初始化
{0,16,0,16,0,0,0,0};
inttime_count=0;//定时分频计数
intbegin_time_count=MinSpeed;//定时分频计数,供启动缓慢加速用
inttime_interval=MinSpeed;//送节拍时间间隔,控制速度
intstep=0;//电机总拍数,供显示
u8i_step=0;//电机节拍(双4)
u8start_flag=1;//启动控制标志位;1运行0停止
u8count_flag=0;//控制节拍加减
voidchip8279_init();
voidtimer0_init();
voidkey_handle();
voidled_show();
voidmain()
{
chip8279_init();//8279初始化
timer0_init();//定时器初始化
for(;;)
{
key_handle();//按键扫描处理
led_show();//数码管显示
}
}
voidtimer0_init()
{
TMOD=TIMEINT;
TH0=TIME;
TL0=TIME;
ET0=1;
EA=1;
TR0=1;
}
voidchip8279_init()
{
COM=0x34;//20分频系数
COM=0;//8*8字符显示,左边输入,外部译码
COM=0xde;//清除命令
while(COM&0x80);//等待显示RAM清楚完毕
COM=0x90;//从第一个数码管开始移位显示
}
voidchip8279_reset()
{
COM=0xde;//清除命令
while(COM&0x80);//等待显示RAM清楚完毕
COM=0x90;//从第一个数码管开始移位显示
}
u8key_scan(u8*keytemp)
{
if(COM&7)//有键按下
{
COM=0X40;//读FIFORAM
*keytemp=DATA;//读键码缓冲区
*keytemp&=0x3f;//键码转换为键号?
return1;
}
else
return0;
}
voidkey_handle(void)
{
staticu8num_count=0;//静态变量,计数用
u8keynum=0xff;
if(key_scan(&keynum)==0)//无按键,退出
return;
else//处理按键
{
if(keynum!
=13)start_flag=0;//停机
switch(keynum)
{
case10:
SHOW_TAB[0]^=1;//改变转向
break;
case11:
SHOW_TAB[2]++;//加速
if(SHOW_TAB[2]>11)
SHOW_TAB[2]=11;
break;
case12:
SHOW_TAB[2]--;//减速
if(SHOW_TAB[2]<0)
SHOW_TAB[2]=0;
break;
case13:
start_flag^=1;//运行中按D则停止,静止时按D则启动
break;
default:
if(keynum<10)//输入设置步数
{
num_count=num_count%4;
SHOW_TAB[4+num_count]=keynum;
num_count++;}
break;
}
time_interval=40+200*(11-SHOW_TAB[2]);//速度级数速度变化不明显增大200,速度太大失步增大40
begin_time_count=MinSpeed;//定时分频计数,缓慢加速
MotorPort|=0x10;//蜂鸣器停
if(SHOW_TAB[4]==0&&SHOW_TAB[5]==0&&SHOW_TAB[6]==0&&SHOW_TAB[7]==0)
count_flag=0;//不能放在中断中判断
else
count_flag=1;
chip8279_reset();//8279复位
}
}
voidled_show(void)
{
u8i;
for(i=0;i<8;i++)
DATA=LED_TAB[SHOW_TAB[i]];
}
voidtimer0(void)interrupt1using1
{
if(start_flag==1)//启动
{
time_count++;
if(time_count>begin_time_count)
{
time_count=0;
begin_time_count=begin_time_count-30*(1+SHOW_TAB[2]);
if(begin_time_count begin_time_count=time_interval; i_step=i_step%4; if(SHOW_TAB[0]==0)//正转 MotorPort=STEP_TAB[i_step]; else//反转 MotorPort=STEP_TAB[3-i_step]; i_step++; if(count_flag==0) step++;//加法计数步进节拍 else {step=1000*SHOW_TAB[4]+100*SHOW_TAB[5]+10*SHOW_TAB[6]+SHOW_TAB[7]; step--;}//减法计数步进节拍 if(step>9999) step=0; if(step==0) { start_flag=0;//电机停转 MotorPort&=0xef;//蜂鸣器响 } SHOW_TAB[4]=step/1000;//更新步数缓冲区 SHOW_TAB[5]=(step%1000)/100; SHOW_TAB[6]=(step%100)/10; SHOW_TAB[7]=step%10; } } } 图形点阵液晶实验 #include #include #include #include unsignedcharcodexmu[]; unsignedcharcodepic2[]; unsignedcharcodepic3[]; sbitRS=P1^0; sbitRW=P1^1; sbitE=P1^3; sbitK5=P1^5; sbitK6=P1^6; voiddelay(unsignedintm)//? óê±3ìDò { unsignedinti,j; for(i=0;i for(j=0;j<10;j++); } voidTransferData(chardata1,bitDI)// { RW=0; RS=DI; delay (1); P0=data1; E=1; delay (1); E=0; } voidDisplayGraphic(unsignedcharcode*adder) { inti,j; for(i=0;i<32;i++)// { TransferData((0x80+i),0);//SET′1? ±μ? ? ·VERTICALADD TransferData(0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 实验 报告