新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ATmega128(與PC機通信)

        ATmega128(與PC機通信)

        作者: 時間:2016-11-10 來源:網絡 收藏
        atmega128的USART串口發送與接收數據示例程序,采用串口1,發送和接收都是中斷的方式

        //先發送200個FF,然后單片機處于接收狀態,接收數據顯示在數碼管上,電腦發送的數據格式如09,16進制形式
        //編譯環境 AVR Studio 4.17/AVR GCC
        //系統時鐘11.0592MHZ,設置熔絲位為外部高頻石英晶體振蕩,啟動時間4.1ms

        本文引用地址:http://www.104case.com/article/201611/317441.htm

        //***********************************************************************
        //包含文件
        //***********************************************************************

        #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<|(1<|(1<|(1< UBRR1H=baud_h; //寫波特率的值
        UBRR1L=baud_l;
        }
        |(1<|(1<|(1<

        //*************************************************************************
        //數據處理函數
        //*************************************************************************
        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; //開中斷,用于下次接收中斷
        }
        }



        關鍵詞: ATmega128PC機通

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 顺平县| 大兴区| 远安县| 扎鲁特旗| 瑞昌市| 阜宁县| 常熟市| 堆龙德庆县| 同心县| 广宁县| 定远县| 资中县| 浦县| 都江堰市| 志丹县| 三穗县| 西充县| 新津县| 遵义县| 岳池县| 从化市| 福安市| 日照市| 吉安市| 七台河市| 罗城| 赫章县| 乐陵市| 泾阳县| 安丘市| 巍山| 永泰县| 永胜县| 黄骅市| 十堰市| 昭觉县| 康马县| 乌苏市| 左权县| 太仆寺旗| 瓦房店市|