1、单片机实验、设计
(按PPT上的顺序,有的程序不是很简略,有的也不是我自己写的,仅供参考)
1、并行口控制八个LED灯的轮流亮灭(书本148有类似)
#include
2、<8;i++) { out=temp; delay(200); temp=_crol_(temp,1);//正向 } temp=0x7f; for(i=0;i<8;i++) { out=temp; delay(200); temp=_cror_(temp,1);//逆向 } } } void delay(uint k) { uchar i,j; for(;k>0;k--)
3、 for (i= 142;i>0;i--)
for(j=2;j>0;j--) ;
}
2、(书本73)P2口既作为输入口也作为输出口,通过四个开关,分别控制四个LED的亮与灭。
#include
4、
P2=0xff;
if(P2!=0xff)
{
P2=P2<<4;
delay(2);
}
}
}
3、双数码管显示:模拟十字路口的两位信号灯显示计数(00-99),数字间隔时间不做特殊要求。
#include
5、 void display(uchar sh,uchar g); void delay(uint i) { uint j; for(;i>0;i--) for(j=110;j>0;j--); } void init() { P3=0xff; num=0; tt=0; TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; } void main() { init(); while(1) {
6、 display(shi,ge); } } void timer0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; tt++; if(tt==20)//1s { tt=0; num++; if(num==100) num=0; ge=num%10; shi=num/10; } } void display(uchar sh,uchar g) { P3=0x02; P2=t
7、able[g];
delay(1);
P3=0x01;
P2=table[sh];
delay(1);
}
4、设计一个4*4矩阵键盘,双数码管显示,其键值为“00~16”。按下按键后,数码管显示相应的键值。(书本140)
#include
8、82,0xf8,0x80,0x90, }; uchar code key_table[]={ 0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d, 0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77}; void delay(uchar k) { uchar i; for(;k>0;k--) for(i=110;i>0;i--); } void delay0() { uint n=1000; while(n--); } void main() {
9、 uchar temp,key,num,i; P3=0xff; while(1) { P1=0xf0; if(P1!=0xf0) { delay0(); if(P1!=0xf0) { temp=P1; P1=0x0f; key=temp|P1; for(i=0;i<16;i++) if(key==key_table[i]) { num=i;
10、break;
}
P3=0x01;
P2=table[num/10];
delay(1);
P3=0x02;
P2=table[num%10];
delay(1);
P2=0xff;
}
}
}
}
5、外部中断每发生一次,led由亮转灭。
#include
11、 j;
for(;k> 0;k-- )
for(j=110;j>0;j--);
}
void main()
{
EA=1;
EX0=1;
IT0=0;
led=0;
while(1)
{
led=0;
}
}
void INT_0() interrupt 0
{
EX0=0;
led=1;
delay(20);
EX0=1;
}
6、外部中断每发生一次,在共阴数码管上显示一个数字,且每中断一次显示的数值增加1或减少1
#include
12、ar unsigned char #define uint unsigned int uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; int count= 0; void delay(uchar k) { uchar i; for(;k>0;k--) for(i=110;i>0;i--); } void init() { P1=0; EA=1; EX0=1; IT0=1; EX1=1; IT1=1; } void main() {
13、 init(); while(1) { } } void INT_0() interrupt 0 { EX0=0; delay(5); count++; if(count==10) count=0; P1=table[count]; delay(2); EX0=1; } void INT_1() interrupt 2 { EX1=0; delay(5); count--; if(count<0) count=0; P1=table[count]; delay(2); EX1=1; }
14、
7、将外部中断0端口P3.2,扩展成三个中断入口,并且当中断发生时,能识别是哪个中断源发生的中断事件(书本94)
8、中断嵌套:设置两个外部中断(INT0和INT1)按键,优先级IP=0x04。合上INT0的开关,则led依次循环点亮;按下INT1按键,则led全体闪烁三次,然后继续依次循环点亮。(书本90)
9、8051内部定时计数器T0,按计数器模式和方式1 工作,对P3.4(T0)引脚进行计数。将其数值P1 口驱动LED 灯上显示出来
#include
15、{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x01};
uchar count=0;
void main(void)
{
TMOD=0X05;
TH0=0;
TL0=0;
TR0=1;
while(1)
{
P0=table[TL0%10];
}
}
10、用51单片机的P1.0 口接1 个发光二级管,编写程序,控制发光二级管闪烁,时间间隔1S,要求AT89C51 内部定时器计时。(书本111)
下面是自己简化的
#include
16、 unsigned char uchar code table[]={0xc0,0xf9,0xA4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar count; void delay(uchar k) { uchar i; for(;k>0;k--) for(i=110;i>0;i--); } void main() { count=0; P0=0xff; EA=1; EX0=1; IT0=1; while(1) { } } void INT_0() interru
17、pt 0
{
count++;
if(count==10)
count=0;
P0=table[count];
delay(2);
}
11、数字时钟系统设计
要求:采用8位的7段数码管显示数字时钟的时、分、秒(24小时制)。
(比较长,如果需要私聊)
12、利用两个8051单片机串口相连,实现数据在两机之间的串口通信。
(老师上实验课传过给我们的,开关送数的)
13、ADC0808
#include
18、 sbit START=P2^1; sbit EOC=P2^3; sbit OE=P2^7; sbit add_a=P2^4; sbit add_b=P2^5; sbit add_c=P2^6; sbit clock=P2^0; void main() { uchar temp; add_a=0; add_b=0; add_c=0; OE=0; while(1) { START=0; START=1; START=0; while(1) { clock=!clock; if(EOC=
19、1)
break;
}
OE=1;
temp=out;
OE=0;
led=temp;
}
}
14、DAC0832
中断方式(波形不正常,老师说可能是仿真器的原因)
#include
20、X0=1; IT0=0; EX1=1; IT1=0; while(1) { while(1) { P0=k++; delay(100); if(k==0xff) break; } while(1) { P0=k--; delay(100); if(k==0) break; } } } void INT_0() interrupt 0 { uchar x; EX0=0; x=0; while(1) { P0=x++;
21、delay(100);
if(x==0xff)
break;
}
EX0=1;
}
void INT_1() interrupt 2
{
uchar x;
EX1=0;
x=0xff;
while(1)
{
P0=x--;
delay(100);
if(x==0)
break;
}
EX1=1;
}
上半部分的图和下面的一样。
查询方式
#include
22、3^6; uchar t,k; void delay(uchar k) { while(k--); } void delay(uchar k); void main() { cs=0; wr=0; k=0; EA=1; while(1) { dis(); } } void dis() { switch(P1) { case 0xfe: { k=0; while(1) { P0=k++; delay(100);
23、 if(k==0xff) break; } break; } case 0xfd: { k=0xff; while(1) { P0=k--; delay(100); if(k==0) break; } break; } case 0xfb: { k=0; while(1) { P0=k++; delay(100); if(k==0xff) break; } while(1) { P0=k--; delay(100); if(k==0) break; } break; } } }






