Список разработок админа: генераторы сигналов,
счетчики частоты, осциллограф, любые модификации
термометров, инкубатор, дозатор сырья, блок обработки
и передачи информации на компьютер, станок для заточки
пил, кожемер, универсальный дешифратор для токарного
станка, кодовый замок, 1 проводная клавиатура, мультиметр и
информационный блок для автомобиля.
Все это вы можете заказать у нас или выслать нам свою идею для реализации.
_____________________________________________________________
Термометр на atmega8 со множеством датчиков, два дисплея выводят температуру датчиков и их порядковый номер
Код проекта в CODEVISION AVR
/*****************************************************
Chip type : ATmega8
Program type : Application
Clock frequency : 4,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/
#include
#asm
.equ __w1_port=0x12 ;PORTD
.equ __w1_bit=6
#endasm
#include <1wire.h> //бібліотека для роботи з 1wire
#include
#include
#define digit1 PORTD.4 //живлення 1 індикатора
#define digit2 PORTD.5 //живлення 2 індикатора
#define digit3 PORTD.7 //живлення 3 індикатора
#define digit4 PORTD.0
#define digit5 PORTD.1
#define MAX_DS18b20 12
//unsigned char cnt=0;
flash char digits[] = { //массив с цифрами
0b00000011, //0
0b10011111, //1
0b00100101, //2
0b00001101, //3
0b10011001, //4
0b01001001, //5
0b01000001, //6
0b00011111, //7
0b00000001, //8
0b00001001, //9
0b11111101, //знак мінус
0b11111111 //пусто
};
char digit_out[5],cur_dig;
signed int temperature; //переменная для температуры
signed int big_ctr; // большой счетчик
unsigned char j; // переменная для циклов, число датчиков
unsigned char u;
unsigned char k;
unsigned char devices;
unsigned char rom_code[MAX_DS18b20][9];
//interrupt [EXT_INT0] void ext_int0_isr(void)
//{
// if(cnt<99) ++cnt;
//}
//interrupt [EXT_INT1] void ext_int1_isr(void)
//{
// if(cnt>0) --cnt;
//}
// Timer 2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
switch (cur_dig)
{
case 0:{digit5=0;digit1=1;break;}; //включаєм цифру 3
case 1:{digit1=0;digit2=1;break;}; //включаєм цифру 2
case 2:{digit2=0;digit3=1;break;}; //включаєм цифру 1
case 3:{digit3=0;digit4=1;break;};
case 4:{digit4=0;digit5=1;break;};
}
PORTB=digits[digit_out[cur_dig]];
cur_dig++;
if (cur_dig==5) cur_dig=0;
}
void hex_to_dec(void);
void main(void)
{
PORTB=0x00;
DDRB=0xFF;
PORTC=0x00;
DDRC=0xFF;
PORTD=0x00;
DDRD=0x7F;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 62,500 kHz
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x04;
TCNT2=0x00;
OCR2=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x40;
//GICR|=0xC0;
//MCUCR=0x0A;
//GIFR=0xC0;
devices=w1_search(0xf0,rom_code); //ищем все подключенные датчики
#asm("sei") //разрешаем прерывания
while (1) //цикл опроса датчиков
{
big_ctr++;
if (big_ctr == 1){ // выводим температуру датчика 1
j=0; u=1;
}
else if (big_ctr == 4){ // выводим температуру датчика 2
j=1; u=2;
}
else if (big_ctr == 8){ // выводим температуру датчика 3
j=2; u=3;
}
else if (big_ctr == 12){ // выводим температуру датчика 4
j=3; u=4;
}
else if (big_ctr == 16){ // выводим температуру датчика 5
j=4; u=5;
}
else if (big_ctr == 20){ // выводим температуру датчика 6
j=5; u=6;
}
else if (big_ctr == 24){ // выводим температуру датчика 7
j=6; u=7;
}
else if (big_ctr == 28){ // выводим температуру датчика 8
j=7; u=8;
}
else if (big_ctr == 32){ // выводим температуру датчика 9
j=8; u=9;
}
else if (big_ctr == 36){ // выводим температуру датчика 10
j=9; u=0; k=1;
}
else if (big_ctr == 40){ // выводим температуру датчика 11
j=10; u=1; k=1;
}
else if (big_ctr == 44){ // выводим температуру датчика 12
j=11; u=2; k=1;
}
if (big_ctr > 48){
big_ctr = 0; u=0; k=0;
}
temperature=ds18b20_temperature(&rom_code[j][0]);
//читаем температуру с датчика номер - j
if(temperature>1000){
temperature=4096-temperature;
temperature=-temperature;
}
if (temperature!=-9999)
hex_to_dec();
};
}
void hex_to_dec(void)
{
char i;
int temp;
if (temperature>=90){
PORTC.0=1;
}
else PORTC.0=0;
if (temperature<1000) {
temp=temperature;
i=0;
while (temp>=100){
temp=temp-100;
i++;
};
if(temperature<100)i=11;
digit_out[0]=i;
i=0;
while (temp>=10){
temp=temp-10;
i++;
};
if(temperature<10)i=11;
digit_out[1]=i;
digit_out[2]=temp;
digit_out[4]=u;
digit_out[3]=k;
}
else
{
temp=-temperature/1;
i=0;
while (temp>=10){
temp=temp-10;
i++;
};
if(-temperature/1<10)i=11;
digit_out[1]=i;
digit_out[2]=temp;
digit_out[0]=10;
}
}
Термометр на atmega8 с 3 датчиками, три дисплея выводят температуру каждого датчика на свой дисплей
Код проекта в CODEVISION AVR
/*****************************************************
Chip type : ATmega8
Program type : Application
Clock frequency : 4,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/
#include
#asm
.equ __w1_port=0x12 ;PORTD
.equ __w1_bit=5
#endasm
#include <1wire.h> //бібліотека для роботи з 1wire
#include
#include
#define digit1 PORTC.5 //живлення 1 індикатора
#define digit2 PORTC.4 //живлення 2 індикатора
#define digit3 PORTC.3 //живлення 3 індикатора
#define digit4 PORTD.3//
#define digit5 PORTD.7//
#define digit6 PORTD.6//
#define digit7 PORTC.2//
#define digit8 PORTC.1//
#define digit9 PORTC.0//
#define MAX_DS18b20 3
flash char digits[] = { //массив с цифрами
0b10000000, //0
0b11110010, //1
0b01001000, //2
0b01100000, //3
0b00110010, //4
0b00100100, //5
0b00000100, //6
0b11110000, //7
0b00000000, //8
0b00100000, //9
0b11111100, //знак мінус
0b11111110 //пусто
};
char digit_out[9],cur_dig;
signed int temperature; //переменная для температуры
signed int big_ctr; // большой счетчик
unsigned char k=90; //аварийная температура
unsigned char j; // переменная для циклов, число датчиков
unsigned char devices;
unsigned char rom_code[MAX_DS18b20][9];
// Timer 2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
switch (cur_dig)
{
case 0:{digit9=0;digit1=1;break;};
case 1:{digit1=0;digit2=1;break;};
case 2:{digit2=0;digit3=1;break;};
case 3:{digit3=0;digit4=1;break;};
case 4:{digit4=0;digit5=1;break;};
case 5:{digit5=0;digit6=1;break;};
case 6:{digit6=0;digit7=1;break;};
case 7:{digit7=0;digit8=1;break;};
case 8:{digit8=0;digit9=1;break;};
}
PORTB=digits[digit_out[cur_dig]];
cur_dig++;
if (cur_dig==9) cur_dig=0;
}
void hex_to_dec(void);
void main(void)
{
PORTB=0x00;
DDRB=0xFF;
PORTC=0x00;
DDRC=0xFF;
PORTD=0x00;
DDRD=0xEF;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x03; //частота обновления
TCNT2=0x00;
OCR2=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x40;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
devices=w1_search(0xf0,rom_code); //ищем все подключенные датчики
#asm("sei") //разрешаем прерывания
while (1) //цикл опроса датчиков
{
big_ctr++;
if (big_ctr == 1){ // выводим температуру датчика 1
j=0;
}
else if (big_ctr == 2){ // выводим температуру датчика 2
j=1;
}
else if (big_ctr == 3){ // выводим температуру датчика 3
j=2;
}
if (big_ctr > 3){
big_ctr = 0;
}
temperature=ds18b20_temperature(&rom_code[j][0]);
//читаем температуру с датчика номер - j
if(temperature>1000){
temperature=4096-temperature;
temperature=-temperature;
}
if (temperature!=-9999)
hex_to_dec();
};
}
void hex_to_dec(void)
{
char i;
int temp;
if (j==0){
if (temperature>=k){
PORTD.0=1;
}
else PORTD.0=0;
if (temperature<1000) {
temp=temperature;
i=0;
while (temp>=100){
temp=temp-100;
i++;
};
if(temperature<100)i=11;
digit_out[0]=i;
i=0;
while (temp>=10){
temp=temp-10;
i++;
};
if(temperature<10)i=11;
digit_out[1]=i;
digit_out[2]=temp;
}
else
{
temp=-temperature/1;
i=0;
while (temp>=10){
temp=temp-10;
i++;
};
if(-temperature/1<10)i=11;
digit_out[1]=i;
digit_out[2]=temp;
digit_out[0]=10;
}
};
//второй индикатор
if (j==1){
if (temperature>=k){
PORTD.1=1;
}
else PORTD.1=0;
if (temperature<1000) {
temp=temperature;
i=0;
while (temp>=100){
temp=temp-100;
i++;
};
if(temperature<100)i=11;
digit_out[3]=i;
i=0;
while (temp>=10){
temp=temp-10;
i++;
};
if(temperature<10)i=11;
digit_out[4]=i;
digit_out[5]=temp;
}
else
{
temp=-temperature/1;
i=0;
while (temp>=10){
temp=temp-10;
i++;
};
if(-temperature/1<10)i=11;
digit_out[4]=i;
digit_out[5]=temp;
digit_out[3]=10;
}
};
//третий индикатор
if (j==2){
if (temperature>=k){
PORTD.4=1;
}
else PORTD.4=0;
if (temperature<1000) {
temp=temperature;
i=0;
while (temp>=100){
temp=temp-100;
i++;
};
if(temperature<100)i=11;
digit_out[6]=i;
i=0;
while (temp>=10){
temp=temp-10;
i++;
};
if(temperature<10)i=11;
digit_out[7]=i;
digit_out[8]=temp;
}
else
{
temp=-temperature/1;
i=0;
while (temp>=10){
temp=temp-10;
i++;
};
if(-temperature/1<10)i=11;
digit_out[7]=i;
digit_out[8]=temp;
digit_out[6]=10;
}
};
}
Инкубатор на ATMEGA16 со стабилизацией установленной, усредненной по трем датчикам температурой, выставляемые диапазоны, проверка резервного источника питания, сигнализация и охлаждение по требованию, и авто переворот яиц.
Код проекта в CODEVISION AVR
#include
#asm
.equ __w1_port=0x12 ;PORTD
.equ __w1_bit=7
#endasm
#include <1wire.h>
#include
#include
#define digit1 PORTA.5
#define digit2 PORTA.6
#define digit3 PORTA.7
#define digit4 PORTA.4
#define MAX_DS18b20 3
#define ADC_VREF_TYPE 0x40
float temperature,jj; //переменная для температуры
char pp; // переменная переключения подпрограмм
int w=300,w1,w2,rr,k=6,t11,p,t,e,e1;
char i,y;
int temp,ff1,ff2,ff3,mm;
//кнопка переключения меню
interrupt [EXT_INT0] void ext_int0_isr(void)
{
e1=0;
delay_ms(200); // сглаживание дребезга
pp=pp+1;
if (pp==10){pp=0;}
}
// считываем результат преобразования АЦП
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
// Начинаем преобразование
ADCSRA|=0x40;
// немного подождем АЦП - работает
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
flash char digits[] = { //массив с цифрами
0b01001000, //0
0b01111110, //1
0b11000100, //2
0b01100100, //3
0b01110010, //4
0b01100001, //5
0b01000001, //6
0b01111100, //7
0b01000000, //8
0b01100000, //9
0b11111101, //знак -
0b11111111, //пробел
0b01010010, //hour
0b01001111, //напряжение
0b11000011, //температура
0b10001001, //секунда
0b01001101, //нижний предел
0b11100010 //верхний предел
};
// Timer 2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
e=e+1;
e1=e1+1;
if (e1==70){e1=0;pp=0;} // время работы меню до сброса
if (e==15){e=0;} // секунда
if (e==14){t11=t11-1;} // отсчет установленных минут
//====================================== переворот
if (p==0){
if((t11<40)&&(t11>3)){
PORTB.2=1;}
if(t11<=2){
t11=t;
p=1;
PORTB.2=0;
}
}
if (p==1){
if((t11<40)&&(t11>3)){
PORTB.3=1;}
if(t11<=2){
t11=t;
p=0;
PORTB.3=0;
}
}
}
char digit_out[4],cur_dig;
int big_ctr; // большой счетчик
unsigned int Vin,W,yy; // переменная для значения АЦП
unsigned char j; // переменная для циклов, число датчиков
unsigned char devices;
unsigned char rom_code[MAX_DS18b20][9];
// прерывание по переполнению таймера
// для вывода значений на индикаторы
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
switch (cur_dig)
{
case 0:{digit4=0;digit1=1;break;}; //включаем цифру 4
case 1:{digit1=0;digit2=1;break;}; //включаем цифру 3
case 2:{digit2=0;digit3=1;break;}; //включаем цифру 2
case 3:{digit3=0;digit4=1;break;}; //включаем цифру 1
}
PORTC=digits[digit_out[cur_dig]];
cur_dig++;
if (cur_dig==4) cur_dig=0;
if ((pp==1)&&(cur_dig==2)){PORTC^=0b01000000;}
if ((pp==3)&&(cur_dig==2)){PORTC^=0b01000000;}
if ((pp==0)&&(cur_dig==2)){PORTC^=0b01000000;}
if ((pp==5)&&(cur_dig==2)){PORTC^=0b01000000;}
if ((pp==6)&&(cur_dig==2)){PORTC^=0b01000000;}
if ((pp==7)&&(cur_dig==2)){PORTC^=0b01000000;}
if ((pp==8)&&(cur_dig==2)){PORTC^=0b01000000;}
if ((pp==9)&&(cur_dig==2)){PORTC^=0b01000000;}
}
void hex_to_dec(void);
void main(void)
{
int c1=90,c2=150;
PORTA=0x00; //
DDRA=0xFA; //
PORTB=0x00; //
DDRB=0xFF; //
PORTC=0xFF; //
DDRC=0xFF; //
PORTD=0x7F; //
DDRD=0x40; //
TCCR0=0x03; //
TCNT0=0x00; //
OCR0=0x00; // НАСТРОЙКА УЗЛОВ МИКРОКОНТРОЛЛЕРА
GICR|=0x40; //
MCUCR=0x02; //
MCUCSR=0x00; //
GIFR=0x40; //
TIMSK=0x41; //
ACSR=0x80; //
SFIOR=0x00; //
ADMUX=ADC_VREF_TYPE; //
ADCSRA=0x85; //
ASSR=0x00; //
TCCR2=0x07; //
TCNT2=0x00; //
OCR2=0x00; //
//ищем все подключенные датчики
devices=w1_search(0xf0,rom_code);
#asm("sei") //разрешаем прерывания
while (1)
{
//============================================
while(pp==1){ //цикл опроса кнопок установки
// и вывода значения регулируемой температуры
if((PIND.0==0)&&(w<400)){
delay_ms(500);
w=w+1;
e1=0;
}
if((PIND.1==0)&&(w>200)){
delay_ms(500);
w=w-1;
e1=0;
}
//-------------------------------------------- вывод
if (w<1000) {
rr=w;
i=0;
while (rr>=100){
rr=rr-100;
i++;
};
if(w<100)i=11;
digit_out[0]=i;
i=0;
while (rr>=10){
rr=rr-10;
i++;
};
if(w<10)i=11;
digit_out[1]=i;
digit_out[2]=rr;
digit_out[3]=14;
}
//--------------------------------------------
}
//============================================
//============================================
while(pp==2){ //цикл опроса кнопок
//установки и вывода часов
if((PIND.0==0)&&(k<12)){
delay_ms(500);
k=k+1;
t=k*3600;
t11=t;
e1=0;
}
if((PIND.1==0)&&(k>1)){
delay_ms(500);
k=k-1;
t=k*3600;
t11=t;
e1=0;
}
//-------------------------------------------- вывод
if (k<1000) {
rr=k;
i=0;
while (rr>=100){
rr=rr-100;
i++;
};
if(k<100)i=11;
digit_out[0]=i;
i=0;
while (rr>=10){
rr=rr-10;
i++;
};
if(k<10)i=11;
digit_out[1]=i;
digit_out[2]=rr;
digit_out[3]=12;
}
//--------------------------------------------
}
//============================================
//============================================
while(pp==3){
//-------------------------------------------- вывод
if (Vin<1000) {
rr=Vin;
i=0;
while (rr>=100){
rr=rr-100;
i++;
};
if(Vin<100)i=11;
digit_out[0]=i;
i=0;
while (rr>=10){
rr=rr-10;
i++;
};
if(Vin<10)i=11;
digit_out[1]=i;
digit_out[2]=rr;
digit_out[3]=13;
}
//--------------------------------------------
}
//============================================
while(pp==4){
//-------------------------------------------- вывод
yy=t11/60;
if (yy<1000) {
rr=yy;
i=0;
while (rr>=100){
rr=rr-100;
i++;
};
if(yy<100)i=11;
digit_out[0]=i;
i=0;
while (rr>=10){
rr=rr-10;
i++;
};
if(yy<10)i=11;
digit_out[1]=i;
digit_out[2]=rr;
digit_out[3]=15;
}
//--------------------------------------------
}
//============================================
//============================================
while(pp==5){ //цикл опроса кнопок установки
// и вывода нижнего предела аварийного напряжения
if((PIND.0==0)&&(c1<110)){
delay_ms(500);
c1=c1+1;
e1=0;
}
if((PIND.1==0)&&(c1>80)){
delay_ms(500);
c1=c1-1;
e1=0;
}
//-------------------------------------------- вывод
if (c1<1000) {
rr=c1;
i=0;
while (rr>=100){
rr=rr-100;
i++;
};
if(c1<100)i=11;
digit_out[0]=i;
i=0;
while (rr>=10){
rr=rr-10;
i++;
};
if(c1<10)i=11;
digit_out[1]=i;
digit_out[2]=rr;
digit_out[3]=17;
}
//--------------------------------------------
}
//============================================
//============================================
while(pp==6){ //цикл опроса кнопок установки и
//вывода верхнего предела аварийного напряжения
if((PIND.0==0)&&(c2<200)){
delay_ms(500);
c2=c2+1;
e1=0;
}
if((PIND.1==0)&&(c2>120)){
delay_ms(500);
c2=c2-1;
e1=0;
}
//---------------------------- вывод
if (c2<1000) {
rr=c2;
i=0;
while (rr>=100){
rr=rr-100;
i++;
};
if(c2<100)i=11;
digit_out[0]=i;
i=0;
while (rr>=10){
rr=rr-10;
i++;
};
if(c2<10)i=11;
digit_out[1]=i;
digit_out[2]=rr;
digit_out[3]=16;
}
//--------------------------------------------
}
//============================================
//============================================
while(pp==7){
//------------------------------ вывод датчик 1
if (ff1<1000) {
rr=ff1;
i=0;
while (rr>=100){
rr=rr-100;
i++;
};
if(ff1<100)i=11;
digit_out[0]=i;
i=0;
while (rr>=10){
rr=rr-10;
i++;
};
if(ff1<10)i=11;
digit_out[1]=i;
digit_out[2]=rr;
digit_out[3]=1;
}
//--------------------------------------------
}
//============================================
//============================================
while(pp==8){
//------------------------------ вывод датчик 2
if (ff2<1000) {
rr=ff2;
i=0;
while (rr>=100){
rr=rr-100;
i++;
};
if(ff2<100)i=11;
digit_out[0]=i;
i=0;
while (rr>=10){
rr=rr-10;
i++;
};
if(ff2<10)i=11;
digit_out[1]=i;
digit_out[2]=rr;
digit_out[3]=2;
}
//--------------------------------------------
}
//============================================
//============================================
while(pp==9){
//-------------------------------- вывод датчик 3
if (ff3<1000) {
rr=ff3;
i=0;
while (rr>=100){
rr=rr-100;
i++;
};
if(ff3<100)i=11;
digit_out[0]=i;
i=0;
while (rr>=10){
rr=rr-10;
i++;
};
if(ff3<10)i=11;
digit_out[1]=i;
digit_out[2]=rr;
digit_out[3]=3;
}
//--------------------------------------------
}
//===========================================
w1=w-2; //диапазон регулировки установленной температуры
w2=w+2;
//===================== заносим в переменную значение АЦП
Vin =((read_adc(0)*5/102)*5.3);
//----------------------- сигнал по напряжению и температуре
if (Vin
else if (jj>=400){PORTA.3=1;}
else if (jj<=350){PORTA.3=1;}
else PORTA.3=0;
//-----------------------
//================================ цикл опроса датчиков
big_ctr++;
if (big_ctr == 1){ // выводим температуру датчика 1
j=0;
}
else if (big_ctr == 2){ // выводим температуру датчика 2
j=1;
}
else if (big_ctr == 3){ // выводим температуру датчика 3
j=2;
}
if (big_ctr > 3){
big_ctr = 0;
}
temperature=ds18b20_temperature(&rom_code[j][0]);
//читаем температуру с датчика номер - j
if(temperature>1000){
temperature=4096-temperature;
temperature=-temperature;
}
if (temperature!=-9999)
hex_to_dec();
};
}
void hex_to_dec(void)
{
temperature=temperature*10;
if (mm<=w1){ //включение нагревателя при достижении
//минимума уст. температуры
PORTB.4=1;
PORTD.6=0;
}
if (mm>w2){ //выключение нагревателя при достижении
//максимума уст. температуры
PORTB.4=0;
PORTD.6=1;
}
jj=temperature;
if (j==0){ff1=temperature;}
if (j==1){ff2=temperature;}
if (j==2){ff3=temperature;}
mm=((ff1+ff2+ff3)/devices);
if (mm<1000) {
temp=mm;
i=0;
while (temp>=100){
temp=temp-100;
i++;
};
if(mm<100)i=11;
digit_out[0]=i;
i=0;
while (temp>=10){
temp=temp-10;
i++;
};
if(mm<10)i=11;
digit_out[1]=i;
digit_out[2]=temp;
digit_out[3]=11;
}
}