主页 > 手机  > 

基于STC12C5A60S2系列1T8051单片机的数模芯片DAC0832实现数模转换应用

基于STC12C5A60S2系列1T8051单片机的数模芯片DAC0832实现数模转换应用

基于STC12C5A60S2系列1T 8051单片的数模芯片DAC0832实现数模转换应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍数模芯片DAC0832介绍通过按键调节数模芯片DAC0832输出模拟量控制LED灯亮度

STC12C5A60S2系列1T 8051单片机管脚图

STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置

STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍

数模芯片DAC0832介绍

通过按键调节数模芯片DAC0832输出模拟量控制LED灯亮度

#include <stc12c5a60s2.h> #define uchar unsigned char//自定义无符号字符型为uchar #define uint unsigned int//自定义无符号整数型为uint #define DAC0832Data P0;//声明DAC0832数据变量为P0组端口 #define KeyPressDeshakeTime 10//自定义按键按下消抖时间为10ms #define KeyLongPressDelayTime 500//自定义按键长按延时时间为500ms #define KeyLongPressIntervalChangeTime 25//自定义按键长按间隔变化时间为25ms uchar AddKeyLockFlag;//声明增加按键锁定标志位变量 uchar DecKeyLockFlag;//声明减少按键锁定标志位变量 uchar KeyNumber = 0;//定义按键键值为0 uchar AddKeyLongPressAddIntervalTime;//声明增加按键长按连增间隔时间变量 uchar DecKeyLongPressDecIntervalTime;//声明减少按键长按连减间隔时间变量 uchar NumberValue;//声明数字量变量 uint AddKeyPressDelayTime;//声明增加按键按下延时时间变量 uint DecKeyPressDelayTime;//声明减少按键按下延时时间变量 //uint Timer0TimeCount;//声明定时器0定时计数变量 sbit AddKey = P2^0;//位定义增加按键为单片机P2.0引脚 sbit DecKey = P2^1;//位定义减少按键为单片机P2.1引脚 sbit DAC0832WR = P3^6;//位定义DAC0832读写变量为P3.6端口 sbit DAC0832CS = P2^7;//位定义DAC0832片选变量为P2.6端口 void DAC0832Change(uchar Data)//DAC0832转化函数 { DAC0832CS = 0;//DAC0832片选端口拉低电平 DAC0832WR = 0;//DAC0832读写端口拉低电平 DAC0832Data = Data;//数据变量包含的数据赋给DAC0832数据变量 DAC0832CS = 1;//DAC0832片选端口拉高电平 DAC0832WR = 1;//DAC0832读写端口拉高电平 } void KeyScan()//按键扫描函数 该函数放在定时器定时1ms的中断函数中扫描 { if(AddKey)//如果增加按键没按下或弹起 { AddKeyLockFlag = 0;//增加按键锁定标志位清0 AddKeyPressDelayTime = 0;//增加按键按下延时时间清0 } else if(!AddKeyLockFlag)//如果增加按键锁定标志位置1 即增加按键按下 { AddKeyPressDelayTime++;//增加按键按下延时时间自加 if(AddKeyPressDelayTime > KeyPressDeshakeTime)//如果增加按键按下延时时间大于按键按下消抖时间 { AddKeyPressDelayTime = 0;//增加按键按下延时时间清0 KeyNumber = 1;//按键键值置1 此处是单击增加 可赋给swicth()语句中的变量来对数值单击增加 AddKeyLockFlag = 1;//增加按键锁定标志位置1 } } else if(AddKeyPressDelayTime < KeyLongPressDelayTime)//如果增加按键按下延时时间小于按键长按延时时间 { AddKeyPressDelayTime++;//增加按键按下延时时间自加 } else//如果增加按键按下延时时间大于按键长按延时时间 { AddKeyLongPressAddIntervalTime++;//增加按键长按连增间隔时间自加 if(AddKeyLongPressAddIntervalTime > KeyLongPressIntervalChangeTime)//如果增加按键长按连增间隔时间大于按键长按间隔变化时间 { AddKeyLongPressAddIntervalTime = 0;//增加按键长按连增间隔时间清0 KeyNumber = 1;//按键键值置1 此处是连击增加 可赋给swicth()语句中的变量来对数值连击增加 } } if(DecKey)//如果减少按键没按下或弹起 { DecKeyLockFlag = 0;//减少按键锁定标志位清0 DecKeyPressDelayTime = 0;//减少按键按下延时时间清0 } else if(!DecKeyLockFlag)//如果减少按键锁定标志位置1 即减少按键按下 { DecKeyPressDelayTime++;//减少按键按下延时时间自加 if(DecKeyPressDelayTime > KeyPressDeshakeTime)//如果减少按键按下延时时间大于按键按下消抖时间 { DecKeyPressDelayTime = 0;//减少按键按下延时时间清0 KeyNumber = 2;//按键键值置2 此处是单击减少 可赋给swicth()语句中的变量来对数值单击减少 DecKeyLockFlag = 1;//减少按键锁定标志位置1 } } else if(DecKeyPressDelayTime < KeyLongPressDelayTime)//如果减少按键按下延时时间小于按键长按延时时间 { DecKeyPressDelayTime++;//减少按键按下延时时间自加 } else//如果减少按键按下延时时间大于按键长按延时时间 { DecKeyLongPressDecIntervalTime++;//减少按键长按连减间隔时间自加 if(DecKeyLongPressDecIntervalTime > KeyLongPressIntervalChangeTime)//如果减少按键长按连减间隔时间大于按键长按间隔变化时间 { DecKeyLongPressDecIntervalTime = 0;//减少按键长按连减间隔时间清0 KeyNumber = 2;//按键键值置2 此处是连击减少 可赋给swicth()语句中的变量来对数值连击减少 } } } void NumberValueSet()//数字量数值设置函数 { switch(KeyNumber)//按键类型筛选位 { case 1 ://增加按键单击、长按触发位 NumberValue++;//数字量数值自加 if(NumberValue > 255)//如果数字量数值大于255 为啥数字量数值变量NumberValue取255来比较?由于数字量数值变量NumberValue要计入DAC0832转换器 而DAC0832转换器是八位寄存器 最大只能计入255 因此数字量数值变量NumberValue取255来比较 { NumberValue = 255;//数字量数值等于255 } KeyNumber = 0;//按键键值清0 break;//跳出 case 2 ://减少按键单击、长按触发位 NumberValue--;//数字量数值自减 if(NumberValue < 0)//如果数字量数值小于0 { NumberValue = 0;//数字量数值清0 } KeyNumber = 0;//按键键值清0 break;//跳出 default:break;//跳出 } } /*****关于8051系列单片机定时器溢出率和定时器初值(定时计数初值)之间计算的知识点*****/ /**** 一、定时器溢出率计算公式 1、定时器溢出率:定时器每秒溢出的次数 2、定时器溢出率计算公式表 定时方式 分频方式 公式 方式1:16位定时器 12分频(即12T 默认值) Ft=晶振频率/12/(65536-定时器初值) 方式2:8位定时器 12分频(即12T 默认值) Ft=晶振频率/12/(256-定时器初值) 方式1:16位定时器 1分频(即1T) Ft=晶振频率/1/(65536-定时器初值) 方式2:8位定时器 1分频(即1T) Ft=晶振频率/1/(256-定时器初值) 二、定时器初值(定时计数初值)计算公式 定时方式 分频方式 公式 方式1:16位定时器 12分频(即12T 默认值) 定时器初值(定时计数)=65536-晶振频率/12*定时时间 方式2:8位定时器 12分频(即12T 默认值) 定时器初值(定时计数)=256-晶振频率/12*定时时间 方式1:16位定时器 1分频(即1T) 定时器初值(定时计数)=65536-晶振频率*定时时间 方式2:8位定时器 1分频(即1T) 定时器初值(定时计数)=256-晶振频率*定时时间 ****/ void Timer0Init()//定时器0的16位定时模式1用12分频定时1ms初始化函数 晶振为12MHz { AUXR &= 0x7f;//设定定时器/计数器模式为12T TMOD &= 0xf0;//设定定时器/计数器工作模式清0 TMOD |= 0x01;//设定定时器/计数器为定时器 工作模式为16位定时器0模式1 TH0 = 0xfc;//设定定时器0高8位初值 TL0 = 0x18;//设定定时器0低8位初值 TF0 = 0;//定时器0溢出中断标志位清0 ET0 = 1;//打开定时器中断开关 EA = 1;//打开定时器中断总开关 TR0 = 1//打开定时器0开关 } void Timer0() interrupt 1//定时器0的16位定时模式1用12分频定时1ms中断函数 晶振为12MHz { TR0 = 0;//关定时器0开关 /**** Timer0TimeCount++;//定时器0定时计数自加 if(Timer0TimeCount >= 10)//10ms时间到 { Timer0TimeCount = 0;//定时器0定时计数清0 DAC0832Change(NumberValue);//DAC0832转化函数 } ****/ KeyScan();//按键扫描函数 TH0 = 0xfc;//设定定时器0高8位初值 TL0 = 0x18;//设定定时器0低8位初值 TR0 = 1;//开定时器0开关 } void main()//主函数 { Timer0Init();//定时器0的16位定时模式1用12分频定时1ms初始化函数 晶振为12MHz NumberValueSet();//数字量数值设置函数 while(1)//主循环 { DAC0832Change(NumberValue);//DAC0832转化函数 } }
标签:

基于STC12C5A60S2系列1T8051单片机的数模芯片DAC0832实现数模转换应用由讯客互联手机栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“基于STC12C5A60S2系列1T8051单片机的数模芯片DAC0832实现数模转换应用