IO口模拟串口C51程序

发布者:vettykatty最新更新时间:2016-11-18 来源: eefocus关键字:IO口  模拟串口  C51程序 手机看文章 扫描二维码
随时随地手机看文章

/**************************
 文件所用资源
1.外部中断0
2.端口:P3.3、P3.4
**************************/
sbit BT_REC =P3^3;  //接收 P3.0
sbit BT_SND =P3^4;  //发送 P3.1

#define MODE_QUICK
#define F_TM F0
#define TIMER0_ENABLE   TL0=TH0; TR0=1;
#define TIMER0_DISABLE TR0=0;

sbit ACC0=    ACC^0;
sbit ACC1=    ACC^1;
sbit ACC2=    ACC^2;
sbit ACC3=    ACC^3;
sbit ACC4=    ACC^4;
sbit ACC5=    ACC^5;
sbit ACC6=    ACC^6;
sbit ACC7=    ACC^7;
unsigned char com_dat;
/**************************
 定时器0中断服务函数
**************************/
void IntTimer0() interrupt 1
{
 F_TM=1;
}
/**************************
 模拟串口发送一个字节
**************************/
void PSend_Char(unsigned char inch)
{
 EX1=0;   //关闭INT0中断
 #ifdef MODE_QUICK 
 ACC=inch;

 F_TM=0;
 BT_SND=0;   
 TIMER0_ENABLE;  //启动
 while(!F_TM);
 
 BT_SND=ACC0;  //先送出低位
 F_TM=0;
 while(!F_TM);

 BT_SND=ACC1; 
 F_TM=0;
 while(!F_TM);

 BT_SND=ACC2; 
 F_TM=0;
 while(!F_TM);

 BT_SND=ACC3; 
 F_TM=0;
 while(!F_TM);
 
 BT_SND=ACC4; 
 F_TM=0;
 while(!F_TM);

 BT_SND=ACC5; 
 F_TM=0;
 while(!F_TM);

 BT_SND=ACC6; 
 F_TM=0;
 while(!F_TM);

 BT_SND=ACC7; 
 F_TM=0;
 while(!F_TM);

 BT_SND=1; 
 F_TM=0;
 while(!F_TM);

 TIMER0_DISABLE; //停止timer
 #else
 unsigned char ii;

 ii=0;

 F_TM=0;
 BT_SND=0; 
 TIMER0_ENABLE;  //启动
 while(!F_TM);

 while(ii<8)
 {
  if(inch&1)
  {
   BT_SND=1;
  }
  else
  {
   BT_SND=0;
  }
  F_TM=0;
  while(!F_TM);
  ii++;
  inch>>=1;
 }
 BT_SND=1; 
 F_TM=0;
 while(!F_TM);

 #endif 
 TIMER0_DISABLE; //停止timer
 IE1=0;   //清除中断标志
 EX1=1;   //INT0中断允许
}
/******************************** 
 外部中断0模拟串口接收一个字节
********************************/
void PGet_Char() interrupt 2
{   
 EX1=0;   //关闭INT0中断
  
 #ifdef MODE_QUICK

 TIMER0_ENABLE; 
 F_TM=0;
 while(!F_TM);  //等过起始位
 ACC0=BT_REC;

 TL0=TH0;

 F_TM=0;
 while(!F_TM);
 ACC1=BT_REC;

 F_TM=0;
 while(!F_TM);
 ACC2=BT_REC;

 F_TM=0;
 while(!F_TM);
 ACC3=BT_REC;

 F_TM=0;
 while(!F_TM);
 ACC4=BT_REC;

 F_TM=0;
 while(!F_TM);
 ACC5=BT_REC;

 F_TM=0;
 while(!F_TM);
 ACC6=BT_REC;

 F_TM=0;
 while(!F_TM);
 ACC7=BT_REC;

 F_TM=0;

 while(!F_TM)
 {
  if(BT_REC)
  {
   break;
  } 
 }
 TIMER0_DISABLE; //停止timer
 com_dat=ACC;

 #else
 unsigned char rch,ii;
 TIMER0_ENABLE; 
 F_TM=0;
 ii=0;
 rch=0;
 while(!F_TM);  //等过起始位

 while(ii<8)
 {
  rch>>=1;
  if(BT_REC)
  {
   rch|=0x80;
  }
  ii++;
  F_TM=0;
  while(!F_TM);

 }
 F_TM=0;
 while(!F_TM)
 {
  if(BT_REC)
  {
   break;
  }
 } 
 TIMER0_DISABLE; //停止timer
 dat=rch;

 #endif 
 IE1=0;   //清除中断标志
 EX1=1;   //INT0中断允许
}


关键字:IO口  模拟串口  C51程序 引用地址:IO口模拟串口C51程序

上一篇:IO口模拟SPI通信C51程序
下一篇:24CXX读写驱动C51程序

推荐阅读最新更新时间:2024-03-16 15:21

再次发模拟串口,51自适应波特率
这个是在12T的8051上面用的模拟串口程序,配合22.1184M的晶振,加上6T的双倍速,波特率可以上38400 但是我认为和某些STC的芯片比,还是差了一点,所以说,看官门看注释吧。开启帧请发送没有连续低电平的字符,类似0 55,0xff,0x7f如此等等,如果有连续低电平很容易造成判断失误 这个程序可以用在STC的自动冷启动模块里(STC15F101系列就行,很便宜的,注意是八位装载模式顺便把T1X12关了~然后补偿可以顺便减小一点,顺便说一句,用AT89C51来做也行)。这个在24M/22.1184M/11.0592M均工作正常,11.0592能到9600,24能到38400。不过,我提个醒,如果看官们真拿这个做STC冷启的
[单片机]
STC8单片机IO口简单模拟串行通信
我们都知道如何使用系统配置的串口初始化函数去使用我们的串口,就是只能使用固定的引脚去进行串行通信,就是下面这种方法, 如果想要使用其他的引脚来进行串行通信,就不可以了。下面教大学如何使用模拟串行通信,即可以使用任意引脚进行数据的收发。 1.计算传输一位数据所需要的时间,这与通信的波特率有关,在这里以波特率为1200bps为例。 波特率为1200,意思就是每秒传输的位数是1200位,那么每一位传输的时间就是1/1200*10的6次方=833us 这就表示传输每一位的时间是833us。 2.了解串行数据收发的过程,它的一帧数据一般包括1个起始位 + 8位有效数据(即一个字节)+ 1位停止位,还有校验位,在这里可要可
[单片机]
STC8单片机<font color='red'>IO口</font>简单<font color='red'>模拟</font>串行通信
单片机I/O口与寻址方式
寻址方式 寻址方式是指令中提供操作数的形式,它可以是操作数本身,也可以是操作数存放的位置.51单片机中,存放数据的存储器空间有4种:内部RAM,特殊功能寄存器SFR,外部RAM和程序存储器ROM. 立即寻址 指令中直接给出操作数的寻址方式称之为立即寻址.立即数用一个前面加”#”号的8位数或16位数表示. 直接寻址 指令中直接给出操作数所在的地址的寻址方式称之为直接寻址. 寄存器寻址 以通用寄存器的内容为操作数的寻址方式称之为寄存器寻址.通用寄存器包括:A,B,DPTR,R0~R7. 寄存器间接寻址 以寄存器中的内容为地址,该地址中的内容为操作数的寻址方式称之为寄存期间接寻址.建成寄存期间址.能够
[单片机]
单片机I/O口与寻址方式
51单片机如何模拟串口之计数法
简介:51的计数器在每指令周期加1,直到溢出,同时硬件置溢出标志位。这样我们就可以通过预置初值的方法让机器每96个指令周期产生一次溢出,程序不断的查询溢出标志来决定是否发送或接收下一位。 计数法 分 析: 51的计数器在每指令周期加1,直到溢出,同时硬件置溢出标志位。这样我们就可以通过预置初值的方法让机器每96个指令周期产生一次溢出,程序不断的查询溢出标志来决定是否发送或接收下一位。 接收的程序,可以参考下一种方法,不再写出。这种办法个人感觉不错,接收和发送都很准确,另外不需要计算每条语句的指令周期数。 view plaincopy to clipboardprint? //计数器初始化 void S2INI(voi
[单片机]
MSP430F149的IO口
1 概述 MSP430F149共有6组IO口,每组8bit, IO口的设置包括设置IO功能、方向、输入输出寄存器初值。对IO口不做设置,默认情况下为第一功能,输入模式。 2 常用寄存器 PxDIR 0 输入,1 输出; PxSEL 0 I/O口,1 第二功能; PxOUT,PxIN; PxIES 设置中断触发方式 0上升沿,1下降沿; PxIE 设置中断触发允许0禁止,1允许; PxIFG 中断标志寄存器,需要软件清零。 3 用法 IO口中断: P1,P2口总共有16个IO口均能引发中断,相关寄存器为PXIE(中断允许):0不允许,1允许。PXIES(中断触发岩选择)0上升沿、1下降沿。PXIFG(中断标志寄存器),I0口
[单片机]
stm32学习之时钟和IO口配置
一.时钟的配置 如果仅仅点亮小灯的话,仅需配置系统时钟和IO口的时钟 1.利用SystemInit()函数配置系统时钟,默认是72MHZ 2.利用APB2外设时钟给GPIO口提供IO口时钟,我的板子上是利用的PD6引脚点亮灯的,故对应的函数为RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); void RCC_Configuration(void) { SystemInit(); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); } 二.GPIO口的配置 配置IO口主要利用两部分结构:1.结构体GPI
[单片机]
51单片机的出租车计价器C51程序
已通过模拟测试 #include reg52.h unsigned char cir_num,pwm_mach,temp,distance,wait_time,price,distance; unsigned int a,t; sbit pwm_mach=P1^0; sbit key_clean=P3^0;//定义按键位置 sbit key_stop=P3^1; sbit key_cheak=P3^2; sbit key_oneway=P3^3; sbit key_doubleway=P3^4; unsigned char code led_buf ={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07
[单片机]
C51单片机的IO口介绍(下)
上一篇文章我们对C51的IO简单的介绍了一下,现在我们来简单了解C51的IO的结构 这里我们学习一下比较常见的单片机的IO模式,分别是准双向,开漏输出和推挽输出 (这里要提一嘴,我们用的STC88C52RC是没有推挽输出功能的,STC公司后续推出的一些机型才有推挽输出功能) 接下来我们来看看这几种模式 1.准双向 看看下面的原理图,机内信号通过一个非门取反后送入一个MOS管,MOS管负责控制这个IO的高低电平,配合内部上拉电阻完成高低电平的输出 为了方便我们分析,我们把这个MOS管看成一只NPN三极管。区别是三极管靠电流导通,MOS管靠电压导通 结合前面我们讲过的知识,对于一只NPN三极管,基极b电压比集电极c电压
[单片机]
<font color='red'>C51</font>单片机的<font color='red'>IO口</font>介绍(下)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

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