⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 com.c

📁 AVR单片机 Mega88 AD/串口/开关量检测/输出控制.
💻 C
字号:
#include <iom88v.h> 
#include <stdio.h>
#include <macros.h>
#include<eeprom.h>
#include<string.h>
#define changeHexToInt(hex)  ( ( ((hex)>>4) *10 ) + ((hex)%16) )
#define   amount 10
int n=0;
unsigned char inbox[amount];//接收缓冲 10 
unsigned char x[]="hello";
void IntToStr(unsigned int Number, char *CalBuff,char add)
{
	unsigned char 				i;

	for (i = 0; i < 5; i++)
	{
		CalBuff[5-1-i] = (Number%10)+add;
		Number /= 10;
	}
}

//#include <usart.h> 

void port_init(void)
{
 PORTB = 0x00;
 DDRB  = 0x00;
 PORTC = 0x00; //m103 output only
 DDRC  = 0x00;
 PORTD = 0x00;
 DDRD  = 0x00;
}
void uart0_init(void)
{
 UCSR0B = 0x00; //disable while setting baud rate
 UCSR0A = 0x00;
 UCSR0C = 0x06;
 UBRR0L = 0x67; //set baud rate lo
 UBRR0H = 0x00; //set baud rate hi
 UCSR0B = 0x98;
}
void main(void)
{  
char c;
char temp2;
char y[10];
unsigned char adcL,adcH;
char x[4],adc[3];
unsigned int dd;
//stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();
 uart0_init();
  ADMUX=96;                  //设置参考电压为AVCC,结构左对齐(就是8位精度)
  ADCSRA|=135;               //使能ADC,ADC时钟=系统时钟128分频

 MCUCR = 0x00;
 EICRA = 0x00; //extended ext ints
 EIMSK = 0x00;
 
 TIMSK0 = 0x00; //timer 0 interrupt sources
 TIMSK1 = 0x00; //timer 1 interrupt sources
 TIMSK2 = 0x00; //timer 2 interrupt sources
 
 PCMSK0 = 0x00; //pin change mask 0 
 PCMSK1 = 0x00; //pin change mask 1 
 PCMSK2 = 0x00; //pin change mask 2
 PCICR = 0x00; //pin change enable 
 PRR = 0x00; //power controller
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
while(1)
{
switch(inbox[1])
{
case 0xFF:
            put_char(inbox[1]);
            inbox[1]='';   
 break;
case 'C':
            EEPROMwrite(0x10,'a'); //向EEProm地址 0x10写相应的字符
			EEPROM_WRITE(0x20,"hello123"); //字符串双引号
			putstring(x);
			DDRB=0x01; //定义 PB0为输出 
			PORTB=0x00; // PB0 输出低电平
			inbox[1]='';                                    
 break;
case 'I':
           temp2=EEPROMread(0x10);//读取EEProm地址 0x10对应的字符
		   put_char(temp2);
		   DDRB=0x01; //定义 PB0为输出
		   PORTB=0x01; // PB0 输出高电平 
		   inbox[1]='';
		   break;  
case 'F':
           //EEPROM_READ(0x20,y); //读取EEProm地址 0x20对应的字符串
		   //putstring(y);
		   //DDRB=0x01;
		   //put_char(PB1);
		   if(PINB&BIT(1)) //PB1脚的电平为高时
		   {
		   if(PINB&BIT(1))
		   {
		   putstring("HELLO");
		   }
		   }
		   if(!(PINB&BIT(1)))//PB1脚的电平为低时
		   {
		   if(!(PINB&BIT(1)))
		   {
		   putstring("XXX");
		   }
		   }
		   inbox[1]='';
		   break;
case 'Q':
    ADMUX=0x05;       //清除已选择的ADC通道,选择新的ADC通道(0-7)
	ADCSRA|=(1<<ADSC);//启动ADC转换
    //ADCSRA|=64;              //启动单次ADC转换
    while((ADCSRA&16)==0);   //等待ADC转换结束 
    adcL=ADCL;                //结果左对齐只需读取高8位数据
	adcH=ADCH; //read 2 high bits and shift into top byt
	/*adc[0]='0x';
	adc[1]=adcH;
	adc[2]=adcL;*/
	//adc=adc*380/1024;
	//dd=changeHexToInt(adc);
	//put_char(adc);
	//IntToStr(dd,x,'0');
	//putstring(adc);
	//sprintf(dd, "%u", 123456);
	dd=(int)ADC; //强制转换为十进制
	IntToStr(dd,x,'0');//十进制转为字符输出
	putstring(x);
	//dd=changeHexToInt(ADC);
	//IntToStr(dd,x,'0');
	//putstring(x);
	/*
	put_char(ADCL);
	put_char(ADCH);
	/*
    put_char(adc/100+48);     //从串口输出ADC的百位数
    put_char(adc/10%10+48);   //从串口输出ADC的十位数
    put_char(adc%10+48);      //从串口输出ADC的个位数
    delay_ms(500);           //延时
	ADCSRA|=16;              //清除ADC转换结束标记
    //putchar(13);             //回车
    //putchar(10);             //换行*/
	//put_char(ADCL);
	//put_char(ADCH);
	inbox[1]='';
     break;                                    
default:
        
 break;
 
}

}
  
}
void delay_us(int time)//微秒级延迟程序
{
do
time--;
while(time>1);
}
void delay_ms(unsigned int time)//毫秒级延迟程序
{
while(time!=0)
{
delay_us(1000);
time--;
}
}
void put_char(unsigned char c)
{
while (!(UCSR0A & (1<<UDRE0)));
UDR0=c;
}
void putstring(char *s)
 {
 while(*s)
 {
 put_char(*s);
 s++;
 }
 put_char(0x0d);
 put_char(0x0a);
 }
 
unsigned char get_char(void)//字符输入函数
 {
 while(!(UCSR0A & (1<<RXC0))); 
 return UDR0;
 }
 
#pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
void uart0_rx_isr(void)
{
 char temp;
 temp=UDR0;
 if((n<=amount))
 {
  inbox[n]=temp;
  n++;           
  }
 if((temp==0x0d)||(temp==0x0a)||(n>amount))
 {
 n=0;
 }
 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -