搭建:keil5+proteus8
详见 : 单片机---keil5+proteus8安装与流水灯简单仿真
目录
一、proteus:
绘制原理图
工具:AT89C51 LED-BIBY GROUND(终端模式)
二、keil
1.直接赋值法
#include <reg51.h> //定义单片机的一些特殊功能寄存器
sbit led1=P0^0; //定义指定 LED 灯的管脚,连接到 P0.0
sbit led2=P0^1;
sbit led3=P0^2;
sbit led4=P0^3;
sbit led5=P0^4;
sbit led6=P0^5;
sbit led7=P0^6;
sbit led8=P0^7;
void delay(unsigned int i) //延时函数。unsigned int 定义无符号整型,范围 0 - 65535
{
while(i--); //i=1 时,大约延时 10us
}
void main() //主函数,程序从这里开始执行
{
while(1)
{
led1=0; //0 表示低电平,点亮 led1
delay(5000); //调用延时函数,产生一定时间间隔
led1=1; //1 表示高电平,熄灭 led1
delay(5000);
led2=0; //0 表示低电平,点亮 led2
delay(5000);
led2=1; //1 表示高电平,熄灭 led2
delay(5000);
led3=0; //0 表示低电平,点亮 led3
delay(5000);
led3=1; //1 表示高电平,熄灭 led3
delay(5000);
led4=0; //0 表示低电平,点亮 led4
delay(5000);
led4=1; //1 表示高电平,熄灭 led4
delay(5000);
led5=0; //0 表示低电平,点亮 led5
delay(5000);
led5=1; //1 表示高电平,熄灭 led5
delay(5000);
led6=0; //0 表示低电平,点亮 led6
delay(5000);
led6=1; //1 表示高电平,熄灭 led6
delay(5000);
led7=0; //0 表示低电平,点亮 led7
delay(5000);
led7=1; //1 表示高电平,熄灭 led7
delay(5000);
led8=0; //0 表示低电平,点亮 led8
delay(5000);
led8=1; //1 表示高电平,熄灭 led8
delay(5000);
}
}
2.读取数组法
#include <reg51.h>
// 定义延时函数,参数 t 为循环次数
void delay(unsigned int t)
{
while (t--);
}
void main(void)
{
char st[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
int t = 0;
while(1)
{
// 将数组 st 中的元素赋值给 P0 端口
P0 = st[t];
// 调用延时函数,延时一段时间
delay(50);
t++;
// 当 t 等于 8 时,重新将 t 置为 0,实现循环遍历数组 st
if(t == 8){
t = 0;
}
}
}
3.库函数法
#include <reg52.h>
#include <intrins.h> //当调用_cror_右移库函数和_crol_左移库函数时,需调用头文件<intrins.h>
//注意:库函数的移位不会自动补0,是最高位向最低位,进行移位的
//了解函数的参数:extern unsigned char _crol_ (unsigned char, unsigned char);
//第一个参数是移动的值,第二个参数是移动的位数
#define LED_PORT P0
// 定义一个延迟函数,参数 ten_us 是循环次数,通过循环消耗时间来实现延迟
void delay_10us(ten_us)
{
while(ten_us--);
}
void main()
{
int i = 0;
LED_PORT = 0xfe;
while(1)
{
for(i=0;i<7;i++) // 循环实现左移流水灯效果,循环 7 次是因为初始状态下只需要移动 7 次就可以完成一个循环
{
// 使用 _crol_ 函数对 LED_PORT 的值进行左移一位操作
LED_PORT = _crol_(LED_PORT,1);
// 调用延迟函数,延迟一段时间
delay_10us(50000);
}
}
}
4.位方法
#include <reg52.h>
#include <intrins.h> //当调用_cror_右移库函数和_crol_左移库函数时,需调用头文件<intrins.h>
//注意:库函数的移位不会自动补0,是最高位向最低位,进行移位的
//了解函数的参数:extern unsigned char _crol_ (unsigned char, unsigned char);
//第一个参数是移动的值,第二个参数是移动的位数
#define LED_PORT P0
typedef unsigned int u16;
typedef unsigned char u8;
// 定义一个延迟函数,参数 ten_us 是循环次数,通过循环消耗时间来实现延迟
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
void main()
{
u8 i = 0;
LED_PORT = 0xfe;
delay_10us(50000);
while(1)
{
for(i=0;i<7;i++) // 循环实现左移流水灯效果,循环 7 次是因为初始状态下只需要移动 7 次就可以完成一个循环
{
// 使用 _crol_ 函数对 LED_PORT 的值进行左移一位操作
LED_PORT = _crol_(LED_PORT,1);
// 调用延迟函数,延迟一段时间
delay_10us(50000);
}
// 右移同理
for(i=0;i<7;i++)
{
LED_PORT = _cror_(LED_PORT,1);
delay_10us(50000);
}
}
}