久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

單片機(jī)可控0-30V可調(diào)電源

作者:佚名   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2013年11月13日   【字體:

CPU電路圖


顯示電路


控制板電路圖
 

程序
 
#include <iotiny24.h>                  // 包含型號(hào)頭文件

//#include <iot24v.h>
#include <iomacro.h>                   // 包含"位"操作頭文件
#include <ctype.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>

 
#define uchar unsigned char
#define uint  unsigned int

 
#define TRUE  1
#define FALSE 0

 
#define ad_Temp_flag  0x03          // 溫度轉(zhuǎn)換通道
#define ad_Vout_flag  0x04          // 電壓轉(zhuǎn)換通道
#define ad_Iout_flag  0x05          // 電流轉(zhuǎn)換檢測

 

 
#define FAN_ON    (PORTB_Bit3 = 1)  // FAN 開
#define FAN_OFF   (PORTB_Bit3 = 0)  // FAN 關(guān)

 
#define D1_ON     (PORTA_Bit0 = 0)  // D1 開
#define D1_OFF    (PORTA_Bit0 = 1)  // D1 關(guān)

 
#define D2_ON     (PORTA_Bit1 = 0)  // D2 開
#define D2_OFF    (PORTA_Bit1 = 1)  // D2 關(guān)

 
#define D3_ON     (PORTA_Bit2 = 0)  // D3 開
#define D3_OFF    (PORTA_Bit2 = 1)  // D3 關(guān)

 
#define D4_ON     (PORTB_Bit2 = 0)  // D4 開
#define D4_OFF    (PORTB_Bit2 = 1)  // D4 關(guān)

 
#define D5_ON     (PORTA_Bit6 = 0)  // D5 開
#define D5_OFF    (PORTA_Bit6 = 1)  // D5 關(guān)

 
#define D6_ON     (PORTA_Bit7 = 0)  // D6 開
#define D6_OFF    (PORTA_Bit7 = 1)  // D6 關(guān)

 
#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;               // 溫度轉(zhuǎn)換結(jié)果
uint   ad_Vout_result;               // 電壓轉(zhuǎn)換結(jié)果
uint   ad_Iout_result;               // 電流轉(zhuǎn)換結(jié)果

 
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);          // 啟動(dòng)AD轉(zhuǎn)換,并返回轉(zhuǎn)換值
void Vout_adc_get(void);             // 電壓檢測
void Temp_adc_get(void);             // 溫度檢測
void Iout_adc_get(void);             // 電流檢測
//數(shù)碼管顯示代碼定義 
__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' 
};
/******************************************************************************/
//延時(shí)函數(shù)  
void delay_1us(void)                 // 1us延時(shí)函數(shù)
{
  asm("nop");
}
void delay_nus(uchar n)              // N us延時(shí)函數(shù)
{
  for(;n>0;n--)
    {
      delay_1us();
    }
}
                                     // 內(nèi)部晶振頻率為8MHz
void delay_1ms(void)                 // 1ms延時(shí)函數(shù)
{
  uint i;
  for(i=1142;i>0;i--);               // 8*143-2
}  
void delay_nms(uchar n)              // N ms延時(shí)函數(shù)
{
  for(;n>0;n--)
    {
      asm("wdr");                    // 喂狗
      delay_1ms();
    }   
}
/*******************************************************************************
函數(shù)名: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 修改系統(tǒng)時(shí)鐘分頻使能
  CLKPR  = 0x00;                     // 1分頻 
  TCCR1B = 0x00;                     // TIMER1停止計(jì)數(shù)
  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開始計(jì)數(shù),1分頻       
}
/*******************************************************************************
函數(shù)名:adc_init()
作用:adc初始化
輸入:無
返回值:無
*******************************************************************************/
void adc_init(void)
{
  ADCSRA = 0x00;                     // 設(shè)置前,先關(guān)閉ADC              
  ADMUX  = 0x00;                     // 選擇外部VCC為基準(zhǔn),ADC0通道
  ADCSRB = 0x00;                     // AD轉(zhuǎn)換結(jié)果左對(duì)齊,(10位)
                                     // 使能ADC,啟動(dòng)ADC單次轉(zhuǎn)換,8分頻
  ADCSRA = 0xc3;      
}
/*******************************************************************************
函數(shù)名:wdt_init()
作用:看門狗初始化
輸入:無
返回值:無
*******************************************************************************/
void wdt_init(void)
{
  asm("wdr");                        // clr wdt
  WDTCSR=0x1f;
  WDTCSR=0x0f;                       // enable wdt,clk = 256,2S
/*******************************************************************************
函數(shù)名:adc_get(uchar adc_ch)
作用:啟動(dòng)AD轉(zhuǎn)換,并返回轉(zhuǎn)換值
輸入:adc_ch (AD轉(zhuǎn)換通道)
返回值:adddata
*******************************************************************************/
uint adc_get(uchar adc_ch)
{  
  uint addata=0;                     // AD轉(zhuǎn)化初始數(shù)據(jù)為0
  uchar i;  
  asm("wdr");                        // 喂狗
  ADMUX  = adc_ch;                   // adc_ch為ADC通道選擇
  for(i=10;i>0;i--)
    {
      ADCSRA_Bit6 = 1;               // 啟動(dòng)ADC轉(zhuǎn)換
      while((ADCSRA & 0x10) == 0);   // 等待轉(zhuǎn)換結(jié)束,ADIF=1
    }
  addata=ADCL;     // 讀取低8位數(shù)據(jù)
  addata+=ADCH*256;     // 讀取高2位數(shù)據(jù)
  return addata;     // 返回8位數(shù)據(jù)
}
/*******************************************************************************
函數(shù)名: 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; 
}  
/*******************************************************************************
函數(shù)名: 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;    
}
/*******************************************************************************
函數(shù)名: 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;    
}
/*******************************************************************************
函數(shù)名:Send_164_data()
作用:送164數(shù)據(jù)
輸入: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;
     }
}
/*******************************************************************************
函數(shù)名:disp_data_adc()
作用:顯示數(shù)據(jù)處理
輸入:無
返回值:無
*******************************************************************************/
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;
     }
}   
/*******************************************************************************
函數(shù)名:delay()
作用:延時(shí)。。
輸入:無
返回值:無
*******************************************************************************/
void delay(void)
{
   if(adc_get_flag == 0)
     {
       disp_data_adc();
       adc_get_flag=1;
     }
   else
     {
       delay_nms(20);    
     }
}    
/*******************************************************************************
函數(shù)名:display_led()
作用:數(shù)碼管顯示
輸入:無
返回值:無
*******************************************************************************/
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;  
}
/*******************************************************************************
函數(shù)名: time1_ovf()
作用:TIMER1定時(shí)器中斷服務(wù)程序,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;
    }
}
/*******************************************************************************
主函數(shù)
*******************************************************************************/
void main(void)
{
  mcu_init();                        // 單片機(jī)初始化
  adc_init();                        // AD轉(zhuǎn)換初始化
  wdt_init();                        // 看門狗初始化
  while(1)
    { 
      display_led();  
    }  
}

 MCU型號(hào): AT Tiny24
功能說明:0-30V 可調(diào)電源  顯示電壓及電流
引腳說明;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
關(guān)閉窗口

相關(guān)文章

主站蜘蛛池模板: 国产三区av| 国产黄色小视频在线观看 | 日韩欧美一区二区三区免费观看 | 黄色一级特级片 | 日日摸日日碰夜夜爽2015电影 | 久久骚 | 国产精品久久久久久久久久免费看 | 小h片免费观看久久久久 | 欧美天堂| 日韩一区在线播放 | 国产1区2区3区 | 91精品国产手机 | 国产在线麻豆精品入口 | 国产一区二区自拍 | 久久狠狠 | 日本免费一区二区三区 | 福利社午夜影院 | 亚洲xx在线 | 国产极品车模吞精高潮呻吟 | 青青草精品 | 黄网免费 | 日日干日日操 | 欧美日韩电影一区二区 | 免费黄色录像片 | 日操操夜操操 | 久久99精品久久久久久 | 国产一级精品毛片 | 久久久高清 | 国产91精品久久久久久久网曝门 | 午夜视频一区二区 | 成人午夜免费福利视频 | 2022精品国偷自产免费观看 | 国产精品美女久久久久aⅴ国产馆 | 99tv成人影院 | 一区二区av| 日韩一区二区在线播放 | 国产精品18hdxxxⅹ在线 | 国产精品美女久久久久久免费 | 免费一级片 | 精品福利一区二区三区 | 成人在线精品视频 |