钰平电子 发表于 2023-7-2 22:25:35

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

功能描述:此数码管显示模块是基于,STC15W408AS单片机为核心的,可编程数码管显示模块,可以通过对单片机编程,实现数码管任意显示,有四位数码管和四个LED指示灯,均可以编程使用,四路输入IO口和LED共用输入口。数码管也可以通过TTL通讯实现任意显示。我们提供基本例程。【简要说明】一、板子尺寸:长69mmX宽37mmX高12mm
二、主要器件:STC15W408AS三、工作电压:3.3V至5V
四、板子功耗:小于50mA
五、特点:
1、具有四路输入信号和LED灯指示功能。
2、四位数码管显示,支持共阴或共阳数码管。
3、可单独工作,也可以通讯控制显示
4、TTL电平输入控制。
5、2.54mm 管脚距。
6、接受定制或者编程服务
7、工作温度-40度至 +70度
8、工作湿度 40%~ 80%RH








【声明】此程序仅用于学习与参考!   
*********************************************************************/#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 9600uint8 sendBuf;          //发送缓冲区uint8 receBuf;    //接收缓冲区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={0x3F,0x05,0x5B,0x4F,0x65,0x6E,0x7E,0x07,0x7F,0x6F}; //显示段码uchar dat=0x00;bitbz1=0;bitbz2=0;bitbz3=0;bitbz4=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;COM1=0;COM2=1;COM3=1;COM4=1;delay(1);//千位显示COM1=1;COM2=1;COM3=1;COM4=1;P1=seg7code;COM1=1;COM2=0;COM3=1;COM4=1;delay(1);//百位显示COM1=1;COM2=1;COM3=1;COM4=1;P1=seg7code;COM1=1;COM2=1;COM3=0;COM4=1;delay(1);//十位显示COM1=1;COM2=1;COM3=1;COM4=1;P1=seg7code;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=SBUF;   //把接受的数据存储到BUT数组中               if(receBuf!=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==0xaa)          //如果开始位和结束位,还有地址都正确,进行下一步判断                        {                         A1=receBuf;                        B1=receBuf;                        C1=receBuf;                        D1=receBuf;                        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();}/********************************************************************                              结束*********************************************************************/

神农鼎 发表于 2023-7-2 22:37:48

感谢分享{:4_196:}

钰平电子 发表于 2023-7-2 22:39:58

神农鼎 发表于 2023-7-2 22:37
感谢分享

共同进步{:smile:}
页: [1]
查看完整版本: 使用STC15W408AS单片机设计一款串口通信四位数码管显示模块开源资料原理图+例程