实例介绍
【实例简介】PWM模拟实现DAC ,并用LCD1602显示设定值和PWM_DAC电压的实测值
【文件目录】
PWM模拟DAC转换功能测试(LCD显示)
├── 4X4键盘驱动
│ ├── 4x4KEY.c
│ └── 4x4KEY.h
├── GPIO驱动
│ ├── GPIO.c
│ └── GPIO.h
├── LCD1602驱动
│ ├── LCD1602.h
│ └── lcd1602.c
├── PWM模拟实现DAC功能测试.plg
├── PWM模拟实现DAC功能测试.uvopt
├── PWM模拟实现DAC功能测试.uvproj
├── PWM模拟实现DAC功能测试_uvopt.bak
├── PWM模拟实现DAC功能测试_uvproj.bak
├── STARTUP.A51
├── STARTUP.LST
├── STC15内部ADC驱动
│ ├── ADC.c
│ └── ADC.h
├── STC15硬件PWM驱动
│ ├── STC15W4KPWM.C
│ └── STC15W4KPWM.H
├── STC15头文件
│ └── STC15Fxxxx.H
├── STC15时钟配置
│ └── config.h
├── main.c
├── output
│ ├── 4x4KEY.lst
│ ├── 4x4KEY.obj
│ ├── ADC.lst
│ ├── ADC.obj
│ ├── GPIO.lst
│ ├── GPIO.obj
│ ├── Interrupt.lst
│ ├── Interrupt.obj
│ ├── PWM模拟实现DAC功能测试
│ ├── PWM模拟实现DAC功能测试.hex
│ ├── PWM模拟实现DAC功能测试.lnp
│ ├── PWM模拟实现DAC功能测试.m51
│ ├── PWM模拟实现DAC功能测试.plg
│ ├── STARTUP.lst
│ ├── STARTUP.obj
│ ├── STC15W4KPWM.lst
│ ├── STC15W4KPWM.obj
│ ├── delay.lst
│ ├── delay.obj
│ ├── lcd1602.lst
│ ├── lcd1602.obj
│ ├── main.lst
│ └── main.obj
├── 中断驱动
│ ├── Interrupt.c
│ └── Interrupt.h
└── 软件延时
├── delay.c
└── delay.h
10 directories, 47 files
【核心代码】
void main(){
u8 i=6,tmepbuf[4];
u8 dactemp=20;//DAC电压初始值为2.0V
ADC_InitTypeDef *ADCInit1;
ADCInit1-> ADC_Px = ADC_P14|ADC_P15;
ADCInit1->ADC_Speed=ADC_180T;
ADCInit1->ADC_Power=DISABLE;
ADCInit1->ADC_AdjResult=ADC_RES_H2L8;
ADCInit1->ADC_Polity=PolityLow;
ADCInit1->ADC_Interrupt =DISABLE;
ADC_Inilize(ADCInit1);
ADC_PowerControl(ENABLE);
//pinMode(61,HighZ);//初始化P15ADC引脚为输入的端口
P1M0 &=0XDF;
P1M1 |=0X20; // P1.5口ADC输入
PWM6_Init();
Beep_PortInit();//初始化蜂鸣器的端口
Lcd1602_PortInit(); //初始化LCD1602端口
key4x4_PortInit();
Lcd1602Set(); //设置LCD
LcdShowStr(0,0,"PWM_DAC test....",16);
LcdShowStr(0,1,"SET:2.0V DAC: ",16);
Timer2_attachInterrupt(1,0);//定时器T2定时周期为50uS,用于PWM2的时钟信号
Timer2_detachInterrupt();
Timer0_attachInterrupt(2000,0);//定时器T0定时周期为2MS,用于显示和按键扫描
EA=1;//开启总中断
PWM6_Control(200);
delay_ms(600);
while(1)
{
if(keynum==1) //K1按键设定DAC电压 加1;
{
keynum=0;
dactemp =1;
if(dactemp>50)
dactemp=50;
tmepbuf[0]=((dactemp/10)%10) 0x30;
tmepbuf[1]='.';
tmepbuf[2]= (dactemp)%10 0x30;
tmepbuf[3]='\n';
LcdShowStr(4,1,tmepbuf,3);
}
if(keynum==2) //K2按键设定DAC电压,减1
{
keynum=0;
if(dactemp>5)
dactemp-=1;
tmepbuf[0]=((dactemp)/10)%10 0x30;
tmepbuf[1]='.';
tmepbuf[2]=(dactemp)%10 0x30;
tmepbuf[3]='\n';
LcdShowStr(4,1,tmepbuf,3);
}
if(Flag_100ms==1) //每100MS测量次电压值
{
Flag_100ms=0;
Disp_ADC();
}
PWM6_Control(dactemp*10);//PWM_DAC输出设定的电压
}
}
/* 整型数转换为字符串,str-字符串指针,dat-待转换数,返回值-字符串长度 */
unsigned char IntToString(unsigned char *str, int dat)
{
signed char i = 0;
unsigned char len = 0;
unsigned char buf[6];
if (dat < 0) //如果为负数,首先取绝对值,并在指针上添加负号
{
dat = -dat;
*str = '-';
len ;
}
do { //先转换为低位在前的十进制数组
buf[i ] = dat % 10;
dat /= 10;
} while (dat > 0);
len = i; //i最后的值就是有效字符的个数
while (i-- > 0) //将数组值转换为ASCII码反向拷贝到接收指针上
{
*str = buf[i] '0';
}
*str = '\0'; //添加字符串结束符
return len; //返回字符串长度
}
/*
函数功能:把字符型数换成字符串
*/
//void CharToString1(unsigned char *string1,unsigned char dat1)
//{
//
//string1[0]=dat1/100 '0';
//string1[1]=(dat1/10)%10 '0';
//string1[2]=dat1%10 '0';
//string1[3]='\0';
//}
void Disp_ADC()
{
u8 i=0,len=0;
u8 tempbuf[6];
u16 ADC_Temp=0;
LcdShowStr(13,1," ",3);
for(i=0;i<20;i ) //20次求平均值才达到稳定电压的效果
{
ADC_Temp =Get_ADC10bitResult(ADC_CH5);
}
ADC_Temp /= 20;
len=IntToString(tempbuf,ADC_Temp);
ADC_Temp =ADC_Temp*10*5.0/1024;
tempbuf[0]=ADC_Temp/10 '0';
tempbuf[1]='.';
tempbuf[2]=ADC_Temp%10 '0';
tempbuf[3]='\n';
LcdShowStr(13,1,tempbuf,3);
}
void Beep_PortInit(void)
{
P4M0=0X00;
P4M1=0X00;
BEEP=1;
}
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论