数码之家

 找回密码
 立即注册
搜索
查看: 424|回复: 20

求大神帮我改改这个程序

[复制链接]
发表于 2024-11-6 23:03:38 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
//------------------------------------------------------------------------------------
// Main.c
//------------------------------------------------------------------------------------
// Copyright (C) 2013 Shenyang JYXD.
// WEN BO RUI
// Tool chain: KEIL Full c
//
//#pragma CD OE DB SB // Compilation directives
#include <STC8G.H>
#include <intrins.h>
//#include
//#include
#define uchar unsigned char
#define uint unsigned int
uint Period; //Period刷新周期
uint PWM;
uint Pulse; //脉冲个数
uchar Speed; //速度变量
uchar count;
uint excount;
bit Gra; //渐变/跳变总控制位
bit Gra7; //七彩渐亮渐灭控制位
bit Gra3; //红绿蓝渐亮渐灭控制位
bit BP; //亮到暗,暗到亮转换位
bit LEDdelay ; //LED定时到标志位
sbit key1 = P3^1; //花样组合键
sbit key2 = P3^5; //速度组合键

uchar led1[12]={0x10,0x030,0x20,0x60,0x40,0x50,0x70,0x50,0x40,0x60,0x20,0x30};//红、黄、绿、青、蓝、粉、白、粉、蓝、青、绿、黄
uchar led2[24]={0x10,0x00,0x30,0x00,0x20,0x00,0x60,0x00,0x40,0x00,0x50,0x00,
0x70,0x00,0x50,0x00,0x40,0x00,0x60,0x00,0x20,0x00,0x30,0x00};
uchar led3[3]={0x10,0x20,0x40}; //红、绿、蓝
uchar ledcount,ledcount1;
//***********************************************************
//以下定义函数
// 1毫秒延时函数delayms();花样及速度扫描函数keyscan();
//***********************************************************
/*void delayms(unsigned int ms)
{
unsigned char i ;
while(ms--)
{
for(i = 0 ; i < 120 ; i++) ;
}
}*/
void Pattern1(); //花样1函数--------->跳变无灭灯过程
void Pattern2(); //花样2函数--------->跳变有灭灯过程
void Pattern34();
void keyscan()
{
if(k1 = 0) {Speed = 20;Period = 25;} //预设4种速度200MS
if(k1 = 1) {Speed = 50;Period = 50;} //500MS
if(k1 = 2) {Speed = 100;Period = 100;} //1S
if(k1 = 3) {Speed = 150;Period = 200;} //1.5S
if(k2 = 0) {ledcount1 = 0;Pattern1();} //预设4种花样
if(k2 = 1) {ledcount1 = 0;Pattern2();}
if(k2 = 2) {ledcount = 0;Gra3 = 1;Pattern34();}
if(k2 = 3) {ledcount = 0;Gra7 = 1;Pattern34();}
}
void value()
{
if(Speed == 20) PWM = Pulse*8;
if(Speed == 50) PWM = Pulse*4; //脉冲个数
if(Speed == 100)PWM = Pulse*2;
if(Speed == 150)PWM = Pulse;
}
void Reset(void)
{
unsigned char code rst[ ]={0xe4,0xc0,0xe0,0xc0,0xe0,0x32};
(*((void (*)(void))(rst)))();
}
void main()
{
_nop_ ();
_nop_ ();
_nop_ ();
P1 = 0;
TMOD = 0x11; //11.0592M晶振的10ms定时初值(100分之一秒)
TH0 = 0x0db;
TL0 = 0x0ff;
TH1 = 0x0ff; //0.05ms(20000分之一秒)
TL1 = 0x0D1;
EA = 1; //开启总中断允许
ET0 = 1; //允许T0定时器中断
ET1 = 1; //允许T1定时器中断
TR0 = 1; //开启T0定时器
EX0=1; //开外部中断0
IT0=1; //下降沿触发
while(1)
{

keyscan();
}
}
//*************************************************************************
//Pattern1() 花样函数1-------------跳变无灭灯过程
//*************************************************************************
void Pattern1()
{
//keyscan();
Gra = 0; //跳变位=0
if(LEDdelay)
{
LEDdelay = 0;
P1 = led1[ledcount];
ledcount++;
if(ledcount>11)
{
ledcount = 0;
}
}
}
//***********************************************************************
//Pattern2() 花样函数2-------------跳变有灭灯过程
//***********************************************************************
void Pattern2()
{
keyscan();
Gra = 0;
if(LEDdelay)
{
LEDdelay = 0;
P1 = led2[ledcount];
ledcount++;
if(ledcount>23)
{
ledcount = 0;
}
}
}
//***********************************************************************
//Pattern3() 花样函数3-------------3彩渐变
//***********************************************************************
void Pattern3()
{
keyscan();
if(Speed == 20) Period = 25;
if(Speed == 50) Period = 50;
if(Speed == 100)Period = 100;
if(Speed == 150)Period = 200;
Gra = 1;
Gra3 = 1;
}

//***********************************************************************
//Pattern4() 花样函数4-------------7彩渐变
//***********************************************************************
void Pattern34()
{
Gra = 1; //渐变位 = 1
}
/*********************************************************/
// 定时器0中断服务程序
/*********************************************************/
void time0(void) interrupt 1
{
TR1 =0;
TF0 =0;
TH0=0xdb; //重新写入初值
TL0=0xff;
if(!Gra) //执行跳变程序
{
count ++;
if(count > Speed)
{
LEDdelay = 1;
count = 0;
}
}
if(Gra)
{
TR1 = 1; //开启TR1;
if(!BP) //
{
if(Gra7)
{
P1 = led1[ledcount1]; //10ms到,亮相应的LED
}
if(Gra3)
{
P1 = led3[ledcount1]; //10ms到,亮相应的LED
}
Pulse++;
value();
if(Pulse >= Period)
{
Pulse = Period;
BP = 1; //一个周期完成转换模式
}
}
if(BP)
{
if(Gra7)
{
P1 = led1[ledcount1]; //10ms到,亮相应的LED
}
if(Gra3)
{
P1 = led3[ledcount1]; //10ms到,亮相应的LED
}
value();
Pulse--; //脉冲个数
if(Pulse == 0)
{
Pulse = 0;
BP = 0; //一个周期完成转换模式
ledcount1++;
if(Gra7)
{
if(ledcount1 > 11)
{
ledcount1 = 0;
}
Gra7 = 0;
}
if(Gra3)
{
if(ledcount1 > 2)
{
ledcount1 = 0;
}
Gra3 = 0;
}
}
}
}
}
/*********************************************************/
// 定时器1中断服务程序
/*********************************************************/
void timer1() interrupt 3
{
PWM --;
TH1 = 0xff; //0.05ms(20000分之一秒)
TL1 = 0xD1;
if(PWM == 0)
{
P1 = 0;
TR1 = 0;
}
}
/*********************************************************/
// 外部中断0中断服务程序 下降沿触发
/*********************************************************/
void extern0(void) interrupt 0
{
IE0 = 0; // 清标志位
excount++;
if(excount>50) // 50大约3秒
{
EA = 0;
//P1_5 = 1;
excount = 0;
Reset();
}
}
发表于 2024-11-7 00:46:10 | 显示全部楼层
这程序有点长吧,这需求有点虚啊,先报个 2K 价格压压惊
回复 支持 1 反对 0

使用道具 举报

发表于 2024-11-7 07:51:19 | 显示全部楼层
好像是七彩灯
回复 支持 反对

使用道具 举报

发表于 2024-11-7 08:51:48 | 显示全部楼层
这种网上找AI改啊
回复 支持 反对

使用道具 举报

发表于 2024-11-7 11:10:31 | 显示全部楼层
以下是对这段 C 语言代码的分析:
一、代码功能概述
这段代码是用 C 语言编写的,用于控制某种 LED 灯的显示模式和速度。主要功能包括以下几个方面:
通过不同的函数实现多种 LED 显示花样,如跳变无灭灯过程(Pattern1)、跳变有灭灯过程(Pattern2)、三彩渐变(Pattern3)和七彩渐变(Pattern4,Pattern34 可实现七彩渐变和三彩渐变)。
可以通过按键(key1 和 key2)选择不同的速度和花样组合。
使用定时器中断(T0 和 T1)来控制 LED 的显示时间和渐变效果,外部中断(INT0)用于系统复位。
二、主要变量和宏定义
Period:刷新周期变量,用于控制 LED 渐变或跳变的速度。
PWM:脉冲宽度调制变量,可能用于控制 LED 的亮度。
Pulse:脉冲个数变量,在渐变过程中用于控制 LED 的亮度变化。
Speed:速度变量,通过按键设置不同的值来改变 LED 显示的速度。
count、excount、ledcount、ledcount1:用于各种计数目的的变量。
Gra、Gra7、Gra3、BP、LEDdelay:标志位变量,用于控制渐变、七彩渐变、三彩渐变、亮暗转换以及 LED 定时标志。
key1和key2:定义为连接到 P3.1 和 P3.5 的按键。
led1、led2、led3:分别是不同花样的 LED 显示数据数组。
三、函数分析
delayms(unsigned int ms):注释掉的函数,可能是一个毫秒延时函数。
Pattern1():实现跳变无灭灯过程的花样函数。当LEDdelay标志位为真时,切换到下一个 LED 颜色显示,循环显示led1数组中的颜色。
Pattern2():实现跳变有灭灯过程的花样函数。与Pattern1()类似,但使用led2数组进行显示。
Pattern34():可以根据Gra7和Gra3标志位分别实现七彩渐变和三彩渐变。
keyscan():扫描按键状态,根据按键key1和key2的状态设置速度和选择不同的花样函数。
value():根据Speed的值设置PWM变量,可能用于控制 LED 的亮度。
Reset(void):系统复位函数,通过执行一段特定的代码来实现系统复位。
main():主函数,初始化定时器、中断和端口,然后进入一个无限循环,在循环中调用keyscan()函数扫描按键状态。
time0(void) interrupt 1:定时器 0 中断服务程序,根据Gra标志位执行不同的操作。如果Gra为假,执行跳变程序;如果Gra为真,根据BP标志位进行 LED 的渐变操作。
timer1() interrupt 3:定时器 1 中断服务程序,用于控制PWM变量递减,当PWM为 0 时关闭 LED。
extern0(void) interrupt 0:外部中断 0 中断服务程序,用于系统复位。当检测到下降沿触发时,计数变量excount递增,当excount大于 50(大约 3 秒)时,关闭总中断,执行系统复位操作。
四、代码执行流程
在main()函数中,进行初始化操作,包括设置端口状态、定时器模式、中断允许等。
进入无限循环,在循环中调用keyscan()函数扫描按键状态,根据按键选择不同的速度和花样。
当定时器 0 中断发生时,根据Gra标志位执行不同的操作。如果是跳变模式,根据count变量控制 LED 的跳变速度;如果是渐变模式,开启定时器 1,并根据BP标志位进行 LED 的渐变操作。
当定时器 1 中断发生时,递减PWM变量,当PWM为 0 时关闭 LED。
当外部中断 0 中断发生时,计数变量excount递增,当excount大于 50 时,执行系统复位操作。
五、总结
这段代码实现了一个较为复杂的 LED 控制程序,通过按键选择不同的速度和花样,利用定时器中断实现 LED 的跳变和渐变效果,同时还提供了系统复位功能。代码中使用了多个标志位和数组来控制 LED 的显示,需要仔细理解各个变量和函数的作用,以便更好地进行调试和扩展。
回复 支持 反对

使用道具 举报

发表于 2024-11-7 12:19:09 | 显示全部楼层
找个AI帮写把,学会把需求描述清晰。这没头没脑的,到时候需求改的无边无际别说2K,20k都不一定包的住
回复 支持 反对

使用道具 举报

