一、基本介绍
STC89c51和STC89c52是电脑接口程序设计、自动化控制、工业控制、安防等诸多领域中经常运用到的一种单片机芯片。这两种芯片均采用8051核心,能够完全兼容C51指令,采用16位定时器、4组可编程计数器、六组通用输入输出接口等,具有RAM和FLASH等硬件存储器资源,并且还具备较高的运算速度、可靠性等基本特性。
二、应用领域
STC89c51与STC89c52主要应用于以下领域:
1、电脑接口程序设计:如电脑外设控制、多媒体音效、游戏控制等;
2、自动化控制:如家居智能控制、工业装备控制、传感器监测等;
3、工业控制:如机器人控制、生产线控制、仪表监控等;
4、安防领域:如门禁控制、生物识别系统、智能警报等。
三、编程环境
编程环境是使用STC89c51和STC89c52进行编程的重要基础之一,下面介绍几种常用的编程环境:
1、Keil C51编译软件:官方推荐的编译环境,能够提供完整的开发工具链,包括编译器、调试器、仿真器等;
2、IAR环境:该环境是很多ARM单片机开发的首选,IAR以其快速与稳定性成为Keil之外的另一强大的开发环境;
3、C51极限编程环境:该环境相较于前两个来说具有优秀的易用性,包括代码加速器、链接器、编辑器等,其中代码加速器能够大量节省用户进行编程所需的时间;
/* Sample Code */
#include
//头文件定义
void main()
{
while(1) // 循环执行
{
P1 = 0xff; // 点亮P1口指示灯
delay(1000);// 延时函数
P1 = 0x00; // 灭掉P1口指示灯
delay(1000);// 延时函数
}
}
void delay(unsigned int xms)
{
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=600;j>0;j--);// 延时一毫秒
}
四、串口通信
串口通信一般是指在计算机与单片机之间进行通信,下面介绍单片机串口与PC串口之间的通讯:
1、硬件串口:将串口芯片与单片机外部引脚相连接,这种方式支持PC与单片机之间的数据双向传输;
2、软件串口:调用单片机内部定时器进行标准波特率的硬件计算,将计算结果处理后,通过单片机的I/O口来模拟一个串口;
/* Sample Code */
#include
#define BAUD 9600 //通讯波特率
/*波特率计算公式:(1/时钟频率)*12=偏差率,1-偏差率=实际通讯速率*/
void InitUART() //初始化串口
{
TMOD = 0x20; //选择自动重装方式
SCON = 0x50; //选择波特率不可变的工作方式,开启接受中断
TH1 = TL1 = -(FOSC/12/32/BAUD); //设置计数器自动重装载初值
TR1 = 1; //打开定时器1,开始计时
ES = 1; //使能串口中断
}
void SendData( unsigned char dat ) //向串口发送数据
{
TI = 0;
SBUF = dat;
while( TI == 0 );
}
void main() //主程序
{
InitUART(); //初始化串口为9600
SendData('H');//开始向串口发送单片机数据
SendData('e');
SendData('l');
SendData('l');
SendData('o');
SendData(',');
SendData('w');
SendData('o');
SendData('r');
SendData('l');
SendData('d');
while(1);
}
五、脉宽调制
脉宽调制是指单片机根据需要产生一个变化的电脉冲来实现对电路硬件参数变化的调节。下面简单介绍两种实现脉宽调制的方法:
1、定时器方式:在单片机中定时器是实现脉冲信号的重要组成部分,通过计算定时器中所设定的时间长度,可以产生具有不同频率和占空比的周期性信号;
2、计数器方式:通过对计数器内部设定初值和计数器溢出次数的判定,可以得出不同长度和频率的脉冲信号;
/*Sample Code */
#include
#define T PWMOUT //设定占空比值
sbit PWMOUT = P1^0; //设定PWM波形输出口
void Delay10ms() //单片机延时函数
{
unsigned char n, i;
for (n = 1; n > 0; n--)
for (i = 0; i < 240; i++);
}
void main() //主函数
{
while (1)
{
for (T = 0; T < 255; T++) //PWM增加
{
Delay10ms(); //延时10ms
}
for (T = 255; T > 0; T--) //PWM减小
{
Delay10ms(); //延时10ms
}
}
}