1. 上次课作业
让发光二极管保持闪烁,编写程序使得单片机IO口输出交替的高低电平。
#include<reg52.h>
sbit p1_1=P1^0;
unsigned int a;
void main(){
while(1) { //大循环
a=50000
p1_1=0;
while(a--);//不为零一直执行语句
a=50000;
p1_1=1;
while(a--);
}
]
Keil软件中调试程序Start debug Session (黄色放大镜),进入调试模式。
调节闪烁周期需要调节时间或晶振频率(与芯片晶振频率同)的在Options for Target里面 XtalMHz():
延时为1s闪烁
#include<reg52.h>
sbit p1_1=P1^0;
unsigned int a;
void main(){
while(1)
{
a=51000;
p1_1=0;
while(a--);
a=51000;
while(a--);
p1_1=1;
a=51000;
while(a--);
a=51000;
while(a--)
}
}
2. 单片机工作基本时序
(1)振荡周期,也称时钟周期,指的是为单片机提供时钟脉冲信号的振荡源的周期;
(2)状态周期,每个状态周期为时钟周期的2倍,是振荡周期经过二分频得到的;
(3)机器周期,包含6个状态周期,12个时钟周期,在一个机器周期内完成一次独立操作;
(4)指令周期,CPU完成一条操作所需全部时间。每条指令执行实践是由一个或几个机器周期组成。
3.子程序调用
#include<reg52.h>
#define unit unsigned int //宏定义:unsigned int
#define uchar unsigned char //要定义的写在前面
sbit D1=P1^0; //位定义
void delay();//子函数的声明,在main前。返回值,参数有也要声明
void main () {
while(1) {
D1=0;
delay();//子函数调用
D1=1;
delay();
}
}
void delay() {
uint x,y;
for(x=100;x>0;x--)
for(y=600;y>0;y--);
{
}
运行一个*delay()*函数需要500毫秒 即sec=0.5225
#include<reg52.h>
#define unit unsigned int //宏定义:unsigned int
#define uchar unsigned char //要定义的写在前面
sbit D1=P1^0; //位定义
//void delay();//子函数的声明,在main前。返回值,参数有也要声明
void delay(uint);//声明带参数函数,类型要写。
void main () {
while(1) {
D1=0;
delay(600);//子函数调用 (带参数)
D1=1;
delay(600);
}
}
void delay(uint z)
{
uint x,y;
for(x=100;x>0;x--)
for(y=z;y>0;y--);
}
4. C51库函数的调用
直接调用库函数中的延时子程序**crol**
#include<reg52.h>
#include<intrins.h>
#define unit unsigned int
#define uchar unsigned char
uchar temp;
sbit D1=P1^0;
void delay();
void main () {
temp=0xfe;
P1=temp;//p1口赋值
while(1) {
temp=_crol_(temp,1);//循环左移一位的函数
delay(500);//延时
P1=temp;
}
}
void delay() {
uint x,y;
for(x=100;x>0;x--)
for(y=600;y>0;y--);
}
5.蜂鸣器
sbit beep=P2^3
void main()
beep=0;//给低电平