找回密码
 立即注册
楼主: wuzhengmin

有关DMA,山东大学陈桂友教授

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:154
  • 最近打卡:2026-04-01 21:19:52
已绑定手机

22

主题

2426

回帖

3424

积分

论坛元老

积分
3424
发表于 2026-1-15 15:13:56 | 显示全部楼层
怎么改写成C语言?
  1. //对应的C语言版程序如下:
  2. //#include"stc8h.h"  
  3. #include <AI8051U.H>  //包含ai8051U单片机的头文件
  4. unsigned char T0cnt; //声明计数变量
  5. void Timer0_Init(void);//定时器0初始化函数
  6. void main(void)
  7. {
  8.         P4M1=0xff;
  9.         P4M0=0xff;
  10.         P0M1=0x0;
  11.         P0M0=0x0;
  12.         P40=0;
  13.         Timer0_Init();
  14.         T0cnt=10;      //计数变量赋初值
  15.         ET0  = 1;     //允许T0中断
  16.         EA = 1;    //开放总的中断
  17.         while(1);  //等待中断
  18.        
  19. }
  20. void Timer0_Init(void) //50毫秒@11.0592MHz
  21. {
  22.         AUXR&= 0x7E;   //定时器时钟12T模式
  23.         TMOD&= 0xF0;  //设置定时器模式
  24.         TL0 = 0x00;   //设置定时初始值
  25.         TH0 = 0X4C;   //设置定时初始值
  26.         TF0 = 0;      //清除TFO标志
  27.         TR0 = 1;      //定时器0开始计时
  28.        
  29. }
  30. //定时器TO中断函数
  31. void TO_ISR(void)  interrupt TMR0_VECTOR   //TMR0_VECTOR 就是1
  32. {
  33.         T0cnt--;           //计数变量减1
  34.         if(T0cnt==0)       //若减到0,则将P0.0取反
  35.         {
  36.                 P00 = ~P00;
  37.                 T0cnt = 10;    //重新给计数变量赋值
  38.                
  39.         }       
  40. }
  41.        
复制代码

当然可读性就好很多,不过效率是汇编的70%
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:154
  • 最近打卡:2026-04-01 21:19:52
已绑定手机

22

主题

2426

回帖

3424

积分

论坛元老

积分
3424
发表于 2026-1-15 15:15:17 | 显示全部楼层
接着看看定时器2

截图202601151515148809.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:154
  • 最近打卡:2026-04-01 21:19:52
已绑定手机

22

主题

2426

回帖

3424

积分

论坛元老

积分
3424
发表于 2026-1-15 15:29:01 | 显示全部楼层
下边是初始化函数和中断服务函数

截图202601151528596666.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:154
  • 最近打卡:2026-04-01 21:19:52
已绑定手机

22

主题

2426

回帖

3424

积分

论坛元老

积分
3424
发表于 2026-1-15 15:59:41 | 显示全部楼层
完整程序如下:

/*【例2】T2的使用。设系统时钟频率为11.0592MHz,利用定时器T2定时,每隔4s将P0.0的状态取反。
C语言程序如下:
*/

#include <AI8051U.H> //包含stc8h单片机的头文件
unsigned char i; //声明计数变量
void Timer2_Init(void);  //定时器2初始化函数

void main(void)
{
        P4M1=0xff;
        P4M0=0xff;
        P0M1=0x0;
        P0M0=0x0;
        P40=0;
        Timer2_Init();
       
        i=4;         //计数变量赋初值
        EA = 1 ;     //开放总的中断
        while(1);    //等待中断
       
}

void Timer2_Isr(void) interrupt TMR2_VECTOR
{
        i--;//计数变量减1
        if(i==0)    //若减到0,则将P2.0取反
        {
                P00 =~P00;
                i = 4;  //重新给计数变量赋值
        }
}

void Timer2_Init(void)  //1秒@11.0592MHz
{
//        TM2PS=0x0E;   //设置定时器时钟预分频(注意:并非所有系列都有此寄存器,详情请查看数据手册)
//        AUXR&= 0xFB;  //定时器时钟12T模式
//        T2L = 0x00;   //设置定时初始值
//        T2H = 0x10;   //设置定时初始值
//        AUXR= 0x10;   //定时器2开始计时
       

        TM2PS = 0x0E;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
        AUXR &= 0xFB;                        //定时器时钟12T模式
        T2L = 0x00;                                //设置定时初始值
        T2H = 0x10;                                //设置定时初始值
        AUXR |= 0x10;                        //定时器2开始计时
        IE2 |= 0x04;            //使能定时器2中断
       
//        TM2PS = 0xA8;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
//        AUXR |= 0x04;                        //定时器时钟1T模式
//        T2L = 0x61;                                //设置定时初始值
//        T2H = 0x00;                                //设置定时初始值
//        AUXR |= 0x10;                        //定时器2开始计时
//        IE2 |= 0x04;            //使能定时器2中断

}

回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:154
  • 最近打卡:2026-04-01 21:19:52
已绑定手机

22

主题

2426

回帖

3424

积分

论坛元老

积分
3424
发表于 2026-1-15 16:02:58 | 显示全部楼层
不过,我编译下载烧录后,觉得定时时间不对

好像没有相隔4秒,最多是0.5秒的感觉.............

我又用STC的ISP自动生成的定时器,实验了一下,无论是12T,还是1T

实际定时时间好像都不对.............

但是理论上又看不出哪里错了?
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:154
  • 最近打卡:2026-04-01 21:19:52
已绑定手机

22

主题

2426

回帖

3424

积分

论坛元老

积分
3424
发表于 2026-1-15 16:16:16 | 显示全部楼层
定时器3、4的使用方法与定时器2类似,唯一需要注意的是大多寄存器不能使用位寻址,设置或修改内容时,请
使用相关的字节操作方式进行设置。 请自行进行学习。

汇编就要用 ANL ORL  C语言就要用 &  |

STC  的手册有应用实际例子,大家去跑一下就容易理解了

定时器的时钟输出(级联)也不细讲了

这节课先讲到这里

下节课我们讲:
截图202601151616146648.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:154
  • 最近打卡:2026-04-01 21:19:52
已绑定手机

22

主题

2426

回帖

3424

积分

论坛元老

积分
3424
发表于 2026-1-15 16:19:33 | 显示全部楼层
下面姚总补充USB-CDC串口:

因为马上要学习串口了

所以我们要先插入 STC-USB-CDC的双串口

截图202601151619311395.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:154
  • 最近打卡:2026-04-01 21:19:52
已绑定手机

22

主题

2426

回帖

3424

积分

论坛元老

积分
3424
发表于 2026-1-15 16:21:54 | 显示全部楼层
当单片机需要和电脑之间进行数据交换时,首选一般都是串口通讯。Ai8051U系列单片机内置USB控制器和收发器,当用户代码中嵌入USB-CDC代码后,使用USB线将单片机与电脑直接相连接,在电脑端就可识别出【USB-CDC虚拟串口】,【USB-CDC虚拟串口】就是【串口】.
截图202601151621132119.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:154
  • 最近打卡:2026-04-01 21:19:52
已绑定手机

22

主题

2426

回帖

3424

积分

论坛元老

积分
3424
发表于 2026-1-15 16:25:03 | 显示全部楼层
USB-CDC 虚拟串口和传统串口相比有如下优点:
数据传输更快:USB-CDC虚拟串口忽略传统串口的波特率,传输速度的比特率即为全速USB的通讯速度 12MBPS(即每秒 12M 位)
使用更简单便捷:USB-CDC 虚拟串口忽略传统串口的起始位、停止位等冗余信息数据传输更可靠:USB-CDC虚拟串口丢弃传统串口简单的软件奇偶校验机制,USB-CDC虚拟串口数据传输时有 USB 硬件 CRC 校验,以及校验出错重传机制,保证数据100%正确自动缓存数据:USB-CDC虚拟串口会自动缓存数据。单片机在没有处理完成上位机下传的上一笔数据时,如果此时上位机又有新的数据下传,虚拟串口会自动将新的数据缓存,从而保证数据 100%不会丢失或被覆盖。

传统的8051是没有这个USB-CDC串口的

我们一定要学会使用STC的“一箭双雕”和link1D

它们都能在完成不停地下载的情况下,产生STC-USB-CDC 双串口

很方便,这样我们搞UART1  UART2 UART3  UART4 的实验,就方便好多

回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:154
  • 最近打卡:2026-04-01 21:19:52
已绑定手机

22

主题

2426

回帖

3424

积分

论坛元老

积分
3424
发表于 2026-1-15 16:30:33 | 显示全部楼层
STC 有个有名的串口通信+中断的实验:

b)实验介绍
测试Ai8051U芯片的RTC功能,产生闹钟中断、天中断、小时中断、分钟中断、秒钟中断,并使用AiCube-ISP系统软件的USB-CDC功能打印中断数据及年/月/日、时/分/秒数据。
实验观察到的现象:
程序运行后,在AiCube-ISP系统软件的USB-CDC窗口显示闹钟中断,每秒/分/小时/天产生的中断,并显示当前RTC的时间。
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-4-2 20:09 , Processed in 0.117021 second(s), 79 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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