找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[讨论]51单片机高手能看懂的!!能解答的!!

[复制链接]
跳转到指定楼层
楼主
ID:40829 发表于 2012-5-25 12:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这里有三个程序,
一个main主程序,两个子程序,分别是计时用的DS1302芯片,LCD显示模块。
主要功能 :
通过LCD显示电机转速、显示DS1302芯片的时间,通过控制电路按键切换实现显示切换,控制电机加速、减速功能。
 
求真正的高手给出本程序流程执行框图。 不胜感激!!框图可以发给我 gangbanfsk@foxmail.com
 
附带两张仿真图:    

 

 

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

使用道具 举报

沙发
ID:40829 发表于 2012-5-25 12:44 | 只看该作者

这是程序内容

Main

#include <reg52.h>

#include "lcd1602.h"

#include "ds1302.h"

uchar phase; //电机4相的变换

uchar second ; //时间的计数

uchar change ; //设置电机转速的中断标志

uchar state ; //中断源的选择状态

uchar speed=40 ; //电机初始的速度

uchar speed_up,slow_down; //电机的加速与减速

uchar mot_spee1[]={" The Speed is "};

uchar mot_spee2[]={" 000 r/min "};

// uchar four_single[]={0x01,0x02,0x04,0x08}; //4拍模式

uchar four_double[]={0x0c,0x06,0x03,0x09}; //4拍模式

回复

使用道具 举报

板凳
ID:40829 发表于 2012-5-25 12:45 | 只看该作者
 

void init_break()                                                          //中断初始化函数

{

       TMOD=0x11;

       TH0=0x00;

       TL0=0x00;

       TH1=(65536-5000)/256;                                               //定时5ms

       TL1=(65536-5000)%256;

       ET0=1;

       ET1=1;

       IT0=1;

       EX0=1;

       IT1=1;

       EX1=1;

       EA=1;

       TR0=1;

       TR1=1;

}

 

void main()

{

       init_break();

       lcd_init();

       set_time();

       while(1)

       {

              read_time();

              display();

       }

}

 

void int0()interrupt 0

{

       state=P1;

}

 

void int1()interrupt 2

{    

回复

使用道具 举报

地板
ID:40829 发表于 2012-5-25 12:45 | 只看该作者
 

uchar value  ;                                                               //电机的转速

       value=60000000/(second*65536+TH0*256+TL0)+1;

       second=0;      

       TH0=0x00;

       TL0=0x00;

       mot_spee2[4]=value/100+'0';

       mot_spee2[5]=value%100/10+'0';

       mot_spee2[6]=value%100%10+'0';

}

 

void timer()interrupt 1

{    

       second++;

}

 

void timer1()interrupt 3

{

       TH1=(65536-5000)/256;                                               //定时5ms

       TL1=(65536-5000)%256;

       change++;

       if(change>=speed)

       {    

              change=0;

              P2=four_double[phase];                                  //电机以双4拍的模式转动

       //     P2=single_four[phase];                                   //电机以单4拍的模式转动

              phase=++phase&0x03;

       }

}

 

 

回复

使用道具 举报

5#
ID:40829 发表于 2012-5-25 12:47 | 只看该作者

Ds1302

      #include<reg52.h>

#include<intrins.h>

#include "ds1302.h"

 

extern uchar clk_xian1[];                                                       //存放时钟的数据

extern uchar clk_xian2[];

uchar time[]       ={12,3,28,17,46,30};

uchar write_add[]  ={0x8c,0x88,0x86,0x84,0x82,0x80};  //年月日时分秒的地址(写)

uchar read_add []  ={0x8d,0x89,0x87,0x85,0x83,0x81};  //年月日时分秒的地址(读)

 

void write_byte(uchar dat)

{

       uchar i;

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

       {

              clk=0;

              io=dat&0x01;                                                    

              dat=dat>>1;                                                            //从数据的低位开始写

              clk=1;

       }

}

 

void write(uchar add,uchar date)

{

       rst=0;

       _nop_();

       clk=0;

       _nop_();

       rst=1;

       _nop_();

       write_byte(add);

       write_byte(date);

       rst=0;

       _nop_();

       clk=1;

       io=1;

}

 

uchar read(uchar addr)

{

       uchar i,temp;

       rst=0;

回复

使用道具 举报

6#
ID:40829 发表于 2012-5-25 12:48 | 只看该作者
 

_nop_();

       clk=0;

       _nop_();

       rst=1;

       _nop_();

       write_byte(addr);

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

       {

              clk=0;

              temp=temp>>1;

              if(io)

                     temp=temp|0x80;

              clk=1;    

       }

       rst=0;

       _nop_();

//     clk=0;

       _nop_();

//     clk=1;

       _nop_();

//     io=0;

       _nop_();

       io=1;

       return temp;

}

 

void set_time()

{    

        uchar i,j;

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

        {

              j=time/10;                                                            //数据转换成BCD

               time=time%10;

               time=time+j*16;

        }

        write(0x8e,0x00);                                                           //去除写保护

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

        {

               write(write_add,time);

        }

        write(0x8e,0x80);                                                         //加上写保护

}

 

回复

使用道具 举报

7#
ID:40829 发表于 2012-5-25 12:48 | 只看该作者
 

void read_time()

{

uchar i;

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

{

time=read(read_add);

}

clk_xian1[7]=time[0]%16+'0'; //时钟数据送入液晶

clk_xian1[6]=time[0]/16+'0';

clk_xian1[10]=time[1]%16+'0';

clk_xian1[9]=time[1]/16+'0';

clk_xian1[13]=time[2]%16+'0';

clk_xian1[12]=time[2]/16+'0';

clk_xian2[7]=time[3]%16+'0';

clk_xian2[6]=time[3]/16+'0';

clk_xian2[10]=time[4]%16+'0';

clk_xian2[9]=time[4]/16+'0';

clk_xian2[13]=time[5]%16+'0';

clk_xian2[12]=time[5]/16+'0';

}

回复

使用道具 举报

8#
ID:40829 发表于 2012-5-25 12:50 | 只看该作者

Lcd1632

       #include<reg52.h>

#include"lcd1602.h"

 

extern uchar state ;

extern uchar speed ;                                       //电机初始的速度

extern uchar speed_up,slow_down;                          //电机的加速与减速

extern uchar mot_spee1[];

extern uchar mot_spee2[];

uchar *t1,*t2;                                                                      //换屏显示

uchar clk_xian1[]="Date: 00-00-00  ";                                 //初始时钟

uchar clk_xian2[]="Time: 00:00:00  ";

 

void delay(uchar i)

{

       uchar j,m;

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

              for(m=0;m<50;m++);

}

回复

使用道具 举报

9#
ID:40829 发表于 2012-5-25 12:51 | 只看该作者
 

void write_com(uchar com)

{

       rs=0;

       rw=0;

       P0=com;

       delay(5);

       e=1;

       delay(5);

       e=0;

}

 

void write_data(uchar date)

{

       rs=1;

       rw=0;

       P0=date;

       delay(5);

       e=1;

       delay(5);

       e=0;

}

 

void lcd_init()

{    

       write_com(0x38);

       write_com(0x06);

       write_com(0x0c);  

       write_com(0x01);

}

void basic_display()

{

       uchar i;

       write_com(0x80);

       for(i=0;*t1!=0;i++)

       {

              write_data(*t1);

              t1++;

       }

       write_com(0xc0);

       for(i=0;*t2!=0;i++)

       {

              write_data(*t2);

              t2++;

回复

使用道具 举报

10#
ID:40829 发表于 2012-5-25 12:51 | 只看该作者
 

       }

}       

 

void display()                                                 

{

       switch(state)

       {

              case 0:  t1=&mot_spee1; t2=&mot_spee2;  break;

              case 1:  t1=&clk_xian1; t2=&clk_xian2;  break;

              case 2:     speed_up   =1;   state=0;        break;

              case 3:     slow_down  =1;  state=0;        break;

       }

       if(speed_up)                                                                       //电机的加速处理

       {

              speed--;

              speed_up=0;

       }

       if(slow_down)                                                                         //电机的减速处理

       {

              speed++;

              slow_down=0;

       }

       basic_display();

}

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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