找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3404|回复: 14
收起左侧

如何把一个固定的值,用单片机IO口发送出来.具体请看帖子内容

[复制链接]
ID:548551 发表于 2020-8-19 19:26 | 显示全部楼层 |阅读模式
  如题, 比如我把789这个数值. 通过IO口一高低电平的方式发送出来. 然后我用逻辑分析仪来抓波形, 通过波形的高低,来确定这个数值是不是我想要的数值, 中断定时200US.如果有愿意帮主的老哥, 您给我一个模块就可以了
回复

使用道具 举报

ID:235200 发表于 2020-8-19 22:29 | 显示全部楼层
可以借鉴红外编码方法,直接发出来似乎不可能,因为二进制位数太多
回复

使用道具 举报

ID:283954 发表于 2020-8-20 03:00 | 显示全部楼层
先写一个串口副程式,把要看的数值往串口送,打开下载ISP软件的“串口助手”,把“下载后自动打开串口”打勾,就可以看到你要的数值了。
回复

使用道具 举报

ID:213173 发表于 2020-8-20 07:17 | 显示全部楼层
无标题.jpg
  1. #include <reg51.h>
  2. #include <intrins.h>

  3. typedef unsigned char uchar;
  4. typedef unsigned int  uint;

  5. sbit sign= P2^0;    //观察标记
  6. sbit SER = P2^1;    //数据输出

  7. /**功能:串行发送两个字节的数据**/
  8. void Serial(uint Data)
  9. {
  10.         uchar i;   
  11.         sign= 1;
  12.         for(i=0;i<16;i++)//由高位到低位发送16位数据
  13.         {
  14.                 Data<<=1;      
  15.                 SER = CY;                //溢出位赋值数据输出端
  16.         }  
  17.         _nop_();
  18.         _nop_();
  19.         _nop_();
  20.         _nop_();
  21.         _nop_();
  22.         _nop_();
  23.         SER = 0;
  24.         sign= 0;
  25.         _nop_();
  26. }

  27. void main()
  28. {         
  29.         uint num=789;//0000 0011 0001 0101
  30.         SER = 0;                //初始化数据输入端
  31.         sign= 0;                //起始标记
  32.         while(1)                //循环周期200us
  33.         {
  34.                 Serial(num);
  35.         }
  36. }
复制代码



回复

使用道具 举报

ID:213173 发表于 2020-8-20 07:21 | 显示全部楼层
说明:程序是按晶振频率12MHz编写
回复

使用道具 举报

ID:420836 发表于 2020-8-20 07:43 | 显示全部楼层
如果十进制数可以用8位二进制数表示,则首先将十进制数转换为二进制数,然后将二进制数发送到IO端口,例如P1.0-P1.7,每一位都有其 相应的IO引脚。 最后,在将二进制数发送给端口后,读取端口并将其与已知的十进制数进行比较。
回复

使用道具 举报

ID:548551 发表于 2020-8-20 08:46 | 显示全部楼层
csmyldl 发表于 2020-8-19 22:29
可以借鉴红外编码方法,直接发出来似乎不可能,因为二进制位数太多

最好的方法是红外的,但是不知道怎么把十进制的转化为二进制,比如789的二进制是1100010101.我直接在IO口输出高低就行了. 因为我要用逻辑分析仪抓波形出来, 我要根据波形的高低来转换成十进制,高低相对应的就是二进制的1和0
回复

使用道具 举报

ID:401564 发表于 2020-8-20 09:17 | 显示全部楼层
数值在单片机内部就是以二进制形式保存的,不用转换
如果你要通过一个IO发送出去,那就像写入24C01那种样子发送出去就可以了呀
延时可以适当的延长,一秒延时就能肉眼看到发送的是什么了
但最好是再用另外一个端口来提示时钟
回复

使用道具 举报

ID:548551 发表于 2020-8-20 10:55 | 显示全部楼层

感谢老哥的解答, 但是我有点看不懂.SER=CY;  这是什么意思? 是把CY的这个二进制的1和0通过SER这个IO口输出来了么?还有就是前面的Data<<=1;这条指令是不是就是相当于一个十进制的数据,被转换成了二进制,只是系统自己去转换去了, 是这意思么?  
回复

使用道具 举报

ID:548551 发表于 2020-8-20 11:05 | 显示全部楼层
感觉各位大佬的回复,感谢 . 我最开始没有表述清楚是我的错误, 我现在再详细的说一下我的需求, 我的IC 是八脚的,都被用完了.我采集出来的AD在线看不了,那么我想通过模拟红外波形的方式通过IO口把这个AD值比如789这个AD值,他的二进制是1100010101.通过IO口发送1100010101.这样的波形出来. 那么我通过逻辑分析仪,来接收,分析波形,根据波形的高低排列再转换成789这个十进制的数值. 定时是200US ,比如最高位为1,那么中断到了以后我就IO口输出1,下一个中断来的时候,我还是输出1,反之如果是0我就输出0  .这样能行得通么?
回复

使用道具 举报

ID:147710 发表于 2020-8-20 12:06 | 显示全部楼层
xqleft 发表于 2020-8-20 11:05
感觉各位大佬的回复,感谢 . 我最开始没有表述清楚是我的错误, 我现在再详细的说一下我的需求, 我的IC 是八 ...

用模拟串口,可以在任意端口输出数据,串口助手显示数据:
001.jpg

  1. ////测试工作频率为11.0592MHz
  2. #include "stc15.h"
  3. sbit TXD1 = P3 ^ 1; // 定义模拟串口发送脚
  4. void delay104us(void); //软件延时STC15W  11.0592M
  5. void Tx1Send(unsigned char dat); //9600,N,8,1                发送一个字节
  6. unsigned char HEX2ASCII(unsigned char dat); //十六进制转ASCII函数
  7. void Uart_Service(void);
  8. void PrintHex(unsigned char hex); // 发送一hex
  9. void PrintString(unsigned char code * puts); // 发送一串字符串
  10. //
  11. void delay104us(void) {  //(软件延时STC15W  11.0592M  i=1,j=2,k=140)
  12.         unsigned char i,j,k;
  13.         for (i = 1; i > 0; i--) // 注意后面没分号(   6M     i=1,j=3,k=49)
  14.                 for (j = 2; j > 0; j--) // 注意后面没分号(11.0592M  i=1,j=2,k=140)
  15.                         for (k = 140; k > 0; k--); // 注意后面有分号(22.1184M  i=1,j=3,        k=189)
  16. }
  17. //
  18. //模拟串口发送
  19. void Tx1Send(unsigned char dat) //9600,N,8,1                发送一个字节
  20. {
  21.         unsigned char i;
  22.         EA = 0;
  23.         TXD1 = 0;
  24.         delay104us();
  25.         for (i = 0; i < 8; i++) {
  26.                 if (dat & 1)
  27.                         TXD1 = 1;
  28.                 else
  29.                         TXD1 = 0;
  30.                 dat >>= 1;
  31.                 delay104us();
  32.         }
  33.         TXD1 = 1;
  34.         EA = 1;
  35.         delay104us();
  36.         delay104us();
  37. }
  38. //
  39. // 发送hex,如果8位,则0xXX,16位,0xXXXX
  40. void PrintHex(u16 hex)
  41. {
  42.         PrintString("0x");
  43.         if(hex>0xff)
  44.         {
  45.                 Tx1Send(HEX2ASCII(hex>> 12)); // 用户码高字节的低半字节
  46.                 Tx1Send(HEX2ASCII(hex>> 8)); // 用户码高字节的低半字节
  47.         }
  48.         Tx1Send(HEX2ASCII(hex >> 4)); // 用户码高字节的低半字节
  49.         Tx1Send(HEX2ASCII(hex)); // 用户码高字节的低半字节
  50. }
  51. //十六进制转ASCII函数
  52. unsigned char HEX2ASCII(unsigned char dat) {
  53.         dat &= 0x0f;
  54.         if (dat <= 9)
  55.                 return (dat + '0'); //数字0~9
  56.         return (dat - 10 + 'A'); //字母A~F
  57. }
  58. //
  59. // 发送一串字符串
  60. void PrintString(unsigned char code * puts)
  61. {
  62.         for (;  * puts != 0; puts++)
  63.                 Tx1Send( * puts); // 遇到停止符0结束
  64. }
  65. //


  66. void main()
  67. {
  68.                 u32 i=0;
  69.                 unsigned int ui_number=0x6789;       
  70.                 P3M1=P3M0=0;
  71.                 P1M1=P1M0=0;
  72.     while (1)
  73.                 {
  74.                         i++;
  75.                         if(i>150000)
  76.                         {
  77.                                 i=0;
  78.          PrintHex(ui_number);
  79.                                 P33=!P33;
  80.                                 PrintString(" ");
  81.                         }
  82.                 }
  83. }

  84. ///
复制代码



回复

使用道具 举报

ID:548551 发表于 2020-8-20 15:34 | 显示全部楼层
XTXB 发表于 2020-8-20 12:06
用模拟串口,可以在任意端口输出数据,串口助手显示数据:

谢谢大佬的指点. 我先研究一下
回复

使用道具 举报

ID:592807 发表于 2020-8-20 15:52 | 显示全部楼层
ASCII码了了解下
回复

使用道具 举报

ID:469932 发表于 2020-8-20 16:59 | 显示全部楼层
过于天真,串口有发射与接收协议,你就想用逻辑分析仪的波形看去你的值,那别人的代码让你这样一看都得破解了!
回复

使用道具 举报

ID:592807 发表于 2020-8-22 08:40 | 显示全部楼层
xqleft 发表于 2020-8-20 11:05
感觉各位大佬的回复,感谢 . 我最开始没有表述清楚是我的错误, 我现在再详细的说一下我的需求, 我的IC 是八 ...

不能,应为ADC是专门的外设,他的信号转换时间是固定的,很快的,你IO口手动切换,再快也不肯能和他一致
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表