打印

蜗牛

[复制链接]
1164|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
a406916285|  楼主 | 2014-6-10 23:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
TI, ni, LED, des, dc
本帖最后由 a406916285 于 2014-6-24 23:00 编辑

#include<reg52.h>
sbit led=P1^0;
void init_tim0();
main()
{
        unsigned char i=0;
        led=1;
        init_tim0();
        while(1);
}

void init_tim0()
{
        TMOD=0X01;
        EA=1;
        IE=0X82;
        TR0=1;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;        
}

void tim0() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;        
        i++;
        if(i>=10)
        {
        led=0;
        i=0;
        }
}
这是我没事想调个闪烁灯玩,可是结果不知道哪里出问题,怎么也不能溢出控制,请求帮助啊 PS:程序更改完毕

相关帖子

沙发
前功尽弃| | 2014-6-11 08:53 | 只看该作者
你每次进入中断就把i清零了,unsigned char i=0;这个i赋初值应该放到外面。

使用特权

评论回复
板凳
a406916285|  楼主 | 2014-6-11 20:10 | 只看该作者
前功尽弃 发表于 2014-6-11 08:53
你每次进入中断就把i清零了,unsigned char i=0;这个i赋初值应该放到外面。

把i变成全局变量了,也不行啊!我一个学机械的不给力啊

使用特权

评论回复
地板
前功尽弃| | 2014-6-12 08:38 | 只看该作者
a406916285 发表于 2014-6-11 20:10
把i变成全局变量了,也不行啊!我一个学机械的不给力啊

你进入中断以后,计时一到就把灯灭了,当然不会闪烁了

使用特权

评论回复
5
剡溪渡口| | 2014-6-12 10:56 | 只看该作者
中断服务函数写的不对吧,每次进入中断i都被清零了,怎么让它满足if的判断条件呢?
而且,进入if后,led从1变到0,之后就一直是0的状态了,只能闪一下

使用特权

评论回复
6
a406916285|  楼主 | 2014-6-18 23:16 | 只看该作者
本帖最后由 a406916285 于 2014-6-18 23:20 编辑

发个刚才调试成功的28BYJ48步进电机程序:电机可以实现正反转(1相励磁),并可以急停控制(再按启动),转速可调,并显示在P0口的共阳数码管上。
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char


sbit A1=P1^0; //定义步进电机连接端口
sbit B1=P1^1;
sbit C1=P1^2;
sbit D1=P1^3;
sbit key_OFF=P1^4;        //步进电机停止转动
sbit key_R=P1^5;        //步进电机反转
sbit key_jia=P1^6;        //步进电机转速加
sbit key_jian=P1^7;        //步进电机转速减
bit Flag=1;                        //步进电机开关标志位
bit Flag1=0;                //步进电机正转标志位
bit Flag2=0;                //步进电机反转标志位
uchar speed;                //步进电机转速
unsigned int code table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};// 显示段码值0~9
#define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电
#define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电
#define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电
#define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电
#define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电
#define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电
#define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电

void delay(uchar t);
void IT0_init();
void coil_r();
void coil_l();
void main()                                //主函数
{
        unsigned int y;
        IT0_init();

        y=512;
        speed=2;
        P0=table[speed%8];
        while(1)
        {
        while(y--&&Flag&&Flag1)
        {
                coil_r();
        }
        while(y--&&Flag&&Flag2)
        {
                coil_l();
        }
        }
}

void IT0_init()                //外部中断以及定时器0中断
{
        TMOD=0X01;
        TH0=(65536-2000)/256;
        TL0=(65536-2000)%256;
        PT0=1;
        TR0=1;
        EA=1;
        ET0=1;
        EX0=1;
        IT0=1;
}

void coil_r()                //步进电机正转
{
        Coil_A1
        delay(speed);
        Coil_B1
        delay(speed);
        Coil_C1
        delay(speed);
        Coil_D1
        delay(speed);
}

void coil_l()                //步进电机反转
{
        Coil_D1
        delay(speed);
        Coil_C1
        delay(speed);
        Coil_B1
        delay(speed);
        Coil_A1
        delay(speed);
}
void delay(uchar t)                //延时函数MS
{
        uchar z;
        while(t--)
        {for(z=0;z<120;z++);}
}

void IT0_ZD() interrupt 0                //外部中断0按键控制
{
        if(!INT0)
                {
                        delay(10);
                        if(!INT0)
                        {
                                while(!INT0);
                //                speed++;
                                Flag=1;
                                Flag1=1;
                                Flag2=0;;
                        /*        if(speed>7)
                                speed=2;*/
                        }
                }
}

void t0() interrupt 1                //定时器0中断控制
{
        TH0=(65536-2000)/256;
        TL0=(65536-2000)%256;
        P0=table[speed%8];
        if(!key_OFF)
        {
                delay(10);
        if(!key_OFF)
        {
                while(!key_OFF);
                        Flag=~Flag;
        }
        }
        if(!key_R)
        {

                while(!key_R);
                        Flag=1;
                        Flag1=0;
                        Flag2=1;
        }
        if(!key_jia)
        {
                while(!key_jia);
                speed++;
                if(speed>7)
                speed=2;
        }
        if(!key_jian)
        {
                while(!key_jian);
                speed--;
                if(speed<2)
                speed=7;
        }
}

使用特权

评论回复
7
a406916285|  楼主 | 2014-6-24 22:58 | 只看该作者
本帖最后由 a406916285 于 2014-6-24 23:01 编辑

再发一个刚才以上个步进电机程序为基础,LCD1602显示speed和 左右转的程序,程序在上个基础上增加了一个定时器1来控制LCD定时器,所以程序运转上会有个小小瑕疵,在更新显示速度等信息时,步进电机会出现停顿现象,这是不是就是数控机床上好几个控制芯片的原因?程序如下:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char

sbit led=P2^2;                //定时器1溢出显示灯
sbit A1=P1^0;                 //定义步进电机连接端口
sbit B1=P1^1;
sbit C1=P1^2;
sbit D1=P1^3;
sbit key_OFF=P1^4;        //步进电机停止转动
sbit key_on=P2^0;        //步进电机开始转动
sbit key_l=P2^1;        //步进电机正转
sbit key_R=P1^5;        //步进电机反转
sbit key_jia=P1^6;        //步进电机转速加
sbit key_jian=P1^7;        //步进电机转速减
sbit key_t1=P2^3;        //定时器1溢出控制键
sbit RS = P2^4;   //定义端口
sbit RW = P2^5;
sbit EN = P2^6;


bit Flag=1;                        //步进电机开关标志位
bit Flag1=0;                //步进电机正转标志位
bit Flag2=0;                //步进电机反转标志位
uchar speed;                //步进电机转速
uchar num;                        //lcd写数据位
uint led_time;                //led闪烁控制时间

uchar code table1[]="SPEED:";
uchar code table2[]={0,0,'2','3','4','5','6','7'};
uchar code table3[]="RIGHT";
uchar code table4[]="LEFT";


unsigned int code table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};// 显示段码值0~9
#define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电
#define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电
#define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电
#define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电
#define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电
#define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电
#define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电

void delay(uchar t);
void IT0_init();
void coil_r();
void coil_l();

void init_led();
void write_date(uchar date);
void write_com(uchar com);
void delay_o(uint z);

void main()                                //主函数
{
        unsigned int y;
        IT0_init();
        init_led();
        y=512;
        speed=4;
        P3=table[speed%8];
        while(1)
        {
        while(y--&&Flag&&Flag1)
        {
                coil_r();
        }
        while(y--&&Flag&&Flag2)
        {
                coil_l();
        }
        }
}

void IT0_init()                //外部中断以及定时器0中断
{
        TMOD=0X11;
        TH0=(65536-2000)/256;
        TL0=(65536-2000)%256;
        TH1=(65536-2000)/256;
        TL1=(65536-2000)%256;
        PT0=1;
        TR0=1;
        TR1=1;
        EA=1;
        ET0=1;
        ET1=1;
//        EX0=1;
//        IT0=1;
}

void coil_r()                //步进电机正转
{
        Coil_A1
        delay(speed);
        Coil_B1
        delay(speed);
        Coil_C1
        delay(speed);
        Coil_D1
        delay(speed);
}

void coil_l()                //步进电机反转
{
        Coil_D1
        delay(speed);
        Coil_C1
        delay(speed);
        Coil_B1
        delay(speed);
        Coil_A1
        delay(speed);
}
void delay(uchar t)                //延时函数MS
{
        uchar z;
        while(t--)
        {for(z=0;z<120;z++);}
}

/*void IT0_ZD() interrupt 0                //外部中断0按键控制
{
        if(!INT0)
                {
                        delay(10);
                        if(!INT0)
                        {
                                while(!INT0);
                //                speed++;
                                Flag=1;
                                Flag1=1;
                                Flag2=0;;
                        /*        if(speed>7)
                                speed=2;*/
//                        }
//                }
//}*/

void t0() interrupt 1                //定时器0中断按键检测
{
        TH0=(65536-2000)/256;
        TL0=(65536-2000)%256;
        P3=table[speed%8];
        if(!key_on)
        {
                delay(10);
        if(!key_on)
        {
                while(!key_on);
                        Flag=1;
        }
        }
        if(!key_OFF)
        {
                delay(10);
        if(!key_OFF)
        {
                while(!key_OFF);
                        Flag=0;
        }
        }
        if(!key_R)
        {
                delay(10);
        if(!key_R)
        {
                while(!key_R);
                        Flag=1;
                        Flag1=0;
                        Flag2=1;
        }
        }
        if(!key_jia)
        {
                delay(10);
        if(!key_jia)
        {
                while(!key_jia);
                speed++;
                if(speed>7)
                speed=2;
        }
        }
        if(!key_jian)
        {
                delay(10);
        if(!key_jian)
        {
                while(!key_jian);
                speed--;
                if(speed<2)
                speed=7;
        }
        }
        if(!key_l)
                {
                        delay(10);
                        if(!key_l)
                        {
                                while(!key_l);
                //                speed++;
                                Flag=1;
                                Flag1=1;
                                Flag2=0;;
                        }
                }
        if(!key_t1)
                {
                        delay(10);
                        if(!key_t1)
                        {
                                while(!key_t1);
                                TR1=~TR1;
                        }
                }
}

void t1() interrupt 3                //定时器1中断控制lcd1602
{
        TH1=(65536-2000)/256;
        TL1=(65536-2000)%256;
        led_time++;
        if(led_time<2000) return;
        led=~led;
        write_com(0x80+0X04);
        for(num=0;num<6;num++)
        {
                write_date(table1[num]);
                delay_o(5);
        }
        write_date(table2[speed]);
        if(Flag2==1&Flag1==0)
        {
        write_com(0x80+0x40+0X05);
        for(num=0;num<5;num++)
        {
                write_date(table3[num]);
                delay_o(5);
        }        
        }
        if(Flag2==0&Flag1==1)
        {
        write_com(0x80+0x40+0X05);
        for(num=0;num<4;num++)
        {
                write_date(table4[num]);
                delay_o(5);
        }        
        }
        led_time=0;
}

void delay_o(uint z)        //lcd1602延时
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}

void write_com(uchar com)        //lcd1602写指令
{
        RS=0;
        RW=0;
        EN=0;
        P0=com;
        delay_o(5);
        EN=1;
        delay_o(5);
        EN=0;
}

void write_date(uchar date)                //lcd1602写数据
{
        RS=1;
        RW=0;
        EN=0;
        P0=date;
        delay_o(5);
        EN=1;
        delay_o(5);
        EN=0;
}

void init_led()                                //lcd1602初始化
{
        write_com(0x38);
        delay_o(5);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);
}

使用特权

评论回复
8
花戒| | 2014-6-26 00:33 | 只看该作者
程序在上个基础上增加了一个定时器1来控制LCD定时器,所以程序运转上会有个小小瑕疵,在更新显示速度等信息时,步进电机会出现停顿现象,这是不是就是数控机床上好几个控制芯片的原因?

数控机床上真没见有多少个控制芯片。你这里出现停顿现象是因为delay用得太多。这程序,值得鼓励,但不值得学习。结构还需要优化。定时器服务函数里面还嵌套延时。。。这也太牛X了。

使用特权

评论回复
9
a406916285|  楼主 | 2014-6-26 12:03 | 只看该作者
花戒 发表于 2014-6-26 00:33
程序在上个基础上增加了一个定时器1来控制LCD定时器,所以程序运转上会有个小小瑕疵,在更新显示速度等信息 ...

有什么建议或者指导一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

44

帖子

0

粉丝