找回密码
 立即注册
查看: 176|回复: 2

使用STC15W408AS单片机设计一款串口通信四位数码管显示模块开源资料原理图+例程

[复制链接]

该用户从未签到

42

主题

7

回帖

246

积分

中级会员

积分
246
发表于 2023-7-2 22:25:35 | 显示全部楼层 |阅读模式
功能描述:
此数码管显示模块是基于,STC15W408AS单片机为核心的,可编程数码管显示模块,可以通过对单片机编程,实现数码管任意显示,有四位数码管和四个LED指示灯,均可以编程使用,四路输入IO口和LED共用输入口。数码管也可以通过TTL通讯实现任意显示。我们提供基本例程。
【简要说明】
一、板子尺寸:长69mmX宽37mmX高12mm
二、主要器件STC15W408AS
三、工作电压:3.3V5V
四、板子功耗:小于50mA
五、特点:
1、具有四路输入信号LED指示功能
2四位数码管显示,支持共阴或共阳数码管
3可单独工作,也可以通讯控制显示
4TTL电平输入控制
52.54mm 管脚距
6接受定制或者编程服务
7、工作温度-40度至 +70度
8、工作湿度 40%  ~ 80%RH
GYJ-0241 淘宝描述352.png
GYJ-0241 淘宝描述355.png
GYJ-0241 淘宝描述364.png
GYJ-0241 淘宝描述372.png
GYJ-0241 淘宝描述381.png
GYJ-0241 淘宝描述413.png
GYJ-0241 淘宝描述415.png
GYJ-0241 淘宝描述417.png
【声明】此程序仅用于学习与参考!     
*********************************************************************/
#include<STC15W408AS.h>
#include<math.h>                  //计算小数点的头文件
#include <intrins.h>          //用nop函数延时的头文件
#define uchar unsigned char//宏定义无符号字符型
#define uint unsigned int  //宏定义无符号整型
/*数据类型定义*/
typedef signed char        int8;
typedef signed int        int16;
typedef signed long        int32;
typedef unsigned char        uint8;
typedef unsigned int        uint16;
typedef unsigned long        uint32;

#define ENABLE_IAP 0x83 //系统工作时钟<12MHz 时,对IAP_CONTR 寄存器设置此值
#define CMD_IDLE 0
#define CMD_READ 1
#define CMD_PROGRAM 2
#define CMD_ERASE 3
#define ENABLE_IAP 0x83//SYSCLK<12MH
#define IAP_ADDRESS 0x0000        //存储地址
#define FOSC 11059200L  
#define BAUD 9600  
uint8 sendBuf[10];          //发送缓冲区
uint8 receBuf[10];    //接收缓冲区  
sbit IN1 =  P3^2;                        /*单片机1.2引脚检测IN1是否动作*/
sbit IN2 =  P3^3;                        /*单片机1.3引脚检测IN2是否动作*/
sbit IN3 =  P5^4;                        /*单片机1.4引脚检测IN3是否动作*/
sbit IN4 =  P5^5;                        /*单片机1.5引脚检测IN4是否动作*/
sbit COM1 = P3^4;                  /*单片机3.7引脚控制继电器COM1*/
sbit COM2 = P3^5;                  /*单片机3.6引脚控制继电器COM2*/
sbit COM3 = P3^6;                  /*单片机3.5引脚控制继电器COM3*/
sbit COM4 = P3^7;                  /*单片机3.4引脚控制继电器COM4*/
code uchar seg7code[10]={0x3F,0x05,0x5B,0x4F,0x65,0x6E,0x7E,0x07,0x7F,0x6F}; //显示段码
uchar dat=0x00;
bit  bz1=0;
bit  bz2=0;
bit  bz3=0;
bit  bz4=0;
bit write=0;
uint sec=0;
uint tcnt=0;
uchar sj1;
uchar sj2;
uchar A1,B1,C1,D1;
uchar r;
bit flag_zx=0;
/********************************************************************
                            定义 ISP/IAP/EEPROM 命令
*********************************************************************/

void IapIdle();//禁用 ISP/IAP/EEPROM functionmake 单片机 在 一 安全 状态
uint8 IapReadByte(uint16 addr);//读数据
void IapProgramByte(uint16 addr, uint8 dat);//写数据
void IapEraseSector(uint16 addr);//擦除数据
/********************************************************************
                            延时函数
*********************************************************************/
void delay(uchar dat)//延时程序
{
uchar m,n,s;
for(m=dat;m>0;m--)
for(n=20;n>0;n--)
for(s=248;s>0;s--);
}
/****************发送函数*********************/
void senduart1()
{          
SBUF='R';while(!TI);TI=0;
SBUF='E';while(!TI);TI=0;
SBUF='A';while(!TI);TI=0;
SBUF='D';while(!TI);TI=0;
}
/********************************************************************
                            定时中断服务函数
*********************************************************************/
void t0(void) interrupt 1 using 0 //定时中断服务函数
{
        tcnt++; //每过250ust tcnt 加一
        if(tcnt==400) //计满400 次(1/10 秒)时
        {
                tcnt=0; //重新再计
                sec++;
    if(sec==10){sec=0;}

        }
}
/********************************************************************
                            按键函数
*********************************************************************/
void key()
{
if((IN1==0)&&(bz1==0)){delay(10);if(IN1==0){bz1=1;A1++;if(A1>9)A1=0;}}if((IN1==1)&&(bz1==1)){bz1=0;write=1;}//按键控制数码管0~9显示
if((IN2==0)&&(bz2==0)){delay(10);if(IN2==0){bz2=1;B1++;if(B1>9)B1=0;}}if((IN2==1)&&(bz2==1)){bz2=0;write=1;}//按键控制数码管0~9显示
if((IN3==0)&&(bz3==0)){delay(10);if(IN3==0){bz3=1;C1++;if(C1>9)C1=0;}}if((IN3==1)&&(bz3==1)){bz3=0;write=1;}//按键控制数码管0~9显示
if((IN4==0)&&(bz4==0)){delay(10);if(IN4==0){bz4=1;D1++;if(D1>9)D1=0;}}if((IN4==1)&&(bz4==1)){bz4=0;write=1;}//按键控制数码管0~9显示
}
/********************************************************************
                            显示函数
*********************************************************************/
void xianshi()
{
COM1=1;COM2=1;COM3=1;COM4=1;P1=seg7code[A1];COM1=0;COM2=1;COM3=1;COM4=1;delay(1);//千位显示
COM1=1;COM2=1;COM3=1;COM4=1;P1=seg7code[B1];COM1=1;COM2=0;COM3=1;COM4=1;delay(1);//百位显示
COM1=1;COM2=1;COM3=1;COM4=1;P1=seg7code[C1];COM1=1;COM2=1;COM3=0;COM4=1;delay(1);//十位显示
COM1=1;COM2=1;COM3=1;COM4=1;P1=seg7code[D1];COM1=1;COM2=1;COM3=1;COM4=0;delay(1);//个位显示
}
/*****************清空发送缓冲区*************************/
void clear_receBuf()
{
  uchar i;
        for(i=0;i<5;i++)
        {
        receBuf=0;
        }
}
/********************************************************************
                            主函数
*********************************************************************/
void main()                                  
{
  SCON = 0x50;
  T2L = (65536 - (FOSC/4/BAUD));
  T2H = (65536 - (FOSC/4/BAUD))>>8;
  AUXR = 0x14;               
  AUXR |= 0x01;              
  ES = 1;                  
  EA = 1;
        sj1= IapReadByte(0x01);//读取存储的值
        sj2= IapReadByte(0x02);//读取存储的值

  A1= IapReadByte(0x03);//读取存储的值
        B1= IapReadByte(0x04);//读取存储的值
        C1= IapReadByte(0x05);//读取存储的值
        D1= IapReadByte(0x06);//读取存储的值

        IN1=sj1;
        IN2=sj2;
  TMOD=0x02; //定时器工作在方式2
        TH0=0x06; //对TH0 TL0 赋值
        TL0=0x06;
        TR0=1; //开始定时
        ET0=1;
        EA=1;
        sec=0;
        COM1=1;COM2=1;COM3=1;COM4=1;
        P1M0=0Xff;P1M1=0X00;
   while(1)
   {

  key();//调用按键函数
  xianshi();//调用显示函数                    
  if(write==1)  //存储数据
           {
//    sj1=IN1;sj2=IN2;
        write=0;
        IapEraseSector(0);  //擦除扇区
  IapProgramByte(0x01,sj1);//写入新的地址                           
  IapProgramByte(0x02,sj2);//写入新的地址       
  IapProgramByte(0x03,A1);//写入新的地址                           
  IapProgramByte(0x04,B1);//写入新的地址       
  IapProgramByte(0x05,C1);//写入新的地址                           
  IapProgramByte(0x06,D1);//写入新的地址
}
   }               
}
/********************************************************************
                              串口中断函数
*********************************************************************/
void Uart() interrupt 4 using 1
{
    if (RI)
    {
         RI=0; //接收标志清零
             receBuf[r++&0x0F]=SBUF;     //把接受的数据存储到BUT数组中
                 if(receBuf[0]!=0xaa){r=0;}
                 if(r>=5)
                 {        r=0;

                   flag_zx=1;
                 }
           }
           if(flag_zx==1)
           {                     

             flag_zx=0;
                    //0         1     2      3     4               
                        //起始位   千位  百位   十位  个位
                        if(receBuf[0]==0xaa)          //如果开始位和结束位,还有地址都正确,进行下一步判断
                        {
                        A1=receBuf[1];
                        B1=receBuf[2];
                        C1=receBuf[3];
                        D1=receBuf[4];
                        write=1;
                  clear_receBuf();
                        }
    }

}

/********************************************************************
                              结束
*********************************************************************/
void IapIdle(){//禁用 ISP/IAP/EEPROM functionmake 单片机 在 一 安全 状态
    IAP_CONTR = 0;           //
        IAP_CMD = 0;           //
        IAP_TRIG = 0;           //
        IAP_ADDRH = 0x80;  //
        IAP_ADDRL = 0;           //
}
uint8 IapReadByte(uint16 addr){//读数据
   uint8 dat;
   IAP_CONTR = ENABLE_IAP;
   IAP_CMD = CMD_READ;
   IAP_ADDRL = addr;
   IAP_ADDRH = addr >> 8;
   IAP_TRIG = 0x5A;
   IAP_TRIG = 0xA5;
   _nop_();
   dat = IAP_DATA;
   IapIdle();
   return dat;
}
void IapProgramByte(uint16 addr, uint8 dat){//写数据
   IAP_CONTR = ENABLE_IAP;
   IAP_CMD = CMD_PROGRAM;
   IAP_ADDRL = addr;
   IAP_ADDRH = addr >> 8;
   IAP_DATA = dat;
   IAP_TRIG = 0x5A;
   IAP_TRIG = 0xA5;
   _nop_();
   IapIdle();
}
void IapEraseSector(uint16 addr){//擦除数据
   IAP_CONTR = ENABLE_IAP;
   IAP_CMD = CMD_ERASE;
   IAP_ADDRL = addr;
   IAP_ADDRH = addr >> 8;
   IAP_TRIG = 0x5A;
   IAP_TRIG = 0xA5;
   _nop_();
   IapIdle();
}
/********************************************************************
                              结束
*********************************************************************/


GYJ-0241_四位数码管显示串口显示模块带壳配套测试程序.rar

54.72 KB, 下载次数: 29

GYJ-0241_四位数码管显示串口显示模块带壳原理图及PCB.pdf

316.29 KB, 下载次数: 25

GYJ-0241_四位数码管显示串口显示模块使用手册.pdf

868.25 KB, 下载次数: 24

回复 送花

使用道具 举报

该用户从未签到

550

主题

9359

回帖

1万

积分

管理员

积分
13900
发表于 2023-7-2 22:37:48 | 显示全部楼层
感谢分享
回复 送花

使用道具 举报

该用户从未签到

42

主题

7

回帖

246

积分

中级会员

积分
246
 楼主| 发表于 2023-7-2 22:39:58 | 显示全部楼层

共同进步
回复 支持 反对 送花

使用道具 举报

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2024-5-10 10:00 , Processed in 0.063477 second(s), 39 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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