wuzhengmin 发表于 2026-1-15 15:13:56

怎么改写成C语言?//对应的C语言版程序如下:
//#include"stc8h.h"
#include <AI8051U.H>//包含ai8051U单片机的头文件

unsigned char T0cnt; //声明计数变量

void Timer0_Init(void);//定时器0初始化函数

void main(void)
{
        P4M1=0xff;
        P4M0=0xff;
        P0M1=0x0;
        P0M0=0x0;
        P40=0;
        Timer0_Init();

        T0cnt=10;      //计数变量赋初值
        ET0= 1;   //允许T0中断
        EA = 1;    //开放总的中断
        while(1);//等待中断
       
}

void Timer0_Init(void) //50毫秒@11.0592MHz
{
        AUXR&= 0x7E;   //定时器时钟12T模式
        TMOD&= 0xF0;//设置定时器模式
        TL0 = 0x00;   //设置定时初始值
        TH0 = 0X4C;   //设置定时初始值
        TF0 = 0;      //清除TFO标志
        TR0 = 1;      //定时器0开始计时
       
}

//定时器TO中断函数
void TO_ISR(void)interrupt TMR0_VECTOR   //TMR0_VECTOR 就是1
{
        T0cnt--;         //计数变量减1
        if(T0cnt==0)       //若减到0,则将P0.0取反
        {
                P00 = ~P00;
                T0cnt = 10;    //重新给计数变量赋值
               
        }       
}
       
当然可读性就好很多,不过效率是汇编的70%

wuzhengmin 发表于 2026-1-15 15:15:17

接着看看定时器2

wuzhengmin 发表于 2026-1-15 15:29:01

下边是初始化函数和中断服务函数

wuzhengmin 发表于 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中断

}

wuzhengmin 发表于 2026-1-15 16:02:58

不过,我编译下载烧录后,觉得定时时间不对

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

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

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

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

wuzhengmin 发表于 2026-1-15 16:16:16

定时器3、4的使用方法与定时器2类似,唯一需要注意的是大多寄存器不能使用位寻址,设置或修改内容时,请
使用相关的字节操作方式进行设置。 请自行进行学习。

汇编就要用 ANL ORLC语言就要用 &|

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

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

这节课先讲到这里

下节课我们讲:

wuzhengmin 发表于 2026-1-15 16:19:33

下面姚总补充USB-CDC串口:

因为马上要学习串口了

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

wuzhengmin 发表于 2026-1-15 16:21:54

当单片机需要和电脑之间进行数据交换时,首选一般都是串口通讯。Ai8051U系列单片机内置USB控制器和收发器,当用户代码中嵌入USB-CDC代码后,使用USB线将单片机与电脑直接相连接,在电脑端就可识别出【USB-CDC虚拟串口】,【USB-CDC虚拟串口】就是【串口】.

wuzhengmin 发表于 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 双串口

很方便,这样我们搞UART1UART2 UART3UART4 的实验,就方便好多

wuzhengmin 发表于 2026-1-15 16:30:33

STC 有个有名的串口通信+中断的实验:

b)实验介绍
测试Ai8051U芯片的RTC功能,产生闹钟中断、天中断、小时中断、分钟中断、秒钟中断,并使用AiCube-ISP系统软件的USB-CDC功能打印中断数据及年/月/日、时/分/秒数据。
实验观察到的现象:
程序运行后,在AiCube-ISP系统软件的USB-CDC窗口显示闹钟中断,每秒/分/小时/天产生的中断,并显示当前RTC的时间。
页: 58 59 60 61 62 63 64 65 66 67 [68] 69 70 71 72 73 74 75 76 77
查看完整版本: 有关DMA,山东大学陈桂友教授