***************************************************************/
#include
#include
/***计算和定义波特率设置参数***/
#define BAUD 9600
#define CRYSTAL 4000000
#define BAUD_SETTING (unsigned int)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1)
#define BAUD_H (unsigned char)(BAUD_SETTING>>8)
#define BAUD_L (unsigned char)(BAUD_SETTING)
#define FRAMING_ERROR (1<
/********************延时函数***********************/
void delay(void)
{
int i,j;
for(i=0;i<500;i++)
for(j=0;j<500;j++);
}
/*******************接收函数************************/
#pragma interrupt_handler uart_rx:12 // USART接收中断服务
void uart_rx(void)
{
unsigned char status,da
status = UCSRA;
da
if ((status & (FRAMING_ERROR | PARITY_ERROR | DA
PORTA = led_7[da
}
/******************发送函数************************/
void USART_Transmit(unsigned char da
{
while (!(UCSRA & DA
UDR = da
}
void main( void )
{
unsigned char i=0;
PORTA = 0x00; // LED段码输出
DDRA = 0xff;
PORTD = 0x03; // TXD(PD1)输出
DDRD = 0x02; // RXD(PD0)输入,上拉有效
UCSRA = 0x00; // USART初始化
UCSRB = (1<
UCSRC = (1<
//UCSRC = 0x86;
UBRRH=BAUD_H; // 设置波特率
UBRRL=BAUD_L;
SEI(); //允许全局中断
for(;;)
{
USART_Transmit(i);
if (++i>=10) i = 0;
delay();
}
}
名称:USART测试
目的:发送字符,字符串到PC上显示(本例中LED显示不用)
作者:竹林清风
***************************************************************/
#include
#include
/***计算和定义波特率设置参数***/
#define BAUD 9600
#define CRYSTAL 4000000
#define BAUD_SETTING (unsigned int)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1)
#define BAUD_H (unsigned char)(BAUD_SETTING>>8)
#define BAUD_L (unsigned char)(BAUD_SETTING)
#define FRAMING_ERROR (1<
/********************延时函数***********************/
void delay(void)
{
int i,j;
for(i=0;i<20;i++)
for(j=0;j<500;j++);
}
/*******************接收函数************************/
#pragma interrupt_handler uart_rx:12 // USART接收中断服务
void uart_rx(void)
{
unsigned char status,da
status = UCSRA;
da
if ((status & (FRAMING_ERROR | PARITY_ERROR | DA
PORTA = led_7[da
}
/******************发送字符函数************************/
void USART_Transmit(unsigned char da
{
while (!(UCSRA & DA
UDR = da
// while(!(UCSRA&(BIT(TXC))));
//UCSRA|=BIT(TXC);
}
/******************发送字符串函数************************/
void USART_Transmit_str(unsigned char *ptr)
{
while (*ptr)
{
USART_Transmit(*(ptr++));
}
}
/***********************主函数**********************************/
void main( void )
{
unsigned char i='a';
PORTA = 0x00; // LED段码输出
DDRA = 0xff;
PORTD = 0x03; // TXD(PD1)输出
DDRD = 0x02; // RXD(PD0)输入,上拉有效
UCSRA = 0x00; // USART初始化
UCSRB = (1<
UCSRC = (1<
//UCSRC = 0x86;
UBRRH=BAUD_H; // 设置波特率
UBRRL=BAUD_L;
// SEI(); //允许全局中断
while(1)
{
USART_Transmit(i);
delay();
USART_Transmit_str("welcome");
delay();
}
}
名称:USART测试
目的:按键控制发数据,PC机显示,本实验没用到接收函数
作者: 竹林清风
***************************************************************/
#include
#include
/***计算和定义波特率设置参数***/
#define BAUD 9600
#define CRYSTAL 4000000
#define BAUD_SETTING (unsigned int)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1)
#define BAUD_H (unsigned char)(BAUD_SETTING>>8)
#define BAUD_L (unsigned char)(BAUD_SETTING)
#define FRAMING_ERROR (1<
unsigned char led_7[]={0x3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};
unsigned char time_10ms_ok,time_1s_ok,time_1,key_stime1_counter=0;
int time_counter=0;
/*******************按键函数************************/
/******************按键函数***********************************************/
#define key_input PIND // 按键输入口
#define key_mask 0b000000100 // 按键输入屏蔽码
#define key_no 0
#define key_k1 1
#define key_state_0 0
#define key_state_1 1
#define key_state_2 2
unsigned char read_key(void)
{
static unsigned char key_state = 0,key_old;
unsigned char key_press, key_return=key_no;
key_press = key_input & key_mask; // 读按键I/O电平
switch (key_state)
{
case key_state_0: // 按键初始态
if (key_press != key_mask)
{
key_old = key_press; // 记录原电平
key_state = key_state_1; // 键被按下,状态转换到键确认态
}
break;
case key_state_1: // 按键确认态
if (key_press == key_old) // 与原电平比较(消抖处理)
{
if (key_press == 0b00000000)
{
key_state = key_state_2; // 状态转换到键释放态
key_return = key_k1;
}
}
else
key_state = key_state_0; // 按键已抬起,转换到按键初始态
break;
case key_state_2:
if (key_press == key_mask) key_state = key_state_0;
break;
}
return key_return;
}
/******************比较定时器0比较向量入口地址***************/
#pragma interrupt_handler TIMER0_COMP:20
void TIMER0_COMP(void)
{
if(++key_stime1_counter>=5)
{
time_10ms_ok=1;
PORTD.6=~PORTD.6
if(++time_counter>=1000)
{
time_1s_ok=1;
}
}
}
/********************延时函数***********************/
void delay(void)
{
int i,j;
for(i=0;i<20;i++)
for(j=0;j<500;j++);
}
/*******************接收函数************************
****接收到电脑发送的数据****************************/
#pragma interrupt_handler uart_rx:12 // USART接收中断服务
void uart_rx(void)
{
unsigned char status,da
status = UCSRA;
da
if ((status & (FRAMING_ERROR | PARITY_ERROR | DA
PORTA = led_7[da
}
/******************发送字符函数************************/
void USART_Transmit(unsigned char da
{
while (!(UCSRA & DA
UDR = da
// while(!(UCSRA&(BIT(TXC))));
//UCSRA|=BIT(TXC);
}
/******************发送字符串函数************************/
void USART_Transmit_str(unsigned char *ptr)
{
while (*ptr)
{
USART_Transmit(*(ptr++));
}
}
/***********************主函数**********************************/
void main( void )
{
unsigned char temp,i,count=0;
PORTA = 0x00; // LED段码输出
DDRA = 0xff;
PORTD = 0x03; // TXD(PD1)输出
DDRD = 0x02; // RXD(PD0)输入,上拉有效
UCSRA = 0x00; // USART初始化
UCSRB = (1<
UCSRC = (1<
//UCSRC = 0x86;
UBRRH=BAUD_H; // 设置波特率
UBRRL=BAUD_L;
TCCR0=0x0B; // 内部时钟,64分频(4M/64=62.5KHz),CTC模式
TCNT0=0x00;
OCR0=0x7C; // OCR0 = 0x7C(124),(124+1)/62.5=2ms
TIMSK=0x02; // 允许T/C0比较匹配中断
SEI(); //允许全局中断
while(1)
{
if(time_10ms_ok)
{
time_10ms_ok=0;
temp=read_key();
if(temp!=key_no)
{
if(temp=key_k1)
{
USART_Transmit(i);
if (++i >= 10) i = 0;
delay();
}
}
}
}
}
/*************************实验目的*****************************
名称:USART测试
目的:从PC机上发送字符到实验板上,LED数码管显示相应的值
作者:竹林清风
***************************************************************/
#include
#include
/***计算和定义波特率设置参数***/
#define BAUD 9600
#define CRYSTAL 4000000
#define BAUD_SETTING (unsigned int)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1)
#define BAUD_H (unsigned char)(BAUD_SETTING>>8)
#define BAUD_L (unsigned char)(BAUD_SETTING)
#define FRAMING_ERROR (1<
unsigned char led_7[]={0x3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};
/********************延时函数***********************/
void delay(void)
{
int i,j;
for(i=0;i<20;i++)
for(j=0;j<500;j++);
}
/*******************接收函数************************
****接收到电脑发送的数据****************************/
#pragma interrupt_handler uart_rx:12 // USART接收中断服务
void uart_rx(void)
{
unsigned char status;
status = UCSRA;
fdata = UDR;
//if ((status & (FRAMING_ERROR | PARITY_ERROR | DA
flag=1;
}
/******************发送字符函数************************/
void USART_Transmit(unsigned char da
{
while (!(UCSRA & DA
UDR = da
// while(!(UCSRA&(BIT(TXC))));
//UCSRA|=BIT(TXC);
}
/******************发送字符串函数************************/
void USART_Transmit_str(unsigned char *ptr)
{
while (*ptr)
{
USART_Transmit(*(ptr++));
}
}
/***********************主函数**********************************/
void main( void )
{
PORTA = 0x00; // LED段码输出
DDRA = 0xff;
PORTD = 0x03; // TXD(PD1)输出
DDRD = 0x02; // RXD(PD0)输入,上拉有效
UCSRA = 0x00; // USART初始化
UCSRB = (1<
UCSRC = (1<
//UCSRC = 0x86;
UBRRH=BAUD_H; // 设置波特率
UBRRL=BAUD_L;
SEI(); //允许全局中断
while(1)
{
if(flag)
{
PORTA=led_7[fdata];//把单片机接收到的数据在数码管上显示
flag=0;
}
}
}
上一篇:AVR单片机 usart串口使用范例
下一篇:avr利用pwm控制led光暗及峰鳴器音量大小
推荐阅读最新更新时间:2024-03-16 15:17