怎么改写成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%
接着看看定时器2
下边是初始化函数和中断服务函数
完整程序如下:
/*【例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中断
}
不过,我编译下载烧录后,觉得定时时间不对
好像没有相隔4秒,最多是0.5秒的感觉.............
我又用STC的ISP自动生成的定时器,实验了一下,无论是12T,还是1T
实际定时时间好像都不对.............
但是理论上又看不出哪里错了?
定时器3、4的使用方法与定时器2类似,唯一需要注意的是大多寄存器不能使用位寻址,设置或修改内容时,请
使用相关的字节操作方式进行设置。 请自行进行学习。
汇编就要用 ANL ORLC语言就要用 &|
STC的手册有应用实际例子,大家去跑一下就容易理解了
定时器的时钟输出(级联)也不细讲了
这节课先讲到这里
下节课我们讲:
下面姚总补充USB-CDC串口:
因为马上要学习串口了
所以我们要先插入 STC-USB-CDC的双串口
当单片机需要和电脑之间进行数据交换时,首选一般都是串口通讯。Ai8051U系列单片机内置USB控制器和收发器,当用户代码中嵌入USB-CDC代码后,使用USB线将单片机与电脑直接相连接,在电脑端就可识别出【USB-CDC虚拟串口】,【USB-CDC虚拟串口】就是【串口】.
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 的实验,就方便好多
STC 有个有名的串口通信+中断的实验:
b)实验介绍
测试Ai8051U芯片的RTC功能,产生闹钟中断、天中断、小时中断、分钟中断、秒钟中断,并使用AiCube-ISP系统软件的USB-CDC功能打印中断数据及年/月/日、时/分/秒数据。
实验观察到的现象:
程序运行后,在AiCube-ISP系统软件的USB-CDC窗口显示闹钟中断,每秒/分/小时/天产生的中断,并显示当前RTC的时间。