使用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();}/******************************************************************** 结束*********************************************************************/
感谢分享{:4_196:} 神农鼎 发表于 2023-7-2 22:37
感谢分享
共同进步{:smile:}
页:
[1]