标题:
STC8G1K08-16PIN单片机为主控转向中网灯主控程序 求指教
[打印本页]
作者:
川蜀浪子
时间:
2020-11-9 19:56
标题:
STC8G1K08-16PIN单片机为主控转向中网灯主控程序 求指教
/********使用STC8G1K08-16PIN为主控转向流光灯,
1、上电扫描流光左右同时流光三次,日行灯亮。
2、接收到左或右转向信号时相应方向流光一次,日行灯LED11 50%亮度。
3、断开左或右转向信号时,日行灯LED11 100%亮度。
4、锁车左右同时接到信号时流光。*****/
#include <STC8G.H>
typedef unsigned char u8;
typedef unsigned int u16;
/********端口引脚定义*****/
sbit KEYL=P5^4; //设置左方向触发信号
sbit KEYR=P5^5; //设置右方向触发信号
sbit LED1=P3^2; //左方向流光灯设定
sbit LED2=P3^3;
sbit LED3=P3^4;
sbit LED4=P3^5;
sbit LED5=P3^6;
sbit LED6=P3^7; //右方向流光灯设定
sbit LED7=P1^0;
sbit LED8=P1^1;
sbit LED9=P1^6;
sbit LED10=P1^7;
sbit LED11=P3^1; //日行灯设定
bit signl=0; //触发状态标志
bit signr=0;
u8 count1=0; //开关消抖计数变量
u16 count2=0,count3=0; //LED延时计数变量
/********定时器初始化*****/
void Timer0Init() //10毫秒@11.0592MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器自动重装模式
TL0 = 0x00; //设置定时初值
TH0 = 0xDC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
/********上电扫描流光子函数*****/
void Led()
{
LED1=LED6=1; //LED1,LED6亮
count2++;
if(count2>=10) //0.1秒延时
LED1=LED6=LED2=LED7=1; //LED1、2,LED6、7亮
if(count2>=20)//0.2秒延时
LED1=LED6=0; LED2=LED7=LED3=LED8=1; //LED2、3,LED7、8亮
if(count2>=30)//0.3秒延时
LED1=LED6=LED2=LED7=0; LED3=LED8=LED4=LED9=1; //LED3、4,LED8、9亮
if(count2>=40)//0.4秒延时
LED1=LED6=LED2=LED7=LED3=LED8=0; LED4=LED9=LED5=LED10=1; //LED4、5,LED9、10亮
if(count2>=50)//0.5秒延时
LED1=LED6=LED2=LED7=LED3=LED8=LED4=LED9=0; LED5=LED10=1; //LED5,LED10亮
{
count2=60; //保持
LED1=LED6=LED2=LED7=LED3=LED8=LED4=LED9=LED5=LED10=0; //LED灭
}
}
/******主函数区******/
void main()
{
P3M0=0xFE;//设P3口为推挽输出,P3.0为高阻输入.
P3M1=0x01;
P1M0=0xC3;//设P1口为推挽输出,
P1M1=0x00;
P5M0=0x00;//设P5.4、P5.5为准双向口.
P5M1=0x00;
P3=0X01;
P1=0X3C;
KEYL =1; //不可以设低电平
KEYR =1;
Timer0Init();
Led();
Led();
Led();
LED11=1; //P5.5为高电平
while(1)
{
if(TF0==1)//定时器10毫秒溢出
{
TF0=0; //清0
/********扫描开关(触发/复位)**************/
if(KEYL==1)//如P5.4为高电平
{
if(++count1>=2&&signl==0)//消抖计数和判断判断开关触发状态
signl=1;//触发状态标志置1
}
else //如P5.4为低电平
{
signl=0; //触发状态标志清0
count1=0; //消抖计数清0
}
if(KEYR==1)//如P5.5为高电平
{
if(++count1>=2&&signr==0)//消抖计数和判断判断开关触发状态
signr=1;//触发状态标志置1
}
else //如P5.5为低电平
{
signr=0; //触发状态标志清0
count1=0; //消抖计数清0
}
/********执行触发/复位部分**************/
if(signl==1) //触发状态
{
count3=0; //计数3清0
LED11=0; //P3.1需PWM50%亮度 //P3.1输出低电平 熄
LED1=1; //LED1亮
count2++;
if(count2>=10) //0.1秒延时
LED1=LED2=1; //LED1、2,亮
if(count2>=20)//0.2秒延时
LED1=0; LED2=LED3=1; //LED2、3,亮
if(count2>=30)//0.3秒延时
LED1=LED2=0; LED3=LED4=1; //LED3、4,亮
if(count2>=40)//0.4秒延时
LED1=LED2=LED3=0; LED4=LED5=1; //LED4、5,亮
if(count2>=50)//0.5秒延时
LED1=LED2=LED3=LED4=0; LED5=1; //LED5,亮
{
count2=60; //保持
LED1=LED2=LED3=LED4=LED5=0; //LED灭
}
}
else //复位状态
{
count2=0; //计数2清0
LED1=LED2=LED3=LED4=LED5=0; //LED1~5熄
if(++count3>=100)//1秒延时
{
count3=100; //保持
LED11=1; //LED5亮
}
}
if(signr==1) //触发状态
{
count3=0; //计数3清0
LED11=0; //P3.1需PWM50%亮度 //P3.1输出低电平 熄
LED6=1; //LED6亮
count2++;
if(count2>=10) //0.1秒延时
LED6=LED7=1; //LED6、7,亮
if(count2>=20)//0.2秒延时
LED6=0; LED7=LED8=1; //LED7、8,亮
if(count2>=30)//0.3秒延时
LED6=LED7=0; LED8=LED9=1; //LED8、9,亮
if(count2>=40)//0.4秒延时
LED6=LED7=LED8=0; LED9=LED10=1; //LED9、10,亮
if(count2>=50)//0.5秒延时
LED6=LED7=LED8=LED9=0; LED10=1; //LED10,亮
{
count2=60; //保持
LED6=LED7=LED8=LED9=LED10=0; //LED灭
}
}
else //复位状态
{
count2=0; //计数2清0
LED6=LED7=LED8=LED9=LED10=0; //LED6~10熄
if(++count3>=100)//1秒延时
{
count3=100; //保持
LED11=1; //LED5亮
}
}
}
}
}
复制代码
作者:
川蜀浪子
时间:
2020-11-10 10:06
那位大大帮忙看看这个程序需要怎样修改一下,及怎样加入PWM的调光功能。
作者:
川蜀浪子
时间:
2020-11-12 08:21
看看那位大神能指点一下双输入信号的思路。
作者:
lovexulu
时间:
2020-11-12 16:37
吐槽一句,这程序写的真废片子。
输出选择pwm端I/O,配置pwm。 硬件需要做些改动,不改硬件控制亮度,你估计要配置8路pwm 。不过stc8G1k08芯片只有3路。。。。
关于信号采集。。。我想应该是控制信号输入,严谨写法用中断,不严谨嘛。轮询就能行。至于双路信号,最多不过4种状态,case0~3,不香么。
另外,流光写成子函数,传递调用参数不香么,多写几个花样闪烁做成子函数。。。。。
还有,你想要的功能表达并不详细,没法给你具体解答。
作者:
川蜀浪子
时间:
2020-11-28 11:41
没有人指点吗?贴子都沉了。
作者:
51c_yang
时间:
2021-6-10 10:05
请问stc8G1k08的芯片,在keil中cpu选89c52的行吗,还有这个头文件就是“stc8G.h”嘛
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1