liudingding 发表于 2019-2-19 20:00:15

有没有C语言的AVR芯片模拟多串口程序参考?

如题,有位大侠用汇编写了个8通道的M8芯片程序,虽然学单片机是从汇编开始的,但现在用汇编头痛,初步搜了搜没找到可靠的参考程序,我记得以前好像有个这样的程序,不知应该搜那个关键词?

wkman 发表于 2019-2-19 20:36:11

还玩avr的一定是情怀{:titter:}

liudingding 发表于 2019-3-21 13:39:29

改用51了,多年不用了

t3486784401 发表于 2019-3-21 15:15:46

模拟8通道串口,这效率能上天

zhanan 发表于 2019-3-21 15:34:10

改用CAN吧,CAN模块很便宜

2-605 发表于 2019-3-21 16:00:02

模拟8路的没有,一路的有,因为我是内部晶振,不敢用太高了的频率
使用了定时器和外部中断
//*********************************************************************
//外部中断
//当在没有接收和发送数据时产生中断时,先关中断再开定时
#pragma interrupt_handler EXT_INT1:iv_EXT_INT1
void EXT_INT1(void)
        {
        if((RS232TakeOver_Sign==0)&&(RS232Send_Sign==0))
                {
                OFF_EXT_INT1;
               TCNT1H = 0xff; //reload counter high value
               TCNT1L = 0xfe; //reload counter low value
               ON_RS232;
               RS232TakeOver_Sign=1;
                }
       
        }
//*********************************************************************
//定时器1,定时0.4167ms波特率为2400全双工串口
#pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
void timer1_ovf_isr(void)
        {
       //TIMER1 has overflowed
       TCNT1H = 0xf4; //reload counter high value
       TCNT1L = 0x0; //reload counter low value
       //串口发送
       if(RS232SendNumber!=0)
               {
               RS232Send_Sign=1;
               if(RS232Send_bitRAM==0){RS232_TX=0;RS232_TXUDR=RS232SendFull;RS232SendNumber1++;}//开始信号
                else if((RS232Send_bitRAM>=1)&&(RS232Send_bitRAM<=8)){if(RS232_TXUDR_bit0){RS232_TX=1;}else {RS232_TX=0;}RS232_TXUDR>>=1;}
                else if(RS232Send_bitRAM==9)RS232_TX=1;//停止位
                else RS232Send_bitRAM=0;
                if(RS232Send_bitRAM>=9)
                        {
                        RS232Send_bitRAM=0;
                        if(RS232SendNumber1>=RS232SendNumber)
                                {
                                RS232SendNumber=0;
                                RS232SendNumber1=0;
                                RS232Send_Sign=0;
                                if(RS232TakeOverStart_Sign==0)OFF_RS232;
                                }
                        }
               else RS232Send_bitRAM++;
               }
       //串口接收
       if(RS232TakeOver_Sign)//有数据
               {//bezz=RS232_RX;
                RS232TakeOverBITNumber++;       
                if(RS232TakeOverBITNumber==1)
                        {
                        if(RS232_RX)
                                {
                                RS232TakeOver_Sign=0;
                                RS232TakeOverBITNumber=0;
                                ON_EXT_INT1;
                                if(RS232Send_Sign==0)OFF_RS232;
                                }
                        }
                else if((RS232TakeOverBITNumber>=2)&&(RS232TakeOverBITNumber<=9))
                        {
                        if(RS232_RX)RS232_RXUDR_bit0=1;
                        else RS232_RXUDR_bit0=0;
                        if(RS232TakeOverBITNumber!=9)RS232_RXUDR>>=1;
                        }//读数据
                //一个字节的数据读取完成
                else if((RS232TakeOverBITNumber==10)&&(RS232_RX))
                        {
                        ON_EXT_INT1;
                        RS232TakeOverBITNumber=0;
                        if(RS232Send_Sign==0)OFF_RS232;
                        RS232TakeOver_Sign=0;
                        RS232TakeOverFull=RS232_RXUDR;
                        RS232_RXUDR=0;
                        RS232TakeOverNumber++;
                        if(RS232TakeOverNumber>15)RS232TakeOverNumber=0;
                       RS232TakeOverStart_Sign=1;//有数据标志
                        RS232TakeOverTime=0;//计时清除
                        }
                else {RS232TakeOverBITNumber=0;RS232_RXUDR=0;}
               }
        }

tomzbj 发表于 2019-3-22 21:56:27

需要8个串口?上个沁恒的ch438好了
http://www.wch.cn/products/CH438.html
页: [1]
查看完整版本: 有没有C语言的AVR芯片模拟多串口程序参考?