资源描述
Proteus实验报告
姓名: xxxxx
专业: xxxxxx
系别:电气信息工程学院
学号:xxxxxxxx
班级:xxxxxxxxxxxxxxxx
老师: xxxxxxx
2012年11月
实验一
花样灯一
一、 实验目的
使用P2端口控制LED0~LED7进行花样显示。显示顺序规律为:8个LED依次左移点亮;8个LED依次右移点亮;LED0、LED2、LED4、LED6亮1s熄灭,LED1、LED3、LED5、LED7亮1s熄灭,再LED0、LED2、LED4、LED6亮1s熄灭……循环3次;LED0~LED3亮1s熄灭,LED4~LED7亮1s熄灭,循环2次;LED2、LED3、LED6、LED7亮1s熄灭,LED0、LED1、LED4、LED5亮1s熄灭,循环3次,然后再从循环.
二、实验仪器
单片机AT89C51、瓷片电容CAP22Pf、晶振CRYSTAL 11。0592MHz、电解电容CAP-ELEC、电阻RES、发光二级管LED—GREEN、发光二级管LED—YELLOW、发光二级管LED—RED、发光二级管LED—BULE、按钮BUTTON。
三、实验流程图
指向表下一地址
开始
结束
延时1s
(A)送P2端口
表代码是否为结束码
查表送A
累加器A清零
将表地址存入DPTR
四、实验原理
电路图:
程序: #include”reg51。h”
#define uint unsigned int
#define uchar unsigned char
const tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,
0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,
0xaa,0x55,0xaa,0x55,0xaa,0x55,0xff,
0xf0,0x0f,0xf0,0x0f,0xff,
0x33,0xcc,0x33,0xcc,0x33,0xcc,0xff
}
void delay(void)
{uint i,j,k;
for(i=0;i〉0;i——)
{for(j=200;j>0;j—-)
{for(k=230;k〉0;k——);}}
}
void main(void)
{uchar i;
while(1)
{for(i=0;i〈35;i++)
{P2=tab[i];
delay();}}}
五、实验结果
实验二
定时计数器一
一、 实验目的
使用定时计数器作为延时,要求在P0.0和P0.1间两灯按1s间隔互相闪烁。
二、 实验仪器
单片机AT89C51、瓷片电容CAP22Pf、晶振CRYSTAL 11.0592MHz、电解电容CAP—ELEC、电阻RES、发光二级管LED—GREEN、排阻RESPACLK-8、发光二级管LED—RED、发光二级管LED—YELLOW、按钮BUTTON。
三、实验流程图P0.0、P0.1取反
定时/计数器重新赋值
重新计循环次数
是否循环20次(延时1s)?
定时/计数器是否延时50ms?
启动定时/计数器
P0.0置1、P0.1清零
定时/计数器初始值设置
开始
四、实验原理
电路图:
程序:#include”reg51。h”
#define uint unsigned int
#define uchar unsigned char
sbit P0_0=P0^0;
sbit P0_1=P0^1;
uint t=0;
void time0_server_(void)interrupt 1
{
TH0=0x4C;
TL0=0x00;
t++;}
void Init_t0(void)
{TMOD=0x01;
TH0=0x4C;
TL0=0x00;
EA=1;
ET0=1;
TR0=1;}
void main(void)
{P0_0=1;
P0_1=0;
Init_t0();
while(1)
{if(t==20){
t=0;
P0_0=~P0_0;
P0_1=~P0_1;
}
}
}
五、实验结果
实验三
中断系统应用一
一、 实验目的
主程序将P0端口进行花样显示,显示顺序规律为:8个LED依次左移点亮;8个LED依次右移点亮;LED0、LED2、LED4、LED6亮1s熄灭,LED1、LED3、LED5、LED7亮1s熄灭,再LED0、LED2、LED4、LED6亮1s熄灭……循环3次。中断时(INT0与按钮K1连接)使8个LED闪烁5次.
二、 实验器件
单片机AT89C51、瓷片电容CAP22Pf、晶振CRYSTAL 11。0592MHz、电解电容CAP—ELEC、电阻RES、发光二级管LED—GREEN、排阻RESPACLK—8、发光二级管LED—RED、按钮BUTTON、发光二级管LED—BULE、发光二级管LED-YELLOW。
三、实验流程图
四、实验原理
原理图:
程序:#include ”reg51.h”
#define uint unsigned int
#define uchar unsigned char
const tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,
0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,
0xaa,0x55,0xaa,0x55,0xaa,0x55,0xff,};
const tab2[]={0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,};
void delay(void)
{
uint i,j,k;
for(i=10;i〉0;i——)
{for(j=200;j〉0;j—-)
{for(k=230;k>0;k——);}}
}
void int0() interrupt 0
{
uchar i;
for(i=0;i〈10;i++)
{
P0=tab2[i];
delay();
}
}
void INT0_init(void)
{
EX0=1;
IT0=1;
EA=1;
}
void main(void)
{
uchar x;
INT0_init();
while(1)
{
for(x=0;x〈23;x++)
{
P0=tab[x];
delay();
}
}
}
五、实验结果
实验四
两个单片机之间的串行通信
一、 实验目的
再摸控制系统中有U1、U2这两个单片机,U1单片机首先将P1端口指拨开关数据载入SUBF,然后由TXD将数据传送给U2单片机,U2单片机将接收数据存入SBUF,再由SUBF载入累加器,并输出至P1端口,点亮相应端口的LED.
二、 实验器件
发光二级管LED—RED、按钮BUTTON、单片机AT89C51、瓷片电容CAP22Pf、晶振CRYSTAL 11.0592MHz、电解电容CAP—ELEC、电阻RES、发光二级管LED—GREEN、拨码开关DIPSW-8、开关SWITCH。
三、实验流程图
四、实验原理
原理图:
程序:
U1:
#include ”reg51。h”
#define uchar unsigned char
#define uint unsigned int
void send(uchar state)
{
SBUF=state;
while(TI=0);
TI=0;
}
void SCON_init(void)
{
SCON=0x50;
TMOD=0x20;
PCON=0x00;
TH1=0xFD;
TL1=0xFD;
TI=0;
TR1=1;
ES=1;
}
void main(void)
{
P1=0xFF;
SCON_init();
while(1)
{
send(P1);
}
}
U2:
#include "reg51.h”
#define uchar unsigned char
#define uint unsigned int
uchar state;
void receive()
{
while(RI=0);
state=SBUF;
RI=0;
}
Void SCON_init(void)
{
SCON=0x50;
TMOD=0x20;
PCON=0x00;
TH1=0xFD;
TL1=0xFD;
RI=0;
TR1=1;
}
void main(void)
{
SCON_init();
while(1)
{
receive();
P1=state;
}
}
五、实验结果
U1
U2:
实验五
矩阵式键盘识别一
一、实验目的
设计一个4x4的矩阵键盘,以P3。0~P3。3作为行线,以P3.4~P3。7作为列线,在数码管上显示每个按键的0~F序号。
二、实验器件
单片机AT89C51、瓷片电容CAP22Pf、晶振CRYSTAL 11。0592MHz、电解电容CAP—ELEC、电阻RES、排阻RESPACLK—7、按钮BUTTON、共阳数码管7SEG-COM-AM—GRN。
三、实验流程图
四、实验原理
程序:
#include”reg51.h”
#define uchar unsigned char
#define uint unsigned int
uchar buff,times,j;
uchar code dispcode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
uchar idata value[8];
void delay1ms(void)
{
uchar i;
for(i=200;i>0;i—-);
}
void delay5ms(void)
{
unsigned char i,j;
for(i=5;i〉0;i-—)
for(j=230;j〉0;j——);
}
void key_scan(void)
{
uchar hang,lie,key;
P3=0xf0;
if((P3&0xf0)!=0xf0)
{
delay1ms();
if((P3&0xf0)!=0xf0)
{hang=0xfe;
times++;
if(times=9)
times=1;
while((hang&0x10)!=0)
{P3=hang;
if((P3&0xf0)!=0xf0)
{lie=(P3&0xf0)|0x0f;
buff=((~hang)+(~lie));
switch(buff)
{
case 0x11:key=0;break;
case 0x21:key=1;break;
case 0x41:key=2;break;
case 0x81:key=3;break;
case 0x12:key=4;break;
case 0x22:key=5;break;
case 0x42:key=6;break;
case 0x82:key=7;break;
case 0x14:key=8;break;
case 0x24:key=9;break;
case 0x44:key=10;break;
case 0x84:key=11;break;
case 0x18:key=12;break;
case 0x28:key=13;break;
case 0x48:key=14;break;
case 0x88:key=15;break;
}
value[times-1]=key;
}
else hang=(hang<<1)|0x01;
}
}
}
}
void main(void)
{
while(1)
{
key_scan();
P0=dispcode[value[times-1]];
}
}
原理图:
五、实验结果
实验六
字符式LED静态显示
一、 实验目的
使用HD44780字符编码,在SMC 1602A液晶上静态显示字符串,第一行显示字符为stc89c51;第二行显示字符为proteus7.8.
二、 实验器件
单片机AT89C51、瓷片电容CAP22Pf、晶振CRYSTAL 12MHz、电解电容CAP—ELEC 10uf、电阻RES、排阻RESPACLK-8、按钮BUTTON、LM016字符式LCD、可调电阻POT-HG。
三、 实验原理
原理图:
程序:
#include〈reg51。h〉
#include〈intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P2^0;
sbit rw=P2^1;
sbit ep=P2^2;
uchar code dis1[]={" stc89c51”};
uchar code dis2[]={"Proteus7。8”};
void delay(uchar ms)
{
uchar i;
while(ms-—)
{
for(i=0;i<120;i++);
}
}
uchar Busy_Check(void)
{
uchar LCD_Status;
rs=0;
rw=1;
ep=1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_Status=P0&0x80;
ep=0;
return LCD_Status;
}
void lcd_wcmd(uchar cmd)
{
while(Busy_Check());
rs=0;
rw=0;
ep=0;
_nop_();
_nop_();
P0=cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep=1;
_nop_();
_nop_();
_nop_();
_nop_();
ep=0; }
void lcd_pos(uchar pos)
{
lcd_wcmd(pos|0x80);
}void lcd_wdat(uchar dat){
while(Busy_Check());
rs=1;
rw=0;
ep=0;
P0=dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep=1;
_nop_();
_nop_();
_nop_();
_nop_();
ep=0;
}
void LCD_disp(void){
uchar i;
lcd_pos(1);
i=0;
while(dis1[i]!=’\0’)
{lcd_wdat(dis1[i]);
i++;
}
lcd_pos(0x41);
i=0;
while(dis2[i]!=’\0’)
{
lcd_wdat(dis2[i]);
i++;
}
}
void lcd_init(void)
{
lcd_wcmd(0x38);
delay(1);
lcd_wcmd(0x0e);
delay(1);
lcd_wcmd(0x06);
delay(1);
lcd_wcmd(0x01);
delay(1);
}
void main(void)
{
lcd_init();
delay(10);
LCD_disp();
while(1)
{;}
}
四、 实验结果
展开阅读全文