历史上的今天
今天是: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
上一篇:DS18B20单片机数字温度计
史海拾趣
|
1.电路板(除去元器件)由什么材料制成? 2.电路板用PROTEL画图的时候,哪些层分别对应着哪些位置?(比如;topoverly,layout...) 3.什么是波峰焊,回流焊?… 查看全部问答> |
|
该晶振的1,4脚与OSC32IN,OSC32OUT 的连接有没规定:哪个脚跟哪个脚相连,找不到相关材料,望知情高手指导下,拜谢 ...… 查看全部问答> |
|
1、PC机串口连接TEST44X学习板的9芯串行接口 J5_232 // 2、对拨动开关P_232、P1、U_USART,只有拨动开关 U_USART 的P2脚和P5脚拨到ON 的位置; 按照上面的设置设置了,我从pc端给开发板发数据,没有回来的数据,没反应,其他几个历程也不行,请问 ...… 查看全部问答> |
|
前仿真出来的状态机时钟正确的, 而后仿真出来的状态机中,有些状态之间就会有很短时间的其他状态,时间不到系统时钟的十分之一。 上图是后仿真时序,状态3后应该是状态4,但是实际却是状态7 和 6 ,而且时间很短,不到一个时钟周期,这导致了后 ...… 查看全部问答> |




