单片机可控0-30V可调电源

发布者:LovingLife2023最新更新时间:2015-06-16 来源: 51hei关键字:单片机  可控  可调电源 手机看文章 扫描二维码
随时随地手机看文章
CPU电路图



显示电路


控制板电路图
 

程序
 #include                  // 包含型号头文件

//#include
#include                   // 包含"位"操作头文件
#include
#include
#include
#include
#include
#include

 
#define uchar unsigned char
#define uint  unsigned int

 
#define TRUE  1
#define FALSE 0

 
#define ad_Temp_flag  0x03          // 温度转换通道
#define ad_Vout_flag  0x04          // 电压转换通道
#define ad_Iout_flag  0x05          // 电流转换检测

 

 
#define FAN_ON    (PORTB_Bit3 = 1)  // FAN 开
#define FAN_OFF   (PORTB_Bit3 = 0)  // FAN 关

 
#define D1_ON     (PORTA_Bit0 = 0)  // D1 开
#define D1_OFF    (PORTA_Bit0 = 1)  // D1 关

 
#define D2_ON     (PORTA_Bit1 = 0)  // D2 开
#define D2_OFF    (PORTA_Bit1 = 1)  // D2 关

 
#define D3_ON     (PORTA_Bit2 = 0)  // D3 开
#define D3_OFF    (PORTA_Bit2 = 1)  // D3 关

 
#define D4_ON     (PORTB_Bit2 = 0)  // D4 开
#define D4_OFF    (PORTB_Bit2 = 1)  // D4 关

 
#define D5_ON     (PORTA_Bit6 = 0)  // D5 开
#define D5_OFF    (PORTA_Bit6 = 1)  // D5 关

 
#define D6_ON     (PORTA_Bit7 = 0)  // D6 开
#define D6_OFF    (PORTA_Bit7 = 1)  // D6 关

 
#define DATA164_ON  (PORTB_Bit1 = 1)   // 74HC164 DATA=1
#define DATA164_OFF (PORTB_Bit1 = 0)   // 74HC164 DATA=0

 
#define CLK164_ON   (PORTB_Bit0 = 1)   //
#define CLK164_OFF  (PORTB_Bit0 = 0)   //

 

 
#define Temp_out_lo 0x339            // -5℃ 41.56K  
#define Temp_out_hi 0x10e            // 50℃ 3.588K

 
uint   ad_Temp_result;               // 温度转换结果
uint   ad_Vout_result;               // 电压转换结果
uint   ad_Iout_result;               // 电流转换结果

 
uint   Vout_disp;
uint   Iout_disp;

 
uint   Iout_adj;

 
uchar  time_cnt1;
uchar  adc_get_flag;

 
//#pragma vector=0x10; 
//__interrupt void TIMER2_OVF_Server(void);

 
void mcu_init(void);                 // I/O初始化,PWM初始化
void adc_init(void);                 // ADC初始化
uint adc_get(uchar adc_ch);          // 启动AD转换,并返回转换值
void Vout_adc_get(void);             // 电压检测
void Temp_adc_get(void);             // 温度检测
void Iout_adc_get(void);             // 电流检测
//数码管显示代码定义 
__flash uchar disp_led[10] @0x0040 = 
  0x0a,                                 // '0' 
  0x7b,                                 // '1' 
  0x4c,                                 // '2' 
  0x58,                                 // '3' 
  0x39,                                 // '4' 
  0x98,                                 // '5' 
  0x88,                                 // '6' 
  0x5b,                                 // '7' 
  0x08,                                 // '8' 
  0x18,                                 // '9' 
};[page]
/******************************************************************************/
//延时函数  
void delay_1us(void)                 // 1us延时函数
{
  asm("nop");
}
void delay_nus(uchar n)              // N us延时函数
{
  for(;n>0;n--)
    {
      delay_1us();
    }
}
                                     // 内部晶振频率为8MHz
