5933|11

74

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

快疯了!!PC通过USBlib和89S52通信的问题,大家帮忙哦 [复制链接]

我在淘宝上买了一个USB下载线,他提供给PC的驱动是libusb,没提供驱动代码;我从网上下载了libusb的代码;初始化,打开设备都可以的,就是发送接收失败,想了好几天了都不知道什么原因!请大家帮忙看下
  1. struct usb_bus            
  2. *busses;   
  3. int                           device_num = 0;   
  4. device_num = 0;       /* 记录设备数量 */        
  5. usb_init();            /* 初始化 */   
  6. usb_find_busses();   /* 寻找系统上的usb总线 */   
  7. usb_find_devices(); /* 寻找usb总线上的usb设备 */      
  8. /* 获得系统总线链表的句柄 */
  9. busses = usb_get_busses();     
  10. struct usb_bus       *bus;    /* 遍历总线 */   
  11. for (bus = busses; bus; bus = bus->next)
  12. {        
  13. struct usb_device *dev;        /* 遍历总线上的设备 */      
  14. for (dev = bus->devices; dev; dev = dev->next) {           /* 寻找到相关设备, */
  15. if(dev->descriptor.idVendor==VENDOR_ID&& dev->descriptor.idProduct == PRODUCT_ID)
  16. {               
  17. /* 这里添加设备的初始化代码 */                                 
  18. device_num++;   /* 找到的设备数 */
  19. }                       
  20. }            
  21. }   
  22. return device_num;        /* 返回设备数量 */
复制代码


中间有USB下载线进行转换

单片机的串口发送代码
  1. #include
  2. #include
  3. #define INBUF_LEN 4 //数据长度
  4. unsigned char inbuf1[INBUF_LEN];
  5. unsigned char checksum,count3;
  6. bit read_flag= 0 ;
  7. void init_serialcomm( void )
  8. {
  9. SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable
  10. ucvr TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload
  11. PCON |= 0x80 ; //SMOD=1; TH1 = 0xF4 ; //Baud:4800 fosc=11.0592MHz
  12. IE |= 0x90 ; //Enable Serial Interrupt
  13. TR1 = 1 ; // timer 1 run // TI=1;
  14. }
  15. //向串口发送一个字符
  16. void send_char_com( unsigned char ch)
  17. { SBUF=ch; while (TI== 0 ); TI= 0 ; }
  18. //向串口发送一个字符串,strlen为该字符串长度
  19. void send_string_com( unsigned char *str, unsigned int strlen)
  20. { unsigned int k= 0 ;
  21. do { send_char_com(*(str + k)); k++; }
  22. while (k < strlen); }
  23. //串口接收中断函数
  24. void serial () interrupt 4 using 3
  25. {
  26. if (RI)
  27. {
  28. unsigned char ch; RI = 0 ;
  29. ch=SBUF;
  30. if (ch> 127 )
  31.   { count3= 0 ; inbuf1[count3]=ch; checksum= ch- 128 ; }
  32.    else { count3++; inbuf1[count3]=ch; checksum ^= ch;
  33.    if ( (count3==(INBUF_LEN- 1 )) && (!checksum) )
  34.    { read_flag= 1 ; //如果串口接收的数据达到INBUF_LEN个,且校验没错, //就置位取数标志
  35.    }
  36.    }
  37.     }
  38.     }
  39.    
  40.     main()
  41.     {
  42.      init_serialcomm(); //初始化串口
  43.      while ( 1 )
  44.      {
  45.      if (read_flag) //如果取数标志已置位,就将读到的数从串口发出
  46.       { read_flag= 0 ; //取数标志清0
  47.       send_string_com(inbuf1,INBUF_LEN);
  48.       }
  49.       }
  50.       }
复制代码

最新回复

上式中的“计数速率”与所使用的晶体振荡器频率有关,在51芯片中定时器启动后会在每一个机器周期使定时寄存器TH的值增加一,一个机器周期等于十二个振荡周期,所以可以得知51芯片的计数速率为晶体振荡器频率的1/12,一个12M的晶振用在51芯片上,那么51的计数速率就为1M。通常用11.0592M晶体是为了得到标准的无误差的波特率,那么为何呢?计算一下就知道了。如我们要得到9600的波特率,晶振为11.0592M和12M,定时器1为模式2,SMOD设为1,分别看看那所要求的TH1为何值。代入公式:             11.0592M             9600=(2÷32)×((11.0592M/12)/(256-TH1))             TH1=250 //看看是不是和上面实例中的使用的数值一样?             12M             9600=(2÷32)×((12M/12)/(256-TH1))             TH1≈249.49                  上面的计算可以看出使用12M晶体的时候计算出来的TH1不为整数,而TH1的值只能取整数,这样它就会有一定的误差存在不能产生精确的9600波特率。当然一定的误差是可以在使用中被接受的,就算使用11.0592M的晶体振荡器也会因晶体本身所存在的误差使波特率产生误差,但晶体本身的误差对波特率的影响是十分之小的,可以忽略不计。   详情 回复 发表于 2009-10-12 23:08
点赞 关注

回复
举报

54

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
对了,我用的是12M的晶振
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
是下载程序么?用现成的下载软件即可,如avr_fighter
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

4
 
驱动不需要重新编译,有现成的
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

5
 
avr_fighter 用这个烧写程序,读取89S52都没问题
我现在是想PC与52进行通信,发送接收数据
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

6
 
怎么没人知道吗?
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

7
 
这个版块也太冷清了,还是水平低啊;不解决问题,绝对结贴!
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

8
 
void init_serialcomm( void )
{
SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable
ucvr TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload
PCON |= 0x80 ; //SMOD=1; TH1 = 0xF4 ; //Baud:4800 fosc=11.0592MHz
IE |= 0x90 ; //Enable Serial Interrupt
TR1 = 1 ; // timer 1 run // TI=1;
}
PCON |= 0x80 ; //SMOD=1; TH1 = 0xF4 ; //Baud:4800 fosc=11.0592MHz

看看你的这一行代码

然后你自己去算一个12M的
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

9
 
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

10
 
没看懂,下载线是usb接口,是吗?
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

11
 
是USB接口的下载线啊
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

12
 
上式中的“计数速率”与所使用的晶体振荡器频率有关,在51芯片中定时器启动后会在每一个机器周期使定时寄存器TH的值增加一,一个机器周期等于十二个振荡周期,所以可以得知51芯片的计数速率为晶体振荡器频率的1/12,一个12M的晶振用在51芯片上,那么51的计数速率就为1M。通常用11.0592M晶体是为了得到标准的无误差的波特率,那么为何呢?计算一下就知道了。如我们要得到9600的波特率,晶振为11.0592M和12M,定时器1为模式2,SMOD设为1,分别看看那所要求的TH1为何值。代入公式:

            11.0592M

            9600=(2÷32)×((11.0592M/12)/(256-TH1))

            TH1=250 //看看是不是和上面实例中的使用的数值一样?


            12M

            9600=(2÷32)×((12M/12)/(256-TH1))

            TH1≈249.49

            

    上面的计算可以看出使用12M晶体的时候计算出来的TH1不为整数,而TH1的值只能取整数,这样它就会有一定的误差存在不能产生精确的9600波特率。当然一定的误差是可以在使用中被接受的,就算使用11.0592M的晶体振荡器也会因晶体本身所存在的误差使波特率产生误差,但晶体本身的误差对波特率的影响是十分之小的,可以忽略不计。
引用 7 楼 lbing7 的回复:
void init_serialcomm( void )
{
SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable
ucvr TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload
PCON |= 0x80 ; //SMOD=1; TH1 = 0xF4 ; //Baud:4800 fosc=11.0592MHz
IE |= 0x90 ; //Enable Serial Interrupt
TR1 = 1 ; // timer 1 run // TI=1;
}
PCON |= 0x80 ; //SMOD=1; TH1 = 0xF4 ; //Baud:4800 fosc=11.0592MHz

看看你的这一行代码

然后你自己去算一个12M的

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表