历史上的今天
返回首页

历史上的今天

今天是:2024年12月09日(星期一)

正在发生

2020年12月09日 | STC15F104W编码器两路可调PWM输出源程序

2020-12-09 来源:51hei


//没有用IAPIDLE功能,有没有高手指点一下利弊

#include

#include

typedef unsigned char BYTE;

typedef unsigned int WORD;

//#define uint unsigned int

//#define MAIN_Fosc                22118400L        //定义主时钟

//#define MAIN_Fosc                12000000L        //定义主时钟

#define MAIN_Fosc                11059200L        //定义主时钟

//#define MAIN_Fosc                 5529600L        //定义主时钟

//#define MAIN_Fosc                24000000L        //定义主时钟

//#define MAIN_Fosc                40000000L        //定义主时钟

//#define ENABLE_IAP 0x80           //if SYSCLK<30MHz

//#define ENABLE_IAP 0x81           //if SYSCLK<24MHz

//#define ENABLE_IAP  0x82          //if SYSCLK<20MHz

#define ENABLE_IAP 0x83           //if SYSCLK<12MHz

//#define ENABLE_IAP 0x84           //if SYSCLK<6MHz

//#define ENABLE_IAP 0x85           //if SYSCLK<3MHz

//#define ENABLE_IAP 0x86           //if SYSCLK<2MHz

//#define ENABLE_IAP 0x87           //if SYSCLK<1MHz

#define CMD_IDLE    0               //空闲模式

#define CMD_READ    1               //IAP字节读命令

#define CMD_PROGRAM 2               //IAP字节编程命令

#define CMD_ERASE   3               //IAP扇区擦除命令

//测试地址

#define IAP_ADDRESS1 0X0000         //内部EEPROM地址

#define IAP_ADDRESS2 0X0200

/*初始定义*/

bit  write = 0;

sbit VD=P3^3;  //红色LED 0.50v=10v ;1.00=27v ;3.85=73v;

sbit CD=P3^4;  //绿色LED

sbit ZS=P3^5;  //指示LED转换  0 - 红色LED调整;1 - 绿色LED调整

sbit BA=P3^0;  //编码器的a脚接P3.0

sbit BB=P3^1;  //编码器的b脚接P3.1

sbit QH=P3^2;  //编码器的按键接P3.2 电压调整或电流调整299=5.00V

BYTE v_temp,c_temp,XZ = 0,flag,a0,b0,c0;//  128 109  48 29  //48=0.96V;29=0.58V;

void InitTimer0() interrupt 1  // 0.5毫秒@11.0592MHz  频率 1000HZ

{

    IE2 = 0x00;    //关闭定时器2中断

    AUXR = 0XE4;   //关闭定时器2计数

    TL0 = 0xCD;    //设置定时初值 0.5毫秒@11.0592MHz

    TH0 = 0xD4;    //设置定时初值 0.5毫秒@11.0592MHz

    VD = 1;

    CD = 1;

    flag = 1;

    AUXR = 0xF4;   //开启定时器2计数

    IE2 = 0x04;    //开启定时器2中断允许

}


void InitTimer2() interrupt 12    //2微秒@11.0592MHz 控制灯亮时间

{

    flag++;

    T2L = 0xD4;    //设置定时初值 2微秒@11.0592MHz

    T2H = 0xFF;    //设置定时初值 2微秒@11.0592MHz

    if(v_temp == flag) VD=0;

    if(c_temp == flag) CD=0;

}


/*//关闭IAP

void IapIdle()

{

    IAP_CONTR = 0;                  //关闭IAP功能

    IAP_CMD = 0;                    //清除命令寄存器

    IAP_TRIG = 0;                   //清除触发寄存器

    IAP_ADDRH = 0x80;               //将地址设置到非IAP区域

    IAP_ADDRL = 0;

}

*/

//从ISP/IAP/EEPROM区域读取一字节

BYTE IapReadByte(WORD addr)

