2019年7月29日 星期一

亂數1~10每次都不一樣


































#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
    srand(time(0));
    int i,j,n[10];//所以要把10次陣列存起來
    for(i=1;i<=10;i++)
    {
        do
        {
          n[i-1]=rand()%10+1;//產生1~10亂數
//n[從0號開始編],我們把他記來,然後要做檢查
          for(j=1;j<i;j++)//不想讓亂數有重覆
//第五次,檢查1~4次有沒有出現過,再丟一次就可能產
//生不一樣的數字
          {
            if(n[i-1]==n[j-1])
            {
                break;//結束for loop
            }
          }
        }while(j!=i);
//如果已經做過了,至少做一次,重覆繼續丟,
//沒有出現過,繼續印下一輪的i
//我用for去判斷,用if檢查
//例如:i是5存在n[4],我只要檢查前面1~4即可
//j要去比對,從1開始比是否有出現過
//i跟j(都是從1開始編,目前10個中的第幾個)都是代表第幾個,n是從第0個開始編
//兩個值一樣,代表值已經出現過,就要繼續exe
//如果不成立,while就跳出
        printf("%d ",n[i-1]);
    }
    printf("\n");
    return 0;
}

2019年7月28日 星期日

二維陣列

例1:
int main()
{
    int matrix[3][3]=
    {
        {1,2,3},
        {4,5,6},
        {7,8,9},
    };
    int i,j;
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            printf("%d",v[i][j]);
        }
        printf("\n");
    }
    return 0;
}
例2:
int main()
{
    int matrix[3][3],i,j,k=1;
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            matrix[i][j]=k;
            k++;
        }
    }
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            printf("%d",matrix[i][j]);
        }
        printf("\n");
    }
    return 0;
}
例3:
int main()
{
    int matrix[3][3],i,j;
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            matrix[i][j]=i*3+j+1;
        }
    }
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            printf("%d",matrix[i][j]);
        }
        printf("\n");
    }
    return 0;
}
例4:
int main()
{
    int matrix[9]={1,2,3,4,5,6,7,8,9};
    int i;
    for(i=0;i<9;i++)
    {
        printf("%d",matrix[i]);
    }
    return 0;
}
例5:
int main()
{
    int matrix[9]={1,2,3,4,5,6,7,8,9};
    int i;
    for(i=0;i<9;i++)
    {
        printf("%d",matrix[i]);
        if(i%3==2)
        {
            printf("\n");
        }
    }
    return 0;
}

例6:
int main()
{
    int matrix[9];
    int i,k=1;
    for(i=0;i<9;i++)
    {
        matrix[i]=k;
        k++;
    }
    for(i=0;i<9;i++)
    {
        printf("%d",matrix[i]);
        if(i%3==2)
        {
            printf("\n");
        }
    }
    return 0;
}
例7:
int main()
{
    int matrix[9];
    int i;
    for(i=0;i<9;i++)
    {
        matrix[i]=i+1;
    }
    for(i=0;i<9;i++)
    {
        printf("%d",matrix[i]);
        if(i%3==2)
        {
            printf("\n");
        }
    }
    return 0;
}
例8:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
    srand(time(0));
    int matrix[3][3]={{1,2,3},{4,5,6},{7,8,9}};
    int i,j,k=0;
    for(i=0;i<3;i++)
    {
      for(j=0;j<3;j++)
      {
          int r=rand()%(9-k)+k;
          int m=r/3;
          int n=r%3;
          int t= matrix[m][n];
          matrix[i][j]=matrix[m][n];
          matrix[m][n]=t;
          k++;
      }
    }
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            printf("%d ",matrix[i][j]);
        }
        printf("\n");
    }
    return 0;
}
例9:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
    srand(time(0));
    int matrix[9]={1,2,3,4,5,6,7,8,9};
    int i;
    for(i=0;i<9;i++)
    {
      int m=rand()% (9-i)+i;
      int t=matrix[i];
      matrix[i]=matrix[m];
      matrix[m]=t;
    }
    for(i=0;i<9;i++)
    {
       printf("%d ",matrix[i]);
       if(i %3==2)
       {
           printf("\n");
       }
    }
    return 0;
}


2019年7月27日 星期六

gcd

#include <stdio.h>
int main()
{
    int a,b;
    scanf("%d%d",&a,&b);
    while(a%b !=0)
    {
        int temp=a%b;
        printf("%d %d %d 連分數:%d\n",a,b,a%d, a/b);
        a=b;
        b=temp;
    }
    printf("連分數:%d\n",a/b);
    printf("%d",b);
}

2019年7月17日 星期三

bluetooth

#include  <SoftwareSerial.h> 
SoftwareSerial BTSerial(10, 11); // RX | TX 
void setup() 
{
  pinMode(9,OUTPUT);
  digitalWrite(9,HIGH); 
  Serial.begin(9600); 
  Serial.println("Enter AT commands:"); 
  BTSerial.begin(38400);  // HC-05 default speed in AT command more 

void loop() 

  // Keep reading from HC-05 and send to Arduino Serial Monitor 
if (BTSerial.available()) 
  { 
    Serial.write(BTSerial.read()); 
  } 
  // Keep reading from Arduino Serial Monitor and send to HC-05 
  if (Serial.available()) 
  { 
    BTSerial.write(Serial.read()); 
  } 

2019年7月12日 星期五

Mifare RFID-RC522模組實驗(一):讀取Mifare RFID卡的UID識別碼


本文旨在補充《超圖解Arduino互動設計入門》第18章「RFID無線識別裝置與問答遊戲製作」單元,書本採用的RFID讀卡機模組是採用9600bps, TTL序列通訊介面,RFID的通訊頻率為125KHz。這種模組的接線和程式都很簡單,每當感測到RFID卡,讀卡機就把卡片的識別碼送往序列埠。
市售Arduino套件裡面的RFID模組,多半是Mifare(讀音:my-fare)規格,跟書本的不一樣,因此本文將補充說明Mifare的基本原理及其模組的接線,以及讀取卡片識別碼的程式。
Mifare是NXP(恩智普)半導體公司推出的非接觸型IC卡(也就是外表沒有金屬接點的卡片),在市場上獲得廣泛的採用,像是停車場的感應幣(token)、現金卡(如:台灣的悠遊卡)、員工識別證…等等。Mifare卡有不同的系列,如:Mifare Classic, Mifare UltraLight, Mifare Pro…等,主要的差別在於資料安全加密和驗證的等級。
Mifare卡內建EEPROM,應用程式可對它寫入和讀取數據,例如:停車票卡可紀錄車主的停車時間。Mifare還具備「防衝突處理」機制,也就是避免訊號干擾:若多張卡片同時出現在偵測範圍,Mifare讀寫器將能逐一選擇卡片進行處理。例如,假設超級市場裡的每個商品都貼上RFID標籤,結帳櫃台的RFID讀取設備若具備防干擾機制,將能自動掃描堆放在購物推車裡的所有商品,結帳人員不必再手動逐一掃描商品條碼,也不會重複計算。附帶一提,所有符合ISO/IEC 14443-A標準規範的RFID卡片都要有防衝突處理功能,而Mifare是依循ISO/IEC 14443-A規格建立的非接觸式IC卡。
底下是Mifare裝置的概略圖,它的卡片屬於被動式、無內建電源(也稱為「無源」),卡片所需的電力來自讀寫器的電磁場。
啟動RFID讀寫器之後,讀寫器的天線將不停地發送電磁波,每當卡片進入此電磁場,卡片內部的線圈和電路將與此電磁場產生共振,從而獲得電能。無線充電器也是透過電磁感應、非直接連線方式獲取能量,RFID讀寫器和卡片兩端的線圈(天線)相當於變壓器裡的主線圈和副線圈(請參閱「測試Palm Touchstone(點金石)無線充電模組」貼文。
依照感應距離,非接觸型IC卡分成緊耦合型(close-coupled,需要緊貼感測器)、接近式(proximity,10cm以內)和鄰近式(vicinity,50cm以內),Mifare屬於接近式,這種類型的卡片簡稱為PICC(Proximity IC Card,接近式IC卡),讀寫器則簡稱PCD(Proximity Coupling Device,接近型耦合器)。
另一方面,某些RFID的應用場合,標籤的尺寸大小有固定的標準,像信用卡和金融卡,這一類的卡片長、寬和厚度,都要遵循國際ID-1標準(85.6 × 53.98 × 0.76mm),目前的技術沒有辦法把電池塞入這麼薄的卡片,所以非接觸型卡片只能採用無線供電方案。
當卡片被電磁能啟動(activate)之後,將等待接收與回應來自讀寫器的命令。微控器和Mifare讀寫器之間採用TTL數位訊號傳遞資料,為了用電波傳送數位訊號,必須將數位訊號加上載波調變,Mifare的載波頻率是13.56MHz。上圖的射頻訊號波形只是描述概念,數位訊號在調變成電波之前,從讀寫器發送的訊號會採用米勒(Miller)編碼,而從卡片發出訊息則經過曼徹斯特(Manchester)編碼。讀寫器在操作卡片時,都會經過三次雙向認證,互相驗證使用的合法性,而且通訊過程中的所有數據都經過加密,以確保安全。

Mifare讀寫器模組與Arduino接線示範

本單元使用的Mifare RFID-RC522讀寫器模組的外觀與接腳定義如下,模組採用的MFRC522晶片本身有支援UART, I2C和SPI介面,但是本文採用的程式庫僅支援SPI介面。








Arduino Uno板的接線示範如下,SPI介面的晶片線選擇通常接在Arduino數位10腳,但這不是強制性的,模組的Reset腳也可以接在其他腳位:

操控Mifare模組的MFRC522程式庫

本單元程式採用Miki Balboa開發的這個MFRC522程式庫來操控Mifare模組,若不使用程式庫,我們需要詳閱MFRC522晶片的規格書,了解讀寫器、卡片和微控制器之間的數據通訊流程,以及晶片內部的暫存器的指令位址,才能動手撰寫程式。
下載程式庫之後,請將它解壓縮到Arduino的libraries資料夾,再開啟Arduino IDE,即可從主功能表的「檔案→範例→MFRC522」指令底下找到一些範例程式。










底下列舉本單元使用到的MFRC522程式物件的方法和屬性:
  • MFRC522物件.PCD_Init():初始化MFRC522讀卡機模組
  • MFRC522物件.PICC_IsNewCardPresent():是否感應到新的卡片
  • MFRC522物件.PICC_ReadCardSerial():讀取卡片的資料
  • MFRC522物件.PICC_GetType():取得卡片類型
  • MFRC522物件.PICC_GetTypeName():取得卡片類型名稱
每張Mifare卡片都有個唯一的ID(unique identifier,簡稱UID),當讀寫機讀取到卡片的資料之後,UID的長度和內容,可從底下兩個屬性值取得:
  • MFRC522物件.uid.size:包含UID的長度
  • MFRC522物件.uid.uidByte:包含UID碼的陣列

讀取Mifare卡片的UID碼

讀取Mifare卡片的流程如下,我們的程式不需要理會其中的「防衝突處理」和「選卡」部份,讀寫器會幫我們搞定,但是在讀取資料之後,我們的程式要發出命令讓卡片進入停止(halt)狀態,避免讀寫器重複讀取同一張卡片:
AK代表select acknowledge,直譯為「選擇應答」,是由卡片發給讀寫器,對於選擇卡片命令的回應,不同類型的Mifare卡片的SAK值不一樣(例如,Mifare Classic的SAK值為0x18),程式可藉此判別感應到的卡片類型。詳細的防衝突處理與SAK值判斷流程,請參閱NXP公司的“MIFARE ISO/IEC 14443 PICC Selection”技術文件(PDF格式)。
讀取Mifare卡片類型及其UID碼的程式如下:
#include <SPI.h>
#include <MFRC522.h>     // 引用程式庫

#define RST_PIN      A0        // 讀卡機的重置腳位
#define SS_PIN       10        // 晶片選擇腳位

MFRC522 mfrc522(SS_PIN, RST_PIN);  // 建立MFRC522物件

void setup() {
  Serial.begin(9600);
  Serial.println("RFID reader is ready!");

  SPI.begin();
  mfrc522.PCD_Init();   // 初始化MFRC522讀卡機模組
}

void loop() {
    // 確認是否有新卡片
    if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) {
      byte *id = mfrc522.uid.uidByte;   // 取得卡片的UID
      byte idSize = mfrc522.uid.size;   // 取得UID的長度

      Serial.print("PICC type: ");      // 顯示卡片類型
      // 根據卡片回應的SAK值(mfrc522.uid.sak)判斷卡片類型
      MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
      Serial.println(mfrc522.PICC_GetTypeName(piccType));

      Serial.print("UID Size: ");       // 顯示卡片的UID長度值
      Serial.println(idSize);

      for (byte i = 0; i < idSize; i++) {  // 逐一顯示UID碼
        Serial.print("id[");
        Serial.print(i);
        Serial.print("]: ");
        Serial.println(id[i], HEX);       // 以16進位顯示UID值
      }
      Serial.println();

      mfrc522.PICC_HaltA();  // 讓卡片進入停止模式
    } 
}
程式第20行宣告一個指向儲存UID值的指標變數(假設UID碼的長度為4):
第25行的“MFRC522::PICC_Type”代表引用在MFRC522類別(程式庫)裡面定義的PICC_Type這個資料類型,其中的雙冒號(::)代表範圍解析運算子(scope-resolution operator),用來表示“PICC_Type”定義在MFRC522程式庫裡面。如果不用雙冒號指出“PICC_Type”資料類型的來源,程式編譯器會產生未定義之類的錯誤。

上傳程式碼之後,開啟序列埠監控視窗,你可以嘗試一次讓Mifare模組感應多個卡片(筆者同時用3個),它將能逐一顯示每個卡片的類型和UID:

除非這些卡片離開、再次進入感應區,否則它們不會被重複讀取。

2019年7月11日 星期四

WiFi無線入門

void setup()
{
  // put your setup code here, to run once:
  pinMode(LED_BUILTIN,OUTPUT);
}
void loop()
{
  // put your main code here, to run repeatedly:
  digitalWrite(LED_BUILTIN,LOW);delay(1000);
  digitalWrite(LED_BUILTIN,HIGH);delay(1000);
}

/*13=D7 16=D0 15=D8
14=D5 12=D6 4=D2 3=D9 2=D4
1=D10 0=D3
*/
void setup()
{
  // put your setup code here, to run once:
  pinMode(12,OUTPUT);
}
void loop()
{
  // put your main code here, to run repeatedly:
  digitalWrite(12,LOW);delay(1000);
  digitalWrite(12,HIGH);delay(1000);
}

2019年7月6日 星期六

四位七段顯示器,向左移-keil c

#include <at89x52.h>
char P1table[]={1,2,4,8};
char P2table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90} ; 
char bcd[]={0,0,0,0};
int jj=0;
void delay_1ms(int k)
{
  int i,j;
for(i=0;i<k;i++)
for(j=0;j<114;j++)
    ;
}
void ch_data(char x)                         
{
  bcd[3]=bcd[2];
  bcd[2]=bcd[1];
  bcd[1]=bcd[0];
  bcd[0]=x;
}

main()
{
 while(1)
 {
P2=0xff; //消除移位殘影,不可以放在P2=P2table[bcd[jj]];下面,峰鳴器會一直叫
{
   P1=~P1table[jj];
   P2=P2table[bcd[jj]];
   jj++;
   if(jj >= 4) jj=0;

}
P3=0x7f;
if(P3_3==0){ch_data(1); delay_1ms(20); while(P3_3==0); delay_1ms(20); }  //1
if(P3_2==0){ch_data(4);   delay_1ms(20); while(P3_2==0); delay_1ms(20);  }  //4
if(P3_1==0){ch_data(7);   delay_1ms(20); while(P3_1==0); delay_1ms(20);  }  //7
if(P3_0==0){ch_data(12);  delay_1ms(20); while(P3_0==0); delay_1ms(20);  }  //E 

P3=0xbf;         
if(P3_3==0){ch_data(2);   delay_1ms(20); while(P3_3==0); delay_1ms(20);  }  //2
if(P3_2==0){ch_data(5);   delay_1ms(20); while(P3_2==0); delay_1ms(20);  }  //5
if(P3_1==0){ch_data(8);   delay_1ms(20); while(P3_1==0); delay_1ms(20);  }  //8
if(P3_0==0){ch_data(0);   delay_1ms(20); while(P3_0==0); delay_1ms(20);  }  //0

P3=0xdf;
if(P3_3==0){ch_data(3);   delay_1ms(20); while(P3_3==0); delay_1ms(20);  }  //3
if(P3_2==0){ch_data(6);   delay_1ms(20); while(P3_2==0); delay_1ms(20);  }  //6
if(P3_1==0){ch_data(9);   delay_1ms(20); while(P3_1==0); delay_1ms(20);  }  //9
if(P3_0==0){ch_data(12);  delay_1ms(20); while(P3_0==0); delay_1ms(20);  }  //F   

P3=0xef;
if(P3_3==0){ch_data(12);  delay_1ms(20); while(P3_3==0); delay_1ms(20);  }  //A   
if(P3_2==0){ch_data(12);  delay_1ms(20); while(P3_2==0); delay_1ms(20);  }  //B   
if(P3_1==0){ch_data(12);  delay_1ms(20); while(P3_1==0); delay_1ms(20);  }  //C   
if(P3_0==0){ch_data(12);  delay_1ms(20); while(P3_0==0); delay_1ms(20);  }  //D 
 }
}