发表于 2024-11-7 12:42:31 | 显示全部楼层
eric_yangsen 发表于 2024-11-7 12:19
找个AI帮写把,学会把需求描述清晰。这没头没脑的,到时候需求改的无边无际别说2K,20k都不一定包的住{:013 ...

+1,英雄所见略同...


二○二四年十一月七日
回复 支持 反对

使用道具 举报

发表于 2024-11-7 14:14:51 | 显示全部楼层
vip2128 发表于 2024-11-7 11:10
以下是对这段 C 语言代码的分析:
一、代码功能概述
这段代码是用 C 语言编写的,用于控制某种 LED 灯的显 ...

经本菜鸟鉴定这是个大佬
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-7 15:40:47 | 显示全部楼层
这是个七彩led闪光程序,原作者是用四个按键来调节模式和速度,因用stc8g08是个8脚单片机,所以想改成2个键控制模式和速度,希望哪位大神帮忙改写一下
回复 支持 反对

使用道具 举报

发表于 2024-11-7 15:54:59 | 显示全部楼层
要改啥呢?
没说清楚呢
回复 支持 反对

使用道具 举报

发表于 2024-11-7 17:02:43 | 显示全部楼层
什么乱七八糟的代码?
unsigned char code rst[ ]={0xe4,0xc0,0xe0,0xc0,0xe0,0x32};
(*((void (*)(void))(rst)))();
是啥意思?
k1, k2在哪里赋值?
回复 支持 反对

使用道具 举报

发表于 2024-11-7 21:50:13 | 显示全部楼层
5楼真是位大神啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-7 22:17:06 | 显示全部楼层
bg4rff 发表于 2024-11-7 15:54
要改啥呢?
没说清楚呢

这是个七彩led闪光程序,原作者是用四个按键来调节模式和速度,因用stc8g08是个8脚单片机,所以想改成2个键控制模式和速度,
回复 支持 反对

使用道具 举报

发表于 2024-11-8 03:17:50 | 显示全部楼层
add 发表于 2024-11-7 14:14
经本菜鸟鉴定这是个大佬

大哥,你看他的用户组级别,再看看他的注册时间。。。。我有种瑟瑟发抖的感觉~!~!
回复 支持 反对

使用道具 举报

发表于 2024-11-8 10:07:40 | 显示全部楼层
fsj5098 发表于 2024-11-7 22:17
这是个七彩led闪光程序,原作者是用四个按键来调节模式和速度,因用stc8g08是个8脚单片机,所以想改成2个 ...

8G1K08,除了电源有P30-P33,P54,P55,建议按键接在P54和P55用外部中断
红绿蓝三色灯接在P30-P32,这样颜色数组只要右移四位
在P54和P55用边沿触发外加小电容硬件滤波接按键输入
回复 支持 反对

使用道具 举报

发表于 2024-11-8 10:09:30 | 显示全部楼层
fsj5098 发表于 2024-11-7 22:17
这是个七彩led闪光程序,原作者是用四个按键来调节模式和速度,因用stc8g08是个8脚单片机,所以想改成2个 ...

调节两个按键是可以的,简单点就是只有单击程序循环加,复杂点就是单击双击和长按实现复杂组合
回复 支持 反对

使用道具 举报

发表于 2024-11-8 10:10:04 | 显示全部楼层
fsj5098 发表于 2024-11-7 22:17
这是个七彩led闪光程序,原作者是用四个按键来调节模式和速度,因用stc8g08是个8脚单片机,所以想改成2个 ...

建议把硬件原理图弄出来,然后才好安排
回复 支持 反对

使用道具 举报

发表于 2024-11-8 10:21:21 | 显示全部楼层
bg4rff 发表于 2024-11-8 10:09
调节两个按键是可以的,简单点就是只有单击程序循环加,复杂点就是单击双击和长按实现复杂组合 ...

如果是STC8G08A而且原来没有组合键的话改成AD按键比较简单。
回复 支持 反对

使用道具 举报

发表于 2024-11-8 10:40:05 | 显示全部楼层
把代码复制到GPT,就知道代码逻辑了,然后让gpt按你的需求改一下就行
回复 支持 反对

使用道具 举报

发表于 2024-11-9 23:11:23 | 显示全部楼层
真不知道是哪个人开发出来的,有这闲工夫,直接用个数码管显示故障代码它不行吗?
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-12-13 00:23 , Processed in 0.140401 second(s), 10 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

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