men007 发表于 2024-12-16 17:27:17

{:4_174:}学习了

浦江一水 发表于 2024-12-18 11:00:46

jun_1234 发表于 2024-12-16 10:55
哇塞,这个板子设计的好好看,请问这个一套总成本大概是多少啊?

感谢诸位坛友的浏览、点评和留言。
关于这套总成本,还未仔细计算过。
总体说吧,这是比较低廉的,一般而言:
开发板套件,加上运费,大概是20元出点头;
转40脚的核心板是国芯论坛官方赠送的,据最新信息,凡是国芯论坛的会员,只要申请,都可免费获得的;
如果配一块AI8051U_DIP40脚的直插芯片,也能用。可以用论坛心愿兑换,或者大约<5元左右一片;
如果配一块LCD1602字符显示屏,网上有机会3.5元左右就能买到;
如果配一块本实验所用到的ST7735驱动的128×160彩色显示屏,网上价格约10元上下;
......
总之,这是价格低廉的入门级的实验板。
对于初学者来说,她以较低的门槛,引领你进入奇妙的51单片机世界。
将来,你可能会拥有比较高级复杂些的开发板,然而这块经典而基础的学习板,她曾经陪伴你入门学习,也许会成为一段美好的回忆,是值得收藏的。

清风予我 发表于 2024-12-18 11:59:40

【免费 + 包邮 送】 送/申样/采购 可上班时间加 如下您对应地区的客服 QQ或微信联系
加STC华南区客服司经理QQ: 2234917869 ;微信:18012226298要求 【免费+包邮】 送, 还免费教仿真
加STC华南区客服刘经理QQ: 3398500488 ;微信:18106296592要求 【免费+包邮】 送, 还免费教仿真
加STC华南区客服佘经理QQ: 614777595;   微信:18106296591 要求 【免费+包邮】 送, 还免费教仿真
加STC华南区客服曹经理QQ: 1933892258 ;微信:18106296595 要求 【免费+包邮】 送, 还免费教仿真
加STC华东区客服聂经理QQ: 2593903262; 微信:18106296598要求 【免费+包邮】 送, 还免费教仿真
加STC华东区客服吴经理QQ: 1463035472; 微信:19952583954要求 【免费+包邮】 送, 还免费教仿真
加STC西北区客服孙经理QQ: 1347154513 ;微信:18106296593要求 【免费+包邮】 送, 还免费教仿真
加STC华北区客服石经理QQ: 1638975601 ;微信:19952583876要求 【免费+包邮】 送, 还免费教仿真
加STC华中区客服唐经理QQ:2571301708 ; 微信:18106296589 要求 【免费+包邮】 送, 还免费教仿真
加STC东北区客服李经理QQ: 1017142298 ;微信:19952583534要求 【免费+包邮】 送, 还免费教仿真
加STC西南区客服曹经理QQ: 3897745450 ;微信:18012226281 要求 【免费+包邮】 送, 还免费教仿真
加STC西南区客服吴经理QQ: 1463035472 ;微信:19952583954 要求 【免费+包邮】 送, 还免费教仿真

工作时间:8:30-12:00,13:00-17:30(周一 到 周五, 法定节假日除外)
【免费 + 包邮 送】 送/申样/采购传统电话热线:0513-55012928,0513-89896509,0513-55012929
2024/12/11, 统一安排【免费 + 包邮 送】服务人员

大叶子 发表于 2024-12-18 12:11:22

<p>浦江道友出手,精品也</p>

jun_1234 发表于 2024-12-19 14:30:10

浦江一水 发表于 2024-12-18 11:00
感谢诸位坛友的浏览、点评和留言。
关于这套总成本,还未仔细计算过。
总体说吧,这是比较低廉的,一般而 ...

感谢您的回复和解答,希望后面学习STC能成为一段美好的回忆

浦江一水 发表于 2025-1-15 16:10:39

擎天柱+驱动四位数码管显示实验



这块“先悦”实验板配有四位数码管,其电路如图:


这是共阳极数码管,与STC32G12K128实验箱所配置的数码管电路一样,是由单片机IO直接驱动,没有经过595之类集成块驱动的。
四位数码管或八位数码管,其编程原理应该是相似的:
本实验电路由P0口驱动各数码笔划段,P1.3--P1.0四个IO分别驱动各位。
电路简单,可用动态扫描方式显示之。
而今实验用擎天柱核心板来驱动则四位数码管: 模拟时钟显示,显示笔段清晰均匀,效果还是不错的。
在此贴一下主程序代码和数码管驱动的核心代码,供初学单片机的坛友参考。

//********************************************************************************

// 名称: 擎天柱+先悦板+实验4位数码管动态扫描显示Main.C
// 基于: 先悦SINYUE 单片机开发学习板 LED_4位共阳极数码管驱动
// 实验: AI8051U 取代 STC89C52 实现4位LED数码管字符串显示.
// 硬件: P0-8段数据 P10-P13-4位选( 24MHz主频 )
// 编程: 浦晓明(浦江一水) 2024-12-12
//********************************************************************************
#include "AI8051U.H"
#include "AI8051U_SYS.H"
#include "LED4D.H"


/************* 全局变量声明 **************/
char S;         //显示字符串缓存
unsigned char hour; //时
unsigned char min;//分
unsigned char sec;//秒


//=====================================================================
// 函数: voiddelay_ms(unsigned int ms)
// 描述: 毫秒级延时函数。
// 参数: ms,要延时的ms数,自动适应主时钟.
//=====================================================================
voiddelay_ms(unsigned int ms)
{ unsigned int i;
do{ i = MAIN_Fosc / 10000;
      while(--i);
    } while(--ms);
}
/********************** 模拟RTC演示函数 ***********************/
void RTC(void)
{
if(++sec >= 60)
{ sec = 0;
    if(++min >= 60)
    { min = 0;
      if(++hour >= 24) hour = 0;
    }
}
sprintf(S,"%02d.%02d",min,sec);//组织字符串
LED4D_Str(0,S);                  //送显示段码缓存   
}
/******************** 主函数 **************************/
void main(void)
{
SYS_Init();       //系统初始化
LED4D_Init();   //8数码管和定时器0初始化
   
LED4D_Str(0,"AI80");            //字符串常量直接显示   
delay_ms(2000);                  //延时一下
LED4D_Str(0,"I805");            //字符串常量直接显示   
delay_ms(2000);                  //延时一下
LED4D_Str(0,"8051");         //字符串常量直接显示   
delay_ms(2000);                  //延时一下
LED4D_Str(0,"051U");         //字符串常量直接显示   
delay_ms(2000);                  //延时一下
min= 59;
sec= 58;
RTC();
//循环...字符串显示...
while(1)
{
    if(SecOK)   //1s到
    { SecOK = 0;
      RTC();
    }   
}
}
/***** END *****************************************/

//数码管驱动源代码:
//********************************************************************************

// 名称: LED4D.C
// 基于: 先悦SINYUE 单片机开发学习板 LED_4位共阳极数码管驱动
// 实验: AI8051U 取代 STC89C52 实现4位LED数码管字符串显示.
// 硬件: P0-8段数据 P10-P13-4位选
// 编程: 浦晓明(浦江一水) 2024-12-12
//********************************************************************************
#include "LED4D.H"


/************* 用户定义宏 *******************/
#define T1MS   (65536UL -(MAIN_Fosc / 1000))             //Timer 0 1ms 中断频率, 1000次/秒
/************* 本地常量声明    **************/
u8 code LEDC[]={ "0123456789ABCDEF -HJKLNoPUtGqryhnuc=_SI" }; //可显示字符38   //段码...
u8 code LEDD[]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,//0..9,A..F
               0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x6E,0x7C,//...h
               0x54,0x1C,0x58,0x48,0x08,0x6D,0x30,       }; //n...
u8 code T_COM[]={ 0xF7,0xFB,0xFD,0xFE, }; //位码
/************* 本地变量声明    **************/
u8LED4;      //显示段码缓冲
u8DispN;         //显示位索引
bit SecOK;         //秒到标志
unsigned int msec;//毫秒
/************* 本地函数声明    **************/


//***** LED4位数码管初始化函数 *************
void LED4D_Init(void)
{ //定时器0初始化
AUXR |=0x80;
TMOD &= ~0x0F;
TL0 = T1MS;
TH0 = T1MS >> 8;
TR0 = 1;
ET0 = 1;
EA=1;   //开中断..
DispN=0; msec=0; SecOK=0;
}
//*** 定位x显示字符串 **********************
void LED4D_Str(u8 x,u8 * str)
{ unsigned char ch,y,i;
if(x>=4)return;             //超界..返回..
for(;x<4;x++)               //从指定位置x到4
{ y=0;
    for(i=0;i<39;i++)         //根据字符查找对应段码
    { if(*str==LEDC)       //找到匹配
   { ch=LEDD;            //取出段码
      y=1; break;             //找到标志y   
      } else ch=0x00;         //若无对应段码则用0空替代.
    }
    if(y==1)
    { if(*(str+1)=='.')      //如果遇小数点处理...
      { ch |= 0x80;            //段码最高位置1...(加小数点)
      str++;
      }
      LED4=ch;             //定位写入显示
    }
    str++;
    if(*str=='\0')break;      //字符串结束
}
}
//********************** 显示扫描函数 ************************
void DisplayScan(void)
{   
   P0 = ~LED4;    //段码送出
   P1 = T_COM;   //移位驱动
   if(++DispN >= 4)DispN = 0;//4位结束回0
}
//=====================================================
// 函数: Timer0_ISR_Handler
// 描述: Timer0中断函数.
//=====================================================
void Timer0_ISR_Handler (void) interrupt TMR0_VECTOR                //进中断时已清除标志
{
msec++;         //毫秒计数...
if(msec>=1000){ SecOK=1; msec = 0; }
DisplayScan();//1ms扫描显示一位
}
//**** LED84.C END *******************************************************



工程文件包,供有兴趣的单片机爱好者坛友参考指正。










浦江一水 发表于 2025-2-1 20:37:22

擎天柱@先悦板+DS18B20_测温实验

单总线数字温度传感器, 外形像一只三极管, 占用IO少, 测试精度高, 被各种项目广泛使用.
传统51开发板, 往往都留有DS18B20的接口, 先悦版开发板, 也不例外, 因此实验DS18B20测温十分方便.
网上有关例程甚多, 但并非个个都能拿来就能用的.
关键在于, DS18B20对于时序, 要求比较严格, AI8051U较传统89C52的主频较高, 且频率可以多变, 因此算法必须仔细考虑.
本实验博采众长, 归纳优化算法, 提高适用性, 极易成功移植.
沿用楼上4位数码管显示实验程序, 实测温度. 先看实验结果如图:


主程序比较简单:
//********************************************************************************
// 名称: 实验DS18B20测温 + 4位数码管动态扫描显示温度
// 基于: 先悦版 51 单片机开发学习板
// 实验: 擎天柱 AI8051U 取代 STC89C52 实现4位LED数码管字符串显示.
// 编程: 浦晓明(浦江一水) 2024-12-05
//********************************************************************************
#include "AI8051U.H"
#include "AI8051U_SYS.H"   //主频在其中定义 24M
#include "LED4D.H"
#include "DS18B20.H"

/************* 全局变量声明 **************/
charS;         //显示字符串缓存
float Te;            //环境温度
int   Temp;          //原始温度数据
sbitL2 = P2^7;//LED2 运行指示

//========================================================================
// 函数: voiddelay_ms(unsigned int ms)
// 描述: 毫秒级延时函数。
// 参数: ms,要延时的ms数,自动适应主时钟.
//=====================================================================
voiddelay_ms(unsigned int ms)
{ unsigned int i;
do{ i = MAIN_Fosc / 10000;
      while(--i);
    } while(--ms);
}
//测温函数
void TestTemp(void)
{
Temp=ReadTemp();       //读取温度原始整数
Te=(float)Temp/16;   //计算环境温度为浮点数
}
/******************** 主函数 **************************/
void main(void)
{
SYS_Init();                  //系统初始化
LED4D_Init();            //4数码管和定时器0初始化
LED4D_Str(0,"8051");//字符串常量直接显示
L2 = 0;                     //LED2 运行指示
delay_ms(3000);         //延时一下
L2 = 1;                      //LED2 运行指示
//循环...整型数转字符串显示...
while(1)
{ if(SecOK)               //1s到
    { SecOK = 0;
      TestTemp();         //测温
      sprintf(S,"%04.1fC",Te);
      LED4D_Str(0,S);   //显示温度
      L2 = 0;                  //LED2 运行指示
      delay_ms(50);      //延时一下
      L2 = 1;                  //LED2 运行指示
    }
}
}
/***** END *****************************************/


DS18B20专用代码的主要部分:
//---------------------------------------------------------------------
// 单总线温度传感器 DS18B20.H 头文件 For Ai8051U
//---------------------------------------------------------------------
#ifndef __DS18B20_H__
#define __DS18B20_H__

#include <stdio.h>
#include "AI8051U.H"
#include "AI8051U_SYS.H"


// 根据不同的主频, 宏定义不同的延时等待...
#if (MAIN_Fosc >= 40000000L)
    #define      usrNOP()    NOP12()
#elif (MAIN_Fosc >= 36000000L)
    #define      usrNOP()    NOP10()
#elif (MAIN_Fosc >= 30000000L)
    #define      usrNOP()    NOP8()
#elif (MAIN_Fosc >= 24000000L)
    #define      usrNOP()    NOP6()
#elif (MAIN_Fosc >= 20000000L)
    #define      usrNOP()    NOP5()
#elif (MAIN_Fosc >= 18000000L)
    #define      usrNOP()    NOP4()
#elif (MAIN_Fosc >= 12000000L)
    #define      usrNOP()    NOP3()
#elif (MAIN_Fosc >= 6000000L)
    #define      usrNOP()    NOP2()
#else
    #define      usrNOP()    NOP1()
#endif

//DS18B20的数据口说明
sbit DQ = P3^2;    //根据实际需要可改变端口


/*** 函数声明    **************/
void DS18B20_Reset();
void DS18B20_WriteByte(u8 dat);
u8   DS18B20_ReadByte(void);
intReadTemp(void);


#endif
//---------------------------------------------------------------------
// 单总线温度传感器 DS18B20.H 头文件 For Ai8051U
//---------------------------------------------------------------------
#include <stdio.h>
#include "AI8051U.H"
#include "AI8051U_SYS.H"
#include "DS18B20.H"

//========================================================================
// 函数: voiddelay_us(u8 us)
// 描述: 延时函数。
// 参数: us,要延时的us数, 这里只支持1~255us.
//========================================================================
void delay_us(u8 us)
{
do
{ usrNOP();
    usrNOP();
} while(--us);
}
/**************************************
复位DS18B20,并检测设备是否存在
**************************************/
void DS18B20_Reset()
{
CY = 1;
while(CY)
{
    DQ = 0;            //送出低电平复位信号
    delay_us(240);    //延时至少480us
    delay_us(240);
    DQ = 1;             //释放数据线
    delay_us(60);   //等待60us
    CY = DQ;          //检测存在脉冲
    delay_us(240);    //等待设备释放数据线
    delay_us(180);
}
}
/**************************************
从DS18B20读1字节数据
**************************************/
u8 DS18B20_ReadByte(void)
{ u8 i;
u8 dat = 0;
for (i=0; i<8; i++)      //8位计数器
{ dat >>= 1;
    DQ = 0;                     //开始时间片
    delay_us(1);               //延时等待
    DQ = 1;                     //准备接收
    delay_us(1);               //接收延时
    if (DQ) dat |= 0x80;    //读取数据
    delay_us(60);             //等待时间片结束
}
return dat;
}
/**************************************
向DS18B20写1字节数据
**************************************/
void DS18B20_WriteByte(u8 dat)
{ u8 i;
for (i=0; i<8; i++)         //8位计数器
{ DQ = 0;                     //开始时间片
    delay_us(1);                //延时等待
    dat >>= 1;               //送出数据
    DQ = CY;
    delay_us(60);            //等待时间片结束
    DQ = 1;                      //恢复数据线
    delay_us(1);                //恢复延时
}
}
//========================================================================
// 函数: u16 ReadTemp()
// 描述: 读取温度函数。
// 参数: none.      // 返回: 温度值0.0625度的倍数.
//========================================================================
int ReadTemp(void)
{ u16 TempH, TempL, Temperature;
DS18B20_Reset();                     //设备复位
DS18B20_WriteByte(0xCC);      //跳过ROM命令
DS18B20_WriteByte(0x44);      //开始转换命令
while (!DQ);                           //等待转换完成
DS18B20_Reset();                     //设备复位
DS18B20_WriteByte(0xCC);      //跳过ROM命令
DS18B20_WriteByte(0xBE);      //读暂存存储器命令
TempL = DS18B20_ReadByte();//读温度低字节
TempH = DS18B20_ReadByte(); //读温度高字节
Temperature = (TempH << 8) + TempL;
return Temperature;
}
//=== END =====================================================================

工程文件包: 共有兴趣的坛友指正和参考.








zhangbin268 发表于 2025-3-20 02:19:35

哈哈,好好的学习下。资料丰富

小涵子爸爸 发表于 2025-3-20 08:27:45

同样对点屏感兴趣,学习

风声雨生 发表于 2025-3-20 22:01:35

焊接技术不错
页: 1 [2] 3 4
查看完整版本: 初学51单片机的爱好者之入门佳配+擎天柱 (多项实验源码)