找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

多功能流水灯程序

[复制链接]
admin 发表于 2012-9-4 05:13:38 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

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

×
单片机有1个月了这是自己独立编的第一个程序,其中包含一键多功能,按键切换流水功能,和上位机通讯控制功能,其中有很多毛病。拿出来和大家分享一下。第一次在网络上发帖子希望能顶下。
#include<REGX51.h>
#define BUFFER_LENGTH 50
#define uint unsigned int
#define uchar unsigned char
uchar _Buffer[50];
uchar pWrite = 0;
uchar pRead = 0;
uchar UpdateFlag = 0;
uchar OverflowFlag = 0;
uchar LoopFlag = 0;
uchar modle_flag=0;
uchar RevData; // 接收数据
uchar LED; // LED跑马灯状态
uchar i;
uchar ID;
uchar flag;
uint var[4]={0x01,0x02,0x04,0x08};
void RS232_SendData(uchar Sdata);
uchar ReadBuffer();
void Init(void) //定时器初始化
{
EA = 0;
TMOD= 0x01;
ET0 = 1; //使能Timer 0
EA = 1; //开中断
}
void TimeStart(void) //开始定时
{
TH0 = 0x4c; //定时50ms
TL0 = 0x00;
TR0 = 1; //打开Timer 0,开始定时
}
void RS232_Init() //串口初始化
{
SCON = 0x50; // UART工作于模式1, REN=1
TMOD |= 0x20; // Timer1 工业于模式2
PCON = 0x80; // SMOD1 = 1
TH1 = 0xFA; // 波特率9600 Bds at 11.0952MHz
TL1 = 0xFA; // 波特率9600 Bds at 14.0592MHz
ES = 1; // 串口中断使能
TR1 = 1; // 启动Timer1
}
void delay(uint t)
{
uint i;
while(t)
{
for(i=0;i<1000;i++);
t--;
}
}
void wait(uint t)
{
uint i;
while(t--)
{
for(i=0;i<100;i++);
}
}
void keyprocess(void)
{
uchar key;
while(P2!=0xff)
{
delay(20);
if(P2!=0xff)
key=P2&0xff;
else key = 0xff;
switch(key)
{
case 0xfd:
modle_flag=5;
break;
case 0xfb:
ID++;
if(ID==4){ID=0;}
modle_flag=2;
break;
case 0xf7:
modle_flag=6;
break;
case 0xef:
modle_flag=3;
break;
default:break;
}
}
}
void LED_1()
{
for(i=0;i<5;i++)
{
P1=(0x01<<i);
delay(50);
}
}
void LED_2()
{
P1=var[ID];
}
void LED_3()
{
P1=0xff;
delay(300);
P1=0x00;
delay(190);
}
void LED_4()
{
P1=var[flag];
}
void LED_5()
{ P1=0xff;
wait(1);
P1=0x00;
wait(4);}
void LED_6()
{
P1=0xff;
delay(5);
modle_flag=5;
}
void main()
{
Init(); //定时器初始化
RS232_Init(); // 初始化UART
TimeStart();
EA = 1; // 全局中断使能
while(1)
{
switch(modle_flag)
{
case 1:
LED_1();
break;
case 2:
LED_2();
break;
case 3:
LED_3();
break;
case 4:
LED_4();
break;
case 5:
LED_5();
break;
case 6:
LED_6();
break;
default:
P1=0x00;
break;
}
}
}
uchar ReadBuffer()
{
uchar Buffer_value; // Buffer 值
Buffer_value = _Buffer[pRead]; // 从缓存区读数
pRead++; // 指针向前移动
if(pRead == BUFFER_LENGTH) // 如果到缓存末尾
{
pRead = 0; // 循环指针
LoopFlag = 0; // 清除LoopFlag
}

if((pRead == pWrite) && (!LoopFlag)) // 如果数据读取完毕
{
UpdateFlag = 0; // 清除更新标志
}

if(OverflowFlag) // 如果数据缓存溢出
{
OverflowFlag = 0; // 清除数据溢出标志
}
return Buffer_value; // 返回读取值
}
void RS232_SendData(uchar Sdata)
{
SBUF = Sdata+1; // 发送数据
while(TI==1); // 等待发送完毕

}
void serial_IT(void) interrupt 4
{
EA = 0;// 关中断
if (RI == 1)
{ // 接收中断
RI = 0; // 清除中断标志
_Buffer[pWrite] = SBUF; // 将数据写入缓存区
UpdateFlag = 1; // 置高数据更新标志
pWrite++;
if(pWrite == BUFFER_LENGTH)
{
pWrite = 0; // 循环缓存区
LoopFlag = 1; // 置高Loop标志
}
if((pWrite >= pRead) && (LoopFlag == 1))
{
OverflowFlag = 1; // 数据溢出标志置高
}
}
else
{
TI = 0; // 清除发送中断标志
}
if(UpdateFlag)
{
RevData = ReadBuffer(); // 读取数据
LED = RevData; // 设置LED灯状态
switch(LED)
{
case 0x32:
modle_flag=1;
break;
case 0x33:
modle_flag=3;
break;
case 0x34:
flag++;
if(flag==4){flag=0;}
modle_flag=4;
break;
case 0x35:
modle_flag=5;
break;
case 0x36:
modle_flag=6;
break;
default:break;
}
RS232_SendData(RevData); // 发送数据
}
EA = 1; // 开中断,准备下次接收
}
void Timer0(void) interrupt TF0_VECTOR using 1
{
TR0 = 0; //关定时器
keyprocess();
TH0 = 0x4c; //定时50ms
TL0 = 0x00;
TR0 = 1;
}
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-24 05:33 , Processed in 0.063019 second(s), 12 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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