单片机及其应用报告.docx

上传人:b****6 文档编号:7874660 上传时间:2023-01-26 格式:DOCX 页数:18 大小:350.09KB
下载 相关 举报
单片机及其应用报告.docx_第1页
第1页 / 共18页
单片机及其应用报告.docx_第2页
第2页 / 共18页
单片机及其应用报告.docx_第3页
第3页 / 共18页
单片机及其应用报告.docx_第4页
第4页 / 共18页
单片机及其应用报告.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

单片机及其应用报告.docx

《单片机及其应用报告.docx》由会员分享,可在线阅读,更多相关《单片机及其应用报告.docx(18页珍藏版)》请在冰豆网上搜索。

单片机及其应用报告.docx

单片机及其应用报告

 

单片机原理及应用

大作业

 

姓名:

XXX

专业:

通信工程

学号:

XXX

 

作业1流水灯实现循环左移右移

一、实验目的

1) 了解单片机系统实现LED动态显示的原理及方法;

2) 较为详细了解AT89C51芯片的性能;

3) 能够了解到单片机系统的基本原理,了解单片机控制原理; 

4) 掌握AT89C51程序控制方法;

5) 掌握AT89C51 C语言中的设计和学会分析程序,进而能够根据自己的需要编写代码;

6)掌握使用PROTEUS软件进行仿真的方法;

7)掌握循环左移右移的方法。

二、实验软件

PROTEUS仿真软件

三、芯片介绍

AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,俗称单片机。

AT89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。

四、实验内容

点亮一个流水灯,然后熄灭,接着点亮第二个流水灯,熄灭,点亮第三个,到最后点亮第八个;点亮第七个灯,一次到第一个灯,然后循环实现流水。

五、原理图

六、仿真效果图

七、软件编程程序

八、总结

作业2数码管矩阵键盘显示

一、实验目的

1) 了解单片机系统实现LED动态显示的原理及方法;

2) 较为详细了解AT89C51芯片的性能;

3) 能够了解到单片机系统的基本原理,了解单片机控制原理; 

4) 掌握AT89C51程序控制方法;

5) 掌握AT89C51 C语言中的设计和学会分析程序,进而能够根据自己的需要编写代码;

6) 掌握4X4矩阵式键盘程序识别原理;

7) 掌握4X4矩阵式键盘的设计方法;

8) 学习键盘的扫描方式和应用程序设计;

9)掌握使用PROTEUS软件进行仿真的方法;

二、实验软件

PROTEUS仿真软件

三、芯片介绍

AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,俗称单片机。

AT89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。

四、实验内容

1)4×4矩阵键盘程序识别原理。

2)每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。

矩阵的行线和列线都连接到AT89C51中,通过按键0~F,来在数码管显示不同的值。

五、原理图

六、仿真效果

七、实验程序

#include

#include// 定义绝对地址头文件

#include

#define uchar unsigned char

#define uint    unsigned int

#define PA8255 XBYTE[0x4000]// 8255的A口地址

#define PB8255 XBYTE[0x4001]// 8255的B口地址

#define PC8255 XBYTE[0x4002]// 8255的C口地址

#define PD8255 XBYTE[0x4003]// 8255的控制口地址

unsigned char dispBuffer[6]={17,17,17,17,17,1};// 显示缓冲

uchar LED_DATA[]=//数码管段码

{

0xc0,//  0

0xf9, //  1

0xa4, //  2

0xb0, //  3

0x99, //  4

0x92, //  5

0x82, //  6

0xf8, //  7

0x80, //  8

0x90, //  9

0x88, //  a

0x83, //  b

0xc6, //  c

0xa1, //  d

0x86, //  e

0x8e, //  f

0xbf, //  .

0xff// 灭

};

uchar LED_NUM[]=//数码管 位码

{

0xFE,// LED1

0xFD,// LED2

0xFB,// LED3

0xF7,// LED4

0xEF,// LED5

0xDF // LED6

};

uchar KEY_number[]=// 按键扫描编码

{

 0x77,// 0,

 0xb7,// 1

 0xd7,// 2

 0xe7,// 3

 0x7b,// 4

 0xbb,// 5

 0xdb,// 6

 0xeb,// 7

 0x7d,// 8

 0xbd,// 9

 0xdd,// a

 0xed,// b

 0x7e,// c

 0xbe,// d

 0xde,// e

 0xee// f

};

void delayms(uint xms)   //误差 0us

{

    uint i,j;

    for(i=xms;i>0;i--)

        for(j=110;j>0;j--);

}

void ini_8255()// 初始化8255

{

 PD8255 = 0x81;

}

void dispRefresh(void)

{

unsigned char i;

for(i=0;i<6;i++)

{

PA8255 = LED_NUM[i];

PB8255 = LED_DATA[dispBuffer[i]];

 delayms

(2);

}

}

unsigned char keyscan(void)

{

unsigned char key1,key2 = 20;

 PC8255 = 0xEF;// C口的 1110 1111 , TL1列扫描

key1 = (PC8255 & 0x0F);// 读取低四位值

if (key1!

=0x0F)

{

delayms(10);// 延迟10ms

key1 = (PC8255 & 0x0F);// 读取低四位值

if (key1!

=0x0F)// 说明有按键按下

{

switch( key1 | 0xE0)// 拼凑成完整的按键码 ,第一列

  {

  case 0xe7:

 key2 = 3;break;// 3

  case 0xeb:

 key2 = 7;break;// 7

case 0xed:

 key2 = 11;break;// b

case 0xee:

 key2 = 15;break;// f

default:

break;

  }}}

      PC8255 = 0xDF;// C口的 1101 1111 , TL2列扫描

key1 = (PC8255 & 0x0F);// 读取低四位值

if (key1!

=0x0F)

{     delayms(10);// 延迟10ms

key1 = (PC8255 & 0x0F);// 读取低四位值

if (key1!

=0x0F)// 说明有按键按下

{ switch( key1 | 0xD0)// 拼凑成完整的按键码 ,第一列

 {    case 0xd7:

 key2 = 2;break;//2

  case 0xdb:

 key2 = 6;break;//6

case 0xdd:

 key2 = 10;break;//a

case 0xde:

 key2 = 14;break;//e

default:

break;

  }}}

 PC8255 = 0xbF;// C口的 1110 1111 , TL1列扫描

key1 = (PC8255 & 0x0F);// 读取低四位值

if (key1!

=0x0F)

{

delayms(10);// 延迟10ms

key1 = (PC8255 & 0x0F);// 读取低四位值

if (key1!

=0x0F)// 说明有按键按下

{

switch( key1 | 0xb0)// 拼凑成完整的按键码 ,第一列

  {

  case 0xb7:

 key2 = 1;break;//1

  case 0xbb:

 key2 = 5;break;//5

case 0xbd:

 key2 = 9;break;//9

case 0xbe:

 key2 = 13;break;//d

default:

break;

  }}}

////////////////////////////////////////////////////////////////////////////////

 PC8255 = 0x7F;// C口的 1110 1111 , TL1列扫描

key1 = (PC8255 & 0x0F);// 读取低四位值

if (key1!

=0x0F)

{

delayms(10);// 延迟10ms

key1 = (PC8255 & 0x0F);// 读取低四位值

if (key1!

=0x0F)// 说明有按键按下

{ switch( key1 | 0x70)// 拼凑成完整的按键码 ,第一列

  {

  case 0x77:

 key2 = 0;break;//0

  case 0x7b:

 key2 = 4;break;//4

case 0x7d:

 key2 = 8;break;//8

case 0x7e:

 key2 = 12;break;//c

default:

break;

  }}}

do

{

PC8255 = 0x0F;

key1 = (PC8255 & 0x0F); 

}while(key1!

=0x0F);

return key2;

}

void dataTransform(unsigned char *pData, unsigned char keyValue)

{

unsigned char ii;

for(ii=0;ii<5;ii++)

{

pData[ii]=pData[ii+1];}

pData[5] = keyValue;}

/////////////////////////////////  以下为主程序  

void main()

{     uchar key=20;

ini_8255();

dispRefresh();

while

(1)

{

key = keyscan();

if(key!

=20)

{

dataTransform(dispBuffer,key);

}

dispRefresh();

}

}

八、小结

作业3A/D转换

一、实验目的

1) 了解单片机系统实现LED动态显示的原理及方法;

2) 较为详细了解AT89C51芯片的性能;

3) 能够了解到单片机系统的基本原理,了解单片机控制原理; 

4) 掌握AT89C51程序控制方法;

5) 掌握AT89C51 C语言中的设计和学会分析程序,进而能够根据自己的需要编写代码;

6)掌握使用PROTEUS软件进行仿真的方法;

7)掌握A/D转换的原理。

二、实验软件

PROTEUS仿真软件

三、芯片介绍

AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,俗称单片机。

AT89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。

四、实验内容

设计一个程序,将IN4输入的0~+5V模拟电压转换成数字量,再将这个2位十六进制转换成3位十进制数,放在LED显示器的第四~六位显示。

五、原理图

六、仿真效果图

七、软件编程程序

#include

#include// 定义绝对地址头文件

#include

#define uchar unsigned char

#define uint    unsigned int

#define PA8255 XBYTE[0x4000]// 8255的A口地址

#define PB8255 XBYTE[0x4001]// 8255的B口地址

#define PC8255 XBYTE[0x4002]// 8255的C口地址

#define PD8255 XBYTE[0x4003]// 8255的控制口地址

#define IN4_ADC0808 XBYTE[0x8004]// DAC0808对应的IN4输入端地址

sbit wr_ADC0808 = P3^6 ;

sbit rd_ADC0808 = P3^7 ;

sbit EOC = P1^0 ;

uchar LED_DATA[]=//数码管段码

{

0xc0,//  0

0xf9, //  1

0xa4, //  2

0xb0, //  3

0x99, //  4

0x92, //  5

0x82, //  6

0xf8, //  7

0x80, //  8

0x90, //  9

0x88, //  a

0x83, //  b

0xc6, //  c

0xa1, //  d

0x86, //  e

0x8e, //  f

0xbf, //  .

0xff// 灭

};

uchar LED_NUM[]=//数码管 位码

{

0xFE,// LED1

0xFD,// LED2

0xFB,// LED3

0xF7,// LED4

0xEF,// LED5

0xDF // LED6

};

uchar KEY_number[]=// 按键扫描编码

{

 0x77,// 0,

 0xb7,// 1

 0xd7,// 2

 0xe7,// 3

 0x7b,// 4

 0xbb,// 5

 0xdb,// 6

 0xeb,// 7

 0x7d,// 8

 0xbd,// 9

 0xdd,// a

 0xed,// b

 0x7e,// c

 0xbe,// d

 0xde,// e

 0xee// f

};

void delayms(uint xms)   //误差 0us

{

    uint i,j;

    for(i=xms;i>0;i--)

        for(j=110;j>0;j--);

}

void ini_8255()// 初始化8255,PA,PB输出,PC高四位输出,低四位输入 ,在本程序中主要是为了显示

{

 PD8255 = 0x81;

}

void display(uchar display_num, uchar display_data)

{

if ((display_num >= 0x01 )&&(display_num<=0x06))// 正常显示范围内

{

uchar i = 1;

PA8255 = LED_NUM[display_num - i];// 输入1,先显示LED1

PB8255 = LED_DATA[display_data];

 delayms(5);

}

}

/////////////////////////////////  以下为主程序  //////////////////////////////////////

void main()

