打印

单片机通信

[复制链接]
3031|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
鼓山|  楼主 | 2013-2-1 13:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/********************************************************************
* 文件名  : 串口接收试验.c
* 描述    :  该文件实现通过单片机从电脑接收数据(数据位数字)。通过数码管显示
    该试验使用的晶振是11.0592,如果使用12M晶振,会出现串口接收
    不正常的情况。原因是用12M晶振,波特率9600时的误差率达 8%
    当下载这个程序到单片机时,单片机的最高为为乱码,是正常现象,
    按一下复位键便可。是由于单片机下载也是通过串口下载引起的。
* 创建人  : 东流,2012年2月8日
* 版本号  : 2.0
* 杜邦线接法:用8针排线把P0口和J12的1-8连接(P0.0接J12的1端)。
     用8针排线把P2口和J13的1-8连接(P2.7接J13的1端)。 //注意这里是P2.7
***********************************************************************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int
uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code LED_W[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar LED_Buffer[8] = {0};      //从串口接收的数据
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)//1ms延时
{
uchar x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
/********************************************************************
* 名称 : Com_Int()
* 功能 : 串口中断子函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Com_Int(void) interrupt 4
{
static uchar i = 7;    //定义为静态变量,当重新进入这个子函数时 i 的值不会发生改变
EA = 0;
if(RI == 1)   //当硬件接收到一个数据时,RI会置位
{
  LED_Buffer[i] = SBUF - 48; //这里减去48是因为从电脑中发送过来的数据是ASCII码。
  RI = 0;  
  if(i==0) i = 8;  
  i--;  
}
EA = 1;
}
/********************************************************************
* 名称 : Com_Init()
* 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中断
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Com_Init(void)
{
     TMOD = 0x20;
     PCON = 0x00;
     SCON = 0x50;   
     TH1 = 0xFd;    //设置波特率 9600
     TL1 = 0xFd;
     TR1 = 1;  //启动定时器1
  ES = 1;  //开串口中断
  EA = 1;  //开总中断  
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main()
{
uchar i = 0;
Delay_1ms(100);
Com_Init();
while(1)
{
  for(i=0;i<8;i++)
  {
   P0 = table[LED_Buffer[i]];
   P2 = LED_W[i];
   Delay_1ms(1);
  }
}
}         

相关帖子

沙发
鼓山|  楼主 | 2013-2-1 13:51 | 只看该作者
:):):)

使用特权

评论回复
板凳
鼓山|  楼主 | 2013-2-1 13:52 | 只看该作者
:lol:lol:lol

使用特权

评论回复
地板
zhangmangui| | 2013-2-1 15:32 | 只看该作者
神马情况?

使用特权

评论回复
5
加油吧小鱼儿| | 2013-3-5 20:36 | 只看该作者
只是接收的?建议以后接收和发送都采用中断方式,这是我的一点经验,不要用查询方式

使用特权

评论回复
6
电子学习员| | 2013-3-6 13:04 | 只看该作者
一个测试程序吧

使用特权

评论回复
7
少先队员| | 2013-3-9 00:48 | 只看该作者
什么意思?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

粉丝