找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2899|回复: 0
收起左侧

自行车测速源程序

[复制链接]
ID:201129 发表于 2017-5-15 21:31 | 显示全部楼层 |阅读模式
#include<reg52.h>
#include <intrins.h>
#define uint  unsigned int
#define uchar unsigned char
void delay(uint z)
{
   uint a,b;
   for(a=z;a>0;a--)
     for(b=60;b>0;b--);
}
sbit LcdRs        = P2^0;
sbit LcdRw        = P2^1;
sbit LcdEn          = P2^2;
#define  DBPort         P0
#define LCD_COMMAND         0
#define LCD_DATA         1
#define LCD_CLEAR_SCREEN        0x01
#define LCD_HOMING                  0x02
void LCD_Write(bit style, unsigned char input)
{
  LcdRs=style;
        LcdRw=0;
        DBPort=input;       
        delay(5);
        LcdEn=1;
        delay(5);
        LcdEn=0;
}
#define LCD_SHOW                        0x04
#define LCD_HIDE                        0x00  
#define LCD_CURSOR                        0x02
#define LCD_NO_CURSOR                0x00             
#define LCD_FLASH                        0x01
#define LCD_NO_FLASH                0x00   
void LCD_SetDisplay(unsigned char DisplayMode)
{
        LCD_Write(LCD_COMMAND, 0x08|DisplayMode);       
}
#define LCD_AC_UP                        0x02
#define LCD_AC_DOWN                        0x00
#define LCD_MOVE                        0x01
#define LCD_NO_MOVE                        0x00
void LCD_SetInput(unsigned char InputMode)
{
        LCD_Write(LCD_COMMAND, 0x04|InputMode);
}
void LCD_Initial()
{
        LcdEn=0;
        LCD_Write(LCD_COMMAND,0x38);
        delay(5);
        LCD_Write(LCD_COMMAND,0x38);
        delay(5);
       
   LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);
        delay(5);
        LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);
        delay(5);
        LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);
        delay(5);
}
void GotoXY(unsigned char x, unsigned char y)
{
        if(y==0)
                LCD_Write(LCD_COMMAND,0x80|x);
        if(y==1)
                LCD_Write(LCD_COMMAND,0x80|(x-0x40));
}
void Print(unsigned char *str)
{
        while(*str)
        {
                LCD_Write(LCD_DATA,*str);
                str++;
                delay(1);
       
}
}
void Timer1Init(void)                //50ms@12.000MHz
{
        TMOD &= 0x0F;
        TMOD |= 0x10;
        TL1 = 0xB0;
        TH1 = 0x3C;
        TF1 = 0;
        TR1 = 1;
        ET1=1;
        EA=1;
}
unsigned char        count=0;
unsigned int speed=0;
long        temp1=0,temp2=0;
long        s=0;
void        Timer1_IRQ()        interrupt 3
{
                TR1 = 0;
                TL1 = 0xB0;
                TH1 = 0x3C;
                TR1 = 1;
                count++;
                if(count==10)
                {
                        temp2=TH0;
                        temp2<<=8;
                        temp2+=TL0;
                        if(temp2<temp1)        s+=65535;
                        speed=(temp2-temp1)*5;
                        temp1=temp2;
                        count=0;
                }
}
void        Count0Init(void)
{
        TMOD &= 0xF0;
        TMOD |= 0x05;
        TL0 = 0;
        TH0 = 0;
        TF0 = 0;
        TR0 = 1;
}
unsigned int        c=20;
long        u=0;
sbit        k1=P3^0;
sbit        k2=P3^1;
void main()
{
       
        Timer1Init();
        Count0Init();       
        LCD_Initial();
        while(1)
        {
                       
                        GotoXY(0,0);
                        Print("V:");
                        LCD_Write(1,speed/100+0x30);
                        LCD_Write(1,speed%100/10+0x30);
                        LCD_Write(1,'.');
                        LCD_Write(1,speed%10+0x30);
                        LCD_Write(1,' ');
                        Print("C:");
                        LCD_Write(1,c/100+0x30);
                        LCD_Write(1,c%100/10+0x30);
                        LCD_Write(1,'.');
                        LCD_Write(1,c%10+0x30);
                        Print("CM");
                        GotoXY(1,1);
                        Print("Total:");
                        u=(s+temp1)*c/40;
                        LCD_Write(1,u/100000+0x30);
                        LCD_Write(1,u%100000/10000+0x30);
                        LCD_Write(1,u%10000/1000+0x30);
                        LCD_Write(1,u%1000/100+0x30);
                        LCD_Write(1,'.');
                        LCD_Write(1,u%100/10+0x30);
                        LCD_Write(1,'M');
                        if(k2==0)
                        {
                                delay(5);
                                if(k2==0)
                                {
                                        while(k2==0);
                                        c++;
                                }
                        }
                        if(k1==0)
                        {
                                delay(5);
                                if(k1==0)
                                {
                                        while(k2==0);
                                        if(c>0)        c--;
                                }
                        }
        }
}

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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