//==========================================================
// 一、宏定义区
//==========================================================
#include <STC15.H> //头文件
#include <intrins.h> //库函数文件
#define FOSC 12000000L //IRC频率
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
//==========================================================
// 二、函数声明区
//==========================================================
void UartInit(void); //9600bps@24MHz
void Timer0_Init(void); //25微秒@24MHz
void Timer2_Init(void); //100微秒@24MHz
void Init_IO(void); //IO初始化
void key_san(void); //按键扫描程序
void sedusart(u8 x); //串口发送测试void sedusart(10)
void delayms(u16 c); //1ms误差 0us
//==========================================================
// 三、IO定义区
//==========================================================
sbit S1 = P5^4; //按键频率加
sbit S2 = P1^6; //按键频率减
sbit S3 = P5^5; //按键占空比加
sbit S4 = P1^7; //按键占空比减
sbit PWM1 = P3^6; //输出1
sbit OUT= P3^2; //
sbit Led = P3^3; //LED
//===========================================================
// 四、变量声明区
//===========================================================
u8 data recive[10]; //声明数组,接收到的数据缓存
u8 data recive_1[10]; //声明数组,接收到的数据缓存
u8 data time; //软件计时,延时读取通讯数据
u8 data num; //通讯字节计数专用
u8 UART_FIG; //串口接收标志位
u16 Time_1US,F_Hz,CT,Step; //F_HZ=100倍(20000对应200HZ) CT=50(占空比50%) Step(步进数)
//===========================================================
// 五、主函数区
//===========================================================
main()
{
Init_IO(); //IO初始化
UartInit(); //串口初始化
F_Hz = 55; //初始值频率
CT = 50; //初始值占空比10%
Step = 5; //步进数
Timer2_Init(); //定时器2初始化
while(1)
{
key_san();
//静态数码管显示
// Pout1 = !Pout1;
}
}
//==========================================================
// 六、子函数区
//==========================================================
// 描述:控制函数
void key_san(void)
{
if(S1 == 0) //频率加
{
if(++Time_1US>20000) //
if(S1 == 0)
{
Time_1US = 0;
F_Hz = F_Hz/100; //缩小100倍
F_Hz = F_Hz + Step; //
if(F_Hz>=200) //
{
F_Hz=0; //
}
Timer2_Init();
Led = 0;
}
}
if(S2 == 0) //频率减
{
if(++Time_1US>20000) //
if(S2 == 0)
{
Time_1US = 0;
F_Hz = F_Hz/100; //缩小100倍
F_Hz = F_Hz - Step; //
if(F_Hz==0)
{
F_Hz=200;
}
Timer2_Init(); //
Led = 0;
}
}
if(S3 == 0) //占空比加
{
if(++Time_1US>20000) //
if(S3 == 0) //
{
Time_1US = 0; //
CT = CT + Step; //
if(CT>=100){CT=0;} //
// Timer2_Init();
Led = 0;
}
}
if(S4 == 0) //占空比减
{
if(++Time_1US>20000) //频率
if(S4 == 0)
{
Time_1US = 0; //F_HZ
CT = CT - Step; //占空比-步进数
if(CT==0){CT=100;} //占空比
// Timer2_Init();
Led = 0;
}
}
}
//=========================================================
// 七、所有初始化函数
//=========================================================
void UartInit(void) //[email protected]
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器时钟1T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TL1 = 0xC7; //设置定时初始值
TH1 = 0xFE; //设置定时初始值
ET1 = 0; //禁止定时器中断
TR1 = 1; //定时器1开始计时
ES = 1; //打开串口中断
EA = 1; //打开总中断
}
//=========================================================
// 定时器2初始化
//=========================================================
void Timer2_Init(void) //1000微秒@12.000MHz
{
AUXR |= 0x04; //定时器2为1T模式
F_Hz = F_Hz*100; //*100 总分频20000HZ
T2L = (65536-FOSC/2/F_Hz); //初始化计时值
T2H = (65536-FOSC/2/F_Hz) >> 8;
AUXR |= 0x10; //定时器2开始计时
// INT_CLKO = 0x04; //使能定时器2的时钟输出功能
IE2 |= 0x04; //开定时器2中断
EA = 1; //打开总中断
if(F_Hz == 0||F_Hz == 20000) //当频率值为0或200Hz关闭输出
{
IE2 &= ~0x04; //关闭中断
AUXR &= ~0x10; //定时器2停止计时
PWM1 = 0;
}
}
//=========================================================
// 初始化IO口函数
//=========================================================
void Init_IO(void) //IO初始化
{
P1M0 = 0x00;
P1M1 = 0x00;
P3M0 = 0x01;
P3M1 = 0x00;
S1 = S2 = S3 = S4 = 1;
PWM1 = 0;
Led = 1;
}
//=========================================================
// 八、所有中断函数
//=========================================================
// 描述:定时器0中断函数,1毫秒进入一次中断
void time0() interrupt 1 //定时器0中断程序
{
}
//=========================================================
// 定时器2中断程序
//=========================================================
void t2int() interrupt 12 //定时器2中断程序,
{
u16 CT1,CT2; // CT=占空比
u8 ss;
CT2++; //
if(CT2>=2) //CT2为占空比计数器0-100
{
CT2 = 0;
CT1++;
if(CT1>=CT)
{
PWM1 = 0; //
}
else
{
PWM1=1;
}
if(CT1>=100)
{
CT1 = 0;
}
}
ss++;
if(ss>50)
{
ss=0;
OUT=~OUT;
}
}
//=========================================================
// 串口中断通信
//=========================================================
void exter0() interrupt 4 //串口中断通信
{
if(RI==1)
{
recive[num++]=SBUF;//接收一个字节
if(num>=2)
{
F_Hz = recive[0];
CT = recive[1];
// F_Hz = F_Hz*100;
// T2L = (65536-FOSC/2/F_Hz); //初始化计时值
// T2H = (65536-FOSC/2/F_Hz) >> 8;
Timer2_Init();
Led = 0;
num=0;
} //防止缓存数据超限
RI=0;
}
time=10; //数据延时读取时间
if(num>=2)
{
num=0;
}
}