📄 通用函数.c
字号:
#include<iom16v.h>
#include<macros.h>
//-----------------------------------------------------------------------------------------------------
//蜂鸣器端口PORTD.5
#define on_spk PORTD&=~(1<<5) //蜂鸣器开
#define off_spk PORTD|=1<<5 //蜂鸣器关
unsigned char command[10];
unsigned char tab[]="open";
//-----------------------------------------------------------------------------------------------------
// LED显示数据表,0-9数据以及开机自检显示的“- ”
unsigned char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
// 延时2.5*i微秒程序
void delay_us(unsigned int i)
{
for(;i;i--);
}
//-----------------------------------------------------------------------------------------------------
// 延时i毫秒程序
void delay_ms(unsigned int i)
{
unsigned int a;
unsigned int b;
for(b=0;b<i;b++)
{for(a=0;a<1135;a++);
}
}
//-----------------------------------------------------------------------------------------------------
// 延时i秒程序
void delay_s(unsigned int i)
{
unsigned int a;
unsigned int b;
unsigned int c;
for(c=0;c<i;c++)
{for(b=0;b<705;b++)
{for(a=0;a<1133;a++);
asm("nop");
}
}
}
//-----------------------------------------------------------------------------------------------------
// LED数码管显示程序
void display(unsigned char i)
{DDRB=0xff;
PORTB=table[i];
}
//-----------------------------------------------------------------------------------------------------
// 蜂鸣器发声 入口参数 i 响声长度 n 响声次数
void buzzer(unsigned char i,unsigned char n)
{
for(;n;n--)
{
for(;i;i--)
{
on_spk;
delay_us(450);
off_spk;
delay_us(450);
}
delay_ms(200);
}
}
//-----------------------------------------------------------------------------------------------------
// AD转换函数,程序入口 i为通道号(0-7即porta.0-porta.7)
unsigned int getadc(unsigned char i)
{
unsigned int adc;
unsigned char temp;
ADMUX=0x1f&i;
ADCSR=0xc6;
delay_ms(3);
temp=ADCL;
adc=ADCH;
adc=(adc<<8)+temp;
return adc;
}
//-----------------------------------------------------------------------------------------------------
// 串口初始化 9600波特率无奇偶校验位 8M晶振下
void uart_init(void)
{
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
}
//-----------------------------------------------------------------------------------------------------
// 串口发送一个字符
void putchar(unsigned char c)
{
while(!(UCSRA&(1<<UDRE))); //等待上次发送完成
UDR=c; //发送字符
}
//-----------------------------------------------------------------------------------------------------
// 串口接收一个字符
unsigned char getchar(void)
{
while(!(UCSRA&(1<<RXC)));
return UDR;
}
//-----------------------------------------------------------------------------------------------------
// 串口发送字符串函数
void send(char *address)
{
while(*address)
{
putchar(*address); //发送一个字符
address++; //地址加1
}
putchar('\r'); //发送回车符
}
//-----------------------------------------------------------------------------------------------------
// 串口接收完成中断
#pragma interrupt_handler receive:12
void receive(void)
{
unsigned char temp=0;
unsigned char count=0;
unsigned char i;
while(temp!='\r')
{
temp=getchar();
command[count]=temp;
count++;
}
count--;
command[count]='\0';
i=judge(command,tab);
if (i==1)
{
PORTC=~PORTC;
DDRC=0xff;
}
else{send("wrong command !");}
return;
}
//-----------------------------------------------------------------------------------------------------
// 判断两个字符串是否相等
// 入口 *add0 字符串A *add1 字符串B
unsigned char judge(unsigned char *add0,unsigned char *add1)
{
unsigned char i;
while((*add0!='\0')||(*add1!='\0')) //直到其中一个字符串读完时退出循环
{
if(*add0!=*add1) //判断两个字符串某一个字符是否相等
{i=0;} //不相等返回 0
else{i=1;} //相等返回 1
add0++; //地址加 1
add1++;
}
return i;
}
//-----------------------------------------------------------------------------------------------------
// 主程序开始
void main(void)
{
unsigned int value;
uart_init(); //串口初始化
SEI(); //开全局中断
send("http://ycavr.cn");
while(1)
{
value=getadc(0);
asm("nop");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -