- 博客(155)
- 收藏
- 关注
原创 基于IO口模拟实现,总线时序延时等皆由软件方式实现
else if (frame < (sizeof(spiral)/sizeof(spiral[0]))*2) //逐个点熄灭。if (frame < sizeof(spiral)/sizeof(spiral[0])) //逐个点点亮。if (i < (sizeof(ledBuff)-1)) //索引递增循环,遍历整个缓冲区。= KeySta[i][j]) //检测按键动作。static uint8 pdata backup[4][4] = { //按键值备份,保存前一次的值。
2025-04-30 23:16:25
857
原创 基于51单片机的步进电机测试程序
unsigned char code BeatCode[8] = { //步进电机节拍对应的IO控制代码。P1 = tmp;//把低4位的节拍代码和高4位的原值送回P1。//用|操作把节拍代码写到低4位。//用tmp把P1口当前值暂存。//用&操作实现到8归零。//用&操作清零低4位。//节拍输出索引递增。//为T0赋初值0xF8CD,定时2ms。//设置T0为模式1。
2025-04-30 23:14:20
365
原创 基于51单片机的点阵向上移动改为向下移动
/250ms软件定时器。unsigned char code image[] = { //图片的字模表。if (tmr >= 250) //达到250ms时改变一次图片索引。if (index == 0) //图片索引31~0递减循环。//为T0赋初值0xFC67,定时1ms。//使能U4,选择LED点阵。//设置T0为模式1。//以下代码完成每250ms改变一帧图像。//以下代码完成LED点阵动态扫描刷新。/* 定时器0中断服务函数 */
2025-04-30 23:12:01
375
原创 基于51单片机的点阵向左移动改为向右移动
/250ms软件定时器。if (tmr >= 250) //达到250ms时改变一次图片索引。if (index >= 30) //图片索引达到30后归零。//为T0赋初值0xFC67,定时1ms。ENLED = 0;//使能U4,选择LED点阵。//设置T0为模式1。//以下代码完成每250ms改变一帧图像。//以下代码完成LED点阵动态扫描刷新。/* 定时器0中断服务函数 */
2025-04-30 23:11:30
480
原创 基于LED点阵的9~0倒计数
{0xC3, 0x81, 0x99, 0x99, 0x99, 0x99, 0x81, 0xC3}, //数字0。{0xC3, 0x81, 0x9D, 0xC7, 0xC7, 0x9D, 0x81, 0xC3}, //数字3。{0xC3, 0x81, 0xF9, 0xC1, 0x81, 0x99, 0x81, 0xC3}, //数字6。{0xC3, 0x81, 0x99, 0xC3, 0xC3, 0x99, 0x81, 0xC3}, //数字8。//为T0赋初值0xFC67,定时1ms。
2025-04-30 23:10:51
400
原创 独立LED、数码管、点阵LED同时全亮-单片机
/为T0赋初值0xFC67,定时1ms。//设置T0为模式1。ENLED = 0;TH0 = 0xFC;//以下代码完成LED点阵动态扫描刷新。P0 = 0xFF;/* 定时器0中断服务函数 */
2025-04-30 23:08:55
314
原创 基于数码管计时程序的函数调用演示
unsigned char LedBuff[6] = { //数码管显示缓冲区,初值0xFF确保启动时都不亮。unsigned char code LedChar[] = { //数码管显示字符转换表。//T0溢出后,清零中断标志。if (cnt >= 1000) //判断T0溢出是否达到1000次。//为T0赋初值0xFC67,定时1ms。if (TF0 == 1) //判断T0是否溢出。/* 秒计数函数,每秒进行一次秒数+1,并转换为数码管显示字符 *///设置T0为模式1。
2025-04-30 23:06:12
362
原创 UART串口控制蜂鸣器的开关
if (RxdByte == 'B') //接收到大写字母B时改变一次蜂鸣器控制标志。unsigned char code LedChar[] = { //数码管显示字符转换表。unsigned char LedBuff[7] = { //数码管+独立LED显示缓冲区。//接收到的数据保存到接收字节变量中。//计算定时器重载值。//串口接收到的字节。//T0重载值的高字节。
2025-04-29 23:54:08
467
原创 UART串口控制流水灯流动和停止
/移位方向变量dir,用于控制移位的方向。flagLight;= 0) //200ms刷新一次流水灯。unsigned char LedBuff[7] = { //数码管+独立LED显示缓冲区。if (shift == 0x80) //左移到最左端后,改变移位方向。if (shift == 0x01) //右移到最右端后,改变移位方向。if (dir == 0) //移位方向变量为0时,左移。
2025-04-29 23:53:25
427
原创 UART串口通信及控制数码管显示的示例
/定时器重载值拆分为高低字节。unsigned char code LedChar[] = { //数码管显示字符转换表。unsigned char LedBuff[7] = { //数码管+独立LED显示缓冲区。//接收到的数据保存到接收字节变量中。//计算定时器重载值。//串口接收到的字节。//T0重载值的高字节。//T0重载值的低字节。
2025-04-29 23:52:48
334
原创 单片机硬件UART中断方式实现串口通信的示例
/接收的数据+1后发回,左边是发送SBUF,右边是接收SBUF。//配置波特率为9600。//手动清零接收中断标志位。//手动清零发送中断标志位。//配置串口为模式1。//清零T1的控制位。//配置T1为模式2。TL1 = TH1;/* 串口配置函数,baud-通信波特率 */if (TI) //字节发送完毕。if (RI) //接收到字节。/* UART中断服务函数 */
2025-04-29 23:51:04
271
原创 单片机硬件UART查询方式实现串口通信的示例
/接收到的数据+1后,发送回去。//清零接收中断标志位。//清零发送中断标志位。//配置波特率为9600。//配置串口为模式1。//清零T1的控制位。//配置T1为模式2。TL1 = TH1;/* 串口配置函数,baud-通信波特率 */
2025-04-29 23:48:50
181
原创 普通IO口模拟实现串口通信的示例
PIN_RXD) //起始位为0时,清零接收缓冲器,准备接收数据位。if (PIN_RXD) //接收脚为1时,缓冲器最高位置1,TH0 = 256 - (11059200/12)/baud;if (PIN_RXD) //停止位为1时,方能认为数据有效。if (cnt <= 8) //低位在先依次发送8bit数据位。else if (cnt <= 8) //处理8位数据位。else if (cnt == 9) //发送停止位。
2025-04-29 23:48:06
568
原创 数码管计时与流水灯同时运行的示例-STC89C52
/循环移位变量shift,并赋初值0x01。unsigned char LedBuff[7] = { //数码管+独立LED显示缓冲区,初值0xFF确保启动时都不亮。i--) //从最高为开始,遇到0不显示,遇到非0退出循环。if (shift == 0x80) //左移到最左端后,改变移位方向。if (shift == 0x01) //右移到最右端后,改变移位方向。if (dir == 0) //移位方向变量为0时,左移。//循环移位变量右移1位。
2025-04-28 23:58:23
385
原创 长短按键/连续按键功能实现示例
static unsigned char pdata backup[4][4] = { //按键值备份,保存前一次的值。static unsigned long pdata TimeThr[4][4] = { //快速输入执行的时间阈值。unsigned long pdata KeyDownTime[4][4] = { //每个按键按下的持续时间,单位ms。//调用按键动作函数。= KeySta[i][j]) //检测按键动作。
2025-04-28 23:57:29
612
原创 交通信号灯示例-stc89c52
/颜色索引:0-绿色/1-黄色/2-红色。switch (color) //LED8/9代表绿灯,LED5/6代表黄灯,LED2/3代表红灯。unsigned char code LedChar[] = { //数码管显示字符转换表。unsigned char LedBuff[7] = { //数码管+独立LED显示缓冲区。P0 = 0xFF;//计算定时器重载值。//T0重载值的低字节。
2025-04-28 23:39:50
355
原创 基于PWM方式控制LED实现呼吸灯效果
/计算高电平的定时器重载值并补偿中断延时。//计算高电平的定时器重载值并补偿中断延时。if (PWMOUT == 1) //当前输出为高电平时,装载低电平值并输出低电平。
2025-04-28 23:38:52
535
原创 基于PWM方式控制LED的亮度
/计算高电平的重载值并补偿中断延时。//计算低电平的重载值并补偿中断延时。if (PWMOUT == 1) //当前输出为高电平时,装载低电平值并输出低电平。//高电平重载值的高字节。//高电平重载值的低字节。//低电平重载值的高字节。//低电平重载值的低字节。
2025-04-28 23:37:45
465
原创 基于数码管显示的数字秒表-STC89C52
if (IntegerPart >= 10000) //整数部分计到10000时归零。if (DecimalPart >= 100) //小数部分计到100时进位到整数部分。= 0) //按键按下时执行动作。//刷新前一次的备份值。if (i == 1) //Esc键复位秒表。else if (i == 2) //回车键启停秒表。= KeySta[i]) //检测按键动作。if (i < 5) //索引递增循环,遍历整个缓冲区。
2025-04-28 23:37:08
1054
原创 蜂鸣器演奏简单乐谱——“两只老虎”-stc89c52
if (time == soundTime) //到达发声时间后,指示关闭蜂鸣器,523, 587, 659, 698, 784, 880, 988, //中音1-7。1047, 1175, 1319, 1397, 1568, 1760, 1976 //高音1-7。65536 - (11059200/12) / (523*2), //中音1。65536 - (11059200/12) / (1047*2), //高音1。if (time == 0) //当前节拍播完则启动一个新节拍。
2025-04-28 23:36:13
600
原创 蜂鸣器驱动的基础示例-STC89C52
/由给定频率计算定时器重载值。//以4KHz的频率启动蜂鸣器。//以1KHz的频率启动蜂鸣器。//计算所需的定时器重载值。//T0重载值的高字节。//T0重载值的低字节。//配置T0工作在模式1,但先不启动。//反转蜂鸣器控制电平。/* 蜂鸣器启动函数,frequ-工作频率 *//* T0中断服务函数,用于控制蜂鸣器发声 */
2025-04-28 23:35:13
433
原创 按键控制步进电机转动的示例-STC89C52
static unsigned char backup[4][4] = { //按键值备份,保存前一次的值。{ 0x30, 0x1B, 0x0D, 0x27 } //数字键0、ESC键、 回车键、 向右键。{ 0x31, 0x32, 0x33, 0x26 }, //数字键1、数字键2、数字键3、向上键。{ 0x34, 0x35, 0x36, 0x25 }, //数字键4、数字键5、数字键6、向左键。{ 0x37, 0x38, 0x39, 0x28 }, //数字键7、数字键8、数字键9、向下键。
2025-04-28 23:34:12
1067
原创 实用的步进电机驱动示例
/把低4位的节拍代码和高4位的原值送回P1。unsigned char code BeatCode[8] = { //步进电机节拍对应的IO控制代码。//用|操作把节拍代码写到低4位。//用tmp把P1口当前值暂存。//用&操作清零低4位。//节拍输出索引递增。//控制电机转动2圈半。//为T0赋初值0xF8CD,定时2ms。= 0) //节拍数不为0则产生一个驱动节拍。//电机转动节拍总数。else //节拍数为0则关闭电机所有的相。
2025-04-28 23:33:24
467
原创 步进电机转动任意角度的示例-STC89C52
/把低4位的节拍代码和高4位的原值送回P1。unsigned char code BeatCode[8] = { //步进电机节拍对应的IO控制代码。//用|操作把节拍代码写到低4位。//用tmp把P1口当前值暂存。//用&操作清零低4位。while (beats--) //判断beats不为0时执行循环,然后自减1。//360度*25,即25圈。/* 步进电机转动函数,angle-需转过的角度 *//* 软件延时函数,延时约2ms */
2025-04-28 23:32:16
453
原创 步进电机驱动的基础示例-STC89C52
/把低4位的节拍代码和高4位的原值送回P1。unsigned char code BeatCode[8] = { //步进电机节拍对应的IO控制代码。//用|操作把节拍代码写到低4位。//延时2ms,即2ms执行一拍。//用tmp把P1口当前值暂存。//用&操作实现到8归零。//用&操作清零低4位。//节拍输出索引递增。//定义节拍输出索引。//定义一个临时变量。/* 软件延时函数,延时约2ms */
2025-04-28 23:31:41
458
原创 简易加减计算器
if ((keycode>=0x30) && (keycode<=0x39)) //输入0-9的数字。{ 0x30, 0x1B, 0x0D, 0x27 } //数字键0、ESC键、 回车键、 向右键。{ 0x31, 0x32, 0x33, 0x26 }, //数字键1、数字键2、数字键3、向上键。{ 0x34, 0x35, 0x36, 0x25 }, //数字键4、数字键5、数字键6、向左键。{ 0x37, 0x38, 0x39, 0x28 }, //数字键7、数字键8、数字键9、向下键。
2025-04-27 23:27:56
396
原创 按键递减计数
backup) //当前值与前次值不相等说明此时按键有动作。if (backup == 0) //如果前次值为0,则说明当前是弹起动作。unsigned char code LedChar[] = { //数码管显示字符转换表。{ //连续8次扫描值都为0,即16ms内都只检测到按下状态时,可认为按键已按下。{ //连续8次扫描值都为1,即16ms内都只检测到弹起状态时,可认为按键已弹起。if (cnt == 0) //按键次数从F~0递减。//按键值备份,保存前一次的扫描值。
2025-04-27 23:27:21
278
原创 矩阵按键扫描并消抖的演示例程2
KeySta[i][j]) //检测按键动作。static unsigned char keybuf[4][4] = { //矩阵按键扫描缓冲区。unsigned char backup[4][4] = { //按键值备份,保存前一次的值。{ //连续4次扫描值为0,即4*4ms内都是按下状态时,可认为按键已稳定的按下。unsigned char KeySta[4][4] = { //全部矩阵按键的当前状态。//索引值加到4即归零。
2025-04-27 23:26:36
431
原创 独立按键扫描并消抖的演示例程
backup) //当前值与前次值不相等说明此时按键有动作。if (backup == 0) //如果前次值为0,则说明当前是弹起动作。unsigned char code LedChar[] = { //数码管显示字符转换表。{ //连续8次扫描值都为0,即16ms内都只检测到按下状态时,可认为按键已按下。{ //连续8次扫描值都为1,即16ms内都只检测到弹起状态时,可认为按键已弹起。//按键计数,记录按键按下的次数。//按键值备份,保存前一次的扫描值。//显示按键次数初值。
2025-04-27 23:24:57
408
原创 独立按键消抖原理演示例程
backup) //当前值与前次值不相等说明此时按键有动作。if (keybuf == KEY4) //判断扫描值有没有发生改变,即按键抖动。if (backup == 0) //如果前次值为0,则说明当前是弹起动作。unsigned char code LedChar[] = { //数码管显示字符转换表。//按键计数,记录按键按下的次数。//把当前扫描值暂存。//延时大约10ms。//按键值暂存,临时保存按键的扫描值。//按键值备份,保存前一次的扫描值。//显示按键次数初值。
2025-04-27 23:24:19
388
原创 独立按键扫描原理演示例程
if (backup == 0) //如果前次值为0,则说明当前是由0变1,即按键弹起。{ //只用1个数码管显示,所以加到10就清零重新开始。= backup) //当前值与前次值不相等说明此时按键有动作。//定义一个计数变量,记录按键按下的次数。unsigned char code LedChar[] = { //数码管显示字符转换表。//定义一个位变量,保存前一次扫描的按键值。//P2.3置0,即KeyOut1输出低电平。//显示按键次数初值。ENLED = 0;
2025-04-27 23:23:47
302
原创 按键基本原理演示例程
P2 = 0xF7;//P2.3置0,即KeyOut1输出低电平。//按下时为0,对应的LED点亮。ENLED = 0;//选择独立LED进行显示。//将按键扫描引脚的值传递到LED上。
2025-04-27 23:23:04
403
原创 基于数码管计时程序的函数调用演示
unsigned char LedBuff[6] = { //数码管显示缓冲区,初值0xFF确保启动时都不亮。unsigned char code LedChar[] = { //数码管显示字符转换表。//T0溢出后,清零中断标志。if (cnt >= 1000) //判断T0溢出是否达到1000次。//为T0赋初值0xFC67,定时1ms。if (TF0 == 1) //判断T0是否溢出。/* 秒计数函数,每秒进行一次秒数+1,并转换为数码管显示字符 *///设置T0为模式1。
2025-04-27 23:22:27
277
原创 密码锁示例-stc89C52
if (buf[PSW_MAX_LEN] == ~sum) //校验通过,即密码有效时,拷贝密码。//密码输入缓冲区1。if ((keycode>='0') && (keycode<='9')) //输入字符。
2025-04-26 13:29:19
505
原创 简易电子广告屏示例-stc89C52
if (CmpMemory(buf, cmdPtr[i], cmdLen[i])) //比较相同时退出循环。//保存字符串1,起始地址为0x20。//保存字符串2,起始地址为0x40。unsigned char code cmdLen[] = { //命令长度汇总表。if (len >= cmdLen[i]) //首先接收到的数据长度要不小于命令长度。
2025-04-26 13:28:04
650
原创 EEPROM连续读与分页写操作示例-STC89C52
i++) //数据依次+1,+2,+3...E2Read(buf, 0x8E, sizeof(buf));//转换为十六进制字符串。if (tmp <= 9) //转换为0-9或A-F。if (tmp <= 9) //转换为0-9或A-F。//添加字符串结束符。
2025-04-26 13:27:11
433
原创 EEPROM多字节读写操作示例-STC89C52
if (I2CWrite(0x50<<1)) //应答则跳出循环,非应答则进行下一次查询。if (I2CWrite(0x50<<1)) //应答则跳出循环,非应答则进行下一次查询。if (tmp <= 9) //转换为0-9或A-F。if (tmp <= 9) //转换为0-9或A-F。/* E2读取函数,buf-数据接收指针,addr-E2中的起始地址,len-读取长度 */
2025-04-26 13:26:26
344
原创 EEPROM单字节读写操作-STC89C52
/读取指定地址上的一个字节。//寻址器件,后续为读操作。//读取一个字节数据。//寻址器件,后续为写操作。//寻址器件,后续为写操作。//写入一个字节数据。/* 读取EEPROM中的一个字节,addr-字节地址 *//* 向EEPROM中写入一个字节,addr-字节地址 */
2025-04-26 13:25:41
305
原创 I2C寻址示例-STC89C52
mask>>=1) //从高位到低位依次进行。//器件地址需左移一位,因寻址命令的最低位。//将地址和应答值转换为字符串。//查询地址为0x50的器件。//查询地址为0x62的器件。//8位数据发送完后,主机释放SDA,以检测从机应答。if ((mask&dat) == 0) //该位的值输出到SDA上。/* I2C寻址函数,即检查地址为addr的器件是否存在,返回值-从器件应答值 *///读取此时的SDA值,即为从机的应答值。/* I2C总线写操作,dat-待写入字节,返回值-从机应答位的值 */
2025-04-26 13:25:01
436
基于STC8G1K08A的108K雾化器(PWM控制)
2024-07-20
stc15xx-STC8-sch-pcb-library-ver1.0 STC单片机的原理图和PCB库文件资料
2024-05-29
家用美容仪 射频仪 频率1MHZ
2023-08-28
美容仪 爆脂仪 高压电源板 驱动板原理图
2023-08-28
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
1