基于STC12C5A60S2系列1T 8051单片机的SPI总线器件数模芯片TLC5615实现数模转换应用

基于STC12C5A60S2系列1T 8051单片的SPI总线器件数模芯片TLC5615实现数模转换应用

  • STC12C5A60S2系列1T 8051单片机管脚图
  • STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置
  • STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍
  • SPI总线器件数模芯片TLC5615介绍
    • 通过按键调节SPI总线器件数模芯片TLC5615输出模拟量控制LED灯亮度

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

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

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

SPI总线器件数模芯片TLC5615介绍

通过按键调节SPI总线器件数模芯片TLC5615输出模拟量控制LED灯亮度

javascript 复制代码
#include <stc12c5a60s2.h>
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint 
#define KeyPressDeshakeTime 10//自定义按键按下消抖时间为10ms
#define KeyLongPressDelayTime 500//自定义按键长按延时时间为500ms
#define KeyLongPressIntervalChangeTime 25//自定义按键长按间隔变化时间为25ms
uchar AddKeyLockFlag;//声明增加按键锁定标志位变量
uchar DecKeyLockFlag;//声明减少按键锁定标志位变量
uchar KeyNumber = 0;//定义按键键值为0
uchar AddKeyLongPressAddIntervalTime;//声明增加按键长按连增间隔时间变量
uchar DecKeyLongPressDecIntervalTime;//声明减少按键长按连减间隔时间变量
uint NumberValue;//声明数字量变量
uint AddKeyPressDelayTime;//声明增加按键按下延时时间变量
uint DecKeyPressDelayTime;//声明减少按键按下延时时间变量
//uint Timer0TimeCount;//声明定时器0定时计数变量
sbit AddKey = P2^0;//位定义增加按键为单片机P2.0引脚
sbit DecKey = P2^1;//位定义减少按键为单片机P2.1引脚
sbit TLC5615CS = P1^0;//位定义TLC5616片选变量为P1.0端口
sbit TLC5615SCLK = P1^1;//位定义TLC5616时钟变量为P1.1端口
sbit TLC5615DIN = P1^2;//位定义TLC5616数字变量为P1.2端口
 void TLC5616Change(uint Data)//TLC5616转化函数
{
  uchar i;//声明循环变量
  Data << = 6;//数据变量左移6位 为啥?由于数模芯片TLC5616选高位在前低位在后16位数据输入模式 而数模芯片TLC5616是10位ADC 因此数模芯片TLC5616的16位数据要左移6位取其中10位做为高位来传输数据 其他位补0
  TLC5615SCLK = 0;//TLC5616时钟端口拉低电平
  TLC5615CS = 0;//TLC5615片选端口拉低电平
  for(i = 0;i < 12;i++)//为啥取12?由于数模芯片TLC5616不作级联 即不连接另外一个数模芯片TLC5616 选高位在前低位在后12位数据输入模式
 {  
   TLC5615DIN = (bit)(Data & 0x8000);//取输入数模芯片TLC5616的16位数据中高10位数据某一位赋给数模芯片TLC5616数字变量 输入到数模芯片TLC5616的DIN引脚
   TLC5615SCLK = 1;//TLC5616时钟端口拉高电平
   Data << = 1;//输入数模芯片TLC5616的16位数据在循环变量i每循环一次就左移一位 取到不同位数的数据 用于下次一位一位取出数模芯片TLC5616的16位数据当中10位数据的每一位 输入到数模芯片TLC5616的DIN引脚
   TLC5615SCLK = 0;//TLC5616时钟端口拉低电平
  }
  TLC5615SCLK = 0;//TLC5616时钟端口拉低电平
  TLC5615CS = 1;//TLC5615片选端口拉高电平
 }
 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 > 1023)//如果数字量数值大于1023 为啥数字量数值变量NumberValue取1023来比较?由于数字量数值变量NumberValue要计入TLC5616转换器 而TLC5616转换器是十位寄存器 最大只能计入1023 因此数字量数值变量NumberValue取1023来比较
          {
            NumberValue = 1023;//数字量数值等于1023
           }
           KeyNumber = 0;//按键键值清0
           break;//跳出
   case 2 ://减少按键单击、长按触发位
           NumberValue--;//数字量数值自减
           if(NumberValue < 0)//如果数字量数值小于0
          {
            NumberValue = 0;//数字量数值清0
           }
           KeyNumber = 0;//按键键值清0
           break;//跳出
   default:break;//跳出
  }
 }
 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
   TLC5616Change(NumberValue);//TLC5616转化函数 
  }
  ***/
  KeyScan();//按键扫描函数
  TH0 = 0xfc;//设定定时器0高8位初值
  TL0 = 0x18;//设定定时器0低8位初值
  TR0 = 1;//开定时器0开关
 } 
 void main()//主函数
{
  Timer0Init();//定时器0的16位定时模式1用12分频定时1ms初始化函数 晶振为12MHz
  NumberValueSet();//数字量数值设置函数
  while(1)//主循环
 {
   TLC5616Change(NumberValue);//TLC5616转化函数 
  }
 } 
相关推荐
IT_阿水2 分钟前
RA-Eco-RA4M2之RTC电子钟
单片机·嵌入式硬件·实时音视频
侯小啾2 小时前
【03】C语言 强制类型转换 与 进制转换
c语言·数据结构·算法
云知谷3 小时前
【经典书籍】C++ Primer 第15章类虚函数与多态 “友元、异常和其他高级特性” 精华讲解
c语言·开发语言·c++·软件工程·团队开发
清风6666664 小时前
基于单片机的水塔液位检测与智能调节报警系统设计
数据库·单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
某zhuan5 小时前
STM32中PB4引脚作普通GPIO使用的一个小问题
stm32·单片机·嵌入式硬件
蓝天居士6 小时前
PY32F040单片机介绍(2)
单片机·国产mcu
点灯小铭8 小时前
基于单片机的人体红外传感的步进电机调速自动门智能控制系统设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
一月千帆8 小时前
STM32 串口 Bootloader 固件升级方案实现
stm32·单片机·嵌入式硬件
czy87874759 小时前
用C语言实现代理模式
c语言·代理模式
朱嘉鼎9 小时前
GPIO引脚操作方法概述
单片机·嵌入式硬件