资源描述
单片机实验、设计
(按PPT上的顺序,有的程序不是很简略,有的也不是我自己写的,仅供参考)
1、并行口控制八个LED灯的轮流亮灭(书本148有类似)
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define out P2
void delay(uint);
void main()
{
uchar i,temp;
while(1)
{
temp=0xfe;
for(i=0;i<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--)
for (i= 142;i>0;i--)
for(j=2;j>0;j--) ;
}
2、(书本73)P2口既作为输入口也作为输出口,通过四个开关,分别控制四个LED的亮与灭。
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
void delay(uchar k)
{
uchar x;
for(;k>0;k--)
for(x=110;x>0;x--);
}
void main()
{
while(1)
{
P2=0xff;
if(P2!=0xff)
{
P2=P2<<4;
delay(2);
}
}
}
3、双数码管显示:模拟十字路口的两位信号灯显示计数(00-99),数字间隔时间不做特殊要求。
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0xc0,0xf9,0xA4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar num,tt,ge,shi;
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)
{
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=table[g];
delay(1);
P3=0x01;
P2=table[sh];
delay(1);
}
4、设计一个4*4矩阵键盘,双数码管显示,其键值为“00~16”。按下按键后,数码管显示相应的键值。(书本140)
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit shiwei=P3^0;
sbit gewei=P3^1;
uchar code table[]={
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,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()
{
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;
break;
}
P3=0x01;
P2=table[num/10];
delay(1);
P3=0x02;
P2=table[num%10];
delay(1);
P2=0xff;
}
}
}
}
5、外部中断每发生一次,led由亮转灭。
#include<reg51.h>
#define uchar unsigned char
sbit led=P2^0;
void delay(uchar k)
{
uchar 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 <reg51.h>
#define uchar 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()
{
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;
}
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 <reg51.h>
#define uchar unsigned char
uchar code table[]={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 <reg51.h>
#define uchar 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() interrupt 0
{
count++;
if(count==10)
count=0;
P0=table[count];
delay(2);
}
11、数字时钟系统设计
要求:采用8位的7段数码管显示数字时钟的时、分、秒(24小时制)。
(比较长,如果需要私聊)
12、利用两个8051单片机串口相连,实现数据在两机之间的串口通信。
(老师上实验课传过给我们的,开关送数的)
13、ADC0808
#include <reg51.h>
#define uchar unsigned char
#define out P1
#define led P0
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==1)
break;
}
OE=1;
temp=out;
OE=0;
led=temp;
}
}
14、DAC0832
中断方式(波形不正常,老师说可能是仿真器的原因)
#include <reg51.h>
#define uchar unsigned char
sbit cs=P3^7;
sbit wr=P3^6;
uchar k;
void delay(uchar m)
{
while(m--);
}
void main()
{
cs=0;
wr=0;
k=0;
EA=1;
EX0=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++;
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<reg51.h>
#define uchar unsigned char
sbit cs=P3^7;
sbit wr=P3^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);
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;
}
}
}
展开阅读全文