
#define uchar unsigned char//宏定义
#define uint unsigned int//宏定义
sbit deng=P2^0//定义车灯的控制引脚
sbit z=P2^1//定义左转向灯的控制引脚
sbit y=P2^2//定义右转向灯的引脚
sbit BEEP=P2^3//定义蜂鸣器的引脚
sbit zuo1=P0^0//定义控制左边电机的单片机引脚
sbit zuo2=P0^1//定义控制左边电机的单片机引脚
sbit you1=P0^2//定义控制右边电机的单片机引脚
sbit you2=P0^3//定义控制右边电机的单片机引脚
uchar a=0//定义一个变量a,用来读取串口的数据
void delay(uint z)//一个带参数的延时程序
{
int i,j//定义两个变量
for(i=10i>0i--)
for(j=zj>0j--)//将参数z赋值给j
}
void init()//初始化子程序
{
TMOD=0x20 //设置定时器T1为工作方式2
TH1=0xfd
TL1=0xfd //T1定时器装初值
TR1=1 //启动定时器T1
REN=1 //允许串口接收
SM0=0
SM1=1 //设置串口工作方式1
EA=1 //开总中断
ES=1 //开串口中断
}
void go()//前进子程序
{
zuo1=0
zuo2=1//左边轮子正转
delay(25)//pwm有用值,越大左边方向的轮子越快
zuo1=1//关闭左边轮子
you1=0
you2=1 //右边轮子正转
delay(24)//pwm有用值,越大右边的轮子越快
you1=1//关闭右边轮子
delay(100)//pwm无用值,越大,小车跑的越慢
z=1
y=1//关闭转向灯
}
void hui()//小车后退的子程序
{
zuo1=1
zuo2=0//左边轮子倒转
delay(25)//pwm有用值,越大左边方向的轮子越快
zuo2=1//关闭左边轮子
you1=1
you2=0 //右边轮子倒转
delay(24)//pwm有用值,越大右边的轮子越快
you2=1//关闭右边轮子
delay(100)//pwm无用值,越大,小车跑的越慢
z=1
y=1//关闭转向灯
}
void turnleft()//小车左转弯子程序
{
zuo1=1
zuo2=1//左边轮子停止转动
you1=0
you2=1 //右边轮子正转
delay(24)//pwm有用值,越大右边的轮子越快
you1=1//右边轮子停止
delay(100)//pwm无用值,越大,小车跑的越慢
z=1
y=1//关闭转向灯
z=~z//左转向灯打开
}
void turnright()//小车右转弯子程序
{
zuo1=0
zuo2=1//左边轮子正转
delay(25)//pwm有用值,越大左边方向的轮子越快
zuo1=1//左边轮子停止
you1=1
you2=1 //右边轮子停止
delay(100)//pwm无用值,越大,小车跑的越慢
z=1
y=1//关闭转向灯
y=~y//右转向灯打开
}
void down()//停止子程序
{
zuo1=1
zuo2=1
you1=1
you2=1 //左右轮全部停止
z=1
y=1//关闭转向灯
}
void onbeep()//蜂鸣器鸣响子程序
{
BEEP=0
}
void offbeep()//蜂鸣器鸣响子程序
{
BEEP=1
}
void main()//主程序
{
init()//调用初始化子程序
while(1)//死循环
{
switch(a)//判断a从串口读取到的数据
{
case 0x1f://如果是0x1f就前进
go()
break
case 0x2f://如果是0x2f就后退
hui()
break
case 0x3f://如果是0x3f就左转
turnleft()
break
case 0x4f://如果是0x4f就右转
turnright()
break
case 0x00://如果是0x00就停止
down()
break
case 0xa0://如果是0xa0车灯打开
deng=0
break
case 0xb0://如果是0xb0车灯关闭
deng=1
break
case 0xc0://如果是0xc0蜂鸣器鸣响
onbeep()
break
case 0xd0://如果是0xc0蜂鸣器鸣响
offbeep()
break
}
}
}
void chuan() interrupt 4//串口中断服务程序
{
RI=0//软件清除串口响应
a=SBUF//读取单片机串口接受的蓝牙模块发送的数据
}
程序不好给,你的硬件接口定义都没有给出来。逻辑部分大致就是
MOV
R7,#80
循环10次,每循环8盏灯,就需要程序循环80次
MOV
A,#03H
(假设你低位口线接右边的LED灯)
CPL
A
(这句视你的LED驱动方式再决定是不是使用)
LOOP10:
MOV
P1,A
(假设P1是你LED接的I/O口)
LCALL
DELAY0.5S
暂假设延时0.5秒,具体延时程序自己再定义
RL
A
DJNZ
R7,LOOP10
就可以了
从静态显示和动态显示的区别说起,把动态显示占用IO少,利用视觉残留的方法说清楚就可以啊.附上电路图和程序供你参考,别忘记给分哦.
#include "STC12C5A.h" //包含头文件
/***数字编码表 0~9***/
unsigned char const seg[10] = {0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6}//段选
unsigned char const position[]={1,2,4,8} //位选
sbit HC595_SCK = P0^4
sbit HC595_RCK = P0^5
sbit HC595_RST = P0^6
sbit HC595_DAT = P0^7
//us延时
void delay_us(unsigned int t)
{
while(t--)
}
//延时函数(24M 晶振下延时 1ms)
void delay_ms(unsigned int time)
{
unsigned int t
for(time>0time--)
{
t = 1500
while(t--)
}
}
//向 HC595 发送一个字节
void HC595_send_byte(unsigned char byte)
{
unsigned char i,temp
for(i=0i<=7i++)
{
temp = byte&1<<i
if(temp)
{
HC595_DAT = 1 //数据线
}
else
{
HC595_DAT=0
}
//下面是写时序
HC595_SCK=1 //SCK(11 脚)
delay_us(1)
HC595_SCK=0
delay_us(1)
}
HC595_RCK=0 //RCK(12 脚)
delay_us(1)
HC595_RCK=1
}
//显示一个数 num
void SMG_ShowNum(unsigned char num)
{
HC595_send_byte(seg[num])
}
void SMG_Display(unsigned int dat)
{
SMG_ShowNum(dat/1000)
P0 = (P0&0xf0)|position[0]
delay_ms(2)
SMG_ShowNum((dat%1000)/100)
P0 = (P0&0xf0)|position[1]
delay_ms(2)
SMG_ShowNum(dat%100/10)
P0 = (P0&0xf0)|position[2]
delay_ms(2)
SMG_ShowNum(dat%10)
P0 = (P0&0xf0)|position[3]
delay_ms(2)
}
//主函数
void main()
{
unsigned int num=0
unsigned char time=0
P0=0X00 //初始化低四位为高电平,使能四位数码管
HC595_RST=0 //HC595 的复位端,不能让他复位
while(1)
{
num = (num+1)%10000 //动态显示 0~9999
time = 100
while(time--)
SMG_Display(num)
}
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)