找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1808|回复: 0
打印 上一主题 下一主题
收起左侧

里程表代码

[复制链接]
跳转到指定楼层
楼主
ID:247127 发表于 2017-11-9 18:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg51.h>
unsigned char i,j,t,m,key,DelayTime,DispBuf[3];
unsigned int n;
unsigned long int c,spm;
unsigned char code
BitTab[3]={0xf7,0xef,0xdf};//位驱动码
unsigned char code
DispTab[10]={0x81,0xcf,0x92,0x86,0xcc,0xa4,0xa0,0x8f,0x80,0x84};//字形码
sbit P3_0=P3^0;
void delay(DelayTime);
main()         //主程序
{       
        TMOD=0x01;//定时器T0工作于方式1
        IT0=1;   //外部中断0为边沿触发方式
        TH0=0xec;
        TL0=0x78;//T0定时时间为5ms
        IE=0X83; //开中断
        TR0=1;   //开定时器T0
        key=0;
        for(;;)  //键盘处理
        {
                if(key==1)
                {
                        if(P3_0==0)
                        {
                                delay(100);
                                if(P3_0==0)
                                key=0;
                        }
                }
                else
                {
                        if(P3_0==0)
                        {
                                delay(100);
                                if(P3_0==0)
                                key=1;
                        }
                }
                for(;P3_0==0;)
                                ;
        }
}
external0() interrupt 0//外部中断0服务程序
{
        c++;
        if(key==0)                  //计算速度
        {
                if(n==0)//
                        spm=0;
                else
                        spm=14904/n;   
        }
        else                          //计算里程
        {
                spm=207*c;
                spm=spm/10000;
        }
        n=0;
        DispBuf[2]=spm%10;//取个位数
        spm=spm/10;
        DispBuf[1]=spm%10;//取十位数
        DispBuf[0]=spm/10;//取百位数
}
Timer0() interrupt 1//定时器T0中断服务程序
{       
        TH0=0xec;
        TL0=0x78;
        n++;
        t=BitTab[j]; //取位值
        P3=P3|0x38;  //P3.3-P3.5送1
        P3=P3&t;     //P3.3-P3.5输出取出的位值
        t=DispBuf[j];//取出待显示的数
        t=DispTab[t];//取字形码
        P1=t;        //字型码由P3输出显示
        j++;         //j作为数码管的计数器,取值0-2,显示程序通过它确认显示哪个数码管
        if(j==3)
        j=0;
        if(n>1000)      //自行车停止超过5秒钟,n复位
        n=0;
}
void delay(DelayTime)//延时子程序
{
        for(;DelayTime>0;DelayTime--)
        {
                for(i=0;i<250;i++)
                        ;
        }

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表