模拟串口硬件机制写的程序

发布者:Harmonious88最新更新时间:2013-01-18 来源: 21IC 关键字:模拟串口  硬件机制  定时中断 手机看文章 扫描二维码
随时随地手机看文章

    本程序是模拟串口硬件机制写的,使用时可设一定时中断,时间间隔为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 表示发送完成
}

关键字:模拟串口  硬件机制  定时中断 引用地址:模拟串口硬件机制写的程序

上一篇:基于单片机的点阵式LED滚动汉字显示屏仿真设计
下一篇:基于AD9912镜像频率的应用

推荐阅读最新更新时间: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
[单片机]
AVR/Arduino<font color='red'>定时</font>/计数器、<font color='red'>中断</font>入门
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
[单片机]
STM32之<font color='red'>定时</font>器<font color='red'>中断</font>控制LED闪烁
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved