搜索
bottom↓
回复: 6

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

[复制链接]

出390入22汤圆

发表于 2019-2-19 20:00:15 | 显示全部楼层 |阅读模式
如题,有位大侠用汇编写了个8通道的M8芯片程序,虽然学单片机是从汇编开始的,但现在用汇编头痛,初步搜了搜没找到可靠的参考程序,我记得以前好像有个这样的程序,不知应该搜那个关键词?

阿莫论坛20周年了!感谢大家的支持与爱护!!

阿莫论坛才是最爱国的,关心国家的经济、社会的发展、担心国家被别国牵连卷入战争、知道珍惜来之不易的和平发展,知道师夷之长,关注世界的先进文化与技术,也探讨中国文化的博大精深,也懂得警惕民粹主义的祸国殃民等等等等,无不是爱国忧民的表现。(坛友:tianxian)

出0入0汤圆

发表于 2019-2-19 20:36:11 | 显示全部楼层
还玩avr的一定是情怀  

出390入22汤圆

 楼主| 发表于 2019-3-21 13:39:29 | 显示全部楼层
改用51了,多年不用了

出200入2554汤圆

发表于 2019-3-21 15:15:46 | 显示全部楼层
模拟8通道串口,这效率能上天

出0入0汤圆

发表于 2019-3-21 15:34:10 | 显示全部楼层
改用CAN吧,CAN模块很便宜

出0入0汤圆

发表于 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];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[RS232TakeOverNumber]=RS232_RXUDR;
                        RS232_RXUDR=0;
                        RS232TakeOverNumber++;
                        if(RS232TakeOverNumber>15)RS232TakeOverNumber=0;
                         RS232TakeOverStart_Sign=1;//有数据标志
                        RS232TakeOverTime=0;//计时清除
                        }
                else {RS232TakeOverBITNumber=0;RS232_RXUDR=0;}
                 }
        }

出0入362汤圆

发表于 2019-3-22 21:56:27 | 显示全部楼层
需要8个串口?上个沁恒的ch438好了
http://www.wch.cn/products/CH438.html
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-16 22:01

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表