📄 csb.c
字号:
/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.1d Standard
Automatic Program Generator
?Copyright 1998-2004 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.ro
e-mail:office@hpinfotech.ro
Project :
Version :
Date : 2005-8-27
Author : HAI
Company :
Comments:
Chip type : AT90LS4433
Clock frequency : 8.000000 MHz
Memory model : Tiny
External SRAM size : 0
Data Stack size : 32
*****************************************************/
#include <90s4433.h>
#include<stdio.h>
#define uint unsigned int
#define uchar unsigned char
#include <delay.h>
#include<math.h>
#include<stdlib.h>
#define ADEN ADCSR.7
#define ADSC ADCSR.6
#define LED PORTD.1
#define EA SREG.7
#define TXEN UCSRB.3
#define RXEN UCSRB.4
#define ADC_VREF_TYPE 0x00
#define PTT PORTB.5
#define KEY PORTD.5
//*********************LCD**************************//
#define LCD_E PORTB.0
#define LCD_RW PORTB.2
#define LCD_RS PORTB.1
#define LCD_VO PORTB.4
#define P0 PORTD
//**************************************************//
// Declare your global variables here
uint time=0;
uint dat[3][2];
uchar mess1[]={" BD7QX@163.COM "};
uchar mess2[]={" TEST OVER>>> "};
/*****************LCD 函数******************/
uchar read_lcd(uchar rs)
{
uchar temp;
LCD_E=1;
delay_us(100);
P0=0x0ff;
DDRD=0x00;
if (rs==1)
LCD_RS=1;
else
LCD_RS=0;
LCD_RW=1;
delay_us(100);
LCD_E=1;
delay_us(100);
temp=PIND;
delay_us(100);
LCD_E=0;
delay_us(100);
return temp;
}
void write_lcd(uchar datt,uchar RS)
{
uchar tepm;
LCD_E=1;
delay_us(100);
DDRD=0xFF;
P0=datt;
if (RS==1)
LCD_RS=1;
else
LCD_RS=0;
delay_us(10);
LCD_RW=0;
delay_us(100);
LCD_E=1;
delay_us(100);
P0=datt;
delay_us(100);
LCD_E=0;
delay_us(10);
LCD_RW=1;
}
void write_com(uchar com)
{
uchar in;
while(1)
{
in=read_lcd(0);
if ((in&0x80)==0) break;
}
write_lcd(com,0);
}
void write_data(uchar dat)
{
uchar in,ladd;
write_lcd(dat,1);
while(1)
{
in=read_lcd(0);
if ((in&0x80)==0)
break;
}
}
void lcd_init(void)
{
LCD_VO=0;
write_com(0x3c); //置显示
write_com(0x0c); //置
write_com(0x06); //置输入模式
write_com(0x01); //清屏
}
void prin(uchar line,uchar *str)
{
uchar i;
if (line==1)
{
write_com(0x80);
for (i=0;i<24;i++) write_data(' ');
write_com(0x80);
}
else
{
write_com(0x0c0);
for (i=0;i<24;i++) write_data(' ');
write_com(0x0c0);
}
i=0;
do {write_data(str[i]);i++;}
while (str[i]!='\0');
}
void test_lcd(void)
{
uchar i;
prin(1,mess1);
write_com(0x0c0);
for(i=0;i<10;i++) write_data(i+0x30);
prin(2,mess2);
}
//uchar T1H=0xfc,T1L=0x18;
bit t1ov=0;
#define ADC_VREF_TYPE 0x40
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
// Start the AD conversion
ADCSR|=0x40;
// Wait for the AD conversion to complete
while ((ADCSR & 0x10)==0);
ADCSR|=0x10;
return ADCW;
}
//TIME1 INT
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
t1ov=1;TCCR1B=0x00;
}
void send_40k(uchar j)
{
uchar i;
for (i=0;i<j;i++)
{
PTT=0;
PTT=0;
PTT=0;
PTT=0;
PTT=0;
PTT=0;
delay_us(11);
PTT=1;
PTT=1;
PTT=1;
PTT=1;
PTT=1;
PTT=1;
delay_us(11);
}
}
void sort(void);
void main(void)
{
uchar gg[6];
uint i,ad;
float ff;
// Declare your local variables here
// Input/Output Ports initialization
// Port B initialization
// Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0xFF;
DDRB=0xFF;
// Port C initialization
// Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0xFF;
DDRD=0xFF;
// UART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// UART Receiver: Off
// UART Transmitter: On
// UART Baud rate: 9600
UCSRB=0x08;
UBRR=0x33;
UBRRHI=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 8000.000 kHz
// Mode: Normal top=FFFFh
// OC1 output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x00;
TCCR1B=0x02;
TCNT1H=0xF8;
TCNT1L=0x2F;
OCR1H=0x00;
OCR1L=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
GIMSK=0x00;
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x80;
UBRRHI=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
// Analog Comparator Output: Off
ACSR=0x80;
// ADC initialization
// ADC Clock frequency: 125.000 kHz
// ADC Bandgap Voltage Reference: Off
ADMUX=ADC_VREF_TYPE;
ADCSR=0x87;
// Global enable interrupts
#asm("sei")
TXEN=1;
RXEN=1;
//lcd_init();
while (1)
{
ad=read_adc(03);
ff=ad*1.220/1023;
ftoa(ff,4,gg);
//LED=0;
printf("V=%s\n",gg);
//delay_ms(200);
//prin(1,gg);
// DDRD=0XFF;
LED=~LED;
delay_ms(100);
//test_lcd();
/*
yy: send_40k(2);
TCCR1B=0x02;
TCNT1=0;
TCNT1H=0;
TCNT1L=0; //定时器2.058ms中断 检测35cm以内的距离
delay_us(60);
t1ov=0;
dat[i][0]=0;
i=1;
while(!t1ov)
{ //循环2.058ms
time=TCNT1;
ad=abs(ADCW-0x1d8);
//ad=ADCW-0x1d8;
if ((ad>120)&&(time<0x24d))
{ dat[i][0]=ad;dat[i][1]=time;}
else
if ((ad>100)&&(time<999))
{ dat[i][0]=ad;dat[i][1]=time;}
else
if ((ad>20)&&(time>1000))
{ dat[i][0]=ad;dat[i][1]=time;}
}
if (dat[1][0]>60) //大于0.3V以上才要
{ //ff=ad*5.00/1023;
dat[1][0]=0;
ff=dat[1][1]/2*0.034;
ftoa(ff,1,gg);
//printf("time=%u S0:%sCM\n",dat[1][1],gg);
prin(1,gg);
delay_ms(200);
goto yy;
}
delay_ms(20); */
/*
for (i=0;i<3;i++)
{
send_40k(40);
TCCR1B=0x02;
t1ov=0;
dat[i][0]=0;
TCNT1=0;
TCNT1H=0;
TCNT1L=0; //定时器12ms中断 检测35cm--408cm以内的距离
delay_us(5000);
while(!t1ov)
{ //循环66ms
time=TCNT1;
ad=abs(read_adc(03)-0x1d8);
//ad=ADCW-0x1d8;
if (ad>dat[i][0])
// if ((ad>8)&&(time>6000))
{ dat[i][0]=ad;dat[i][1]=time;}
}
}
sort();
if ((dat[1][0]>8)&&(dat[1][1]>5000)) //大于0.040V以上才要 3.4m--11m
{ //ff=ad*5.00/1023;
ff=dat[1][1]/2*0.034;
ftoa(ff,1,gg);
//printf("time=%u S1:%sCM\n",dat[1][1],gg);
prin(2,gg);
}
delay_ms(200); */
}
}
void sort(void)
{
uchar i,j;
uint temp;
for (i=0;i<2;i++)
for (j=0;j<3;j++)
if (dat[j][1]>dat[j+1][1])
{ temp=dat[j+1][1];dat[j+1][1]=dat[j][1];dat[j][1]=temp;}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -