第一个板子的程序。请各位大哥也指点指点。有没有思路上的缺陷。
#include"STC15.H"
#include"io.h"
uint a=1,b=1;
uint ia=0,ib=0;
uchar ka=0,kb=0,kc=1; // 标记
//----------------- 下面是 端口初始化函数 01
void io_init()
{
p10=0; //初始化 P10,P11,P37 开机 为弱上拉状态 =0 ;
p11=0; //--
p37=0; //--
P1M1=0X00; P1M0=0X03; // 开推挽模式 变 端口 0 状态为 强 0 状态。
P3M1=0x00; P3M0=0X80; //-- 只开P37 的推挽模式
}
//-----------------下面是 WPM 输出 初始化函数 02
void pwm_init() // wpm 初始化
{
CMOD=0X02; // 时钟来源 为 2分之一 震荡时钟。
CCAPM0=0X42; // # 01000010 开 PCA0 PWM 0输出。 9脚 P11 输出
CCAPM1=0X42; // # 01000010 开 PCA1 PWM 1输出. 10脚 P10 输出
CCAP0H=CCAP0L=255; // 输出 先低电位
CCAP1H=CCAP1L=255;
CR=1; // 打开 PCA 计数器阵列 开始工作
}
//-----------------下面是 WPM输出调节 函数 03
void pwm_1(uchar x) // 大电机。
{
CCAP0H=CCAP0L=x;
}
void pwm_2(uchar x) // 小电机
{
CCAP1H=CCAP1L=x;
}
//---------------- 下面是 EEPROM 读 数据 函数 04
void du()
{
IAP_ADDRH=0X00; // 第一扇区 第一地址 00 00 H
IAP_ADDRL=0X00;
IAP_CMD=0X01; // 命令 读
IAP_CONTR=0X82;
IAP_TRIG=0X5A;
IAP_TRIG=0XA5;
a=IAP_DATA; // 第一个地址读出的数据 放到 a 里面
}
//-------------- 下面是 EEPROM 写数据 a 函数。 05
void xie_a(uchar x)
{
IAP_ADDRH=0X00; // 先擦除 第一扇区 数据 ,不然写不进去数据。
IAP_ADDRL=0X00;
IAP_CMD=0X03; // 命令 擦除
IAP_CONTR=0X82;
IAP_TRIG=0X5A;
IAP_TRIG=0XA5;
//---------
IAP_ADDRH=0X00;
IAP_ADDRL=0X00;
IAP_CMD=0X02; // 命令 写数据
IAP_DATA=x; // 把数据赋给 IAP_DATA 寄存器 准备写入。
IAP_CONTR=0X82;
IAP_TRIG=0X5A;
IAP_TRIG=0XA5;
}
//----------------- 定时器 0 33毫秒 16位自动从装模式 0.75 一个时钟周期 ,时钟频率大概是 15 --16 兆赫 07
void T0_init() // 定时器0 初始化
{
TH0=0X00;
TL0=0X00;
ET0=1;
EA=1;
}
//------------------ T0 中断 函数
void T0(void) interrupt 1
{
ia=ia+1; // 大概是 没 33 毫秒 增加 1 450*0.033=14.85秒
ib=ib+1;
if(ib>12)
{
ka=1; //标记置位
kb=1; //标记置位
p12=!p12;
ib=0; // 每 0.033*12=0.396秒 清零一下 IB 从头开始计数
}
//----------
if(ia>10000) {ia=10000;}
}
//-------- 主函数-----
void main()
{
io_init(); // IO 端口 初始化
pwm_init(); // PWM 初始化
T0_init(); // 定时器T0 初始化
du(); // 读 数据 到 a
pwm_1(1); // 大电机 高速 p32 对应 PWM_1
while(p32==1); // p32 条件为 假 ,开始跳过去执行下一步
pwm_1(253);
pwm_2(1); // 开 PWM_2
TR0=1; // 开定时器
//----------------------------------------------------------------------------- 进入循环体
// p33 为 上限
// p32 为 下限
while(1)
{
if(kc==1&&ia>40) // 本程序 只执行一次,属于 指令脉冲执行 要想再执行 只有清零 KC 标记。
{
pwm_2(70);
kc=0; // 清除标记 为 零
}
//-----------
//-----------
if(p33==1) // 上限 P33 无料时, 执行 A 速度
{
pwm_1(a);
}
if(p33==0) // 上限 P33 有料时, 执行 最低基本停止速度 250
{
pwm_1(250);
}
if(p33==0&&ka==1) // 上限 P33 有料时 ,切 KA = 1 时, 执行 减速度 2 。 KA =1 时表示执行,为零时 表示不可以执行
{
a=a+2;
ka=0;
if(a>250) { a=250; } // 防止 加法 溢出
}
//---------------------------
if(p32==1&&kb==1) // 下限 无料时 , 执行速度 加 1
{
a=a-1;
kb=0;
if(a<2) { a=2; }
}
//-------------------------------------- EEPROM
if(ia==360 ) // 360*0.033=11.88 秒
{ xie_a(a); }
if(ia==5000 ) // 5000*0.033=165/60=2.75分钟
{ xie_a(a); }
}
}
|