?? main.c
字號:
//太陽能帽子 AVR驅(qū)動程序 2MHZ內(nèi)部標定時鐘 快速定位雙PWM 恢復(fù)值50
//2007年4月10
//溶絲位 時鐘 0010
#include"avr/io.h"
#include"avr/iom48.h"
#include"avr/signal.h"
#include "ad.h"
#include"avr/interrupt.h"
void yanshi(unsigned int x)
{
unsigned int y;
for(y=0;y<x;y++);
}
void shengyin(unsigned char x)
{
unsigned char cishu=0,fengs=0;
unsigned int changdu=0;
OCR1B=45;
fengs=OCR1A;
OCR1A=50;//關(guān)閉風扇
for(cishu=0;cishu<x;cishu++)
{
for(changdu=0;changdu<600;changdu++)
{
yanshi(31);
PORTD^=32; //聲音
}
yanshi(40000);
}
OCR1A=fengs;//重新啟動風扇
}
unsigned char tem=0,tem10=0,tem100=0,tem1000=0;
unsigned char x=0;
SIGNAL(SIG_OVERFLOW0) //TO中斷服務(wù)程序
{
TCNT0=255-10; // 10MS
tem=1;
}
/*
SIGNAL(SIG_OVERFLOW2) //T2中斷服務(wù)程序
{
}
SIGNAL(SIG_UART_RECV) //接收中斷
{
}
SIGNAL(SIG_UART_TRANS) //發(fā)送完成中斷
{
}
*/
void chushi(void)
{
CLKPR=128;
CLKPR=2;
WDTCSR=0B00011000;//KANMENGOU
WDTCSR=0B00101000;//4sKANMENGOU 啟動看門狗 4秒方式
asm("WDR");
DDRB=6; //pb =in 無上拉
PORTB=255-6;
DDRD=48; //5 4 =OUT 3 2 =IN
PORTD=255-32-16; //3 2 上拉
DDRC=0; //ADC
PORTC=255-3;
// 初始化PWM //
//==============================================================//
//TCCR1A 7 6 5 4 3 2 1 0//
// 7:6通道A比較輸出模式 快速PWM模式 00普通斷口 01取反 10匹配清零輸出TOP恢復(fù) 11。。。
// 5:4通道B比較輸出模式
// 3:2AB通道強制匹配輸出
// 1:0 WGM11 WGM10 控制序列與TCCR1B中的 3:2 組合
//模式 WGM13 WGM12 WGM11 WGM10 定時器/計數(shù)器工作模式 計數(shù)器上限TOP //
//0 0 0 0 0 普通模式 0XFFFF
//1 0 0 0 1 8位相位修正PWM 0XFF
//2 0 1 0 0 TCT OCR1A
// 0 1 0 1 8位快速PWM 0XFF
// 1 1 1 0 快速PWM ICR1
TCCR1A=242; //AB輸出方式為匹配拉高 非匹配強制方式 快速PWM方式ICR1定義方式
TCCR1B=25; //AB輸出工作于快速PWM方式ICR1定義 時鐘源S/1
ICR1=50; //定義TOP數(shù)值
OCR1A=50;
OCR1B=45;//啟動即可開始進行變換 用來給CPU提供電能
//===================//初始化AD轉(zhuǎn)換器
ADMUX=0B01000000; //AD工作于AVCC基準電壓狀態(tài) 同時設(shè)定AD0狀態(tài) 數(shù)據(jù)是右對齊方式
//BIT 4-0 決定選擇的AD位 0-7 代表AD0-AD7
ADCSRA=0B11000010; //啟動AD,進入轉(zhuǎn)換方式 工作于非中斷方式 分頻為S/4
//BIT6為轉(zhuǎn)換完成標志 通過查詢而進行讀取 寫1開始進行轉(zhuǎn)換 變成0標志完成轉(zhuǎn)變
//BIT4為轉(zhuǎn)換完成標志 通過查詢而進行讀取 變成1表示完成變換 須用軟件寫1來完成清除標志
//初始化定時器T2
//=======================================================//
// TCCR2=7; //T2 1024分頻
// TCNT0=55; // 1/20s
// TIMSK=1<<6; //準許T2中斷bit6
/*
//初始化 UCSRB=216; //允許串口發(fā)送和接收,并響應(yīng)接收完成中斷
UBRRL= 103; //設(shè)置串口波特率為4800
UCSRC= ((1<<URSEL)+(1<<UCSZ1)+(1<<UCSZ0)); //幀結(jié)構(gòu)為8位數(shù)據(jù)+1位stop位
*/
//初始化T0
TCCR0B=5; //TO 1024分頻
TCNT0=78; //
TIMSK0|=1; //準許TO中斷
SREG|=1<<7;
}
unsigned int ADDATA[5];
void pwmjia(void)
{
if(OCR1B<=5)
OCR1B=5;
else
OCR1B-=1;
}
void pwmjian(void)
{
if(OCR1B<50)
OCR1B+=1;
}
unsigned char shan1=0;
void shan(unsigned char x1,unsigned char x2)//閃爍次數(shù) 閃爍間隔總長度
{
shan1+=1;
if(shan1>=x2)
{shan1=0;
}
if(x1==1) //閃爍一次
{
if(shan1==2)
PORTD|=16;
else
PORTD&=255-16;
}
else
{
if(shan1==2||shan1==4)
{
PORTD|=16;
}
else
{
PORTD&=255-16;
}
}
}
unsigned char keyjz=0,keyys=0,dianyad=0,yici=0;
unsigned char ledshan=0,ledkz=0,dianya=0;
//充電閃爍狀態(tài) =0充電總 =1充電完成滿
//LED閃爍狀態(tài) =0充電指示狀態(tài) =1非充電閃爍狀態(tài)
//dianya =1 低壓狀態(tài) =2 充滿狀態(tài)
int main(void)
{
chushi();
for(;;) //事實程序在這里面循環(huán)
{
if(tem)
{
tem=0;
/*
ADMUX=0B01000001;
//ADCSRA=0B11000010;
ADCSRA|=16+64+128; //清除完成標志 同時啟動轉(zhuǎn)換開始
for(;(ADCSRA&16)==0;);
ADDATA[1]=ADC;
ADMUX=0;
ADCSRA=0;
ADMUX=0B01000000;
//ADCSRA=0B11000010;
ADCSRA|=16+64+128; //清除完成標志 同時啟動轉(zhuǎn)換開始
for(;(ADCSRA&16)==0;);
ADDATA[0]=ADC;
ADMUX=0;
ADCSRA=0;
*/
tem100+=1;
if(tem100>19)
{tem100=0;
//100ms
tem1000+=1;
if(tem1000>=10)
{//節(jié)拍1000
tem1000=0;
//1000ks
if(yici==0)
{
yici=1;
shengyin(2); //開機兩聲
}
asm("WDR");
}//節(jié)拍1000END
//100ms
if(OCR1B<50)
{
ledkz=0; //指示充電的狀態(tài)
}
else
{
ledkz=1;
}
if(ADDATA[1]>630) //表示電池電壓高
{
ledkz=0;//充滿電后顯示充滿
dianya=1;
}
else
{
if(ADDATA[1]<620)dianya=0;//3.95v 表示電池電壓低
}
if(ledkz)
{//非充電指示
if(OCR1A<50)
shan(2,30);
else
shan(1,30);
}
else
{//充電指示
if(dianya)
{
shan(2,10);
}
else
{
shan(1,10);
}
}
//===============================鍵盤
if(!(PIND&4)&&(keyjz==0))//+
{
shengyin(1);
keyjz=1;
OCR1A-=5;
if(OCR1A>=40)OCR1A=40; //最小功率控制
if(OCR1A<6)
{
OCR1A=50;
shengyin(2);//停機帶有兩個聲音
}
}
if(!(PIND&8)&&(keyjz==0))//-
{
shengyin(1);
keyjz=1;
OCR1A+=5;
if(OCR1A==55)
{
OCR1A=10;
}
if(OCR1A>41)
{
OCR1A=50;
shengyin(2);//停機帶有兩個聲音
}
}
if((PIND&12)==12)keyjz=0;
if((ADDATA[1]<540)&&(OCR1A<40))//電池電壓低到這里進行將功率處理
{
OCR1A=40;
shengyin(2);
}
if((ADDATA[1]<530)&&(OCR1A<50))//電池電壓低到這里進行將功率處理
{
dianyad+=1;
if(dianyad>10)
{
OCR1A=50;
shengyin(3);
}
}
else
{
dianyad=0;
}
//100msEND
}
//10ms
//10msend
}
AD(&ADDATA[0]);
//自動電壓電流調(diào)節(jié)
if(ADDATA[1]<630) //651=2.1v 電池電壓檢測 電池沒有充電滿則繼續(xù)沖 否則禁止功率輸出
{
if(ADDATA[0]>465)//465 = 1.5v
{
pwmjia();
}
else
{
if(ADDATA[0]<460)
{
pwmjian();
}
}
}
else
{
pwmjian();
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -