有没有C语言的AVR芯片模拟多串口程序参考?
如题,有位大侠用汇编写了个8通道的M8芯片程序,虽然学单片机是从汇编开始的,但现在用汇编头痛,初步搜了搜没找到可靠的参考程序,我记得以前好像有个这样的程序,不知应该搜那个关键词? 还玩avr的一定是情怀{:titter:} 改用51了,多年不用了 模拟8通道串口,这效率能上天 改用CAN吧,CAN模块很便宜 模拟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;}
}
} 需要8个串口?上个沁恒的ch438好了
http://www.wch.cn/products/CH438.html
页:
[1]