📄 m128uart.c
字号:
#include <iom128V.h>
#include <macros.h>
#include <math.h>
#include <stdio.h>
#include <eeprom.h>
#define uchar unsigned char
#define uint unsigned int
#define Fosc 80000 //8M晶震
#define Baud 96 //9600拨特率
uchar temp[16];
void delay_10us(uint n) //10延时函数
{
unsigned int i,j;
for(j=0;j<n;j++)
{
for (i=0;i<8;i++);
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
WDR();
}
void delay_1ms(void) //1ms延时函数
{
unsigned int i;
for (i=0;i<140;i++);
WDR();
}
void delay_nms(unsigned int n) //延时n毫秒
{
unsigned int i;
n=n*8;
for (i=0;i<n;i++)
delay_1ms();
}
void uart1_init(void)
{
CLI();
UCSR0B|=(1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0); // RXEN1,TXEN1使能
UCSR0C = 0b00000110; // 8位数据传送
UBRR0H = (Fosc/(16*Baud)-1)/256; //9600拨特率设置
UBRR0L = (Fosc/(16*Baud)-1)%256;
}
uchar Recvuart(void) //接收数据
{
while(!(UCSR0A&0x80));
return UDR0;
}
uchar Recvuartintime(void) //有限时间接收数据
{
uint i;
i=10000;
while(i--)
{
if(UCSR0A&0x80)
break;
asm("nop");
}
return UDR0;
}
void Senduart(uchar data) //有限时间发送数据
{
uint i;
i=10000;
UDR0=data;
while(i--)
{
if(UCSR0A&0X40)
break;
}
UCSR0A|=0x40;
}
void Resetcard(void) ////卡机复位
{
uchar c;
Senduart(0x7f);
c=Recvuart();
c=c&0x7f;
if(c!=':')
while(1);
c='P';
Senduart(c);
if(Recvuart()!='^')
while(1);
}
#pragma interrupt_handler UART0:19
void UART0(void) //中断6采样卡机数据
{
uchar i;
uchar c;
for(i=0;i<2;i++)
temp[i]=Recvuart();
asm("nop");
}
void intitmcu(void)
{
uchar i,j;
DDRF=0Xfc;
PORTF=0XF0;
DDRE=0X3F;
PORTE=0XeF;
DDRB=0XFF;
PORTB=0XFF;
DDRD=0XFF;
PORTD=0XFF;
uart1_init();
XMCRA = 0x0E; //external memory
MCUCR = 0xC0;
EICRA = 0x02; //extended ext ints
EICRB = 0xA0; //extended ext ints
}
void main(void)
{
float data;
uchar i,c;
intitmcu();
SEI();
delay_nms(1000);
Senduart(0x1b); //卡机初始化
Senduart(0x6a);
delay_nms(1000);
while(1)
{
delay_nms(100);
Resetcard(); //卡机复位
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -