⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 disp.c

📁 单片机实现的遥控小汽车的设计研究论文与程序
💻 C
字号:

///////////////////////////////////////////////////////////////////////
//文件名:disp.c
//功能描述:定时器0中断处理函数、显示任务等
////////////////////////////////////////////////////////////////////////
#include "reg52.h"
#include "disp.h"
#include "dianji.h"
#include "INTRINS.H"

#define uchar unsigned char
#define uint unsigned int

TIME time;    //记录系统时间的全局变量


//共阴极数码管显示数据0~9
uchar code  led_data[32]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,   //0~7
                          0x7f,0x6f,0x077,0x7c,0x39,0x5e,0x79,0x71,  //8,9,A,b,C,d,E,F
                          0x76,0x0e,0x38,0x37,0x73,0x67,0x31,0x3e,   //H,J,L,n,P,q,r,U,
                          0x6e,0x00};                                //y,全灭
data uchar led[4];  //数码管显示缓冲区

//leds_1和leds_2的低两位为10个LED发光二极管显示缓冲区,
//leds_2的高五位记录LED_1~~LED_5五个发光二极管闪烁属性,
//若为1则响应的二极管闪烁
bdata uchar leds_1,leds_2;

sbit LED_DC=leds_1^0;       //P2.0
sbit LED_HZ=leds_1^1;       //P2.1
sbit LED_ZZ=leds_1^2;
sbit LED_SHOUDONG=leds_1^3;
sbit LED_ZIDONG=leds_1^4;
sbit LED_ZOUSHUZI=leds_1^5;
sbit LED_RECORD=leds_1^6;
sbit LED_FEN=leds_1^7;        //P2.7
sbit LED_YZ=leds_2^0;       //P0.0
sbit LED_QZ=leds_2^1;       //P0.1

sbit LED_YZZZ=P0^0;      //有两个LED复用P0口
sbit LED_QZZZ=P0^1;

sbit SSLED_SHOUDONG=leds_2^3;
sbit SSLED_ZIDONG=leds_2^4;
sbit SSLED_ZOUSHUZI=leds_2^5;
sbit SSLED_RECORD=leds_2^6;
sbit SSLED_FEN=leds_2^7;

sbit clk273=P0^2;   //数码管段码锁存器锁存控制端
sbit clk164=P0^1;   //数码管位选通移位寄存器移位控制端
sbit aaa=P0^0;      //数码管位选通移位寄存器数据输入端
sbit led_sel=P1^2;  //LED发光二极管选通端

sbit SPEAK=P0^3;  //蜂鸣器控制端 0:开     1:关

data uchar disp_mode;
data uchar n_beep;//蜂鸣器响的声数

void beep2(void);

/*************************************************************
该函数负责数码管显示,LED发光二极管显示
由定时器0中断处理函数调用
***************************************************************/
void led_disp(void)
{
        static uchar count; //记录正在显示的是第几个数码管
        static uchar n;
        static bit flag_ss; //处理闪烁属性
        data uchar temp;
        data uint li_cheng; //暂存里程值

        led_sel=1;   //熄灭LED发光二极管
        if(!--n)
        {
                n=125;
                flag_ss=!flag_ss;
        }
        count++;
        count&=0x03;

        switch(disp_mode)
        {
         case MODE_TIME:    //数码管显示时间模式
              switch(count)
              {
                case 0:
                     led[0]=(time.t_min/10)%10;
                     break;
                case 1:
                     led[1]=time.t_min%10;
                     led[1]|=LED_DP;
                     break;
                case 2:
                     led[2]=(time.t_sec/10)%6;
                     break;
                case 3:
                     led[3]=time.t_sec%10;
                     break;
                default:
                        break;
               }
               break;
        case MODE_LICHENG:  //数码管显示里程模式
             li_cheng=getlichenglimi();
             switch(count)
             {
                case 0:
                     led[0]=(li_cheng/1000)%10;
                     break;
                case 1:
                     led[1]=(li_cheng/100)%10;
                     break;
                case 2:

                     led[2]=(li_cheng/10)%10;
                     break;

                case 3:
                     led[3]=li_cheng%10;
                     break;
                default:
                        break;
               }
               break;
        case MODE_USER:
             break;
       }

        temp=led_data[led[count]&0x1f];     //得到本次将显示的数码管的段码数据
        temp|=(led[count]&LED_DP);            //小数点属性
        if(!count)aaa=0;
        else aaa=1;
        clk164=0;
        P2=0;           //消除重影
        led_sel=1;
        clk273=0;
        clk273=1;
        clk164=1;       //选通下一个数码管

        if(!((led[count]&LED_SHANSHUO)&&flag_ss))
        {
         clk273=0;

         P2=temp;        //锁存段码
         clk273=1;
         }

         //显示LED发光二极管,包括闪烁的处理
         if(flag_ss)
         {
                P2=(~leds_1)|(leds_1&(leds_2|0x07));
                LED_QZZZ=1;
                LED_YZZZ=1;
                led_sel=0;

         }
         else
         {
                P2=~leds_1;
                LED_QZZZ=!LED_QZ;
                LED_YZZZ=!LED_YZ;
                led_sel=0;
         }

}


/*************************************************************
定时器0中断处理函数
产生时钟节拍
负责维护一个系统时间变量和任务调度
***********************************************************/
void timer0(void) interrupt 1
{

        TH0=(65536-TIME_OVERLOAD)/256;
        TL0=(65536-TIME_OVERLOAD)%256;

        time.t_ms+=4;
        if(time.t_ms>99)
        {
                time.t_ms=0;
                if(++time.t_100ms>9)
                {
                        time.t_100ms=0;
                        if(++time.t_sec>59)
                        {
                                time.t_sec=0;
                                time.t_min++;
                         }
                 }
         }

        if((n_beep)&&(!(time.t_ms%52)))beep2();
        led_disp();
        if(!(time.t_ms&0x0f))dianji();            //调用电机驱动程序
        if(!(time.t_ms&0x1f))licheng();
        if(!(time.t_ms&0x0f))gw_dianji();   //每16ms调用一次前轮转向电机驱动函数

}

/*************************************************************
定时器0初始化函数
*************************************************************/
void init_timer0(void)
{
        TMOD=0x01;
        TH0=(65536-TIME_OVERLOAD)/256;
        TL0=(65536-TIME_OVERLOAD)%256;
        ET0=1;
        EA=1;
        TR0=1;
}

//////////////////////////////////////////////////////////////////
//系统时间复位
void resettime(void)
{
        EA=0;
        time.t_ms=0;
        time.t_100ms=0;
        time.t_sec=0;
        time.t_min=0;
        EA=1;
}

///////////////////////////////////////////////////////////////////
//取系统时间,返回毫秒数
unsigned long gettime(void)
{
        data unsigned long temp;
        EA=0;
        temp=time.t_min*60000+time.t_sec*1000+time.t_100ms*100+time.t_ms;
        EA=1;
        return temp;
}

//////////////////////////////////////////////////////////////////////
//延时函数
void delay_ms(uint n)
{
        data uchar i;
        for(;n>0;n--)
        {
              for(i=200;i>0;i--)
              {
                        _nop_();      //内联函数,对应一条汇编指令NOP
                        _nop_();
                        _nop_();
              }
        }
}


///////////////////////////////////////////////////////////////////////
//设置蜂鸣器响n声
void beep(uchar n)
{
        n_beep=n;
}

//////////////////////////////////////////////////////////////////////
//缝鸣器发声任务
void beep2(void)
{
        static bit flag_beep=1;
        if(flag_beep)
        {
                SPEAK=0;
        }
        else
        {
                SPEAK=1;
                n_beep--;
        }
        flag_beep=!flag_beep;
}

/************************************************************
设置数码管显示模式
mode=MODE_TIME    显示时间 格式:分.秒
mode=MODE_LICHENG 显示里程 格式:XXX.X 单位:米
mode=MODE_USER    显示内容由用户指定
*************************************************************/
void setdispmode(uchar mode)
{
        disp_mode=mode;
}

///////////////////////////////////////////////////////////////
//取得显示模式
uchar getdispmode(void)
{
        return disp_mode;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -