/*********************************************************************************************************
** 工程功能 :用PWM实现DA输出
** 工程作者 :Blue Sky Teams——ZZL
** 工程版本 :V1.0
*********************************************************************************************************/
#include<STC12C5A60S2.h>
#include<LCD1602.h>
#include<PWM.h>
#include<ADC.h>
#define uint unsigned int
#define uchar unsigned char
/*********************************************************************************************************
** 函数功能 :延时函数
** 函数说明 :利用软件延时,占用CPU,经调试最小单位大约为1ms
** 入口参数 :time:需要延时的时间,单位ms
** 出口参数 :无
*********************************************************************************************************/
void Delay_ms(uint time)
{
uint i,j;
for(i = 0;i < time;i ++)
for(j = 0;j < 930;j ++);
}
void main()
{
float result;
uchar i = 0,temp=0x00;
LCD_1602_Init(); //液晶显示前进行初始化
PCA_init();
Timer0_init();
ADC_Init(ADC_PORT0);
temp = 0X80;
/*在while(1)循环中通过连续改变CCAP0H改变PWM0输出的PWM信号的占空比,PWM信号在P1.3脚输出,
将输出的信号通过一个低通滤波器后滤去其他频段,剩下直流成分,送到单片机AD口P1.0检测滤波后的电压值 */
while(1)
{
result = GetADCResult(ADC_CH0);//测得当前占空比的电压值
Write_1602_String("Pulse_rate=",0x80);
if(temp == 0)
Write_1602_Data(0x30 + 1);
else
Write_1602_Data(' ');
Write_1602_Data(0x30+(uchar)((255-temp)/2.55)/10%10);
Write_1602_Data(0x30+(uchar)((255-temp)/2.55)%10);
Write_1602_Data('%');
Write_1602_String("Current Vo=",0xC0);
Write_1602_Data(0x30 + (uint)result%10);
Write_1602_Data('.');
Write_1602_Data(0x30 + (uint)(result*10)%10);
Write_1602_Data(0x30 + (uint)(result*100)%10);
Write_1602_Data('V');
if(++i == 4)
{
i = 0;
temp += 0x10;
CCAP0H = temp; //改变当前的占空比
}
Delay_ms(400);
}
}