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

STC15F104W编码器两路可调PWM输出源程序

发布时间:2023-08-23 发布时间:
|


//没有用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




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

热门文章 更多
8051单片机的函数发生器的设计