void delay_1ms(void)                 // 1ms延时函数
{
  uint i;
  for(i=1142;i>0;i--);               // 8*143-2
}  
void delay_nms(uchar n)              // N ms延时函数
{
  for(;n>0;n--)
    {
      asm("wdr");                    // 喂狗
      delay_1ms();
    }   
}
/*******************************************************************************
函数名:mcu_init()
作用:I/O初始化,PWM初始化
输入:无
返回值:无
*******************************************************************************/
void mcu_init(void)
  SREG  |= 0x80;                   // 全局中断使能
  DDRB   = 0x0f;                     // PB口全部为输出
  PORTB  = 0x04;                     // 初始化PB口
  DDRA   = 0xc7;                     // PA3,PA4,PA5为输入
  PORTA  = 0xc7;                     // 初始化PA口
  CLKPR  = 0x80;                     // CLKPCE=1 修改系统时钟分频使能
  CLKPR  = 0x00;                     // 1分频 
  TCCR1B = 0x00;                     // TIMER1停止计数
  TCNT1H = 0x40;                     // 初值高8位
  TCNT1L = 0x00;                     // 初值低8位
  TIMSK1_Bit0 = 1;                   // TIMER1使能
  D1_OFF;
  D2_OFF;
  D3_OFF;
  D4_OFF;
  D5_OFF;
  D6_OFF;
  TCCR1B = 0x01;                     // TIMER1开始计数,1分频       
}
/*******************************************************************************
函数名:adc_init()
作用:adc初始化
输入:无
返回值:无
*******************************************************************************/
void adc_init(void)
{
  ADCSRA = 0x00;                     // 设置前,先关闭ADC              
  ADMUX  = 0x00;                     // 选择外部VCC为基准,ADC0通道
  ADCSRB = 0x00;                     // AD转换结果左对齐,(10位)
                                     // 使能ADC,启动ADC单次转换,8分频
  ADCSRA = 0xc3;      
}
/*******************************************************************************
函数名:wdt_init()
作用:看门狗初始化
输入:无
返回值:无
*******************************************************************************/
void wdt_init(void)
{
  asm("wdr");                        // clr wdt
  WDTCSR=0x1f;
  WDTCSR=0x0f;                       // enable wdt,clk = 256,2S
/*******************************************************************************
函数名:adc_get(uchar adc_ch)
作用:启动AD转换,并返回转换值
输入:adc_ch (AD转换通道)
返回值:adddata
*******************************************************************************/
uint adc_get(uchar adc_ch)
{  
  uint addata=0;                     // AD转化初始数据为0
  uchar i;  
  asm("wdr");                        // 喂狗
  ADMUX  = adc_ch;                   // adc_ch为ADC通道选择
  for(i=10;i>0;i--)
    {
      ADCSRA_Bit6 = 1;               // 启动ADC转换
      while((ADCSRA & 0x10) == 0);   // 等待转换结束,ADIF=1
    }
  addata=ADCL;     // 读取低8位数据
  addata+=ADCH*256;     // 读取高2位数据
  return addata;     // 返回8位数据
}
/*******************************************************************************
函数名: Vout_adc_get()
作用:电池电压检测,检测20次求平均值
输入:无
返回值:无
*******************************************************************************/
void Vout_adc_get(void)
{  
  uchar n=0;
  ad_Vout_result=0;  
  asm("wdr");                        // 喂狗
  for(n=0;n<10;n++)
    {
      asm("wdr");                    // 喂狗
      ad_Vout_result += adc_get(ad_Vout_flag);
    }
  ad_Vout_result = ad_Vout_result/10; 
}  
/*******************************************************************************
函数名: Temp_adc_get()
作用:电池温度检测,检测20次求平均值
输入:无
返回值:无
*******************************************************************************/
void Temp_adc_get(void)
{
  uchar n=0;
  ad_Temp_result=0;
  asm("wdr");                        // 喂狗
  for(n=0;n<10;n++)
    {
      asm("wdr");                    // 喂狗
      ad_Temp_result += adc_get(ad_Temp_flag);
    }
  ad_Temp_result = ad_Temp_result/10;    
}
/*******************************************************************************
函数名: Iout_adc_get()
作用:电流检测,检测20次求平均值
输入:无
返回值:无
*******************************************************************************/
void Iout_adc_get(void)
{
  uchar n=0;
  ad_Iout_result=0;
  asm("wdr");                        // 喂狗
  for(n=0;n<10;n++)
    {
      asm("wdr");                    // 喂狗
      ad_Iout_result += adc_get(ad_Iout_flag);
    }
  ad_Iout_result = ad_Iout_result/10;    
}
/*******************************************************************************
函数名:Send_164_data()
作用:送164数据
输入:disp_data
返回值:无
*******************************************************************************/
void Send_164_data(uchar disp_data)
{
   uchar i;
   asm("wdr");                        // 喂狗
   CLK164_OFF;
   for(i=0;i<8;i++)
     {
       asm("wdr");                    // 喂狗
       if(disp_data&0x80)
         {
           DATA164_ON;
         }
       else
         {
           DATA164_OFF;
         }
       CLK164_ON;   
       disp_data<<=1;
       CLK164_OFF;
     }
}
/*******************************************************************************
函数名:disp_data_adc()
作用:显示数据处理
输入:无
返回值:无
*******************************************************************************/
void disp_data_adc(void)
{
   Vout_adc_get();
   Vout_disp = ad_Vout_result * 50;
   Vout_disp = Vout_disp / 128;
   Iout_adc_get();
   Iout_disp = ad_Iout_result * 50;
   Iout_disp = Iout_disp / 102;
   Iout_adj = (Vout_disp * 10) / 75;
   if((Iout_disp - Iout_adj) < 0x0fff)
     {      
       Iout_disp = Iout_disp - Iout_adj;
     }
   else
     {
       Iout_disp = 0;
     }
}   
/*******************************************************************************
函数名:delay()
作用:延时。。
输入:无
返回值:无
*******************************************************************************/
void delay(void)
{
   if(adc_get_flag == 0)
     {
       disp_data_adc();
       adc_get_flag=1;
     }
   else
     {
       delay_nms(20);    
     }
}    
/*******************************************************************************
函数名:display_led()
作用:数码管显示
输入:无
返回值:无
*******************************************************************************/
void display_led(void)
{
   asm("wdr");                        // 喂狗  
   Send_164_data(disp_led[Vout_disp  / 100]);
   D1_ON;
   delay();
   D1_OFF;
   Send_164_data(disp_led[(Vout_disp % 100) / 10] - 0x08);
   D2_ON;
   delay();
   D2_OFF;
   Send_164_data(disp_led[(Vout_disp % 100) % 10]);
   D3_ON;
   delay();
   D3_OFF;
   Send_164_data(disp_led[Iout_disp  / 100] - 0x08);
   D4_ON;
   delay();
   D4_OFF;
   Send_164_data(disp_led[(Iout_disp % 100) / 10]);
   D5_ON;
   delay();
   D5_OFF; 
   Send_164_data(disp_led[(Iout_disp % 100) % 10]);
   D6_ON;
   delay();
   D6_OFF;  
}
/*******************************************************************************
函数名: time1_ovf()
作用:TIMER1定时器中断服务程序,8M 50ms中断一次,4M 25ms中断一次
输入:无
返回值:无
*******************************************************************************/
#pragma vector=TIM1_OVF_vect 
__interrupt void time1_ovf(void) 
{
  TCNT1H = 0x40;
  TCNT1L = 0x00;
  asm("wdr");                        // 喂狗 
  time_cnt1++;
  if(time_cnt1==50)                  // 
    {
      asm("wdr");                    // 喂狗
      time_cnt1=0;
      adc_get_flag=0;
    }
}
/*******************************************************************************
主函数
*******************************************************************************/
void main(void)
{
  mcu_init();                        // 单片机初始化
  adc_init();                        // AD转换初始化
  wdt_init();                        // 看门狗初始化
  while(1)
    { 
      display_led();  
    }  
}

 MCU型号: AT Tiny24
功能说明:0-30V 可调电源  显示电压及电流
引脚说明;PA0/ADC0--D1 电压
          PA1/ADC1--D2 电压
          PA2/ADC2--D3 电压
          PA3/ADC3--RT
 PA4/ADC4--Vout
          PA5/ADC5--Iout
          PA6/ADC6--D5 电流
          PA7/ADC7--D6 电流
          PB2/    --D4 电流
          PB3/RESET--FAN
          PB1     --74HC164 DATA
          PB0     --74HC164 SCK
关键字:单片机  可控  可调电源 引用地址:单片机可控0-30V可调电源

上一篇:数码管显示STC89C54RD+DB18B20测温板
下一篇:一个改进型的4*4矩阵键盘扫描

推荐阅读最新更新时间:2024-03-16 14:03

Microchip推出全新低成本PIC32MX1/2/5系列32位单片机
最新PIC32MX1/2/5系列专为低成本应用设计,广泛适用于数字音频、蓝牙®、工业连接、USB和通用嵌入式控制等领域。 全球领先的整合单片机、混合信号、模拟器件和闪存专利解决方案的供应商——Microchip Technology Inc.(美国微芯科技公司)近日宣布推出全新低成本、高引脚数的32位PIC32单片机(MCU)系列产品。最新的PIC32MX1/2/5系列MCU结合了Microchip现有PICM32MX1/2与PIC32MX5系列MCU的主要特点,使得设计人员能够通过丰富的外设组合开发各类成本敏感型应用,这类应用往往需要以较低的成本实现复杂的代码和高度的功能集成。 全新PIC32MX1/
[单片机]
17-基于51单片机低频信号发生器
具体实现功能 系统由STC89C51/52+DAC0832模块+指示及按键模块+LM358模块+LCD1602显示模块+电源模块构成。 1、LCD1602显示波形种类和频率值(频率范围10-100HZ); 2、可以通过按键设置波形种类和设定频率步进值; 3、电位器可以改变振幅(0V-3.5V稳定); 4、可产生正弦波、锯齿波、三角波、矩形波; 5、四个指示灯可分别指示发出的波形。 设计背景 只要是能产生测试信号的仪器,都叫做信号源,也称做信号发生器,它广泛用在产生被测电路所需特定参数的电测试信号中。在测试、研究或者调整电子电路和设备时,为了测定电路的一些电参量,如测量频率响应、噪声系数,为了给电压表定度数等
[单片机]
17-基于51<font color='red'>单片机</font>低频信号发生器
基于C51系列单片机的交通控制系统设计
  0 引言   随着微控技术的日益完善和发展,单片机的应用不断走向深入。它的应用必定导致传统的控制技术从根本上发生变革。它在工业控制、数据采集、智能仪表、机电一体化、家用电器等领域得到广泛的应用,极大地提高了这些领域的技术水平和自动化控制。同时,伴随着我国经济的高速发展,私家车、公交车的增加,无疑会给我国的道路交通系统带来沉重的压力,很多大城市都不同程度地受到交通堵塞问题的困扰。为解决交通堵塞问题,采用AT89C51单片机为核心,与74LS86与74LS04组成特殊情况控制电路、七段数码管及LED组成显示电路,设计出以人性化、智能化为目的的交通灯控制系统,如遇特殊情况可人为控制交通从而解决交通堵塞的实际问题,整个电路简单,易于
[单片机]
基于C51系列<font color='red'>单片机</font>的交通控制系统设计
一种uIP TCP/IP协议栈在51系列单片机上的实现
 一 引言   随着信息技术的不断发展,以及人们对日常生活舒适度、方便度要求的提高,信息家电、智能仪表等产品越来越频繁的出现在我们的生活当中;人们也越来越热衷于把家电、仪表等设备连接到Internet 中,从而可以方便、及时的对它们进行远程察看、远程控制。把这些设备接入Internet ,就需要考虑TCP/IP 网络协议的实现。   51单片机是对目前所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8031单片机,后来随着Flash rom技术的发展,8031单片机取得了长足的进展,成为目前应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。目
[工业控制]
一种uIP TCP/IP协议栈在51系列<font color='red'>单片机</font>上的实现
STM32F1系列单片机的时钟系统
这是stm32的时钟系统,时钟与单片机的关系就好比心脏与人的关系一样,它为单片机的运行提供时间基准。STM32F1系列单片机的时钟树请看图1。 图1 STM32F1系列单片机的时钟树 我们将这个复杂的系统分成三个部分,第一个部分是时钟的输入,也就是时钟源。第二个部分是时钟的输出,也就是各种外设等应用模块。第三个部分就是连接输入与输出的枢纽,也就是锁相回路、分频器和倍频器等。请看图2. 图2 时钟系统的三个部分 STM32F1系列单片机有四个时钟源: 1.低速的内部时钟(LSI),它是一个RC振荡器,可以产生40KHz左右的时钟频率,供给独立看门狗或实时时钟使用。 (a) 低速的内部时钟(LSI) 2.低速的外部时钟(L
[单片机]
STM32F1系列<font color='red'>单片机</font>的时钟系统
展讯携紫潭可控安全解决方案回归
     集微网最新消息,紫光集团与展讯主办紫潭可控安全解决方案产业化汇报会即将于 2016 年 1 月 23 日在北京国家会议中心召开。本次会议的主题围绕“国产”和“安全”两个主题,从安全芯片,操作系统、生物识别和移动智能技术标准白皮书三个层面打造中国自主安全可控的国产移动智能终端设备。   据阿里移动安全统计数据显示,16 个行业的 top10 热门应用中,79.4% 的应用存在仿冒,平均每个应用的仿冒量高达 40 个,金融、购物等重点行业的仿冒情况也不容乐观。传统移动终端的保护方式难以实现彻底防护,更需要全面从手机+软件防护+私密数据单独存储的方式来解决问题。   展讯从“芯片设计”角度考量出发,认为真正“
[手机便携]
基于飞思卡尔MCU的AEC算法实现
0 引言 VoIP是在IP网络上实现音视频及传真信号传输的一门全新的集成业务数据网络技术。IP语音传输技术具有节省带宽、话费低,可方便地集成智能型开放体系结构以及多媒体业务等优势。但较之传统电话,其语音质量较差。事实上,影响因特网语音质量的因素是多方面的,关键因素之一是回声的影响。因此,要提高因特网的语音质量,就必须在语音传输过程中进行回声消除。AEC是基于自适应算法并可用于VoIP的声学回声消除技术。而用于AEC算法的实现与研究的硬件平台是以freescale公司的MCF5235为核心的开发板。MCF523x系列MCU是首个以带有增强型乘加运算单元(eMAC)的ColdFire V2内核为核心,该产品同时结合了增强型时序处理单
[应用]
基于51单片机的温控风扇
设计要求: 1.本设计基于STC89C51/52(与AT89S51/52、AT89C51/52通用,可任选)单片机 • 2.采用DS18B20温度传感器测温(0-99.9°C),三极管驱动数码管显示温度和风扇的档位。 • 3.共3个按键:设置、加、减。按一下设置可以设置上限,再按下设置下限,均可以按键加减调整。 • 4.利用PWM调速,当温度低于下限时,风扇不转动,当温度处于上、下限之间时1档转动(50%的转速),当温度超过上限时,全速转动。 使用说明: 一共3个按键:设置、加、减 按下设置键的时候才可以加减。 按一下设置键,是设置温度的上限,再按下设置键,是设置温度的下限,再按下设置键是退出并保存。 部分程序: #include
[单片机]
基于51<font color='red'>单片机</font>的温控风扇
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved