单片机实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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)
{;}
}
void timer(void) interrupt 1
{
TH0=0xd8;
TL0=0xf0;
disnum[0]++;
if(disnum[0] == 10)
{
disnum[0] = 0;
disnum[1]++;
if(disnum[1] == 10)
{
disnum[1] = 0;
disnum[2]++;
{
disnum=i;
break;
}
else if(~PC & 0x02)
{
disnum=i+8;
break;
}
scankey=(scankey>>7)+(scankey<<1);
}
while(keyin())
{
;
}
}
}
}
main()
{
com_add=0x89;
disnum=0;
while(1)
{
key();
#include<reg51.h>
xdata unsigned char com_add _at_ 0xf003;
xdata unsigned char PA _at_ 0xf000;
xdata unsigned char PC _at_ 0xf002;
unsigned char data disnum;
实验一
1、当开关状态为0101(K5K6K7K8)时,四个灯循环右移,当开关状态为1010时,四个灯循环左移,当开关为其他状态时,在LED1~LED4上显示开关状态。程序运行时,拨动开关时,显示立即跟着变化。
ORG0000H
AJMPSTART
ORG0003H
AJMPEXINT0
ORG0013H
AJMPEXINT1
delay();
}
}
}
实验五
1、将定时器T0设置成对外部脉冲计数方式,T0引脚每来一次外部脉冲,计数加1,计数的结果以二进制格式显示在8个发光二极管上。
#include <reg51.h>
extern unsigned char a;
void exint0(void) interrupt 1 using 1
}
}
实验十三
将电位器输出"0-5v"接ADC0809的通道0,转换后的数字信号由8位发光二极管显示。再将该数字信号由DAC0832转换成模拟信号,用示波器观察。
#include <reg51.h>
xdata unsigned char Addr_0832 _at_ 0xff00;
xdata unsigned char Addr_0809 _at_ 0xf000;
P1=~disnum;
}
}
实验九
电子钟程序
#include<reg51.h>
xdata unsigned char com_add _at_ 0xf003;
xdata unsigned char PA _at_ 0xf000;
xdata unsigned char PB _at_ 0xf001;
unsigned char n,e,q;
void delay()
{
unsigned int i;
for(i=0;i<1000;i++)
{;}
}
unsigned char keyin()
{
unsigned char tempdata;
PA=0x00;
tempdata=~PC;
tempdata=tempdata & 0x03;
if(tempdata>0)
{
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
#define TIMEINT 0X11
sbit L0=P1^0;
bit i=1;
void delay(unsigned int z)//???±1ms
{
unsigned int x,y;
for (x=z;x>0;x--)
for (y=114;y>0;y--);
}
void timer0(void) interrupt 1
MOV P1,A
ACALL DELAY
MOV A,#0FFH
MOV P1,A
ACALL DELAY
AJMP START
RIGHT:CJNE A,#08H,NEXT
MOV A,#0BFH
MOV P1,A
ACALL DELAY
MOV A,#0FFH
MOV P1,A
ACALL DELAY
AJMP START
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
TH0=0xFC;
TL0=0x18;
TH1=0xFE;
TL1=0x0C;
ET0=1;
ET1=1;
EA=1;
TR0=1;
while(1)
{
L0=i;
//delay(500);
}
}
实验八
用8255的PA口接键盘的行线(RL0~RL7),PC0和PC1接键盘的列线,用动态扫描的方法编程检测键盘按键的状态,当有按键按下时读取按下按键的键码并显示在发光二极管上。
{
delay_time--;
if(delay_time==0)
delay_time=10;
}
main()
{
unsigned char j=0x00;
delay_time=10;
IT0=1;
IT1=1;
EX0=1;
EX1=1;
EA=1;
while(1)
{
Addr_0832=j;
delay();
j=j+1;
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
delay();
}
}
步进电机实验
用8279扩展8位数码管和2*8键盘,用P1低四位作双四拍,
采用T0方式2中断。数码管7转向,5速度级数(0-11),后四位显示步数。
按键A正反转,B加速,C减速,D启动开关。初始0时加步数,否则减步数为0后停止,蜂鸣器(P1.4)响。按任意键停止。
#include <reg51.h>
xdata u8 COM _at_ 0xFF01; //8279状态字、命令字地址
xdata u8 DATA _at_ 0xFF00; //8279读写数据口
const u8 LED_TAB[]= //数码管段码
{
disnum[5] = 0;
}
}
}
}
}
}
}
void main()
{
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]];
#define u8 unsigned char
#define MotorPort P1 //步进电机控制端口
#define MinSpeed 2240 //每拍时间间隔(40~2240)*256 us 由速度级数分为12等分
#define TIMEINT 0x02 //定时器方式2中断
#define TIME 0 //256us 中断
#include<reg51.h>
extern unsigned char flag=0,a;
void delay()
{
unsigned int i;
for(i=0;i<0xffff;i++)
{;}
}
void exint0(void) interrupt 0
{
flag=1;
}
void exint1(void) interrupt 2
{
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<reg51.h>
编程:当K5K6状态为01时,左转向灯以1秒/次的频率闪烁
当K5K6状态为10时,右转向灯以1秒/次的频率闪烁
当K5K6状态为00或11时,左右转向灯全灭
ORG 0000H
AJMP START
ORG 0100H
START:
MOV SP,#60H
MOV A,P2
CJNE A,#04H,RIGHT
MOV A,#7FH
unsigned LED[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char disnum[6] = {0,0,0,0,0,0};
void delay()
{
unsigned char n=0xff;
while(n--)
return 1;
else
return 0;
}
void key()
{
unsigned char scankey=0xFE;
unsigned char i;
if(keyin())
{
delay();
delay();
if(keyin())
{
for(i=0;i<8;i++)
{
PA=scankey;
if(~PC & 0x01)
NEXT:MOV A,#0FFH
MOV P1,A
AJMP START
DELAY: MOV R5,#5
DELAY1: MOV R6,#200
DELAY2: MOV R7,#250
DJNZ R7,$
DJNZ R6,DELAY2
DJNZ R5,DELAY1
RET
END
实验四
P1口作输出口,连接8位发光二极管。按键1和按键2接单片机的两个外部中断管脚,按一次按键1,发光二极管循环左移显示;按一次按键2,发光二极管循环右移显示。移位的状态间隔0.5秒,要求用外部中断处理按键事件
PB = ~e;
delay();
e = e << 1;
}
}
}
实验十二
通过DAC0832输出锯齿波,初始频率为2KHz,频率可以通过按键0与按键1进行步进调节,按一下0频率增加100Hz,按一下1频率降低100Hz
#include <reg51.h>
xdata unsigned char Addr_0832 _at_ 0xff00;
{
TH0=0xFC;
TL0=0x18;
TH1=0xFE;
TL1=0x0C;
TR0=0;
T来自百度文库1=1;
i=0;
}
void timer1(void) interrupt 3
{
TH0=0xFC;
TL0=0x18;
TH1=0xFE;
TL1=0x0C;
TR1=0;
TR0=1;
i=1;
}
main()
{
TMOD=TIMEINT;
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作为右转指示灯
unsigned char delay_time;
void delay()
{
unsigned char i=delay_time;
while(i--)
{;}
}
void exint0(void) interrupt 0
{
delay_time++;
}
void exint1(void) interrupt 2
void delay()
{
unsigned char i=40;
while(i--)
{;}
}
void exint0(void) interrupt 0
{
P1=Addr_0809;
Addr_0809=0;
}
main()
{
IT0=1;
EX0=1;
EA=1;
Addr_0809=0;
while(1)
{
Addr_0832=Addr_0809;
相关文档
最新文档