数码管及按键实验报告模板(1)

数码管及流水灯实验报告

成员:

                                             

  20##年11月

 一、实验要求:

1.实验1:在开发板上调试利用按键控制数码管从1累加到F变化(S2加、S3减)(不同分组按键利用IO口不同);

2.实验2利用开发板进行秒表设计(显示分、秒,分辨率0.1s,如0.58.5)(参考P189程序);

 二、硬件原理图

1.  硬件原理图

A到F

秒表

2.原理图分析:

实验一原理

LED数码管是由4个发光二极管中的7个长条形发光二极管(俗称7笔段),按a、b、c、d、e、f、g顺序组成“8”字形,另一个点形的发光二极管dp放在右下方,用来显示小数点,。只要控制7笔段按一定的要求亮与灭,就能显示出十六进制0~F。

实验二原理

以共阳极八段数码管为例,当控制某段发光二极管的信号为低电平时,对应的发光二极管点亮,当需要显示某字符时,就将该字符对应的所有二极管点亮;共阴极二极管则相反,控制信号为高电平时点亮。 电平信号按照dp,g,e…a 的顺序组合形成的数据字称为该字符对应的段码

三、软件设计系统

  1. 软件设计思想与流程图

   软件流程图如下(标准流程图画法)……:

实验一、AF

数码管及按键实验报告模板(1)

     

实验二、秒表

数码管及按键实验报告模板(1)

数码管及按键实验报告模板(1)

2.软件代码:

实验一、秒表

#include               //IO定义

#include            //延时库文件

const unsigned char led_7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

                                 //段码列表,共阳极,09的代码列表

const unsigned char position[4]={0xEF,0xDF,0xBF,0x7F};

                                 //位输出代码,分别定义PD5Pd0单一输出“0”的状态

unsigned char time[3];           //时、分、秒计数

unsigned char dis_buff[4];        //显示缓冲区,存放要显示的6字符的段码

unsigned char time_counter;        //1s计数器

unsigned char point_on=0;                       //秒显示标志

void display(void)

{

      unsigned char i;

         for(i=0;i<=3;i++)         //显示循环开始

         {

            PORTB = led_7[dis_buff[i]];     //段码写入PORTA

            if(point_on && (i == 1||i == 3))

              PORTB &= 0x7F;                          //小数点显示

            PORTD = position[i];                        //位信号写入PORTD

            _delay_ms(1);                  //点亮延时

            PORTD = 0xFF;                 //清除位信号

       }

}

void time_to_disbuffer(void)

{

   /* unsigned char i,j=0;

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

        {

             dis_buff[j++] = time[i] % 10;

          dis_buff[j++] = time[i] / 10;

      }*/

     dis_buff[0] =  time[0] / 10;

         dis_buff[1] =  time[1] % 10;

         dis_buff[2] =  time[1] / 10;

     dis_buff[3] =  time[2] % 10;

}

void main(void )

{

     PORTB =0xFF;                       //IO初始化

        DDRB =0xFF;

        PORTD =0xFF;

        DDRD =0xFF;

        time[2] = 11;time[1] = 00;  time[0] = 23;     //时间初值

        time_to_disbuffer();                           //将时间值装载至缓冲区

        while (1)                                    //循环开始

        {

             display();                          //调用显示函数

                if (++time[0]>=99)           //次数计数

                {

                      time[0] = 0;            //重置计数

                            point_on= ~point_on;        //小数点位求反

                            if (++time[1] >=60)          //秒数目达到60后进位重置

                            {

                                  time[1] = 0;

                                     if (++time[2] >= 60)   //分计数达到60后进位重置

                                     {

                                        time[2] = 0;

                       }

                }

                           

           }

            time_to_disbuffer();    //时间装载至缓冲区

                 _delay_ms(5);                  //延时

      }

}

实验二、0F

#include               //IO定义

#include            //延时库文件

const char led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,

                         0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};

                                           //段码列表,共阳极,0F的代码列表

int main(void)

{

     char i=0;                        //定义i

        PORTB=0xc0;                      //定义输入端的初始值,0xFF表示高电平

        DDRB=0xff;                       //定义DB口为输入端

        PORTD=0xef;                      //定义输出端的初始值,0x70表示低电平

        DDRD=0xff;                       //定义DD口为输出端

        while(1)

        {

            if((PINC&(1<显示循环开始

                 {

                  _delay_ms(10);

                    

                            if((PINC&(1<检测PC3是否按下

                            {

                                   if(i<16)

                                   {

                                       PORTB=led[i];

                                       i++;

                    }

                                    if(i>=16)

                        i=0;

                 }

                     }

                     while(!(PINC&(1<再次放手检测

                     if((PINC&(1<显示循环开始

                 {

                  _delay_ms(10);                   //点亮时间

                    

                            if((PINC&(1<检测PC2是否按下

                            {

                                   if(i<16)

                                   {

                                       PORTB=led[i];

                                       i--;

                    }

                                    if(i>=16)

                        i=0;

                 }

                     }

              while(!(PINC&(1<再次放手检测

              }

}

. 成员分工及完成情况

. 意见及建议

实验报告、编译工程文件、仿真文件打包提供电子版。

相关推荐