ATmega128(與PC機通信)
//先發送200個FF,然后單片機處于接收狀態,接收數據顯示在數碼管上,電腦發送的數據格式如09,16進制形式
//編譯環境 AVR Studio 4.17/AVR GCC
//系統時鐘11.0592MHZ,設置熔絲位為外部高頻石英晶體振蕩,啟動時間4.1ms
//***********************************************************************
//包含文件
//***********************************************************************
#include
#include
#define F_CPU11.0590200// 單片機主頻為11.0592MHz,用于延時子程序
#include
#include
#include
#include //中斷信號頭文件
//***********************************************************************
//定義變量區
//***********************************************************************
#define Data_IO PORTA //數碼管數據口
#define Data_DDR DDRA //數碼管數據口方向寄存器
#define D_LE0 PORTD &= ~(1 << PD4) //數碼管段控制位為0,鎖存端口數據
#define D_LE1 PORTD |= (1 << PD4) //數碼管段控制位為1,鎖存器輸出與端口一致
#define W_LE0 PORTD &= ~(1 << PD5) //數碼管位控制位為0
#define W_LE1 PORTD |= (1 << PD5) //數碼管位控制位為1
#define delay_us(x) _delay_us(x) //AVR GCC延時函數 x(us)
#define delay_ms(x) _delay_ms(x) //AVR GCC延時函數 x(ms)
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define baud 9600 //設置波特率的大小
#define baud_setting (uint)((ulong)F_CPU/(16*(ulong)baud)-1) //波特率計算公式
#define baud_h (uchar)(baud_setting>>8) //提取高位
#define baud_l (uchar)(baud_setting) //低位
uint tx_count=200,tx_flag=0xff;
static uchar A1,A2,A3;
uchar usart_tx_data;
uchar usart_rx_data;
//***********************************************************************
//共陰數碼管顯示的斷碼表0~F
//***********************************************************************
uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//***********************************************************************
//IO端口初始化
//***********************************************************************
void system_init()
{
Data_IO=0xFF; //數據口為輸出
Data_DDR=0xFF;
PORTD=0xFF; //74HC573的控制口,設置為輸出
DDRD=0xFF;
}
//*************************************************************************
//74HC573控制數碼管動態掃描顯示函數,顯示采集到的溫度
//*************************************************************************
void Display_Uart(uint data_b,uint data_s,uint data_g)
{
uchar i,j;
system_init();
j=0x01; //此數據用來控制位選
for(i=0;i<5;i++) //用后3位數碼管來顯示
{
D_LE1;
W_LE1;
Data_IO=~j;
W_LE0;
j=(j<<1);
Data_IO=0x00;
D_LE0;
delay_ms(1);
}
D_LE1;
W_LE1;
Data_IO=~j;
W_LE0;
j=(j<<1);
Data_IO=table[A1];
D_LE0;
delay_ms(1);
D_LE1;
W_LE1;
Data_IO=~j;
W_LE0;
j=(j<<1);
Data_IO=table[A2];
D_LE0;
delay_ms(1);
D_LE1;
W_LE1;
Data_IO=~j;
W_LE0;
j=(j<<1);
Data_IO=table[A3];
D_LE0;
delay_ms(1);
}
void usart_init()
{
UCSR1A=0x00; //單倍速模式
UCSR1B=0xF8; //接收中斷和發送中斷允許
UCSR1C=(1<
UBRR1L=baud_l;
}
//*************************************************************************
//數據處理函數
//*************************************************************************
void data_do(uchar temp_d)
{
uchar A2t;
A1=temp_d/100; //分出百,十,和個位
A2t=temp_d%100;
A2=A2t/10;
A3=A2t%10;
}
//*************************************************************************
//串口相關中斷服務子程序
//*************************************************************************
//數據發送結束中斷向量
SIGNAL(SIG_USART1_TRANS) //中斷服務程序
{
delay_ms(10); //相關操作
}
//數據接收結束中斷向量
SIGNAL(SIG_USART1_RECV) //中斷服務程序
{
usart_rx_data=UDR1; //將接收到的數據取出
data_do(usart_rx_data); //數據處理,得到個位十位百位
}
//數據寄存器空中斷向量
SIGNAL(SIG_USART1_DATA) //中斷服務程序
{
UDR1=usart_tx_data; //發送數據到數據寄存器
tx_count--;
if(tx_count==0x00)
{
tx_flag=0x01;
UCSR1B=0xF0; //禁止發送
}
}
//*************************************************************************
//主程序
//*************************************************************************
void main()
{
system_init(); //系統初始化
usart_init(); //usart串口初始化配置
usart_tx_data=0xff;
SREG|=0x80; //開啟全局中斷
while(1)
{
SREG=0x00; //關中斷,PD口做IO口用,才能正常顯示數碼管
Display_Uart(A1,A2,A3); //顯示接收到的數據
SREG|=0x80; //開中斷,用于下次接收中斷
}
}
評論