📄 main.c
字号:
#include "iom8.h"
#include "avr_macros.h"
#include "ina90.h"
#include "stdio.h" //标准输入输出头文件
/*
#define DISABLE_INT asm("nop");//SREG &= 0x7f
#define ENABLE_INT asm("nop");//SREG |= 0X80
*/
#define TXEN 3 //发送使能
#define TXC 6 //发送结束
#define URSEL 8 //写使能
void delay(unsigned int time);
void initialize(void);
void UartSend(void);
void UartSend_8(unsigned char data);
void uart_init(void);
unsigned char timer;
unsigned char time;
unsigned char time2;
unsigned char UART_H;
unsigned char UART_L;
/*******************************************
函数名称: main
功 能: 主函数
参 数: 无
返回值 : 无
********************************************/
main( void )
{
initialize(); //初始化端口
while(1)
{
delay(1000);
if((PINB&0x01) != 0x01)
{
SETBIT(DDRD,1); /*发送数据,设为输出*/
CLEARBIT(PORTD,1);
UCSRB = 0x08; //发送使能
UartSend_8(UART_L);
while((PINB&0x01) != 0x01) //判断是否为高电平,高电平则发送第二个字节
{
delay(100);
}
UartSend_8(UART_H);
CLEARBIT(DDRD,1);
SETBIT(PORTD,1); /*发送完毕,设为输入*/
UCSRB = 0x00; //发送禁止
}
}
}
/*******************************************
函数名称: UartSend_8
功 能: 异步串口发送一个字节
参 数: sendB--发送的字节数据
返回值 : 无
********************************************/
void UartSend_8(unsigned char data)
{
while((UCSRA & 0x20) == 0x00); //等待发送缓冲区为空
UDR = data; //发送数据
}
/*******************************************
函数名称: TIMER2_COMP
功 能: T2比较中断,中断5次读一次数据.
参 数: 无
返回值 : 无
********************************************/
#pragma vector = TIMER2_COMP_vect
__interrupt void TIMER2_COMP(void)
{
timer++;
if(timer >= 50)
{
timer = 0;
TCCR1B = 0x00; //停止计数
UART_L = TCNT1L; //读取计数值
UART_H = TCNT1H;
TCNT1 = 0;
TCCR1B = 0x07; //T1外部引脚,上升沿驱动
if(time2 == 0)
{
SETBIT(PORTD,2);
time2 = 1;
}
else
{
CLEARBIT(PORTD,2);
time2 = 0;
}
}
}
/*******************************************
函数名称: initialize
功 能: 初始化单片机
参 数: 无
返回值 : 无
********************************************/
void initialize(void)
{
DDRB = 0x00;
PORTB = 0xff;
DDRC = 0xff;
PORTC = 0x00;
// DDRD = 0x0f;
DDRD = 0x00;
PORTD = 0xff; //配置TX为输出(很重要)
TCCR1B = 0X07; //T1外部引脚,上升沿驱动
TCNT2 = 0x00;
TCCR2 = 0x0f; //1024分频,CTC模式
OCR2 = 0x4e; //初值78/0.01s
TIMSK = 0x80; //开T2比较中断
UBRRL = 51; //波特率9600
UBRRH = 0;
// UCSRB = 0x08; //发送使能
UCSRC = 0x86; //8位,1停止位,
SREG=0x80; //开全局中断
}
/*******************************************
函数名称: Delayus
功 能: 延时指定微秒(8M晶振)
参 数: time--延时的微秒数(大约,不是很精确,MS越大越准确)
返回值 : 无
********************************************/
void delay(unsigned int time)
{
unsigned int i;
time = time*5/4; //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
for( i=0;i<time;i++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -