2019年7月4日 星期四

6-5練習 1 2 3 00-99 keil c

#include "reg51.h"
main()
{
  void delay(int);
  int i,j;
char seg[10]={0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
while(1)
  {
for(i=0;i<100;i++)
{
for(j=0;j<50;j++)
{
P2=0x0d;
P1=seg[i/10];
delay(200);
P2=0x0e;
P1=seg[i%10];
delay(200);
}
}
  }
}
void delay(int count)
{
  int i;
  for(i=1;i<=count;i++)
  ;
}
例:99-0
#include "reg51.h"
main()
{
  void delay(int);
  int i,j;
char seg[10]={0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
while(1)
  {
for(i=99;i>=0;i--)
{
for(j=0;j<50;j++)
{
P2=0x0d;
P1=seg[i/10];
delay(200);
P2=0x0e;
P1=seg[i%10];
delay(200);
}
}
  }
}
void delay(int count)
{
  int i;
  for(i=1;i<=count;i++)
  ;
}
例:00-59
#include "reg51.h"
main()
{
  void delay(int);
  int i,j;
char seg[10]={0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
while(1)
  {
for(i=0;i<60;i++)
{
for(j=0;j<50;j++)
{
P2=0x0d;
P1=seg[i/10];
delay(200);
P2=0x0e;
P1=seg[i%10];
delay(200);
}
}
  }
}
void delay(int count)
{
  int i;
  for(i=1;i<=count;i++)
  ;
}
例:00-59閃爍
#include "reg51.h"
main()
{
  void delay(int);
  int i,j;
int x=0;
char seg[10]={0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
while(1)
  {
for(i=0;i<60;i++)
{
for(j=0;j<25;j++)//本來50 拆成前25次是亮 後25次是off
{
P2=0x0d;
P1=seg[i/10];
delay(200);
P2=0x0e;
P1=seg[i%10];
delay(200);
}
for(j=0;j<25;j++)
{
P2=0xff;
P1=0xff;
delay(200);
}
}
  }
}
void delay(int count)
{
  int i;
  for(i=1;i<=count;i++)
  ;
}

4*4 keyborad + 7seg --arduino

int seg7[]={A0,A1,A2,A3,A4,A5,2};
const byte colPins[4] = {9, 8, 7, 6};     // 設定「行」腳位
const byte rowPins[4] = {13, 12, 11, 10}; // 設定「列」腳位
const int keymap[4][4] = {     // 設定按鍵的「行、列」代表值
    {0xc0,0xf9,0xa4,0xb0},
    {0x99,0x92,0x82,0xf8},
    {0x80,0x90,0xa0,0x83},
    {0xa7,0xa1,0x84,0x8e}
};
byte i, j,num;      // 暫存迴圈的索引數字
byte scanVal;   // 暫存掃描到的按鍵值
void setup()
{
  Serial.begin(9600);
  for (i = 0; i <= 3; i++)
  {
    pinMode(rowPins[i], INPUT);
    pinMode(colPins[i], OUTPUT);
    digitalWrite(colPins[i], HIGH);
    digitalWrite(rowPins[i], HIGH);
  }
  for(j=0;j<6;j++)
  {
    pinMode(seg7[j],OUTPUT);
  }
  pinMode(2,OUTPUT);
}
void outport(byte data)
{
 for(num=0;num<7;num++)
 {
  if(data % 2==1)digitalWrite(seg7[num],HIGH);
  else digitalWrite(seg7[num],LOW);
  data=data/2;
 }
}
void loop()
{
  for (i = 0; i <= 3; i++) {
    for (j = 0; j <= 3; j++) {
      digitalWrite(colPins[j], LOW);
      scanVal = digitalRead(rowPins[i]);
      if (scanVal == LOW) {    // 如果輸入值是「低電位」…
        Serial.println(keymap[i][j]);  // 輸出按鍵代表的字元
        outport(~keymap[i][j]);
        delay(200);  // 掃描按鍵的間隔時間
        digitalWrite(colPins[j], HIGH);
        break;       // 跳出迴圈
      }
      digitalWrite(colPins[j], HIGH);
    }
  }
}



2019年7月3日 星期三

A0


IR控制四個開關_v2

#include <IRremote.h>
long sw1=0xFF30CF;
long sw2=0xFF18E7;
long sw3=0xFF7A85;
long sw4=0xFF10EF;
int i;
int RECV_PIN = 2; // 使用數位腳位2接收紅外線訊號
IRrecv irrecv(RECV_PIN); // 初始化紅外線訊號輸入
decode_results results; // 儲存訊號的結構
const int led[4]={3,4,5,6};
void setup()
{
  Serial.begin(9600);
  irrecv.blink13(true); // 設為true的話,當收到訊號時,腳位13的LED便會閃爍
  irrecv.enableIRIn(); // 啟動接收
  for(i=0;i<4;i++)
    pinMode(led[i],OUTPUT);
}

void loop() {
  if (irrecv.decode(&results))          // 接收紅外線訊號並解碼
  {
    irrecv.resume();                   // 準備接收下一個訊號
    if(results.value==sw1)
    {
      for(i=0;i<4;i++)
      {
        digitalWrite(led[i],HIGH);delay(1000);
        digitalWrite(led[i],LOW);     
      }
    }
    else if(results.value==sw2)
    {
      for(i=3;i>=0;i--)
      {
        digitalWrite(led[i],HIGH);delay(1000);
        digitalWrite(led[i],LOW);     
      }
    }
    else if(results.value==sw3)
    {
      for(i=0;i<4;i++)
      {
        digitalWrite(led[i],HIGH);delay(1000);
        digitalWrite(led[i],LOW);     
      }
      for(i=3;i>=0;i--)
      {
        digitalWrite(led[i],HIGH);delay(1000);
        digitalWrite(led[i],LOW);     
      }
    }
    else if(results.value==sw4)digitalWrite(led[3],!digitalRead(led[3]));
  }
}

IR 控制四個led

#include <IRremote.h>
long sw1=0xFF30CF;
long sw2=0xFF18E7;
long sw3=0xFF7A85;
long sw4=0xFF10EF;
int i;
int RECV_PIN = 2; // 使用數位腳位2接收紅外線訊號
IRrecv irrecv(RECV_PIN); // 初始化紅外線訊號輸入
decode_results results; // 儲存訊號的結構
const int led[4]={3,4,5,6};
void setup()
{
  Serial.begin(9600);
  irrecv.blink13(true); // 設為true的話,當收到訊號時,腳位13的LED便會閃爍
  irrecv.enableIRIn(); // 啟動接收
  for(i=0;i<4;i++)
    pinMode(led[i],OUTPUT);
}

void loop() {
  if (irrecv.decode(&results))          // 接收紅外線訊號並解碼
  {
    irrecv.resume();                   // 準備接收下一個訊號
    if(results.value==sw1)digitalWrite(led[0],!digitalRead(led[0])); 
    else if(results.value==sw2)digitalWrite(led[1],!digitalRead(led[1])); 
    else if(results.value==sw3)digitalWrite(led[2],!digitalRead(led[2]));
    else if(results.value==sw4)digitalWrite(led[3],!digitalRead(led[3]));
  }
}

2019年7月2日 星期二

馬達轉速+button

byte motorPin=3;
int speed=0;
byte bnt1Pin = 4;
byte bnt2Pin = 5;
boolean state1;
boolean state2;
boolean buttonUp1;
boolean buttonUp2;
void setup()
{
  Serial.begin(9600);
  pinMode(bnt1Pin, INPUT);
  pinMode(bnt2Pin, INPUT);
  digitalWrite(bnt1Pin, HIGH);
  digitalWrite(bnt2Pin, HIGH);
}
void loop()
{
  if(digitalRead(bnt1Pin) == LOW && buttonUp1 == true)
  {
    speed=speed+10;
    Serial.println(speed);
    if(speed>250) speed=250;
    analogWrite(motorPin,speed);
    buttonUp1 = false;
  }
  else if(digitalRead(bnt1Pin) == HIGH && buttonUp1 == false)
  {
    buttonUp1 = true;
  }
  if(digitalRead(bnt2Pin) == LOW && buttonUp2 == true)
  {
    speed=speed-10;
    Serial.println(speed);
    if(speed<10) speed=10;       
    analogWrite(motorPin,speed);
    buttonUp2 = false;
  }
  else if(digitalRead(bnt2Pin) == HIGH && buttonUp2 == false)
  {
    buttonUp2 = true;
  }
  delay(10); // Delay 時間可視情況調整
}

PWM電壓控制

analogWrite輸出PWM電壓控制

 
  電壓輸出控制其實不複雜。Arduino提供PWM輸出,分別是 pin 3,5,6,9,10,11 ,就是板子上有~ 符號的,都能用PWM輸出。美中不足的是只有8bits,電壓是0-5V,從0-255,每增加1,電壓增加 0.019607843 V。

algorithm

 #include <iostream> #include <string.h> using namespace std; int main(int argc, char** argv)  { for(int j=2;j<=100;j++)//j...