资源描述
东华大学51单片机课程设计硬件实验答案大全6题
东华学子加油 from你们的老学长
说明:哈哈哈哈哈哈,学长造福学弟学妹们啦。有这个在手,还怕51硬件实验吗?哈哈哈哈哈哈(都能直接运行的,下载了别忘记给5分,或者跟我说声:好人一生平安)
实验2
#include <reg51.h>
void delay(void)//延时函数
{
unsigned int i;
for(i=0;i<100;i++);
}
void main(void)
{
unsigned char num,i=0;
while(1)
{
P1 = 0xff;
num = P1&3;
switch (num)
{
case 0:
P1 = 0xff;
break;//灯全灭
case 1:
if(i<100) P1 = 0xf3;
else P1 = 0xff;
break;//两个灯闪烁
case 2:
if(i<100) P1 = 0xcf;
else P1 = 0xff;//两个灯闪烁
break;
case 3:
if(i<100) P1 = 0x00;
else P1 = 0xff;//四个灯闪烁
break;
}
delay();
i++;
if(i>200) i = 0;
}
}
实验3
#include <reg51.h>
#include <absacc.h>
#define Out_port XBYTE[0xcfa0]
void delay(unsigned int time)
{
char i;
for(;time>0;time--)
for(i=0;i<5;i++);
}
void led_out(unsigned char dat)
{
Out_port = ~dat;
}
void main(void)
{
char i=0;
led_out(0x11);//两个路口的红灯全亮
delay(30000);
while(1)
{
led_out(0x12);//东西路口的绿灯亮,南北路口的红灯亮
delay(30000);
while(i<5)//东西方向黄灯闪烁5次
{
led_out(0x10);
delay(1000);
led_out(0x14);
delay(1000);
i++;
}
i=0;
while(i<10)//****将黄灯闪烁10
{
led_out(0x00);
delay(1000);
led_out(0x44);
delay(1000);
i++;
}
led_out(0x21);//东西路口红灯亮,而同时南北路口的绿灯亮
delay(30000);
i=0;
while(i<5)//南北方向黄灯闪烁
{
led_out(0x01);
delay(1000);
led_out(0x41);
delay(1000);
i++;
}
/*led_out(0x03);
delay(1000);*/
}
}
实验5
#include <reg51.h>
#include <absacc.h>
#define Out_port XBYTE[0xcfb0]
void delay(unsigned int time)
{
char i;
for(;time>0;time--)
for(i=0;i<5;i++);
}
void led_out(unsigned char dat)
{
Out_port = ~dat;
}
void urgent(void) interrupt 0//***将闪烁时间改为10秒
{
unsigned int i;
EA = 0;//现在不允许中断
while(i<25)
{
led_out(0x11);
delay(1000);
led_out(0x00);
delay(1000);
i++;
}
i=0;
EA = 1;
}
void main(void)
{
char i=0;
IT0 = 1;
EX0 = 1;
EA = 1;
led_out(0x11);
delay(30000);
while(1)
{
led_out(0x12);
delay(30000);
while(i<5)
{
led_out(0x10);
delay(1000);
led_out(0x14);
delay(1000);
i++;
}
led_out(0x11);
delay(1000);
led_out(0x21);
delay(30000);
i=0;
while(i<5)
{
led_out(0x01);
delay(1000);
led_out(0x41);
delay(1000);
i++;
}
led_out(0x03);
delay(1000);
}
}
实验六
注意更改为“。Asm“文件不要用。C文件编译
NAME T6 ;定时器实验
CSEG AT 0000H
LJMP START
CSEG AT 001BH ;定时器/计数器1中断程序入口地址
LJMP INT
CSEG AT 4100H
START: MOV A,#01H ;首显示码
CPL A
MOV R1,#03H ;03是偏移量,即从基址寄存器到表首的距离
MOV R0,#05H ;05是计数值
MOV TMOD,#10H ;计数器置为方式1
MOV TL1,#0AFH ;装入时间常数
MOV TH1,#03CH
ORL IE,#88H ;CPU中断开放标志位和定时器
;1溢出中断允许位均置位
SETB TR1 ;开始计数
LOOP1: CJNE R0,#00,DISP
MOV R0,#05H ;R0计数计完一个周期,重置初值
INC R1 ;表地址偏移量加1
CJNE R1,#21H,LOOP2
MOV R1,#03H ;如到表尾,则重置偏移量初值
LOOP2: MOV A,R1 ;从表中取显示码入累加器
MOVC A,@A+PC
CPL A
JMP DISP
DB 01H,03H,07H,0FH,1FH,3FH,7FH,0FFH
DB 0FEH,0FCH,0F8H,0F0H,0E0H,0C0H,80H,00H
DB 03H,0FH,3FH,0FFH,0FCH,0F0H,0C0H,00H
DISP: MOV P1,A ;将取得的显示码从P1口输出显示
JMP LOOP1
INT: CLR TR1 ;停止计数
DEC R0 ;计数值减一
MOV TL1,#0AFH ;重置时间常数初值
MOV TH1,#03CH
SETB TR1 ;开始计数
RETI ;中断返回
END
实验11
#include <reg51.h>
#include <absacc.h>
#define Led_dat XBYTE[0xcfe8]
#define Led_ctl XBYTE[0xcfe9]
char g;
void Display_byte(unsigned char loc,unsigned char dat)
{
unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
loc &=0xf;
Led_ctl = loc|0x80;
Led_dat = table[0]; /*显示高4位*/
loc++;
Led_ctl = loc|0x80;
g=dat&0xf ;
if(g==6)
g=4;
if(g==7)
g=5;
if(g==8)
g=6;
if(g==9)
g=7;
if(g==0xc)
g=8;
if(g==0xd)
g=9;
Led_dat = table[g]; /*显示低4位 */
}
void main(void)
{
Led_ctl = 0xd1;
while((Led_ctl&0x80)==0x80);
Led_ctl = 0x31;
while(1)
{
if((Led_ctl&0xf)==0) continue;
Led_ctl = 0x40;
Display_byte(0,Led_dat);
}
}
/*switch(表达式)
{
case 常量表达式1:
语句1;
break;
case 常量表达式2:
语句2;
break;
……
case 常量表达式n:
语句n;
break;
default:
语句n+1;
break;
}
*/
实验15
#include <reg51.h>
#include <absacc.h>
#define Led_dat XBYTE[0xcfe8]
#define Led_ctl XBYTE[0xcfe9]
#define ad_port XBYTE[0xcfa0]
void Display_byte(unsigned char loc,unsigned char dat) //中断结果处理后显示在数码管上
{
unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
loc &=0xf;
Led_ctl = loc|0x80;
Led_dat = table[dat>>4]; /*显示高4位*/
loc++;
Led_ctl = loc|0x80;
Led_dat = table[dat&0xf]; /*显示低4位*/
}
void delay(unsigned int t)
{
for(;t>0;t--);
}
void main(void)
{
/*中断*/
EA=1;
IT0=1;
EX0=1;//初始化设置中断
/*中断*/
Led_ctl = 0xd1;
while((Led_ctl&0x80)==0x80);//?????
Led_ctl = 0x31;
/* while(1)
{
ad_port = 0;
while(INT0);
while(!INT0);//??????
Display_byte(0,ad_port);
delay(10000);
}*/
ad_port = 0;
while(1); //让程序停在这儿等待中断
}
void vb() interrupt 0 //中断函数当数值转化完成后将数值显示出来
{
if(ad_port>0xf0)
P1=0xfe;
if(ad_port<0x10)
P1=0xfd;
if(0x10<ad_port&&ad_port<0xf0)
P1=0xff;
Display_byte(0,ad_port);
delay(10000);
ad_port = 0;
}
18
展开阅读全文