如何用C语言写出51单片机系统时钟为8hz利用定时器T0和p1.2输出矩形脉冲,脉冲

1个回答
展开全部
摘要 #include // 定义系统时钟频率为8hz#define FREQ_SYSCLK 8000void timer0_isr(void) interrupt 1{ // T0时钟计数初值 TH0 = (65536 - FREQ_SYSCLK/8)/256; TL0 = (65536 - FREQ_SYSCLK/8)%256; // 输出矩形脉冲 P1 ^= (1<<2); // P1.2输出矩形脉冲}void main(){ // 定时器T0初始化设置 TMOD |= 0x01; // 16位自动重装定时模式 TH0 = (65536 - FREQ_SYSCLK / 8) / 256; TL0 = (65536 - FREQ_SYSCLK / 8) % 256; ET0 = 1; // 允许定时器T0中断 TR0 = 1; // 启动定时器T0 // 循环等待中断事件 while (1);}
咨询记录 · 回答于2023-05-28
如何用C语言写出51单片机系统时钟为8hz利用定时器T0和p1.2输出矩形脉冲,脉冲
脉冲占空比为2:1 一个为200us一个为100us
#include // 定义系统时钟频率为8hz#define FREQ_SYSCLK 8000void timer0_isr(void) interrupt 1{ // T0时钟计数初值 TH0 = (65536 - FREQ_SYSCLK/8)/256; TL0 = (65536 - FREQ_SYSCLK/8)%256; // 输出矩形脉冲 P1 ^= (1<<2); // P1.2输出矩形脉冲}void main(){ // 定时器T0初始化设置 TMOD |= 0x01; // 16位自动重装定时模式 TH0 = (65536 - FREQ_SYSCLK / 8) / 256; TL0 = (65536 - FREQ_SYSCLK / 8) % 256; ET0 = 1; // 允许定时器T0中断 TR0 = 1; // 启动定时器T0 // 循环等待中断事件 while (1);}
在上述代码中,我们利用16位自动重装定时器模式,并将定时器T0中断的计数初值设为8hz,实现了系统时钟为8hz,并利用P1.2输出矩形脉冲。
#include // 定义系统时钟频率为8hz#define FREQ_SYSCLK 8000// 定义一个矩形脉冲的占空比为2:1,即高电平持续时间为200us,低电平持续时间为100us#define DUTY_CYCLE 2void timer0_isr(void) interrupt 1{ static unsigned char phase = 0; static unsigned char period_count = 0; static unsigned char high_level_count = 0; // 计算T0的计数初值,使得定时器在8hz时钟下,定时一次为125us TH0 = 0xff; TL0 = 0x9a; // 矩形脉冲的输出 if (phase == 0) // 高电平 { P1 |= (1= DUTY_CYCLE) {
{ P1 &= ~(1= 2) // 相邻两个脉冲的时间差为100us { phase = 0; period_count = 0; } } } void main() { // 定时器T0初始化设置 TMOD |= 0x01; // 16位自动重装定时模式 EA = 1; // 全局中断允许 ET0 = 1; // 允许定时器T0中断 TR0 = 1; // 启动定时器T0 // 循环等待中断事件 while (1); }
在上述代码中,我们利用定时器T0中断的方式,处理了相邻两个脉冲的间隔时间,实现了一个占空比为2:1、高电平持续时间为200us、低电平持续时间为100us的矩形脉冲。
发图片您看得到吗
4. 题目已知C8051单片机系统时钟为8MHz,利用定时器T0和P1.2输出矩形脉冲如下: 在此波形中,高电平持续时间为200us,低电平持续时间为100us,因此周期为300us,即一个完整的矩形脉冲为300us。在频率为8MHz的系统时钟下,一个完整的矩形脉冲需要计数的次数为:8MHz * 300us = 2400因为计数是16位的,故计数初值为:65536 - 2400 = 63136 = 0xF700因此,在C8051单片机系统中,利用定时器T0和P1.2实现矩形波输出的代码如下:
#include void main(void){ // 将系统时钟设置为8MHz OSCXCN = 0x67; while ((OSCXCN & 0x80) == 0); OSCICN = 0x0C; // 定时器T0初始化设置 TMOD |= 0x01; //16-bit timer/counter TH0 = 0xF7; TL0 = 0x00; ET0 = 1; // 中断可重入 (Interrupt Enable) TR0 = 1; // 启动定时器T0 // 循环等待中断事件 while (1);}void T0_ISR(void) interrupt 1{ static bit high_level = 0; if(high_level) { P1_2 = 1; // 输出高电平 TH0 = 0xF7; TL0 = 0x9D; // 计数初值,持续200us high_level = 0; // 切换到低电平 } else
else { P1_2 = 0; // 输出低电平 TH0 = 0xF7; TL0 = 0xCE; // 计数初值,持续100us high_level = 1; // 切换到高电平 }}
5. 题目已知C8051单片机系统时钟为8MHz,要求P1.0和P1.1分别输出周期为2ms和500us的方波。频率为 2ms 的方波周期为4ms,需要计数的次数:8MHz * 4ms = 32000计数初值为:65536 - 32000 = 33536 = 0x8300频率为 500us 的方波周期为1ms,需要计数的次数:8MHz * 1ms = 8000计数初值为:65536 - 8000 = 57536 = 0xE100
因此,在C8051单片机中,利用定时器T0和P1.0输出周期为2ms,利用P1.1输出周期为500us的方波的代码如下:
#include void main(void){ // 将系统时钟设置为8MHz OSCXCN = 0x67; while ((OSCXCN & 0x80) == 0); OSCICN = 0x0C; // 初始化定时器T0,用于产生 2ms 方波 TMOD |= 0x01; //16-bit timer/counter TH0 = 0x83; TL0 = 0x00; ET0 = 1; // 中断可重入 (Interrupt Enable) TR0 = 1; // 启动定时器T0 // 初始化定时器T1,用于产生 500us 方波 TMOD |= 0x10; //16-bit timer/counter TH1 = 0xE1; TL1 = 0x00; ET1 = 1; // 中断可重入 (Interrupt Enable) TR1 = 1; // 启动定时器T1
// 循环等待中断事件 while (1);}void T0_ISR(void) interrupt 1{ static bit level_0 = 0; static bit level_1 = 0; if(level_0) { P1_0 = 1; TH0 = 0x83; // 计数初值,持续 1ms 高电平 TL0 = 0xE8; level_0 = 0; }
} else { P1_0 = 0; TH0 = 0x83; // 计数初值,持续 3ms 低电平 TL0 = 0xD0; level_0 = 1; } } void T1_ISR(void) interrupt 3 { static bit level_1 = 0; if(level_1) {
if(level_1) { P1_1 = 1; TH1 = 0xE1; // 计数初值,持续 250us 高电平 TL1 = 0x8F; level_1 = 0; } else { P1_1 = 0; TH1 = 0xE1; // 计数初值,持续 250us 低电平 TL1 = 0xFC; level_1 = 1; } }
6. C8051F410单片机中的PCA可编程计数器的基本结构与原理: PCA是Programmable Counter Array的英文缩写,即可编程计数器阵列。PCA的主要功能是可以代替系统的定时器、计数器和PWM模块,实现比较、捕捉、脉宽调制、定时计数、定时中断等多种计数器/定时器的功能。 PCA的基本结构由三个主要模块组成:计数器模块、比较器模块和捕捉/脉宽调制模块。计数器模块负责计数操作,比较器模块将计数器的输出与给定的比较值进行比较,从而产生比较结果,捕捉/脉宽调制模块可以对外部信号进行捕捉、脉宽调制等操作。
在C8051F410单片机中,PCA的主要特点是使用16位定时器,可实现从0000H到FFFFH的计数。利用可编程的系统时钟分频器,可实现多种不同频率的计数操作。此外,在F410单片机中,PCA还可以产生PWM波,支持多
下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消