16级单片机实践经验分享

实验一 吴思思 0130

2018-05-18  本文已影响52人  吴思思0130

一、实验内容

在keil软件中编写程序,利用烧录软件下载hex文件实现在大板单片机的8*8点阵中显示“54”的指令。

二、keil的使用及生成hex文件

1.project->new uvision project->保存->Atmel->AT89C52->ok

2.file->text1->书写代码调试保存为.c类型

3.project->target->右击source group->add existing files to group->选择刚保存的.c格式文件

4.右击target->options for target->output->勾选creat hex file->再次调试->结果出现creating hex from"..."

5.打开烧录软件->芯片类型:STC89Cxx(new)->选择hex文件进行下载

三、程序编写

(利用原有基础实验10改编而成)

1.在单片机点阵中行线高电平有效,列线低电平有效。原有程序中u8 ledwei[ ]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}拆成二进制0111 1111,1011 1111,1101 1111,1110 1111,1111 0111,1111 1011,1111 1101,1111 1110,可以看出ledwei表示依次使得每一列有效,后面使用循环函数先控制选的列,再进行此列中哪个二极管发光的控制。

2..数字“54”设计

每一列的段选显示代码

当ledwei为0x7f即选择第一列时,通过图可以看出段选信号为1111 0001,以此类推得出所有代码。

3..程序如下:

#include "reg51.h" //此文件中定义了单片机的一些特殊功能寄存器

#include

typedef unsigned int u16; //对数据类型进行声明定义

typedef unsigned char u8;

sbit SRCLK=P3^6;

sbit RCLK=P3^5;

sbit SER=P3^4;

u8 ledduan[ ]={0xf1,0x91,0x91,0x9f,0xf0,0x10,0x10,0xff};//确定每一列显示的二极管计算代码值

u8 ledwei[ ]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//后面利用循环函数依次选择某一列

/*******************************************************************************

* 函 数 名        : delay

* 函数功能   : 延时函数,i=1时,大约延时10us

*******************************************************************************/

void delay(u16 i)

{

while(i--);

}

/*******************************************************************************

* 函数名        : Hc595SendByte(u8 dat)

* 函数功能   : 向74HC595发送一个字节的数据

* 输入          : 无

* 输出        : 无

*******************************************************************************/

void Hc595SendByte(u8 dat)

{

u8 a;

SRCLK=0;

RCLK=0;

for(a=0;a<8;a++)

{

SER=dat>>7;

dat<<=1;

SRCLK=1;

_nop_();

_nop_();

SRCLK=0;

}

RCLK=1;

_nop_();

_nop_();

RCLK=0;

}

/*******************************************************************************

* 函 数 名      : main

* 函数功能 : 主函数

* 输    入      : 无

* 输    出    : 无

*******************************************************************************/

void main()

{

u8 i;

while(1)

{

P0=0x7f;

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

{

P0=ledwei[i];   //位选

Hc595SendByte(ledduan[i]); //发送段选数据

delay(100);   //延时

Hc595SendByte(0x00);  //消隐

}

}

}

四、注意

程序书写时:端口号必须大写!!!

单片机设置:一定要将JOE短接片短接到GND端,如果不需要595后面的小灯点亮可以拔掉JP595短接片!!!

人有视觉残留,当时间间隔过短时,会出现重影。消隐是为了防止进行下一次位选段选的时候受到上一位选的段选信号干扰。当显示完某列后,利用消隐关闭数码管,再进行下一位的显示。

五、结果

最终结果
上一篇下一篇

猜你喜欢

热点阅读