思路:
用于测试发光二极管是否正常工作和学习
点亮二极管,见前文
1.P0 P2 P3 设置为推拉输出,然后将其设置为推拉输出P2 P三置一,使二极管发光。
然后再对P0赋值可以点亮相应的对应值led灯
要实现流水灯,可以点亮一盏led灯 等一会儿 熄灭它,同时点亮下一个led灯 如此循环
推挽输出:
一对选择性地使用一对连接负载灌电流或拉电流 该装置的电路通常使用一对参数相同的功率三极管或MOSFET管道在电路的方式存在于电路中
当电路工作时,两个对称的开关管每次只有一个导管,因此导管损耗小,效率高。输出不仅可以向负载灌注电流,还可以向负载提取电流。推拉输出不仅提高了电路的负载能力,而且提高了开关速度。
推挽输出常见的是图腾式输出
图腾式输出
常用于数字电路,因为TTL与非门采用两种垂直堆叠的同类晶体管,中间采用钳式二极管隔开
关键代码设计
void Init()
只要初始设置发光二极管电路,P0和P2\3工作模式设置为推拉输出,同时设置P2\3置1使二极管发光 其中对P0\P设置2的工作模式可以设置相应的工作模式P0口模式配置寄存器P2模式配置寄存器
void Init(){
P0M1=0x00; P0M0=0xff; P2M1=0x00; P2M0=0x08; led_sel=1;
} void delay_ms(unit n) 延迟函数也可以存在STC-ISP指定延迟时间的延迟函数代码通过软件延迟计算器功能自动生成,如下:
延迟n毫秒的功能,但延迟时间可能不太准确。 单片机在统一的时钟脉冲控制下工作,由单片机控制器中的时钟电路产生 时钟电路由
振荡器和分频器组成,产生基本的振荡信号,然后进行分频,得到相应的时钟。 内部振荡和外部振荡通常有两种方式 我们使用的单片机内部集成高精度R/C内部振荡器或外部晶体振荡器可用于工作时钟 外部振荡信号通过内部时钟电路和分频获得相应的时钟信号
各种周期
振荡周期:晶体振荡器周期
状态周期/时钟周期:振荡信号经二分频后形成的时钟脉冲信号,用S表示,两个振荡周期称为节拍1和节拍2
节拍1用于算术逻辑操作 节拍2通常在内部寄存器之间传输
机器周期:完成一个基本操作所需的时间称为机器周期。一个机器周期包括6个时钟周期,用S1-6表示;依次使用共12个节拍S1P1,S1P2,S2P1,S2P2……表示
指令周期:CPU执行指令所需的时间,CPU执行指令是在时钟脉冲控制下进行的。由于指令的功能和长度不同,指令执行所需的时间也不同。指令周期通常包含1-4个机器周期
举例
例:若MCS-单片机外部晶振为1251MHz单片机四个周期的具体值为:
振荡周期=1/12MHz=1/12μs=0.0833μs
时钟周期=1/6μs=0.167μs
机器周期=1μs
指令周期=1~4μs
单片机晶体振荡器M的频率可以是4MHz~48MHz典型值为11.0592MHz(因为使用此频率的晶振可以准确获得9600bits/s和19200bits/s的波特率) 根据指令执行时间计算1ms可以相应执行多少条指令,函数中可通过循环执行空指令来达到延时1ms的效果。
main()
每个程序都是从main首先,调用Init初始化电路,然后循环P0进行赋值,点亮流水灯
void main() { Init(); /*初始设置发光二极管电路, 只要把P0和P2\工作模式设置为推挽输出, 同时把P2\3置1,能使二极管发光*/ led=0x01.//从第一盏灯开始 while(1) { P0=led; //点亮第一盏灯 delay_ms(200); //延时200ms if(led==0x80) ///从头开始亮灯 led=0x01; else led=led<<1; //左移一位 } } # 总代码 #include<STC15F2K60S2.H> #define uchar unsigned char #define uint unsigned int sbit led_sel=P2^3;//P2^3----E3 uchar led; void Init(){ P0M1=0x00; P0M0=0xff; P2M1=0x00; P2M0=0x08; led_sel=1; } void Delay100ms() //@11.0592MHz { unsigned char i, j, k; // _nop_(); //_nop_(); i = 5; j = 52; k = 195; do { do { while (--k); } while (--j); } while (--i); } void main() { Init(); led=0x01; // P0=led; while(1) { P0=led; // delay_ms(200); Delay100ms(); //?óê±200ms if(led==0x80) led=0x01; else led=led<<1; } }
除了不懂推挽设置,其他都不错,很好! 6.28补充 左右移动的流水灯(乒乓球比赛基础)
void main() { Init(); led=0x80; while(1) { while(1) { P0=led; Delay100ms(); //?óê±100ms if(led==0x01) { break; } led=led>>1; } while(1) { P0=led; Delay100ms(); //?óê±100ms if(led==0x80) { break; } led=led<<1; } } }