4X4 +7seg c lang modify

#include <at89x52.h>
unsigned char seg7_table[]={0Xc0,0Xf9,0Xa4,0Xb0,0X99,0X92,0X82,0Xf8,0X80,0X90};
int  i;
int temp;
int up_flag=0;
int down_flag=0;
int stop_flag=0;
void delay_1ms(unsigned int k)
{
  unsigned int i,j;
  for (i=0;i<=k;i++)
    for (j=0;j<=110;j++);
}
void main()
{
 P0=0xff;
 while(1)
 {
if(stop_flag==1){; }
  else if(up_flag==1)
  {
i++;
   if(i>9)
   {
    i=0;
   }
   P0=seg7_table[i];
   delay_1ms(500);
  }
  else if(down_flag==1)
  {
   i--;
   if(i<0)
   {
    i=9;
   }
   P0=seg7_table[i];
   delay_1ms(500);
  }
  P2=0x7f;
  if(P2_3==0) {up_flag=0,down_flag=0;stop_flag=0;P0=0xc0;i=0;delay_1ms(20);while(P2_3==0);delay_1ms(20);}//0
  if(P2_2==0){up_flag=0,down_flag=0;stop_flag=0;P0=0xf9;i=1;delay_1ms(20);while(P2_2==0);delay_1ms(20);}//1
  if(P2_1==0){up_flag=0,down_flag=0;stop_flag=0;P0=0xa4;i=2;delay_1ms(20);while(P2_1==0);delay_1ms(20);}//2
  if(P2_0==0){up_flag=0,down_flag=0;stop_flag=0;P0=0xb0;i=1;delay_1ms(20);while(P2_0==0);delay_1ms(20);}//3 
  P2=0xbf;
  if(P2_3==0){up_flag=0,down_flag=0;stop_flag=0;P0=0x99;i=4;delay_1ms(20);while(P2_3==0);delay_1ms(20);}//4
  if(P2_2==0){up_flag=0,down_flag=0;stop_flag=0;P0=0x92;i=5;delay_1ms(20);while(P2_2==0);delay_1ms(20);}//5
  if(P2_1==0){up_flag=0,down_flag=0;stop_flag=0;P0=0x82;i=6;delay_1ms(20);while(P2_1==0);delay_1ms(20);}//6
  if(P2_0==0){up_flag=0,down_flag=0;stop_flag=0;P0=0xf8;i=7;delay_1ms(20);while(P2_0==0);delay_1ms(20);}//7
  P2=0xdf;
  if(P2_3==0){up_flag=0,down_flag=0;stop_flag=0;P0=0x80;i=8;delay_1ms(20);while(P2_3==0);delay_1ms(20);}//8
  if(P2_2==0){up_flag=0,down_flag=0;stop_flag=0;P0=0x90;i=9;delay_1ms(20);while(P2_2==0);delay_1ms(20);}//9
  if(P2_1==0){up_flag=1,down_flag=0;stop_flag=0;;delay_1ms(20);while(P2_1==0);delay_1ms(20);}//a
  if(P2_0==0){up_flag=0,down_flag=1;stop_flag=0;delay_1ms(20);while(P2_0==0);delay_1ms(20);}//b
  P2=0xef;
  if(P2_3==0){up_flag=0,down_flag=0;stop_flag=1;delay_1ms(20);while(P2_3==3);delay_1ms(20);}//c
  }
}

