找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2023|回复: 2
收起左侧

新人求51单片机串口通讯LED程序的编写思路

[复制链接]
ID:734389 发表于 2020-10-2 14:14 | 显示全部楼层 |阅读模式
30黑币
单片机89C52RC    现在只会用P0口控制,无法锁存,相当于数码管的显示
要求PO P1口,用16个0/1口串口通讯控制16个LED灯的开关,可单独开关互不影响。
求思路,想自己编写

回复

使用道具 举报

ID:825447 发表于 2020-10-3 20:13 | 显示全部楼层
首先你可以规定下P0口控制数码管位选,P1口控制数码管段选。分别用十六进制赋值。
eg.
{
  P0=0xfe;   //选定位选
  P1=0xff;   //位选8
  delay(1);    //延时几短造成是错觉感觉一直亮
}
当然你也可以先编写一个数组
uchar code table[]={0x3f,0x06,0x5b,0x4f};
然后位选再段选
voidm main()
{
P0=0xfe;
P1=table[num];
delay(1);
}
再加个中断在,中断里面再加上num++;就OK了
可以实现变化
我的89c52无法一起控制8个数码管,只能一个一个控制P0,再输入不同的P1,加上几短延时即可。

回复

使用道具 举报

ID:734389 发表于 2020-10-3 21:06 | 显示全部楼层
#include "reg52.h"
#include "uart.h"


void LED_OFF(u8 char_num) //关闭LED
{
        switch(char_num)//对象码
        {
                 case '1':               
                         P1|=1<<0;
                         UART_SendStr("LED1_OFF \r\n");
                 break;
                 case '2':               
                         P1|=1<<1;
                         UART_SendStr("LED2_OFF \r\n");
                 break;
                 case '3':               
                         P1|=1<<2;
                         UART_SendStr("LED3_OFF \r\n");
                 break;
                 case '4':               
                         P1|=1<<3;
                         UART_SendStr("LED4_OFF \r\n");
                 break;
                 case '5':               
                         P1|=1<<4;
                         UART_SendStr("LED5_OFF \r\n");
                 break;
                 case '6':               
                         P1|=1<<5;
                         UART_SendStr("LED6_OFF \r\n");
                 break;
                 case '7':               
                         P1|=1<<6;
                         UART_SendStr("LED7_OFF \r\n");
                 break;
                 case '8':               
                         P1|=1<<7;
                         UART_SendStr("LED8_OFF \r\n");
                 break;               
  }
}
void LED_ON(u8 char_num) //打开LED
{
        switch(char_num)//对象码
        {
                 case '1':               
                         P1&=~(1<<0);
                         UART_SendStr("LED1_ON \r\n");
                 break;
                 case '2':               
                         P1&=~(1<<1);
                         UART_SendStr("LED2_ON \r\n");
                 break;
                 case '3':               
                         P1&=~(1<<2);
                         UART_SendStr("LED3_ON \r\n");
                 break;
                 case '4':               
                         P1&=~(1<<3);
                         UART_SendStr("LED4_ON \r\n");
                 break;
                 case '5':               
                         P1&=~(1<<4);
                         UART_SendStr("LED5_ON \r\n");
                 break;
                 case '6':               
                         P1&=~(1<<5);
                         UART_SendStr("LED6_ON \r\n");
                 break;
                 case '7':               
                         P1&=~(1<<6);
                         UART_SendStr("LED7_ON \r\n");
                 break;
                 case '8':               
                         P1&=~(1<<7);
                         UART_SendStr("LED8_ON \r\n");
                 break;               
  }
}

/*指令说明:
*发送 001  打开LED  (001表示:分类码='0',功能码='0',对象码='1' ,分类码='0'表示LED控制类,功能码'0'表示关闭LED,对象码'1'表示第1个LED)
*发送 011  打开LED  (011表示:分类码='0',功能码='1',对象码='1' ,分类码='0'表示LED控制类,功能码'1'表示打开LED,对象码'1'表示第1个LED)

*无结束符,适用于固定长度的指令,本工程设计为固定长度为2个字符的指令
*第一个字符表示类别码,即是什么分类
*第二个字符代表功能码,即是什么功能
*第三个字符代表对象码,即是什么对象
*可以修改长度来增减指令长度,获得更多嵌套层数功能控制。
*/
void main(void) //主函数扫描方式
{
  UART_Configure(9600);//配置9600波特率(默认无奇偶校验,1位停止位,8位数据位)
        while(1)
        {
                if(Uart.RX_COUNT>=3) //判断串口是否接收到3个以上数据,修改此处的数据可改变指令长度
                {
                         switch(Uart.RX_BUFF[0]) //类别码
                         {
                                 case '0': //LED控制类
                                         switch(Uart.RX_BUFF[1]) //功能码
                                         {
                                                 case '0':  //功能码0 :关闭LED
                                                                        LED_OFF(Uart.RX_BUFF[2]);//将对象码输入函数中
                                                 break;               
                                                 case '1':  //功能码1 :打开LED  
                                                                        LED_ON(Uart.RX_BUFF[2]);//将对象码输入函数中
                                                 break;                                         
                                         }
                                 break;
                                 case '1': //其他类

                                 break;
                                 case '2': //其他类

                                 break;                                  
                         }                                 
                         
                         //清除数据必须在处理代码后面
                         Uart.RX_COUNT=0;  //缓存计数清0
                         UART_RX_BUFF_Clear();//清除接收缓存
                }
        }
}
Build target 'Target 1'
compiling 串口通信控制led亮灭.c...
..\..\..\..\串口通信控制led亮灭.c(3): warning C318: can't open file 'uart.h'
..\..\..\..\串口通信控制LED亮灭.C(6): error C141: syntax error near 'char_num', expected ')'
..\..\..\..\串口通信控制LED亮灭.C(8): error C202: 'char_num': undefined identifier
Target not created
出这样的错误求解答
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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