Arduino开发从入门到实战程序源代码
程序源码
第五章炫酷LED灯
5.4.2 程序源码
//项目一——LED闪烁灯
int LEDPin=13;
void setup()
{
pinMode(LEDPin,OUTPUT); //13脚设置为输出
}
void loop()
{
digitalWrite(LEDPin,HIGH); //设定PIN13脚为HIGH = 5V左右delay(1000); //设定延时时间,1000 = 1s digitalWrite(LEDPin,LOW); //设定PIN13脚为LOW = 0V delay(1000); //设定延时时间,1000 = 1s
}
5.7 拓展实验
广告灯拓展实验参考程序为:
//设置控制LED的数字I/O脚
int LED1 = 1;
int LED2 = 2;
int LED3 = 3;
int LED4 = 4;
int LED5 = 5;
int LED6 = 6;
//LED灯花样显示样式1子程序
void style_1(void)
{
unsigned char j;
for(j=1;j=6;j++) //每隔200ms依次点亮1~6引脚相连的LED灯{
digitalWrite(j,HIGH); //点亮与j引脚相连的LED灯
delay(200); //延时200ms
}
for(j=6;j=1;j--) //每隔200ms依次熄灭与6~1引脚相连的LED灯{
digitalWrite(j,LOW); //熄灭与j引脚相连的LED灯
delay(200); //延时200ms
}
}
//灯闪烁子程序
void flash(void)
{
unsigned char j,k;
for(k=0;k=1;k++) //闪烁两次
{
for(j=1;j=6;j++) //点亮与1~6引脚相连的LED灯digitalWrite(j,HIGH); //点亮与j引脚相连的LED灯
delay(200); //延时200ms
for(j=1;j=6;j++) //熄灭与1~6引脚相连的LED灯digitalWrite(j,LOW); //熄灭与j引脚相连的LED灯
delay(200); //延时200ms
}
}
//LED灯花样显示样式2子程序
void style_2(void)
{
unsigned char j,k;
k=1; //设置k的初值为1
for(j=3;j=1;j--)
{
digitalWrite(j,HIGH); //点亮灯
digitalWrite(j+k,HIGH); //点亮灯
delay(400); //延时400ms
k +=2; //k值加2
}
k=5; //设置k值为5
for(j=1;j=3;j++)
{
digitalWrite(j,LOW); //熄灭灯
digitalWrite(j+k,LOW); //熄灭灯
delay(400); //延时400ms
k -=2; //k值减2
}
}
//LED灯花样显示样式3子程序
void style_3(void)
{
unsigned char j,k; //LED灯花样显示样式3子程序k=5; //设置k值为5
for(j=1;j=3;j++)
{
digitalWrite(j,HIGH); //点亮灯
digitalWrite(j+k,HIGH); //点亮灯
delay(400); //延时400ms
digitalWrite(j,LOW); //熄灭灯
digitalWrite(j+k,LOW); //熄灭灯
k -=2; //k值减2
}
k=3; //设置k值为3
for(j=2;j=1;j--)
{
digitalWrite(j,HIGH); //点亮灯
digitalWrite(j+k,HIGH); //点亮灯
delay(400); //延时400ms
digitalWrite(j,LOW); //熄灭灯
digitalWrite(j+k,LOW); //熄灭灯
k +=2; //k值加2
}
}
void setup()
{
unsigned char i;
for(i=1;i=6;i++) //依次设置1~6个数字引脚为输出模式pinMode(i,OUTPUT); //设置第i个引脚为输出模式
}
void loop()
{
style_1(); //样式1
flash(); //闪烁
style_2(); //样式2
flash(); //闪烁
style_3(); //样式3
flash(); //闪烁
第六章按键开关输入
6.4.2程序源码
int LED = 13; //设置控制LED的数字I/O脚
void setup()
{
pinMode(LED,OUTPUT); //设置数字I/O引脚为输出模式
}
void loop() {
int i;
while(1)
{
i=analogRead(A0); //读取模拟0 口电压值
if(i>1000) //如果电压值大于1000(即4.88V)
digitalWrite(LED,HIGH); //设置第13引脚为高电平,点亮LED灯
else
digitalWrite(LED,LOW); //设置第13引脚为低电平,熄灭LED灯
}
}
6.6拓展实验
#define LED 13
#define sw 7
int val=0;
int old_val=0;
int state=0; //定义状态位
void setup(){
pinMode(LED,OUTPUT);
pinMode(sw,INPUT);
}
void loop(){
val=digitalRead(sw);
if((val==HIGH)&&(old_val==LOW)){
state=1-state; //状态位取反delay(10);
}
old_val=val;
if(state==1){
digitalWrite(LED,HIGH);
}
else{
digitalWrite(LED,LOW);
}
}
第七章触摸开关
7.4.2程序源码
#define LED 13 //设置控制LED的数字I/O脚
void setup()
{
pinMode(LED,OUTPUT); //设置数字I/O引脚为输出模式
}
void loop() {
int i;
while(1)
{
i=digitalRead(10); //读取电压值
if(i==LOW) //如果为低电平
digitalWrite(LED,HIGH); //设置第13引脚为高电平,点亮LED灯
else
digitalWrite(LED,LOW); //设置第13引脚为低电平,熄灭LED灯
}
}
7.6拓展实验
#define LED 13 //设置控制LED的数字I/O脚
void setup()
{
pinMode(LED,OUTPUT); //设置数字I/O引脚为输出模式
}
void loop() {
int i;
digitalWrite(LED,LOW);
i=digitalRead(10); //读取电压值
if(i==LOW){ //如果为低电平
while(1){
digitalWrite(LED,HIGH); //设置第13引脚为高电平,点亮LED灯 delay(10000);
break;
}
}
}
第8章温度与湿度监测
8.4.2程序源码
#define DHT11_PIN 0
byte read_dht11_dat() //读取DHT11数据(每次获取8位) {
byte i = 0;
byte result = 0;
for(i=0;i<8;i++)
{
while(!(PINC&_BV(DHT11_PIN)));
delayMicroseconds(30);
if(PINC&_BV(DHT11_PIN))
result|=(1<<(7-i));
while((PINC&_BV(DHT11_PIN)));
}
return result; //返回获取的结果
}
void setup()
{
DDRC|=_BV(DHT11_PIN);
PORTC|=_BV(DHT11_PIN);
Serial.begin(19200);
Serial.println("Ready"); //串口输出提示信息
}
void loop()
{
byte dht11_dat[5];
byte dht11_in;
byte i;
PORTC &=~_BV(DHT11_PIN);
delay(18);
PORTC|=_BV(DHT11_PIN);
delayMicroseconds(40);
DDRC &=~_BV(DHT11_PIN);
delayMicroseconds(40);
dht11_in = PINC & _BV(DHT11_PIN);
if(dht11_in)
{
Serial.println("dht11 start condition 1 not met");
return;
}
delayMicroseconds(80);
dht11_in=PINC & _BV(DHT11_PIN);
if(!dht11_in)
{
Serial.println("dht11 start condition 2 not met");
return;
}
delayMicroseconds(80);
for(i=0;i<5;i++)
dht11_dat[i]=read_dht11_dat(); //获取40位温度与湿度数据
DDRC|=_BV(DHT11_PIN);
PORTC|=_BV(DHT11_PIN);
byte dht11_check_sum = dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat [3];
if(dht11_dat[4]!=dht11_check_sum)//校验
{
Serial.println("DHT11 checksum error");
}
Serial.print("Current humdity= ");
Serial.print(dht11_dat[0],DEC); //显示湿度整数部分
Serial.print(".");
Serial.print(dht11_dat[1],DEC); //显示湿度小数部分
Serial.print("%");
Serial.print("temperature = ");
Serial.print(dht11_dat[2],DEC); //显示温度整数部分
Serial.print(".");
Serial.print(dht11_dat[3],DEC); //显示温度小数部分
Serial.println("C");
}
8.6拓展实验
#define DHT11_PIN 0
int LED=8;
int Buzzer=7;
byte read_dht11_dat()
{
byte i = 0;
byte result = 0;
for(i=0;i<8;i++)
{
while(!(PINC&_BV(DHT11_PIN)));
delayMicroseconds(30);
if(PINC&_BV(DHT11_PIN))
result|=(1<<(7-i));
while((PINC&_BV(DHT11_PIN)));
}
return result;
}
void setup()
{
DDRC|=_BV(DHT11_PIN);
PORTC|=_BV(DHT11_PIN);
pinMode(LED,OUTPUT);
pinMode(Buzzer,OUTPUT);
Serial.begin(19200);
Serial.println("Ready");
}
void loop()
{
byte dht11_dat[5];
byte dht11_in;
byte i;
PORTC &=~_BV(DHT11_PIN);
delay(18);
PORTC|=_BV(DHT11_PIN);
delayMicroseconds(40);
DDRC &=~_BV(DHT11_PIN);
delayMicroseconds(40);
dht11_in = PINC & _BV(DHT11_PIN);
if(dht11_in)
{
Serial.println("dht11 start condition 1 not met"); return;
}
delayMicroseconds(80);
dht11_in=PINC & _BV(DHT11_PIN);
if(!dht11_in)
{
Serial.println("dht11 start condition 2 not met");
return;
}
delayMicroseconds(80);
for(i=0;i<5;i++) //获取40位温度与湿度数据
dht11_dat[i]=read_dht11_dat();
DDRC|=_BV(DHT11_PIN);
PORTC|=_BV(DHT11_PIN);
byte dht11_check_sum = dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat [3];
if(dht11_dat[4]!=dht11_check_sum) //校验
{
Serial.println("DHT11 checksum error");
}
Serial.print("Current humdity= ");
Serial.print(dht11_dat[0],DEC); //显示湿度整数部分
Serial.print(".");
Serial.print(dht11_dat[1],DEC); //显示湿度小数部分
Serial.print("%");
Serial.print("temperature = ");
Serial.print(dht11_dat[2],DEC); //显示温度整数部分
Serial.print(".");
Serial.print(dht11_dat[3],DEC); //显示温度小数部分
Serial.println("C");
if(dht11_dat[0]==25)
digitalWrite(LED,HIGH);
else
digitalWrite(LED,LOW);
if(dht11_dat[2]==28) digitalWrite(Buzzer,HIGH); else
digitalWrite(Buzzer,LOW); delay(2000);
}
第9章气体监测
9.4.2程序源码
void setup()
{
Serial.begin(9600);
}
void loop()
{
int val;
val=analogRead(0); //获取当前气体浓度Serial.println(val,DEC); //十进制串口输出delay(1000);
}
第十章 LCD显示
10.4程序设计
2) 实验程序
LCD显示实验参考程序源代码为:
int DI=12;
int RW=11;
int DB[]={3,4,5,6,7,8,9,10}; //使用数组来定义总线需要的引脚
int Enable=2;
void LcdCommandWrite(int value) {
//定义所有引脚
int i = 0;
for (i=DB[0];i <= DI;i++) //总线赋值
{
digitalWrite(i,value & 01); //因为1602液晶信号识别是D7~D0(不是D0~D7),这里是
//用来反转信号
value >>= 1;
}
digitalWrite(Enable,LOW); delayMicroseconds(1); digitalWrite(Enable,HIGH); delayMicroseconds(1); //延时1ms digitalWrite(Enable,LOW); delayMicroseconds(1); //延时1ms }
void LcdDataWrite(int value) { //定义所有引脚
int i = 0;
digitalWrite(DI,HIGH); digitalWrite(RW,LOW);
for (i=DB[0];i <= DB[7];i++) {
digitalWrite(i,value & 01);
value >>= 1;
}
digitalWrite(Enable,LOW); delayMicroseconds(1); digitalWrite(Enable,HIGH); delayMicroseconds(1); digitalWrite(Enable,LOW); delayMicroseconds(1); //延时1ms }
void setup (void) {
int i = 0;
for (i=Enable;i<= DI;i++)
{
pinMode(i,OUTPUT);
}
delay(100);
//短暂的停顿后初始化LCD
用于LCD控制需要
LcdCommandWrite(0x38); //设置为8位接口,2行显示,5×7文字大小delay(64);
LcdCommandWrite(0x38); //设置为8位接口,2行显示,5×7文字大小delay(50);
LcdCommandWrite(0x38); //设置为8位接口,2行显示,5×7文字大小delay(20);
LcdCommandWrite(0x06); //输入方式设定
//自动增量,没有显示移位
delay(20);
LcdCommandWrite(0x0E); //显示设置
//开启显示屏,光标显示,无闪烁
delay(20);
LcdCommandWrite(0x01); //屏幕清空,光标位置归零delay(100);
LcdCommandWrite(0x80); //显示设置
//开启显示屏,光标显示,无闪烁
delay(20);
}
void loop (void) {
LcdCommandWrite(0x01); //屏幕清空,光标位置归零delay(10);
LcdCommandWrite(0x80+4);
delay(10);
//写入欢迎信息
LcdDataWrite('W');
LcdDataWrite('e');