本文目錄一覽:
- 1、如何運用鏈表實現子彈連續發射 C語言 求代碼
- 2、51單片機驅動NRF2401的接受和發射的C語言程序
- 3、單片機程序火箭發射,倒計時和推送都有,用C語言編寫
- 4、用C語言編寫的紅外發射與接收程序
- 5、求一份基於51單片機4X4矩陣鍵盤紅外發射C語言程序,最好附原理圖哦!!
如何運用鏈表實現子彈連續發射 C語言 求代碼
includestdio.h#includestdlib.h#includestring.hstruct people{ char name[10]; int age; struct people * next;};int main(){ struct people * head=NULL; struct people * prev , * current; int flag=1; while(flag!=0) { printf(“請輸入學生姓名,年齡:(年齡輸入0結束所有輸入工作)\n”); current=(struct people *)malloc(sizeof(struct people)); if(head==NULL) head=current; else prev-next=current; current-next=NULL; scanf(“%s”,¤t-name); scanf(“%d”,¤t-age); prev=current; flag=current-age; } printf(“Output:\n”); if(head==NULL) printf(“無資料。\n”); else { current=head; while(current-next!=NULL) { printf(“姓名:%s\n年齡:%d\n\n”,current-name,current-age); current=current-next; } }}
51單片機驅動NRF2401的接受和發射的C語言程序
發送#include reg52.h
#includeintrins.h
// 常量定義
#define uchar unsigned char
#define uint unsigned int
#define BYTE_BIT0 0x01
#define BYTE_BIT1 0x02
#define BYTE_BIT2 0x04
#define BYTE_BIT3 0x08
#define BYTE_BIT4 0x10
#define BYTE_BIT5 0x20
#define BYTE_BIT6 0x40
#define BYTE_BIT7 0x80
//—————————位變數定義—————————————-
bdata uchar DATA_BUF; //用於ByteRead和ByteWrite 函數
#define DATA7 ((DATA_BUFBYTE_BIT7)!=0)
#define DATA0 ((DATA_BUFBYTE_BIT0)!=0)
uchar TxBuf[28]={
0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,
0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,
0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,
0x25,0x26,0x27,0x28,};// ——————————RF2401_Pins 對應引腳 ———————–
sbit PWR_UP = P1^3;
sbit CE = P1^2;
// sbit DR2 = P1^7; //暫時沒有用到
// sbit CLK2 = P1^1;
// sbit OUT2 = P1^6;
sbit CS = P1^0;
sbit DR1 = P1^5;
sbit CLK1 = P1^4;
sbit DATA = P3^3;
//—————————————-LED顯示埠—————————————————
sbit LED=P3^5;
//——————————————————————————-
unsigned char TxAddress[4]={0xcc,0xcc,0xcc,0xcc}; //發送地址
//———————nRF-Configuration-Register 配置信息 ——————————
//晶元測試用,無需修改
#define TEST_2 0x8E // MSB D143-D136
#define TEST_1 0x08 // D135~D128
#define TEST_0 0x1c // D127~D120
// 注意 DATAx_W+ADDRx_W+CRC 的值必須小於256!單個數據包的大小必須小於32位元組(256位)
#define DATA2_W 0x10 //未用到–0x10=2位元組 //頻道2發送/接受數據長度(單位:Bit)
#define DATA1_W 0xE0 //28位元組 16 位 //頻道1發送/接受數據長度(單位:Bit)
//頻道2接收地址 -頻道2未使用
#define ADDR2_4 0x00
#define ADDR2_3 0x1c
#define ADDR2_2 0xcc
#define ADDR2_1 0xcc
#define ADDR2_0 0xcc
// 頻道1接收地址 (當前模塊地址) -只是用頻道1
#define ADDR1_4 0x00
#define ADDR1_3 0xcc
#define ADDR1_2 0xcc
#define ADDR1_1 0xcc
#define ADDR1_0 0xcc
//接收地址位置設置–CRC設置
#define ADDR_W 0x10 //0x10 =2位元組 //發送/接收地址寬度(單位:Bit)
#define CRC_L 0x1 //CRC模式 0:8位 1:16位
#define CRC_EN 0x1 //CRC校驗 0:禁止 1:啟用
//頻道設置–發送方式設置–速率設置–頻率設置
#define RX2_EN 0x0 //雙頻道功能 0:禁用 1:啟用
#define CM 0x1 //0:Direct Mode 1: Shockburst Mode
#define RFDR_SB 0x1 //傳輸速率 0:250k 1: 1M (250k比1M傳輸距離遠)
#define XO_F 0x3 //16M D12 D11 D10 確定 5種頻率
#define RF_PWR 0x3 //信號發射功率—0DB
//
#define RF_CH 0x2 //Channal 頻率設置Channel=2400MHz+RF_CH*1.0MHz
#define RXEN 0x0 //0:TX 1:RX
//將設置信息組合成每個位元組的數據信息
#define RFconfig_Bit0 TEST_2
#define RFconfig_Bit1 TEST_1
#define RFconfig_Bit2 TEST_0
#define RFconfig_Bit3 DATA2_W
#define RFconfig_Bit4 DATA1_W
#define RFconfig_Bit5 ADDR2_4
#define RFconfig_Bit6 ADDR2_3
#define RFconfig_Bit7 ADDR2_2
#define RFconfig_Bit8 ADDR2_1
#define RFconfig_Bit9 ADDR2_0
#define RFconfig_Bit10 ADDR1_4
#define RFconfig_Bit11 ADDR1_3
#define RFconfig_Bit12 ADDR1_2
#define RFconfig_Bit13 ADDR1_1
#define RFconfig_Bit14 ADDR1_0
#define RFconfig_Bit15 (ADDR_W2|CRC_L1|CRC_EN)
#define RFconfig_Bit16 (RX2_EN7|CM6|RFDR_SB5|XO_F2|RF_PWR)
#define RFconfig_Bit17 (RF_CH1|RXEN)
//通過宏定義將18位元組的寄存器參數按照各個功能分解,參照DATASHHET
uchar code nRF2401_Conf[18]=
{
RFconfig_Bit0,RFconfig_Bit1,RFconfig_Bit2,
RFconfig_Bit3,
RFconfig_Bit4,
RFconfig_Bit5,RFconfig_Bit6,RFconfig_Bit7,RFconfig_Bit8,RFconfig_Bit9,
RFconfig_Bit10,RFconfig_Bit11,RFconfig_Bit12,RFconfig_Bit13,RFconfig_Bit14,
RFconfig_Bit15,
RFconfig_Bit16,
RFconfig_Bit17
};
//——————————————函數申明——————————————
void Delay_us(uchar n);
void DoClock();
void Delay_ms(uchar n);
unsigned char Spi_ByteRead(void);
void Spi_ByteWrite(unsigned char send);
void Config2401(void);
void SetTxMode(void);
void nRF2401_TxPacket(uchar TxBuf[]);
//——————————–11.0592M晶振 n=100 868us 左右——————————-
void Delay_us(uchar n)
{
uint i;
for(i=0;in;i++);
}
//—————————————— —————————————–
void Delay_ms(uchar n)
{
unsigned int i,j,k; for(i=0;in;i++)
{
for(k=0;k5;k++)
{
for(j=0;j200;j++);
}
}
}
/*
//————————–SPI讀——————————————
unsigned char Spi_ByteRead(void)
{
unsigned char i = 0;
for (i=0; i8; i++)
{
DATA_BUF = DATA_BUF 1;
CLK1 = 1;
DATA = 1; //設置為輸入狀態
if (DATA) //讀取最高位,保存至最末尾,通過左移位完成整個位元組
{
DATA_BUF |= BYTE_BIT0;
}
else
{
DATA_BUF = ~BYTE_BIT0;
}
CLK1 = 0;
}
return DATA_BUF;
}*/
//———————————-SPI寫—————————————–
void Spi_ByteWrite(unsigned char send)
{
unsigned char i; DATA_BUF = send; CLK1 = 0; for (i=0; i8; i++)
{
if (DATA7) //總是發送最高位
{
DATA = 1;
}
else
{
DATA = 0;
}
CLK1 = 1;
DATA_BUF = DATA_BUF 1;
CLK1 = 0;
}
}
//—————————–配置2401——————————————–
void Config2401(void)
{
uint i;
uchar variable1;
PWR_UP=1; //上電
CE=0;
CS=1; //使RF2401進入配置方式
Delay_ms(3); //從上電到進入配置模式需要3ms的延時(最少)
for(i=0;i18;i++) //輸入3個測試位元組15個配置位元組共 18Byte
{
variable1=nRF2401_Conf[i];
Spi_ByteWrite(variable1);
}
CS=0; //Disable CS —–standby mode
DATA=0;
Delay_us(100);
}
//——————————–設置為發送模式 —————————-
void SetTxMode(void)
{
//——————————-設置為配置模式———————————-
PWR_UP=1; //上電
CE=0;
CS=1; //進入配置模式
Delay_us(100);
DATA=0; //配置寄存器0位元組RXEN 設置為0: 發送模式
CLK1=1;
CLK1=0;
//—————————-設置為 Activemodes(TX)——————————
CS=0;
CE=1; //set standby mode
Delay_us(100);
}
//——————————–nRF 數據發送函數——————————–
void nRF2401_TxPacket()
{
int i;
uchar variable2;
CE=1;
for(i=0;i2;i++) //寫入接受地址(按位元組對齊)
{
variable2=TxAddress[i];
Spi_ByteWrite(variable2);
}
for(i=0;i(28);i++) //寫入接受地址(按位元組對齊)
{
variable2=TxBuf[i];
Spi_ByteWrite(variable2);
}
CE=0; //CE配置低使發送有效
Delay_us(100); //時鐘信號高電平有效
}
//————————————主函數—————————————
main()
{
Config2401();
while(1)
{
nRF2401_TxPacket();
SetTxMode();
LED=0; Delay_ms(10);LED=1; Delay_ms(10);
}
}
單片機程序火箭發射,倒計時和推送都有,用C語言編寫
#include iostream
#include vector
#include algorithm
using namespace std;
int is_right(int a[],int k)
{
int jian_ge=a[1]-a[0];
int count_num=0;
for(int i=0; ia href=”;tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1d9nhndrAnLnAnkmHf3rH0d0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EnH6vnW0vrHcLnjR1nWmYnj6vPs” target=”_blank” class=”baidu-highlight”k-1/a; i++)
{
if(a[i+1]-a[i]==jian_ge)
{
count_num++;
}
}
return count_num==a href=”;tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1d9nhndrAnLnAnkmHf3rH0d0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EnH6vnW0vrHcLnjR1nWmYnj6vPs” target=”_blank” class=”baidu-highlight”k-1/a?true:false;
}
int main()
{
int i;
cini;
vector char result;
vector char :: iterator it;
for(int j=1; j=i; j++)
{
int k;
cink;
int a[k];
for(int m=0; mk; m++)
{
cina[m];
}
if(is_right(a,k)==1)
{
result.push_back(‘Y’);
}
else
{
result.push_back(‘N’);
}
}
// reverse(result.begin(),result.end());
for(it=result.begin(); it!=result.end(); it++)
{
cout*itendl;
}
return 0;
}
用C語言編寫的紅外發射與接收程序
給你一段430單片機遙控器解碼的程序吧,也就是接收部分
畢竟世界太現實只能這麼幫你
#ifndef _IR_
#define _IR_
char t0,t1,t2;
uchar IR;
void DelayIR()
{
uint i=130;
while(i–);
}
void init_port2(void)
{
P2DIR=~BIT0;
P2SEL=~BIT0;
P2IES|=BIT0;
P2IE|=BIT0;
}
#pragma vector=PORT2_VECTOR
__interrupt void PORT2_ISR(void)
{
char CounterIR;
P2IES=~BIT0;
if(P2IFGBIT0)
{
P2IFG=~BIT0;
}
CounterIR=0;
while(!(P2INBIT0))
{
DelayIR();
CounterIR++;
}
if(CounterIR85)
{
if(CounterIR95)
{
t1++;
for(char k=0;k17;k++)
{
CounterIR=0;
while((P2INBIT0)(CounterIR50))
{
DelayIR();
CounterIR++;
}
CounterIR=0;
while((!(P2INBIT0))(CounterIR10))
{
DelayIR();
CounterIR++;
}
}
for(char j=0;j8;j++)
{
CounterIR=0;
while((P2INBIT0)(CounterIR25))
{
DelayIR();
CounterIR++;
}
IR=1;
if(CounterIR11)
IR|=BIT0;
CounterIR=0;
while((!(P2INBIT0))(CounterIR10))
{
DelayIR();
CounterIR++;
}
}
if((IR!=0xff)(IR!=0x00))
{
if(!(flagdataflag))
{
if(IR==0x22)
{
flag|=runflag;
}
else
{
Tar[0]=Tar[1];
Tar[1]=Tar[2];
Tar[2]=Tar[3];
Tar[3]=Tar[4];
switch (IR)
{
//case 0x22 : flag|=runflag;break;
case 0x68 : Tar[4]=0;flag|=dataflag;break;
case 0x30 : Tar[4]=1;flag|=dataflag;break;
case 0x18 : Tar[4]=2;flag|=dataflag;t2++;break;
case 0x7a : Tar[4]=3;flag|=dataflag;break;
case 0x10 : Tar[4]=4;flag|=dataflag;break;
case 0x38 : Tar[4]=5;flag|=dataflag;break;
case 0x5a : Tar[4]=6;flag|=dataflag;break;
case 0x42 : Tar[4]=7;flag|=dataflag;break;
case 0x4a : Tar[4]=8;flag|=dataflag;break;
case 0x52 : Tar[4]=9;flag|=dataflag;break;
default : break;
}
}
}
}
IR=0;
}
}
for(int m=0;m250;m++)
DelayIR();
P2IES|=BIT0;
}
#endif
請採納。
求一份基於51單片機4X4矩陣鍵盤紅外發射C語言程序,最好附原理圖哦!!
#include “reg52.h”
sbit ir=P2^0;//紅外發射管控制腳,使用24M晶振
sbit led = P2^1;
sbit ka=P1^0;
sbit kb=P1^1;
sbit kc=P1^2;
sbit kd=P1^3;
unsigned int count, set_count; //中斷計數,設定中斷次數
bit irflag,keyflag; //紅外發送標誌位,按鍵標誌位
unsigned char irsys[]={0x00,0xff};//16位用戶碼
unsigned char irdata,ircode; //發送的紅外數據
//—————————————————————————
void delay(unsigned int a)//延時約1ms,晶振24M ,此處延時不需很精確
{
unsigned char i;
while(–a!=0)
for(i=300;i0;i–); //若是12M晶振i=125
}
//—————————————————————————
void keyscan() // 按鍵掃描
{
if(ka==0)
{ delay(5);
while(!ka);
keyflag=1;irdata=0x0a;
} //a鍵按下,則發射數據0x0a
if(kb==0)
{ delay(5);
while(!kb);
keyflag=1;irdata=0x0b;
} //a鍵按下,則發射數據0x0a
if(kc==0)
{ delay(5);
while(!kc);
keyflag=1;irdata=0x0c;
} //a鍵按下,則發射數據0x0a
if(kd==0)
{ delay(5);
while(!kd);
keyflag=1;irdata=0x0d;
} //a鍵按下,則發射數據0x0a
}
//—————————————————————————
void ir_sendbyte() //紅外發送一個位元組數據
{
unsigned char i;
for(i=0;i8;i++) //發送8位數據
{
set_count=43;//35; //發送編碼中的0.56ms高電平 (//後為12M晶振下的數值)
irflag=1; //啟動紅外發射二極體發射
count=0; //中斷計數先清0
TR0=1; //開啟定時器0
while(countset_count); //等待發送完
TR0=0; //關閉定時器0
if(ircode0x01) set_count=130;//130; //判斷紅外編碼最低位,若為1則1.69ms的低電平 (//後為12M晶振下的數值)
else set_count=43;//35; //為0則0.565ms的低電平 (//後為12M晶振下的數值)
irflag=0; //低電平則不發射
count=0; //中斷計數清0
TR0=1; //開啟定時器0
while(countset_count); //等待發送完
TR0=0; //關閉定時器0
ircode=ircode1; //將數據右移,即從低位到高位發送
}
}
//—————————————————————————
void ir_send() //發送紅外數據
{
set_count=692;//672; //發送編碼中的引導碼(9ms高電平+4.5ms低電平) (//後為12M晶振下的數值) tc9012
irflag=1; //啟動紅外發射二極體發射
count=0; //中斷計數清0
TR0=1;
while(countset_count);
TR0=0;
set_count=346;//336; //發送編碼中的4.5ms低電平(//後為12M晶振下的數值)
irflag=0; //低電平則不發射
count=0;
TR0=1;
while(countset_count); //等待發送完
TR0=0;
ircode=irsys[0]; //發送16位用戶碼的前1-8位
ir_sendbyte();
ircode=irsys[1]; //發送16位用戶碼的前9-16位
ir_sendbyte();
ircode=irdata; //發送8位數據碼
ir_sendbyte();
ircode=~irdata; //發送8位數據反碼
ir_sendbyte();
set_count=43;//35; //發送編碼中的0.56ms高電平 (//後為12M晶振下的數值)
irflag=1;
count=0;
TR0=1;
while(countset_count);
TR0=0;
ir=1;
delay(23); //延時23ms(編碼中的23ms低電平)
set_count=692;//670; //發送編碼中的引導碼(9ms高電平+4.5ms低電平) (//後為12M晶振下的數值)
irflag=1;
count=0;
TR0=1;
while(countset_count);
TR0=0;
set_count=346;//336; //發送編碼中的4.5ms低電平(//後為12M晶振下的數值)
irflag=0;
count=0;
TR0=1;
while(countset_count);
TR0=0;
set_count=43;//35; //發送編碼中的0.56ms高電平 (//後為12M晶振下的數值)
irflag=1;
count=0;
TR0=1;
while(countset_count);
TR0=0;
ir=1; //發射完了關閉紅外發射二極體
}
//—————————————————————————
void timer0_init() //定時器初始化
{
EA=1;
TMOD=0x02; //定時0 8位自動重裝模式
ET0=1;
TH0=0xe6;//0xf3; //定時13us,38K紅外矩形波,晶振24M (//後為12M晶振下的數值)
TL0=0xe6;
}
//—————————————————————————
void main()
{
timer0_init(); //定時0初始化
count=0; //中斷計數先清0
irflag=0; //紅外發射標誌先置0
while(1)
{
keyscan(); //鍵值掃描
if(keyflag) //若有按鍵按下
{
led = 0;
delay(10);
ir_send(); //發送紅外編碼
delay(500);
keyflag=0; //按鍵標誌清零
delay(100);
}
else
{
led = 1;
}
}
}
//—————————————————————————
void timer0() interrupt 1 //定時器0中斷
{
count++;
if(irflag==1) ir=~ir; //有發射標誌,則發射38khz的矩形波
else ir=1; //否則不發射,即相當於發射編碼中的低電平
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/186525.html