LCD


2019年7月4日 星期四

解決殘影,把p1執行完後再關掉

#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<9999;i++)//i不可字元
{
for(j=0;j<25;j++)
{
P2=0x07;
P1=seg[(i/1000)%10];
delay(200);P1=0XFF;
P2=0x0b;
P1=seg[(i/100)%10];
delay(200);P1=0XFF;
P2=0x0d;
P1=seg[(i/10)%10];
delay(100);P1=0XFF;
P2=0x0e;
P1=seg[(i/1)%10];
delay(200);P1=0XFF;
}
}
  }
}
void delay(int count)
{
  int i;
  for(i=0;i<count;i++)
  ;
}

C语言怎样提取一个数的十位个位百位千位

C语言怎样提取一个数的十位个位百位千位
1 设一个数为n,则在C语言中其个位、十位、百位、千位依次这样计算:n/1%10,n/10%10,n/100%10,n/1000%10
2 示例
#include<stdio.h>
int main(){
    int n = 123456;
    int unitPlace = n / 1 % 10;
    int tenPlace = n / 10 % 10;
    int hundredPlace = n / 100 % 10;
    int thousandPlace = n / 1000 % 10;
    printf("个位:%d\n十位:%d\n百位:%d\n千位:%d\n", unitPlace, tenPlace, hundredPlace, thousandPlace);

    getchar();
    return 0;
}

运行结果:
个位:6
十位:5
百位:4
千位:3

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...