{

uchar key1,key2,key3,key4;

key2 = 0;// 初始显示值

ini_8255();// 初始化8255

while

(1)

{

 IN4_ADC0808 = 0;// 选中通到4

 while(EOC!

=0);// 转换完成 EOC = 0;

 key4 = IN4_ADC0808; //  读入数据

 key3 = ( key4 / 100); // 百位     

 key2 = (key4/10)%10 ; // 十位

 key1 = (key4%10) ;  // 个位

 

 display(1, key3);

 display(2, key2);

 display(3, key1);

}

}

八、总结

作业4D/A转换

一、实验目的

1) 了解单片机系统实现LED动态显示的原理及方法;

2) 较为详细了解AT89C51芯片的性能;

3) 能够了解到单片机系统的基本原理,了解单片机控制原理; 

4) 掌握AT89C51程序控制方法;

5) 掌握AT89C51 C语言中的设计和学会分析程序,进而能够根据自己的需要编写代码;

6)掌握使用PROTEUS软件进行仿真的方法;

7)掌握D/A转换的原理。

二、实验软件

PROTEUS仿真软件

三、芯片介绍

AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,俗称单片机。

AT89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。

四、实验内容

设计一个程序,在主程序中向P1.0输出频率为1Hz的方波,同时使用定时器1定时中断,在中断服务程序中用D/A转换器输出周期为20秒的三角波。

五、原理图

六、仿真效果图

七、软件编程程序

#include

#include//定义绝对地址头文件

#include

#defineucharunsignedchar

#defineuintunsignedint

#definePA8255XBYTE[0x4000]//8255的A口地址

#definePB8255XBYTE[0x4001]//8255的B口地址

#definePC8255XBYTE[0x4002]//8255的C口地址

#definePD8255XBYTE[0x4003]//8255的控制口地址

#defineIN4_ADC0808XBYTE[0x8004]//DAC0808对应的IN4输入端地址

sbitwr_ADC0808=P3^6;

sbitrd_ADC0808=P3^7;

sbitEOC=P1^0;

ucharLED_DATA[]=//数码管段码

{

0xc0,//0

0xf9,//1

0xa4,//2

0xb0,//3

0x99,//4

0x92,//5

0x82,//6

0xf8,//7

0x80,//8

0x90,//9

0x88,//a

0x83,//b

0xc6,//c

0xa1,//d

0x86,//e

0x8e,//f

0xbf,//.

0xff//灭

};

ucharLED_NUM[]=//数码管位码

{

0xFE,//LED1

0xFD,//LED2

0xFB,//LED3

0xF7,//LED4

0xEF,//LED5

0xDF//LED6

};

ucharKEY_number[]=//按键扫描编码

{

0x77,//0,

0xb7,//1

0xd7,//2

0xe7,//3

0x7b,//4

0xbb,//5

0xdb,//6

0xeb,//7

0x7d,//8

0xbd,//9

0xdd,//a

0xed,//b

0x7e,//c

0xbe,//d

0xde,//e

0xee//f

};

voiddelayms(uintxms)//误差0us

{

uinti,j;

for(i=xms;i>0;i--)

for(j=110;j>0;j--);

}

 

voidini_8255()//初始化8255,PA,PB输出,PC高四位输出,低四位输入,在本程序中主要是为了显示

{

PD8255=0x81;

}

 

voiddisplay(uchardisplay_num,uchardisplay_data)

{

if((display_num>=0x01)&&(display_num<=0x06))//正常显示范围内

{

uchari=1;

PA8255=LED_NUM[display_num-i];//输入1,先显示LED1

PB8255=LED_DATA[display_data];

delayms(5);

}

}

/////////////////////////////////以下为主程序//////////////////////////////////////

voidmain()

{

ucharkey1,key2,key3,key4;

key2=0;//初始显示值

ini_8255();//初始化8255

while

(1)

{

IN4_ADC0808=0;//选中通到4

while(EOC!

=0);//转换完成EOC=0;

key4=IN4_ADC0808;//读入数据

key3=(key4/100);//百位

key2=(key4/10)%10;//十位

key1=(key4%10);//个位

display(1,key3);

display(2,key2);

display(3,key1);

}

八、总结

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1