这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 怎么最快将DI数据赋给DO

共2条 1/1 1 跳转至

怎么最快将DI数据赋给DO

工程师
2023-08-21 09:00:16     打赏

问题:DI口输入一组400*24bit的数据,如何使用单片机实现:前40*24bit的数据不接收,剩下的数据全部转给DO口输出,并保证输出数据的准确性,不乱码。输入数据0码高电平时间为300ns左右。

已尝试方法:
使用单片机型号为STC15W105


#include /**
  * @Brief  IO口初始化
  * @param  null
  * @retval null
  */
***it DI = P3^2;
***it DO = P3^3;
void IO_Init(void)
{
        P3M0 |= 0x08;        //P33设置成推挽输出
        P3M1 &= 0xF7;
       
        P3M1 |= 0x04;        //P32设置成高阻输入
        P3M0 &= 0xFB;
        DO=0;


        //把P32脚设置为下降沿触发方式
        //P32是外部中断0输入脚
        IT0 = 1;        //外部中断0触发方式,=1下降沿触发,=0双边沿触发
        EX0 = 1;        //允许外部中断0中断
}


bit flag;
unsigned int count;//定时器计数值


/*void timer0Init(void)                //300微秒@33.1776MHz
{
        AUXR &= 0x7F;                //定时器时钟12T模式
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = 0xC3;                //设置定时初值
        TH0 = 0xFC;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
}
*/




void main(void)
{
       
        count=0;
        IO_Init();    //初始化
        EA = 1;       //开中断
        while(1)
        {
         if(flag)     //当过了20*24bit之后,输出等于输入
         {
                 DO = DI;
         }       
                ;
  }
}
       
       
void Int0_Routine(void)   interrupt 0  //外部中断0服务函数
        {
                if(DI ==1)
                {
                        DO =1;
                }
                else
                {
                        DO=0;
                }
                if(count<960)
                {
                count++;
                }else
                {
                        flag=1;
                }
                TR0=0;
                Timer0Init();      //计时300us则复位   
        }
       


void Timer0_Routine(void)   interrupt 1  //定时器0中断服务函数
        {
                count = 0;
                flag=0;
        }       
发现处理速度过慢,导致输出数据0码高电平时间达到us级,全被判为1码
尝试过不进行计数,直接将DO=DI,使DI口所有数据全部转发,发现一部分0码数据的高电平时间仍达到了600ns,导致乱码。

希望有大佬能帮忙解答




关键词: DI     DO    

助工
2023-08-21 09:01:00     打赏
2楼

////尽量与0判断
if(count)--count; //init count 9xx
else DO=DI;
/*kxxl
;if(count<960)
0000 C3                CLR     C
0001 E500        R     MOV     A,count+01H
0003 94C0              SUBB    A,#0C0H
0005 E500        R     MOV     A,count
0007 6480              XRL     A,#080H
0009 9483              SUBB    A,#083H
000B 5002              JNC     ?C0024
000D 0500        R     INC     DI
;if(count)
000F E500        R     MOV     A,count+01H
0011 4500        R     ORL     A,count
0013 6002              JZ      ?C0026
0015 1500        R     DEC     DO
*/
////Timer0Init()又是一堆指令,感觉赋初值就行,如果其它地方没影响
TL0 = 0xC3;
其他的就不太清楚了


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]