×
单片机 > 单片机程序设计 > 详情

单片机测速与1602显示程序与电路

发布时间:2020-06-18 发布时间:
|

STC12C单片机控制
光传感器测速
PWM控制直流电机


部分代码预览:

#include"mytype.h"  //包含总合的头文件


#define DATA P2    //定义P0口为数据端


//定义按键I/O口

sbit key0=P0^6;                //正反转、停止模式切换按键

sbit key1=P0^7;                //加速按键

sbit key2=P0^2;        

sbit key3=P0^1;        //减速按键

//sbit PWM=P0^0;

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

uchar   table2[16]="     _DGUT_     ";//第1行液晶显示

uchar  table1[16]= "000  Chen ZiXing";//第2行液晶显示

uchar  number_table[10]="0123456789";

sbit lcden=P3^2;//液晶使能端

sbit lcdrs=P3^5;//液晶读写控制端

sbit wela=P3^3;

//uchar number;

uchar ge=0,shi=0,bai=0;

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

//定义全局变量flag=0,

uchar speed=0,speed1=0;  //正反转的标志位,0停止,1正转,2反转

uint  num;   //定时器1的计数变量

int quan;


void delay(uint z)//延时函数

{

        uint x,y;

        for(x=z;x>0;x--)

                for(y=310;y>0;y--);

}

void write_com(uchar com)//液晶写地址函数

{

        lcdrs=0;

        P2=com;

        delay(5);

        lcden=1;

        delay(5);

        lcden=0;

}

void write_data(uchar date)//液晶写数据函数

{

        lcdrs=1;

        P2=date;

        delay(5);

        lcden=1;

        delay(5);

        lcden=0;

}

void init()//液晶初始化函数

{


        wela=0;

        lcden=0;

        write_com(0x38);

        write_com(0x0c);

        write_com(0x06);

        write_com(0x01);

}

void Lcd_display()//液晶显示函数,主要是刷新转速专用

{

        uint i;

        table1[0]=number_table[bai];

        table1[1]=number_table[shi];

        table1[2]=number_table[ge];


        write_com(0x80+0x40);

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

        {

                 write_data(table1[i]);

                delay(1);

        }

}

void main()

{         

        

        uchar number;

        time_init();    //定时器初始化

        PWM_Init();     //PWM初始化        

        UART1_Init(9600);//串口初始化

        DATA=0x00;      //数据端初始化为0

        init();


        write_com(0x80);

        for(number=0;number<16;number++)

        {

                write_data(table2[number]);

                delay(10);

         }

         write_com(0x80+0x40);

         for(number=0;number<16;number++)

         {

                 write_data(table1[number]);

                delay(10);

        }

        

        PWM_SET(46,0);//进去先让电机速度为零

        

        while(1)

         { 

                 keyscan();                                                        //按键扫描                   

                 

        /******用定时器1计算时间,每1秒算一次速度直接显示*******/

                 if(num>=20)//num 是T1计数器计数变量,numG=20时为1秒

                 { 

                         TR0=0;TR1=0;//关定时器0/1中断

                         

                                 num=0;//计数变量清零

                         

                                 ge=quan%10;quan=quan/10;

                                 shi=quan%10;quan=quan/10;

                                 bai=quan%10;


                                 Lcd_display();        //LCD显示控制                         

                                 quan=0;//圈数记录清零

                                TR1=1;TR0=1;        //开定时器0/1中断

                 }


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

                           

         }


}


void time_init()

{

  TMOD=0x15;               //设置定时器0为计数模式,定时器1为定时模式,都为工作方式1

        TH0=(65536-1)/256;     

        TL0=(65536-1)%256;

        TH1=(65536-45872)/256;

        TL1=(65536-45872)%256;        

        ET0=1;                                        //开定时器0中断

        TR0=1;                                        //启动定时器0

        ET1=1;                                        //开定时器1中断

        TR1=1;                                        //启动定时器1    

        EA=1;                                 //开启总中断

}


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

//函数:keyscan()

//功能:实现按键扫描、同时控制电机速度

//

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

void keyscan()

{

        if(key0==0||key1==0||key2==0)

        {

                delay_ms(10);//延时去抖

                if(key0==0)

                {

                        UART1_SendStr("a");

                        

                        if(speed<9)speed++;

       else if(speed1<9){speed=0;speed1++;}

//                        else speed=9;

                        PWM_SET(speed1*10+speed,0);

                        while(!key0);

                }

                else if(key1==0)

                {

                                UART1_SendStr("q");

                                if(speed>0)speed--;

                          else if (speed1>0){speed1--;speed=9;}

                        PWM_SET(speed1*10+speed,0);

                                while(!key1);

     }

                else if(key2==0)

{



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈msp430f5529入门(2)----时钟配置.例程分析