本程序是模拟串口硬件机制写的,使用时可设一定时中断,时间间隔为1/4波特率,每中断一次调用一次接收函数, 每中断4次调用一次发送函数,不过.对单片机来说时钟并须要快.要知道9600的波特率的每个BIT的时间间隔是104us.而单片机中断一次压栈出栈一次的时间是20us左右(标准的51核12M晶体)这样处理时间就要考虑清楚了.呵呵.以下程序是放在定时器中断程序函数内的
//接收部分
sbit JieShou_D= ;//定义接收端口
uint8 DingShiJiShu,JieShou_h;//定时计数,接收缓冲器
uint16 JieShou_T;//接收临时寄存器
bit KaiShi,JieShou_b;//开始接收标准,接收完成标志
void JieShou(void) //接收函数,每4次调用接收一位
{
if((KaiShi==0) && (JieShou_D==0)) //串行开始位到来
{
DingShiJiShu=0; //开始定时计数
KaiShi=1;
JieShou_T=0xffff; //接收临时寄存器置全1
}
else if((KaiShi==1) && (DingShiJiShu==1)) //第2次调用,串行数据采样时间到来
{
JieShou_T >>= 1;
if(JieShou_D) JieShou_T |=0x8000;
}
else if(JieShou_T & 0x807f ==0x803f) //接收完成 JieShou_T=1xxx_xxxx_x011_1111
{
KaiShi=0;
DingShiJiShu=0;
JieShou_h = JieShou_T >> 7; //右移7位得到串行数据
JieShou_b=1;
}
if(KaiShi)
{
DingShiJiShu++; //只在开始接收时定时计数+1
DingShiJiShu &=0x03; //每4次调用接收一位
}
}
//发送部分
sbit FaSong_D= ;//定义发送端口
uint16 FaSong_h; //发送缓冲区
bit FaSong_b; //发送完成标志
void KaiShiFaSong(uint8 fs) //设置发送数据,开始发送
{
FaSong_h = fs;
FaSong_h <<= 1;
FaSong_h |= 0x0200; //FaSong_h=0000_001x_xxxx_xxx_0
FaSong_b=0; //发送标志=0 表示正在发送中
}
void FaSong(void) //发送函数,每调用一次发一位
{
if(FaSong_h) //发送未完成
{
if(FaSong_h & 0x0001)
FaSong_D=1;
else FaSong_D=0;
FaSong_h >>= 1;
}
else
FaSong_b =1; //发送完成标志=1 表示发送完成
}
关键字:模拟串口 硬件机制 定时中断
引用地址:
模拟串口硬件机制写的程序
推荐阅读最新更新时间:2024-03-16 13:16
MCS-51单片机定时中断不同应用情况解决方案
MCS-51单片机的中断响应延迟时间,取决于其它中断服务程序是否在进行,或取决于正在执行的是什么样的指令。单中断系统中的中断响应时间为3~8个机器周期 。无论是哪一种原因引起的误差,在精确定时的应用场合,必须考虑它们的影响,以确保精确的定时控制。根据定时中断的不同应用情况,应选择不同的精确定时编程方法。 文中以定时器T1工作在定时方式1为例,晶振频率为12MHz 。 1 方法1 在定时器溢出中断得到响应时,停止定时器计数,读出计数值(反映了中断响应的延迟时间),根据此计数值算出到下一次中断时,需多长时间,由此来重装载和启动定时器。例如定时周期为1ms,则通常定时器重装载值为-1000(0FC18H)。下面的程序在计算每个定时
[单片机]
STM32单片机(5) 定时器中断实验
/******************************************************************************* * * 软件功能: 定时器中断实验 * *******************************************************************************/ #include stm32f10x.h #include delay.h void RCC_Configuration(void); void GPIO_Configuration(void); void NVIC_
[单片机]
AVR/Arduino定时/计数器、中断入门
在Arduino中,可以使用AnalogWrite来使用硬件产生490Hz/980Hz的pwm波,并可根据参数来设定占空比。不了解这个的同学可以去AnalogWrite学习下,SecretsOfArduinoPWM也是讲了Arduino在avr的定时/计数器上做的封装,我们这里并不讲Arduino相关,而是讲AVR的定时/计数器,如何产生更多PWM波和定时/计数器的中断使用。 AVR Timer/Counter(以下统称Timer) 以ATmega358p为例,其内部拥有一个16位计时器,两个8位计时器,下图则为16位计时器的大致图解: 对于没有接触过avr内部的Arduino同学来说,这张图看不出来任何意思,别急,这些都是AV
[单片机]
51定时器和外部中断
#include reg52.h #define uint unsigned int #define uchar unsigned char sbit p2_0=P2^0; sbit p2_2=P2^1; sbit p2_4=P2^2; uchar num=11; uchar tt=0; uchar bai,shi,ge,bai1,num1; uchar code table = {~0x3f,~0x06,~0x5b,~0x4f, ~0x66,~0x6d,~0x7d,~0x07, ~0x7f,~0x6f,~0x77,~0x7c, ~0x39,~0x5e,~0x79,~0x71}; void delay(uint z)
[单片机]
STM32外部中断及定时器编程示例
#include stm32f10x.h #include 12864.h ErrorStatus HSEStartUpStatus; //等待时钟的稳定 u8 count=0; u8 d; void SYS_Configuration(void); /* //ms延时函数 void delayms(unsigned int nValue) //delay 1ms at 8M { unsigned int nCount; unsigned int ii; unsigned int jj; nCount = 1980; for(ii = nValue;ii 0;ii--) { for(jj = nCount
[单片机]
stm8s定时中断
stm8s定时器有高级定时器TIM1,通用定时器TIM2,TIM3,TIM5,以及基本定时器TIM4,TIM6。定时中断配置基本一样。需要注意的也就是分频不同,定时器位数不同。16位定时器配置后面再说,这里以基本定时器TIM4为例,产生2ms中断,配置如下: TIM4_IER_UIE = 1;//使能TIM4溢出中断 TIM4_PSCR = 0x06; //配置TIM4 64分频,8us记一次数 TIM4_ARR = 0xF9; //自动重装载的值- 249,2ms中断 TIM4_CNTR = 0xF9; TIM4_CR1_CEN = 1; //使能TIM4计数 说明:主时钟为8M,根据手册,带入数值80000
[单片机]
PIC18F中断定时器
//基于MCC18编译器,使用HI-PICC不可用 //-------------------------------------------- #include p18F452.h //---------------------------------------------------------------------------- void main (void); void InterruptHandlerHigh (void); unsigned int Timeout; //------------------------------------------------------------------
[单片机]
STM32之定时器中断控制LED闪烁
上篇博客我们是用延时函数实现了LED的闪烁,今天我们使用STM32的定时器来使LED闪烁。 关于32的定时器的种类,今天我在这先不做过多的说明,有时间我会再另写一篇博客来专门介绍32的定时器。今天我们使用32的定时器3来产生中断,以实现LED的闪烁。 今天我们需要配置的有LED和定时器,首先来配置LED,我们还是使用正点原子精英版开发板上的DS0来进行实验 配置LED的过程还是和上篇博客中点亮LED的方法一样,我就不再过多的说明,只贴下代码 led.c文件如下 #include led.h void led_init(void) { GPIO_InitTypeDef GPIO_InitStructure
[单片机]