51单片机:压控PWM信号发生器设计
经过一个学期的学习,初步入门了51单片机。会写了一点小程序,尝试过在板子上面跑自己设计的代码。当看到自己设计的程序结果由仿真变成现实在你眼前时,确实很开心。51系列虽然很老,有点过时了,感觉对于入手学单片机还是可以的。
知识是一个积累的过程。像这种已经过时的或者说不太主流的东西,我一开始接触时也觉得没啥必要啊,还不如学STM32,后来老师告诉我们,高楼是一层一层盖的,像这种最初的东西,较与现在功能更为完善、性能更优良的芯片是最基础的。只要掌握怎样去学习它的方法,以后给你别的芯片你也不怕了。话不多说,简单介绍一下自己的单片机课程设计,为自己的单片机这门课画个小句号吧。
课程设计题目及要求:
压控PWM信号发生器
课程设计任务内容:
综合运用所学单片机知识,设计一个压控PWM信号发生器。要求如下:系统单片机使用AT89S52,甲机通过ADC0832采集电压信号,显示该电压值并将该电压信号对应的数字量传给乙机,乙机生成对应频率的PWM脉冲信号,占空比恒为1/4。给定单片机频率为11.0592MHz。
设计思路简单描述:
抛开仿真电路图不谈,简单讲述一下自己的软件设计的思路。对于这个课设的软件设计,我是分成了三个部分:ADC0832采集电压信号并显示、乙机生成占空比1/4的PWM脉冲信号、甲乙机通信。我先一部分一部分的写好,然后仿真调试,对代码进行修改,等到这三个部分都完成了再组合到一块,再进行仿真调试,直到出现正确的仿真结果。
电路图设计:
部分代码:
甲机
#include<reg51.h> //51系类单片机
#include<intrins.h> //函数
#define FOSC 11059200 //晶振频率
#define BAUD 9600 //波特率
#define uchar unsigned char
#define uint unsigned int
uchar Get_AD_Result(); //获取AD转换结果(0通道)
void ET0_init(); //定时器0初始化
void RT1_init(); //定时器1初始化
void UartInit(); //双机通信初始化UartInit(用定时器2)
//----------------------------------------
// 主函数
//----------------------------------------
void main()
{
ET0_init(); //定时器0初始化
RT1_init(); //定时器1初始化
UartInit();
ET0 = 1;
TR0 = 1;
ET1 = 1;
TR1 = 1;
EA = 1; //打开总中断
CLK = 0; //ADC0832初始化
CS = 1;
while(1);
}
乙机:
//----------------------------------------
// 主函数
//----------------------------------------
void main()
{
SCON = 0x50;
TMOD |= 0x21;
TH1 = TL1 = -(FOSC/12/32/9600); //设置定时1器高、低8位初值
TR1 = 1; //开启定时器1
ES = 1; //串口中断
TI = 1; //发送中断标记位,必须设置
TMOD |= 0x21;
TL0 = T1MS; //定时器0低八位初值
TH0 = T1MS >> 8; //定时器0高八位初值
TR0 = 1; //开启定时器
ET0 = 1;
PT0=1;
EA = 1; //开总中断
while(1);
}
(详细代码及完整课设内容见Simulation)
仿真结果: