找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1963|回复: 0
收起左侧

单片机串口发射 接收显示二极管,四个按键控制四种显示状态

[复制链接]
ID:263377 发表于 2020-6-15 22:33 | 显示全部楼层 |阅读模式
按键1按下从上到下点亮
按键2按下从两头往中间点亮
按键3按下从中间往两边点亮
按键4按下从下面往上点亮

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.png

单片机源程序如下:
  1. #include<reg51.h>
  2. #define ILEN 8                                         //接收缓冲区大小
  3. unsigned char display_data[ILEN][8];                //显示方式数据缓冲存储区
  4. unsigned char istart=0;                                //接收缓冲区起始索引
  5. unsigned char iend=0;                                //接收缓冲区结束索引
  6. unsigned int dat_size[ILEN]=0;                        //显示方式数据长度存储区
  7. /******************************************************
  8. 函数功能:延时N微秒
  9. ******************************************************/
  10. void delay_nus(unsigned int i)
  11. {
  12.   i=i/10;
  13.   while(--i);
  14. }
  15. /******************************************************
  16. 函数功能:延时N毫秒
  17. ******************************************************/
  18. void delay_nms(unsigned int n)
  19. {
  20.   n=n+1;
  21.   while(--n)
  22.     delay_nus(900);
  23. }
  24. void main()
  25. {
  26.   unsigned char j;
  27.   TMOD=0x20;      //定时器T1工作方式2
  28.   SCON=0x50;      //串口工作方式1
  29.   PCON=0x00;      //SMOD=0,波特率不倍增
  30.   TH1=0xfd;
  31.   TL1=0xfd;          //根据规定给定时器T1赋初值,即波特率为9600b/s
  32.   TR1=1;          //启动定时器T1
  33.   ES=1;              //串口中断允许
  34.   EA=1;              //开启总中断
  35.   while(1)
  36.   {
  37.     while(iend == istart)       //等待数据缓冲区出现新数据
  38.       ;
  39.     for(j=0;j < dat_size[istart & (ILEN-1)];j++)  //根据显示数据长度取出数据
  40.     {
  41.       P1=display_data[istart & (ILEN-1)][j];   //送显示数据
  42.       delay_nms(500);
  43.     }
  44.     istart++;          //为下次从缓冲区取出一组显示数据做好准备
  45.   }
  46. }
  47. /******************************************************
  48. 函数功能:串口中断接收服务函数
  49. ******************************************************/
  50. void com_isr() interrupt 4 using 1
  51. {
  52.    unsigned char c;
  53.    static unsigned char i=0;
  54.    if(RI==1)           //是否接收完成
  55.    {
  56.      c=SBUF;             //从缓冲寄存器中取出数据
  57.      RI=0;               //软件清零
  58.      if(istart+ILEN !=iend )   //判断缓冲区是否以存满
  59.      {
  60.        if(c!=0xff)              //判断接收的数据是否是结束标志数据
  61.        {
  62.          display_data[iend & (ILEN-1)][i++]=c;    //缓冲区接收数据
  63.        }
  64.        else                      //一组显示数据接收完成
  65.        {
  66.          dat_size[iend & (ILEN-1)]=i;     //同时存储该组数据的长度
  67.          iend++;            //为接收下组数据做好准备
  68.          i=0;
  69.        }
  70.      }  
  71.    }
  72. }
复制代码

所有资料51hei提供下载:
串口发射 接收四种方式点亮8个二极管.rar (78.96 KB, 下载次数: 15)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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