{

    BYTE dat;                       //数据缓冲区

    IAP_CONTR = ENABLE_IAP;         //使能IAP

    IAP_CMD = CMD_READ;             //设置IAP命令

    IAP_ADDRL = addr;               //设置IAP低地址

    IAP_ADDRH = addr >> 8;          //设置IAP高地址

    IAP_TRIG = 0x5a;                //写触发命令(0x5a)

    IAP_TRIG = 0xa5;                //写触发命令(0xa5)

    _nop_();                        //等待ISP/IAP/EEPROM操作完成

    dat = IAP_DATA;                 //读ISP/IAP/EEPROM数据

    //IapIdle();                    //关闭IAP功能

    return dat;                     //返回


}


//写一字节数据到ISP/IAP/EEPROM区域

void IapProgramByte(WORD addr, BYTE dat)

{

    IAP_CONTR = ENABLE_IAP;         //使能IAP

    IAP_CMD = CMD_PROGRAM;          //设置IAP命令

    IAP_ADDRL = addr;               //设置IAP低地址

    IAP_ADDRH = addr >> 8;          //设置IAP高地址

    IAP_DATA = dat;                 //写ISP/IAP/EEPROM数据

    IAP_TRIG = 0x5a;                //写触发命令(0x5a)

    IAP_TRIG = 0xa5;                //写触发命令(0xa5)

    _nop_();                        //等待ISP/IAP/EEPROM操作完成

    //IapIdle();


}


//扇区擦除

void IapEraseSector(WORD addr)

{

    IAP_CONTR = ENABLE_IAP;         //使能IAP

    IAP_CMD = CMD_ERASE;            //设置IAP命令

    IAP_ADDRL = addr;               //设置IAP低地址

    IAP_ADDRH = addr >> 8;          //设置IAP高地址

    IAP_TRIG = 0x5a;                //写触发命令(0x5a)

    IAP_TRIG = 0xa5;                //写触发命令(0xa5)

    _nop_();                        //等待ISP/IAP/EEPROM操作完成

    //IapIdle();


}



/*void Timer0Init(void)                //100微秒@24.000MHz  10KHZPWM

{

        AUXR |= 0x80;        //定时器时钟1T模式

        TMOD &= 0xF0;   //设置定时器模式

        TL0 = 0xA0;                //设置定时初值--100微秒@24.000MHz

        TH0 = 0xF6;                //设置定时初值--100微秒@24.000MHz

        TF0 = 0;                //清除TF0标志

        TR0 = 1;                //定时器0开始计时

}


void Timer2Init(void)//0.4微秒@24.000MHz

{

        AUXR |= 0x04;  //定时器时钟1T模式

        T2L = 0xF6;           //设置定时初值--0.4微秒@24.000MHz

        T2H = 0xFF;           //设置定时初值--0.4微秒@24.000MHz

        AUXR |= 0x10;  //定时器2开始计时

}

*/

void bianmaqi(void)//捕捉EC11按下和旋转信息

{

  unsigned char a, b, c;

  a = BA; b = BB; c = QH;

   if (a != a0)     // BA changed

  {

        a0 = a;

    if (b != b0)    // BB changed

     {

      b0 = b;write = 1;

        if ((a == b) && (XZ == 0) && (v_temp < 153)) {v_temp++;}//225 153

    if ((a == b) && (XZ == 1) && (c_temp < 73)) {c_temp++;}//208 65

    if ((a != b) && (XZ == 0) && (v_temp > 23)) {v_temp--;}//85 23   

        if ((a != b) && (XZ == 1) && (c_temp > 5)) {c_temp--;}//29 5

     }

    }

  if (!c && c0)

        {

        if (XZ == 0 )

      {

        XZ = 1;

        ZS = 1;

        }

    else if(XZ == 1)//切换

      {

            XZ = 0;

        ZS = 0;

       }

    }

    c0 = c;

}

void init()

