AVR单片机8位数码管显示的程序实现

发布者:数据迷航者最新更新时间:2020-01-06 来源: eefocus关键字:AVR单片机  8位数码管显示 手机看文章 扫描二维码
随时随地手机看文章

我们接着来完成 数码管的显示实验。现在我们开始动手编写程序;

根据前面的介绍,我们应该已经能够知道编写一个 的C语言程序的基本步骤和方法了。

下面给出这个程序的主程序文件,在这个程序中我们应该能够知道这个程序都包含了那几块,具体来说我们应该能够在这个程序中把以下几个部分找出来:预编译语句、 的定义、函数的声明、主函数、函数定义。如果你还不能够准确找出这几部分,那么需要把前面的内容再详细阅读一下。


主程序代码

#include < /io.h> //io端口寄存器配置文件,必须包含

#include //GCC中的延时函数头文件

#include "hc .h"

//unsigned char Led_Disbuf[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //共阴极

unsigned char Led_Disbuf[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //共阳极

unsigned char ComBuf[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

//函数声明

extern void Delayus(unsigned int lus); //us延时函数

extern void Delayms(unsigned int lms); //ms延时函数

int main(void) //GCC中main文件必须为返回整形值的函数,没有参数

{

unsigned char i;

PORTB = 0xff; //PORTB输出低电平,使 熄灭

DDRB = 0xFF; //配置端口PB全部为输出口

HC595_port_init();

while(1)

{

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

{

PORTB = Led_Disbuf; //送段码

HC595_Send_Data(ComBuf); //选通位选端口

Delayus(70); //延时

HC595_Send_Data(0x00); //位选通关闭

}

}

}

//us级别的延时函数

void Delayus(unsigned int lus)

{

while(lus--)

{

_delay_loop_2(4); //_delay_loop_2(1)是延时4个时钟周期,参数为4则延时16

//个时钟周期,本实验用16M晶体,则16个时钟周期为16/16=1us

}

}

//ms级别的延时函数

void Delayms(unsigned int lms)

{

while(lms--)

{

Delayus(1000); //延时1ms

}

}


在这个主程序文件中有人可能会注意到有一些我们前面没有介绍过的内容,比如extern这个单词,它在这里起什么作用?


这就牵涉到C语言的关键字了,关于C语言的关键字,我们可以到相关的C语言教材中去做详细了解,在这里我们只针对extern这个关键字作出解释,我们注意到extern用在一个函数声明的地方,它的作用就是把这个函数声明为外部函数,这样我们在整个项目的所有文件中就都可以调用这个函数了。同理extern也可以用来声明一个变量为外部变量。


我们可能还会有一个疑惑:#include "hc595.h"这个头文件包含语句中的hc595.h有什么作用,它是GCC提供的还是我们自己编写的?


这里我们就要学习C语言中的一个重要的概念:模块化程序设计。何为模块化程序设计?它实现什么功能?如果要铺开来讲的话,可能需要一本书的内容。我们耗不起这个时间和精力。其实我们只需要知道,模块化程序设计是为了简化程序容量而采取的一种将一个程序分成不同的模块,然后通过特定的方法将这些模块组合起来共同完成同一个目标。通俗的说就是化整为零。


在我们刚开始学习 的时候,我们编写的程序都很简单,程序量也不大,所以往往涉及不到模块化程序设计,但是这是一种很好的编程思路,我们有必要掌握。本实例就是采用的这种方法。


模块化程序设计的思路是:将实现相同功能的程序单独编写,然后实现一个综合的功能,举个例子,我们想实现一个液晶显示的温度测量程序,那么我们可以把液晶显示相关的程序放在一个文件中,把温度测量的程序放在另一个文件中,最后在主程序中调用这两个文件来实现整体的功能。


通常我们在进行模块化程序设计的时候,常常将 ,端口设置,函数声明等部分保存在一个.h文件中,而将函数定义部分放在一个.c文件中,在编写主程序文件的时候,用预处理命令#include将.h文件包含起来,而在编译的时候将所有用到的.c文件一起编译。这样就实现了模块化文件的整合。


在本实例中,我们将74HC595相关的变量定义,端口定义,函数声明放在74HC595.h文件中,而主程序中的#include "hc595.h"这句话实现了将这个文件包含到主程序中的功能。


下面是本实例中模块化程序设计的.h文件

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

.h

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

/*74hc595与 的引脚连接

/MR(10脚) VCC 低点平时将 的数据清零。通常将它接Vcc

/OE(13脚) PG4 高电平时禁止输出(高阻态)。

如果 的引脚不紧张,用一个引脚控制它,

可以方便地产生闪烁和熄灭效果。比通过数据端移位控制要省时省力。

ST_CP(12脚) PG1 上升沿时移位寄存器的数据进入数据存储寄存器,

下降沿时存储寄存器数据不变。通常将RCK置为低电平,

当移位结束后,在RCK端产生一个正脉冲(5V时,大于几十纳秒就行了。

通常都选微秒级),更新显示数据。

SH_CP(11脚) PG0 上升沿时数据寄存器的数据移位。QA-->QB-->QC-->...-->QH;

下降沿移位寄存器数据不变。(脉冲宽度:5V时,大于几十纳秒就行了。

通常都选微秒级)

DS(14) PG2 串行数据输入端。

*/

#ifndef __HC595_H__

#define __HC595_H__

#include //io端口寄存器配置文件,必须包含

#include //GCC中的延时函数头文件

#define HC595_latch (1 << PG1) //上升沿数据打入8位锁存器,下降沿锁存器数据不变

#define HC595_sclk (1 << PG0) //上升沿数据移位,下降沿数据不变

#define HC595_oe (1 << PG4) //低电平,8位数据锁存器输出,高电平输出高组态

#define HC595_data (1 << PG2) //串行数据输入端

#define SET_HC595_latch (PORTG |= (1 << PG1))

#define CLR_HC595_latch (PORTG &= ~(1 << PG1))

#define SET_HC595_sclk (PORTG |= (1 << PG0))

#define CLR_HC595_sclk (PORTG &= ~(1 << PG0))

#define SET_HC595_data (PORTG |= (1 << PG2))

#define CLR_HC595_data (PORTG &= ~(1 << PG2))

#define SET_HC595_oe (PORTG |= (1 << PG4))

#define CLR_HC595_oe (PORTG &= ~(1 << PG4))

void HC595_port_init(void); //595端口初始化

void HC595_Send_Data(unsigned char byte); //发送一个字节

void HC595_Output_Data(unsigned char data); //发送字符串

#endif

同时我们将与74HC595相关的函数定义部分放在74HC595.c文件中,如下

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

74hc595.c

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

#include "hc595.h"

//595端口初始化

void HC595_port_init(void)

{

PORTG = 0x00;

DDRG |= (1 << PG0) | (1 << PG1) | (1 << PG2) | (1 << PG4);

}

//发送一个字节

void HC595_Send_Data(unsigned char byte)

{

unsigned char i;

//CLR_HC595_latch;

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

{

if(byte & 0x80)

{

SET_HC595_data;

}

else

{

CLR_HC595_data;

}

byte <<=1;

SET_HC595_sclk; //上升沿数据移位

CLR_HC595_sclk;

}

SET_HC595_latch;

CLR_HC595_latch;

}

//发送字符串

void HC595_Output_Data(unsigned char data)

{

CLR_HC595_latch; //下降沿锁存器数据不变

HC595_Send_Data(data);

SET_HC595_latch; //上升沿数据打入8位锁存器

}

在主程序中我们使用预定义语句将.h文件包含到了主程序文件中,那么我们怎样实现将.c文件编译到整个项目程序中呢?在这里我们只要在makefile文件中将这个.c文件加进去就可以了,如下图所示,在SRC = $(TARGET).C的后面空一格,然后输入我们所定义的.c文件的名称,然后保存makefile文件的更改。最后进行编译就可以了,编译的时候如果我们仔细观察编译器的输出信息,会发现不但编译了main.c文件,同时也编译了74hc595.c文件。

关键字:AVR单片机  8位数码管显示 引用地址:AVR单片机8位数码管显示的程序实现

上一篇:IAR 编译错解决Error[e16]
下一篇:linux下avr单片机开发:中断服务程序

推荐阅读最新更新时间:2024-10-10 14:43

PIC单片机以及51和AVR单片机的IO口操作方法解析
对于pic单片机的学习,很多朋友总是能充满激情,不断利用闲余时间研究pic单片机的各类技术。而谈及pic单片机,必须牵扯至51、AVR单片机。因此本文中,将探讨pic单片机以及51、AVR单片机对于IO口的操作。对于本文,希望大家认真研读,以在pic单片机的学习之路上更为精进。 一.51单片机IO口的操作 51单片机IO口的结构比较简单,每个IO口只有一个IO口寄存器Px,而且这个寄存器可以位寻址,操作起来是所有单片机里最简单的,可以直接进行总线操作也可以直接进行位操作,这也是51单片机之所以成为经典的原因之一。下例的运行坏境为Keil软件,器件为AT89S52。 #i nclude sbit bv=P2^0;//定义位变量
[单片机]
PIC单片机以及51和<font color='red'>AVR单片机</font>的IO口操作方法解析
基于Atmega48单片机的电子镇流器设计
0 引言 电子镇流器是新型节能产品,不仅能带动一些照明灯具,还可以和一些紫外灯结合在一起,对于空气净化和水源净化都有着非常大的作用。当前,全世界都在大力提倡环境保护,电子镇流器间接地为环保提供了原动力。AVR单片机是一款性价比较高的单片机,用这种单片机来对电子镇流器进行调光和时间采样非常合适,首先是AVR单片机本身较稳定,抗干扰能力比较强,其次是其本身的Harvard结构使得运行速度比较快,数据回读时间较快,可以实现实时在线控制。 1 AVR单片机介绍 1.1 AVR单片机的特点 与以往的8位单片机相比,AVR单片机采用Harvard结构,也就是程序总线和数据总线分开,并采用两级流水线,具备1MIPS/MHz的高速运行处
[单片机]
基于Atmega48单片机的电子镇流器设计
基于AVR单片机直线开关磁阻电机高精度位置控制
一、项目概述 1.1 引言 电机是工业生产不可缺少的动力设备,电机的品种很多,作用也相当广泛。直线开关磁阻电机时一种新型的牵引电机。其主要有以下优点:结构简单,制作成本不高。工作稳定且能够在恶劣的环境下长时间正常工作,比如高温环境,开关磁阻电机有较好的散热性能,可以在高温下正常工作。随着电力电子技术的发展,开关磁阻电机控制将会变得更加容易并且控制效果更好。这种电机启动转矩大,过载能力强,调速范围广。直线开关磁阻电机除了具有以上优点以外,在一些需要做直线运动的场合,它显示出了强大的优越性:再也不需要像传统的做直线运动的装置那样,通过丝杆等传动装置将旋转的运动转化为直线运动。这样再一次的将中间环节给节省下来了,不仅降低了设备的成本
[电源管理]
基于<font color='red'>AVR单片机</font>直线开关磁阻电机高精度位置控制
avr单片机proteus仿真第二课:流水灯
先实现一个最简单的avr单片机proteus仿真,流水灯。 对IO口写数据要先设置DDRxn=0xff,然后才输出PORTxn=输出数据。 电路仿真图如下: avr c程序如下: #include avr/io.h #include stdio.h int main(void){ unsigned char i,j,k; DDRA=0xff; PORTA=0xff; for(;;){ for(k=0;k 8;k++){ PORTA=~(0x01 k); for(i=0;i 0xff;i++){ for(j=0;j 0xff;j++){ ; } } PORTA=
[单片机]
<font color='red'>avr单片机</font>proteus仿真第二课:流水灯
基于AVR单片机的船舶气象仪测试系统的设计与实现
摘要:针对船舶气象仪保障维修而设计的船舶气象仪测试系统,包括信息处理终端、主仪器检测模块、传感器检测模块,各个模块都采用基于AVR单片机的嵌入式系统,模块之间通过CAN总线进行通信。结果表明,船舶气象仪测试系统能够快速检测船舶气象仪故障,与单纯依靠人工方式排查故障相比,故障检测时间缩短了60%以上。 关键词:船舶气象仪保障维修;船舶气象仪测试系统;AVR单片机;CAN总线 船舶气象仪是船舶导航系统设备之一,可测量船舶所在位置海区的风速、风向、温度、湿度、气压等多项气象要素,可向船舶的导航系统传送实时的气象参数。船舶气象仪一旦出现故障,将会影响船舶操作人员对各种气象要素的估计和判断,甚至导致航行船舶失控、搁浅、触礁、倾覆等严重
[单片机]
基于<font color='red'>AVR单片机</font>的船舶气象仪测试系统的设计与实现
AVR单片机无法进入编程模式
做项目用到了AVR单片机ATmega16,学习的过程中编辑编译环境是ICCAVR,采用并口下载器和PonyProg2000软件下载程序。项目做的差不多的时候,考虑到如果要去现场调试程序并且还用并口下载器,那就要带个台式电脑或者买个EXPRESSCARD了,这样就很不方便,那就考虑笔记本电脑吧。后来就买了个深圳市研学电子有限公司的AVR二合一工具。照着光盘资料安装了USB驱动和AVR Studio软件后,将AVR二合一工具和计算机USB口以及目标板相连后,打开AVR Studio软件,单击工具栏上的 按钮,出现如下对话框: 单击Connect按钮,出现如下对话框: 然后单击Flash组中的Program按钮,出现如下对话
[单片机]
<font color='red'>AVR单片机</font>无法进入编程模式
基于AVR单片机的ISP1362OTG设计
   0 引言   随着PDA、移动电话、数码相机、打印机等消费类产品的普及,用于这些设备与电脑、或设备与设备之间的高速数据传输技术越来越受到人们的关注。以往以计算机为核心的数据传输结构,非常不利于USB,总线在嵌入式行业的应用,也不适用于野外作业,而OTG技术的推出则可实现在没有PC的情况下,设备与设备之间的数据传输,它拓展了USB技术的应用范围。本文采用的设计方案是基于Philips公司的ISP1362 OTG控制芯片,参照最新的USB OTG技术规范,设计了一种遵循USB协议的主/从机系统。    1 ISP1362芯片的内部结构   Philips公司的ISP1362是一款符合USB 2.0总线协议的接口芯片,内部有
[单片机]
AVR单片机在蓄电池剩余电量测试仪中的应用
    摘要: 利用一代AVR单片机(AT90S8515)实现蓄电池剩余电量在线测量。该方法通过实时测量蓄电池内阻,推算出剩余电量。最后给出了实验结果。     关键词: 单片机 在线测量 蓄电池 剩余电量 蓄电池作为备用电源,已在计算机网络、通主、电力等领域得到了广泛的应用。蓄电沁的荷电量与整个供电系统的可靠性密切相关,蓄电池剩余电量睦高,系统可靠性越高,否则反之。对于一些重要的用电领域,例如信息处理中心,如果能在既不消耗蓄电池的能量,又不影响用电设备正常工作的条件下,实现蓄电池剩余电量的在线监测,将有重要的实际意义。近几年随着IT产业的迅速发展,电池的重要性越来越突出,对剩余电量精确预测的需求越来越迫切。
[应用]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved