#include<windows.h>
int main()
{
for(int i=0i<100i++) //不停地闪烁100次
{
printf("灯亮") //亮灯,输出一个灯的符号
Sleep(500) //延时500毫秒
system("cls")//系统命令,清屏
printf("灯灭")
Sleep(800) //延时800毫秒
}
return 0
}
用51单片机来简单说明一下:
用8只LED代表8盏灯(D1~D8),限流电阻用一个9脚排阻RP1,原理图如下:
为了视觉观察观察方便,用一个500ms,也就是0.5秒的延时程序来间隔灯的亮灭变化。当然这个时间是可以自由修改的,修改成1秒的话也可以,只是LED亮灭变化快慢不同而已。
下面是延时程序:
void delay500ms(void) //@12.000MHz
{
unsigned char i, j, k
_nop_()
_nop_()
i = 23
j = 205
k = 120
do
{
do
{
while (--k)
} while (--j)
} while (--i)
}
//----------------------------
前面原理图采用P1端口驱动LED,定义LED端口为P1:
#define IO_LED P1
//---------------------------
当端口为0时灯亮,为1时熄灭,为了理解方便,用宏定义来定义LED亮灭,增加可读性,也便于理解,如下:
#define DATA_LED_OFF 0xff
#define DATA_LED_ON 0x00
(程序中写“DATA_LED_OFF”,在编译时编译器会自动编译“0xff”。)
//----------------------------
用for循环语句实现LED点亮和熄灭10次:
for(i = 0i <10i++)
{
IO_LED = DATA_LED_ON //点亮LED
delay500ms()
IO_LED = DATA_LED_OFF //熄灭LED
delay500ms()
}
//----------------------------------
完整的c源程序如下图:
以上仅供参考。
看你这程序编的,ha
查询RI
不是等于
1,而是0
只有当数据传送过来的时候,RI才会由1变为0,所以需要查询的状态是
0,不是1
当接收完数据后,再进行对RI的清零
还是不多说了,上程序,若满意请记得采纳一下,谢谢!
这是一个由串口助手发送十六进制码来控制单片机的8个LED亮灭的简单小程序
/***************************************************************************/
#include
<REG52.h>//通用89C52头文件
/***************************************************************************/
void
main(void)//主函数
{
TMOD=0x20
//定时器1和2工作方式2(8位定时/计数)
TH1=0xfd
//定时器1设置初值,波特率9600bit/s,
TL1=0xff
TR1=1
//启动定时器T1
PCON=0x00
//SMOD=0,不加倍
SCON=0x50
//串口工作方式1,允许接收
IE=0x00
//关闭所有中断
while(1)
{
if(RI==0)//如果有数据
{
P2=SBUF
//接收数据并输出至LED上显示
while(!RI)
//等待接收完成
RI=0
//清空标识
}
}
}
/***************************************************************************/
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)