{

    AUXR = 0XE4;   //设置定时器0和2为1T模式

    TMOD = 0x00;

    TL0 = 0xCD;    //设置定时初值 0.5毫秒@11.0592MHz 0xA0;--100微秒@24.000MHz

    TH0 = 0xD4;    //设置定时初值 0.5毫秒@11.0592MHz 0xFF;--0.4微秒@24.000MHz

    T2L = 0xD4;    //设置定时初值 2微秒@11.0592MHz 0xF6;--0.4微秒@24.000MHz

    T2H = 0xFF;    //设置定时初值 2微秒@11.0592MHz 0xFF;--0.4微秒@24.000MHz

    EA = 1;

    ET0 = 1;

    TR0 = 1;       //定时器0开始计时

    P3M1 &= 0xF7;

    P3M0 |= 0x08;  //P3.3(推挽)

    P3M1 &= 0xEF;

    P3M0 |= 0x10;  //P3.4(推挽)

    P3M1 &= 0xDF;

    P3M0 |= 0x20;  //P3.5(推挽)

    VD = 0;

    CD = 0;

    ZS = 0;        // 0 - 电压调整状态;1 - 电流调整状态

    a0 = BA;

    b0 = BB;

    c0 = QH;

          v_temp = IapReadByte(1);

        if (v_temp == 0 ){v_temp = 65;}     //128        65

        if (v_temp > 153){v_temp = 65;}     //245  128   

        c_temp = IapReadByte(10);

    if (c_temp == 0 ){c_temp = 29;}     //109           

推荐阅读

史海拾趣

问答坊 | AI 解惑

求助:问个电路板的问题

1.电路板(除去元器件)由什么材料制成? 2.电路板用PROTEL画图的时候,哪些层分别对应着哪些位置?(比如;topoverly,layout...) 3.什么是波峰焊,回流焊?…

查看全部问答>

哈佛结构

哈佛结构   哈佛结构是一种将程序指令存储和数据存储分开的存储器结构。中央处理器首先到程序指令存储器中读取程序指令内容,解码後得到数据地址,再到相应的数据存储器中读取数据,并进行下一步的操作(通常是执行)。程序指令存储和数据存储 ...…

查看全部问答>

免费教你实现LED指示灯,不容错过哦!

replyreload += \',\' + 371188;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>

测脉冲,波形不能稳定

1、  用示波器测试脉冲时波形不能稳定下来,我用的时鼎阳SDS1102C,大家有没有遇到过这个问题?…

查看全部问答>

l有谁 知道用libmad 库解码mp3文件的使用流程, 急,谢谢!

就是使用libmad解码mp3文件,什么时候是解码一桢结束,这一桢数据怎么保存?…

查看全部问答>

有没有哪位在wince 6.0 r2上定制出中文模拟器?

自己在wince 6.0 r2上定制了一个模拟器,但不能显示中文,汉字都是以空框显示,不知道是什么原因?请高人指点一下!…

查看全部问答>

求教:stm的rtc用的爱普生的晶振叫什么晶振

                                 该晶振的1,4脚与OSC32IN,OSC32OUT 的连接有没规定:哪个脚跟哪个脚相连,找不到相关材料,望知情高手指导下,拜谢 ...…

查看全部问答>

有关rtdx的问题!

若想在H.263程序运行时,看到实时的压缩数据流,是否只能使用rtdx?仿真器必须用560吗?我现在用的是DM642,510JTAG,求各位大人给予高见!! …

查看全部问答>

利尔达开发板的问题,232串口调试不成功

1、PC机串口连接TEST44X学习板的9芯串行接口 J5_232 // 2、对拨动开关P_232、P1、U_USART,只有拨动开关 U_USART 的P2脚和P5脚拨到ON 的位置; 按照上面的设置设置了,我从pc端给开发板发数据,没有回来的数据,没反应,其他几个历程也不行,请问 ...…

查看全部问答>

前仿真与后仿真结果不同,原因是什么?

前仿真出来的状态机时钟正确的, 而后仿真出来的状态机中,有些状态之间就会有很短时间的其他状态,时间不到系统时钟的十分之一。 上图是后仿真时序,状态3后应该是状态4,但是实际却是状态7 和 6 ,而且时间很短,不到一个时钟周期,这导致了后 ...…

查看全部问答>