- 跑马灯
- 使用protues仿真图如下
- 延时函数实现
•使用硬延时空等待来实现达到延时的目的
注意:实现产品软件开发中,不建议使用硬延时,使用硬延时会降低产品的实时性
实现方法:
1. 写一个函数,带一个形参,延时值由其传入函数
2.函数体内由2级for循环组成
3.由分号语句实现空等待操作
void delayMills(unsigned int ms)
{
unsigned int i,j; //局部变量定义
for(i=ms; i>0; i--) //第一层for
for(j=100; j>0; j--); //第二层for
//分号语句,空操作
}
延时值,可以通过调整循环体变量j所赋的初值
- IO口定义声明
在reg52.h头文件中对4组IO口进行了定义声明
- sfr P0 = 0x80; // 将符号P0与功能寄存器地址0x80关联
- sfr P1 = 0x90; // 将符号P1与功能寄存器地址0x90关联
- sfr P2 = 0xA0; // 将符号P2与功能寄存器地址0xA0关联
- sfr P3 = 0xB0; // 将符号P3与功能寄存器地址0xB0关联
对符号P0,P1,P2,P3操作,相当于是对功能寄存器地址0x80,0x90,0xA0,0xB0操作
•sfr是C51内核MCU在keil编译环境定义功能寄存器特有的关键字•因此,使用sfr可以自己重新对功能寄存器赋于新的符号,例如将P0口重新定义符号为PORT0,
那么使用sfr定义如下:
sfr PORT0 = 0x80;
定义后,可以使用PORT0这个符号操作IO口P0对
应的引脚,如果将P0.0第1个引脚输出低,其余输出高,则:
PORT0 = 0xfe; // 1111 1110
- 跑马灯代码输入
#include //引用单片机头文件
void main(void) //主函数,程序的入口
{
while(1) //无限循环
{
}
}
1.操作单片机首先要引入与MCU相关的头文件
2.C语言的程序入口是main函数
3. while(1)大循环实现单片机的轮循工作结构
•选点亮P0.0上的LED,根据线路接法,将此脚置低即可点亮,则:•P0 = 0xfe;
#include //引用单片机头文件
void main(void) //主函数,程序的入口
{
while(1) //无限循环
{
P0 = 0xfe;
}
}
1.点亮后需要延时一段时间才能点另一个LED,这样才能看出灯亮灭的过程,如果不延时,人眼无法区分
2.采用2级for循环实现延时功能
void delayMills(unsigned int ms)
{
unsigned char i,j;
for(j=ms; j>0; j--)
for(i=100;i>0;i--); //空操作等待
}
现在来使用跑马灯流动时序,在main函数while循环中,编写代码
#include //引用单片机头文件
void delayMills(unsigned int ms)
{
unsigned char i,j;
for(j=ms; j>0; j--)
for(i=100;i>0;i--); //空操作等待
}
void main(void) //主函数,程序的入口
{
while(1) //无限循环
{
P0 = 0xfe; //P0.0亮 1111 1110
delayMills(1000); //延时约1秒
P0 = 0xfd; //P0.1亮 // 1111 11 0 1
delayMills(1000); //延时约1秒
P0 = 0xfb; //P0.2亮 //1111 1011
delayMills(1000); //延时约1秒
P0 = 0xf7; //P0.3亮 1111 0111
delayMills(1000); //延时约1秒
P0 = 0xef; //P0.4亮 1110 1111
delayMills(1000); //延时约1秒
P0 = 0xdf; //P0.5亮 1101 1111
delayMills(1000); //延时约1秒
P0 = 0xbf; //P0.6亮 1011 1111
delayMills(1000); //延时约1秒
P0 = 0x7f; //P0.7亮 0111 1111
delayMills(1000); //延时约1秒
}
}
接好开发板后,双击stc-isp-15xx-v6.85I.exe打开烧录工具,选择STC90C516RD+
•现将8组点亮数值做成一张table表,用一维数组实现,将表存在程序表中,用code关键字来修饰,这个关键字是C51在keil编译
环境 中特有的。定义数组如下:
code unsigned char led_table[] = {
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f
};
在for循环中约每1秒查询一次led_table的值,取出赋给P0寄存器。
#include //单片机内核头文件
// 数据表格,存放在程序表格中
code unsigned char led_table[] = {
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f
};
// 延时函数
void delayMills(unsigned int ms)
{
unsigned char i,j;
for(j=ms; j>0; j--)
for(i=100;i>0;i--); //空操作等待
}
void main(void) { //主函数,程序的入口
unsigned char i;
while(1)
{ //无限循环
for(i=0; i>右移操作运算符,例如:y = x>>1,表示
x右移一位后赋给变量y,右移移出的值扔掉,高
位移入的补0(正数)或补1(有符号且是负数)
例如: char x = 0xfe; //-2 1111 1110-> 1 1111 111
x >>= 1; // -1 1111 1111
x右移1位操作,低位0移出丢弃,高位补1,
因为变量x是有符号字符型变量,且值为负数
char x = 0x7f; // 0111 1111 ,为正数
x >>= 1; // 0011 1111
x虽然是有符号字符型变量,但其值为正数,右移操作,低位丢弃,高位补0
•对有无符号右移操作,低位移出丢弃,高位始终都是补0
unsigned char x = 0xfe; // 1111 1110
x >>= 1; // 0111 1111
左移移位操作,高位移出丢弃,低位始终都是补0
char x = 0xfe; //-2 1111 1110
x
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?