⑴ 單片機c語言編寫自動門控制系統程序,p1.0紅外感測器,p1.1位置檢測開關1,p1.2位置檢測開關2。
以下匯編程序,delay的時間你需要自己調整一下,再加個2重循環吧,現在的時間是很短的。
P1.3為開門信號,P1.4為關門信號,輸入輸出低電平有效。
org 00h
ljmp main
org 30h
main:
jb p1.0,next1
setb 00h
clr 01h
next1:
jb p1.1,next2
clr 00h
next2:
jb p1.2,next3
clr 01h
next3:
mov c,00h
cpl c
mov p1.3,c
mov c,01h
cpl c
mov p1.4,c
jnb 02h,next4
jb 00h,next4
lcall delay
setb 01h
clr 00h
next4:
mov c,00h
mov 02h,c
ljmp main
delay:
mov r7,#00h
lp:
mov r6,#00h
djnz r6,$
djnz r7,lp
ret
⑵ C8051F530A單片機,溫度感測器DS18B20,C51編程,c語言程序。
考試還是開發產品?
開發的話可以幫你搞定。。。
⑶ 基於51單片機紅外遙控代碼(C語言)
以下文件是51單片機實現遙控解碼,通過數碼管顯示鍵碼的程序,P0口驅動數碼管段選,p2.6和p2.7為數碼管位選,接收頭連到P3.2口。此程序以通過驗證,可以直接編譯使用,另外還有一個繼電器和蜂鳴器的控制,不用可以屏蔽掉。
;********************************************************************************
;* 描述: *
;* 遙控鍵值讀取器 *
;* 數碼管顯示, P0口為數碼管的數據口 *
;* *
;********************************************************************************
;遙控鍵值解碼-數碼管顯示 *
;********************************************************************************/
#include <reg51.h>
#include <intrins.h>
void IR_SHOW();
void delay(unsigned char x);//x*0.14MS
void delay1(unsigned char ms);
void beep();
sbit IRIN = P3^2;
sbit BEEP = P3^7;
sbit RELAY= P1^3;
sbit GEWEI= P2^7;
sbit SHIWEI= P2^6;
unsigned char IRCOM[8];
unsigned char code table[16] =
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
main()
{
IE = 0x81; //允許總中斷中斷,使能 INT0 外部中斷
TCON = 0x1; //觸發方式為脈沖負邊沿觸發
delay(1);
IRIN=1;
BEEP=1;
RELAY=1;
for(;;)
{
IR_SHOW();
}
} //end main
void IR_IN() interrupt 0 using 0
{
unsigned char i,j,k,N=0;
EA = 0;
I1:
for (i=0;i<4;i++)
{
if (IRIN==0) break;
if (i==3) {EA =1;return;}
}
delay(20);
if (IRIN==1) goto I1; //確認IR信號出現
while (!IRIN) //等 IR 變為高電平
{delay(1);}
for (j=0;j<4;j++)
{
for (k=0;k<8;k++)
{
while (IRIN) //等 IR 變為低電平
{delay(1);}
while (!IRIN) //等 IR 變為高電平
{delay(1);}
while (IRIN) //計算IR高電平時長
{
delay(1);
N++;
if (N>=30) {EA=1;return;}
}
IRCOM[j]=IRCOM[j] >> 1;
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}
N=0;
}//end for k
}//end for j
if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}
IRCOM[5]=IRCOM[2] & 0x0F;
IRCOM[6]=IRCOM[2] & 0xF0;
IRCOM[6]=IRCOM[6] >> 4;
beep();
EA = 1;
}
void IR_SHOW()
{
P0 = table[IRCOM[5]];
GEWEI = 0;
SHIWEI = 1;
delay1(4);
P0 = table[IRCOM[6]];
SHIWEI = 0;
GEWEI = 1;
delay1(4);
}
void beep()
{
unsigned char i;
for (i=0;i<100;i++)
{
delay(5);
BEEP=!BEEP;
}
BEEP=1;
}
void delay(unsigned char x)//x*0.14MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}
void delay1(unsigned char ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i<120; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
⑷ 嵌入式溫濕度感測器C語言代碼求幫忙注釋
#include "ioCC2430.h" //包含頭文件,相應的板子以及感測器一些信息
#include "hal.h"
#include <math.h>
//#include <intrins.h>
#include <stdio.h>
typedef union //定義聯合體,
{
unsigned int i;
float f;
} value; //定義聯合體類型名稱為value
#define noACK 0
#define ACK 1
#define STATUS_REG_W 0x06 //0x06 = 0000 0110
#define STATUS_REG_R 0x07 //0x07 = 0000 0111
#define MEASURE_TEMP 0x03 //0x03 = 0000 0011
#define MEASURE_HUMI 0x05 //0x05 = 0000 0101
#define RESET 0x1e //0x1e = 0001 1110
#define SDA P1_6 //定義SDA代表的是P1_6腳
#define SCL P1_7
#define begin P2_0
unsigned char d1,d2,d3,d4,d5,d6,d7; //定義無符號字元型變數
void Wait(unsigned int ms) //定義wait函數,主要用於軟體循環,延時作用
{
unsigned char g,k;
while(ms)
{
for(g = 0;g <= 167; g++)
{
for(k = 0;k <= 48; k++);
}
ms--;
}
}
void QWait() //1us的延時
{
asm("NOP"); //加入匯編操作語句,空操作,主要用於機器周期執行
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
}
void initUART(void) //初始化單片機的串口
{
IO_PER_LOC_USART0_AT_PORT0_PIN2345(); //具體函數的定義與用法,你得參考頭文件中的程序代碼了
IO_DIR_PORT_PIN(1, 6, IO_OUT);
IO_DIR_PORT_PIN(1, 7, IO_OUT);
//IO_IMODE_PORT_PIN(1, 6, IO_IMODE_TRI);
//IO_IMODE_PORT_PIN(1, 7, IO_IMODE_TRI);
IO_DIR_PORT_PIN(2, 0, IO_OUT);
IO_FUNC_PORT_PIN(2, 0, IO_FUNC_GIO);
//SET_MAIN_CLOCK_SOURCE(RC);
SET_MAIN_CLOCK_SOURCE(CRYSTAL);
UART_SETUP(0, 115200, HIGH_STOP); //設置傳輸數據的波特率115200
UTX0IF = 1;
U0CSR |= 0XC7; //U0CSR = U0CSR | 0x1010 0111 (進行位或操作)
IEN0 |= 0x84;
SDA = 1;
SCL = 0;
}
int putchar (int c) //定義輸入字元函數,給的參數是一個整型的數
{
if (c == ' ') //判斷參數c的值是否和' '的值相等
{
while (!UTX0IF); //執行的時候UTX0IF的值是0,此處不是很理解?
UTX0IF = 0; //給UTX0IF賦0
U0DBUF = 0x0d; //U0DBUF賦值0x0d = 0000 1011
}
while (!UTX0IF);
UTX0IF = 0;
return (U0DBUF = c); //如果c的值不是' '也就是換行符的時候,將c的值傳遞到U0DBUF寄存器中
}
char s_write_byte(unsigned char value) //定義寫位元組函數(8位)
{
unsigned char i,error = 0;
for (i = 0x80;i > 0;i /= 2) //i 賦初始值0x80 = 128, 執行判斷是i > 0,執行語句是i = i / 2; 即i = 128,64,32,16,8,4,2,1,0.5(0),8位
{
if (i & value)
SDA = 1;
else
SDA = 0;
SCL = 1; //此時SCL埠處,也就是p1_7引腳處是高電平
QWait(); //因為寫入需要時間,所以程序之中加入下面幾條語句
QWait();
QWait();
QWait();
QWait();
SCL = 0; //使能p1_7眼角處低電平,使的數據寫入(具體需要看單片機控制晶元的手冊
asm("NOP");
asm("NOP");
}
SDA = 1;
SCL = 1;
asm("NOP");
error = SDA;
QWait();
QWait();
QWait();
SDA = 1;
SCL = 0;
return error;
}
char s_read_byte(unsigned char ack) //讀取數據,按照位元組位的順序讀取(8位)128 = 1000 0000 ,64 = 0100 0000, 32 = 0010 0000 ,16 = 0001 0000, 8 = 0000 1000, 4 = 0000 0100 , 2 = 0000 0010, 1 = 0000 0001
{
unsigned char i,val = 0;
SDA= 1;
for(i = 0x80;i > 0;i /= 2) //同上
{
SCL = 1;
if (SDA) //判斷SDA處是否有高電平
val = (val | i); //進行或操作
else
val = (val | 0x00);
SCL = 0;
QWait();
QWait();
QWait();
QWait();
QWait();
}
SDA = !ack;
SCL = 1;
QWait();
QWait();
QWait();
QWait();
QWait();
SCL = 0;
SDA = 1;
return val; //返回讀取到的數據,一個位元組,八位
}
void s_transstart(void) //傳輸使能函數,就是給控制器引腳處相應電平,使對應模塊工作
{
SDA = 1;
SCL = 0;
QWait();
QWait();
SCL = 1;
QWait();
QWait();
SDA = 0;
QWait();
QWait();
SCL = 0;
QWait();
QWait();
QWait();
QWait();
QWait();
SCL = 1;
QWait();
QWait();
SDA = 1;
QWait();
QWait();
SCL = 0;
QWait();
QWait();
}
void s_connectionreset(void) //復位操作函數
{
unsigned char i;
SDA = 1;
SCL = 0;
for(i = 0;i < 9; i++)
{
SCL = 1;
QWait();
QWait();
SCL = 0;
QWait();
QWait();
}
s_transstart(); //調用開始函數
}
char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode) //函數,主要統計傳輸的數據個數
{
unsigned er = 0;
unsigned int i,j;
s_transstart();
switch(mode)
{
case 3 :er += s_write_byte(3);
break;
case 5 :er += s_write_byte(5);
break;
default :break;
}
for(i = 0;i < 65535;i++)
{
for(j = 0;j < 65535;j++)
{if(SDA == 0)
{
break;
}
}
if(SDA == 0)
{
break;
}
}
if(SDA)
{
er += 1;
}
*(p_value) = s_read_byte(ACK);
*(p_value + 1) = s_read_byte(ACK);
*p_checksum = s_read_byte(noACK);
d6 = *(p_value);
d7=*(p_value + 1);
return er;
}
void calc_sth11(float *p_humidity ,float *p_temperature)//計算溫度值
{
const float C1 =- 4.0;
const float C2 =+ 0.0405;
const float C3 =- 0.0000028;
const float T1 =+ 0.01;
const float T2 =+ 0.00008;
float rh =* p_humidity;
float t =* p_temperature;
float rh_lin;
float rh_true;
float t_C;
t_C = t * 0.01 - 44.0 ;
rh_lin = C3 * rh * rh + C2 * rh + C1;
rh_true = (t * 0.01 - 40.0 - 25) * (T1 + T2 * rh) + rh_lin;
if(rh_true > 100)
{
rh_true = 100;
}
if(rh_true < 0.1)
{
rh_true = 0.1;
}
*p_temperature = t_C;
*p_humidity = rh_true;
}
void main() //主函數
{
value humi_val,temp_val; //聲明兩個聯合體變數
unsigned char error,checksum; //聲明兩個無符號的字元型變數
initUART(); //初始化串口
P1INP |= 0xC0; //初始化P1引腳 , 0xC0 = 1010 0000 ,使P1_7和P1_5引腳為1
begin = 0;
s_connectionreset();
while(1) //無限循環操作
{
error = 0;
error += s_measure((unsigned char*) &humi_val.i,&checksum,5); //讀入串口的數據進行溫度的計算
d1 = d6;
d2 = d7;
error += s_measure((unsigned char*) &temp_val.i,&checksum,3);
d3 = d6;
d4 = d7;
if(error != 0)
s_connectionreset();
else
{
humi_val.f = (float)humi_val.i;
temp_val.f = (float)temp_val.i;
humi_val.f = d1 * 256 + d2;
temp_val.f = d3 * 256 + d4;
calc_sth11(&humi_val.f,&temp_val.f);
printf("temp:%5.1fC humi:%5.1f%% ",temp_val.f,humi_val.f);
// printf("t1:%x h1:%x ",d1,d2);
//printf("t2:%x h2:%x ",d3,d4);
}
Wait(150);
}
}
⑸ 用單片機C語言設計數字溫度計!求代碼!急急急
//------------------------------------------------------------------
//DS18B20溫度感測器輸出顯示,運行本例時,外界溫度將顯示在1602LCD上
//------------------------------------------------------------------
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define delayNOP() {_nop_();_nop_();_nop_();_nop_();}
sbit DQ=P2^2;
sbit la=P2^6; //定義鎖存器鎖存端
sbit wela=P2^7;
sbit rs=P3^5; //定義1602液晶RS端
sbit lcden=P3^4;//定義1602液晶LCDEN端
sbit s1=P3^0; //定義按鍵--功能鍵
sbit s2=P3^1;//定義按鍵--增加鍵
sbit s3=P3^2;//定義按鍵--減小鍵
sbit s4=P3^6;//鬧鍾查看鍵
sbit rd=P3^7;
sbit beep=P2^3; //定義蜂鳴器端
uchar code Temp_Disp_Title[]={" Current Temp : "};
uchar Current_Temp_Display_Buffer[]={" TEMP: "};
uchar code Alarm_Temp[]={"ALARM TEMP Hi Lo"};
uchar Alarm_HI_LO_STR[]={"Hi: Lo: "};
uchar temp_data[2]={0x00,0x00};
uchar temp_alarm[2]={0x00,0x00};
uchar display[5]={0x00,0x00,0x00,0x00,0x00};
uchar display1[3]={0x00,0x00,0x00};
uchar code df_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};
uchar CurrentT=0;//當前讀取的溫度整數部分
uchar Temp_Value[]={0x00,0x00};//從DS18B20讀取的溫度值
uchar Display_Digit[]={0,0,0,0}; //待顯示的各溫度數位
bit DS18B20_IS_OK=1;//感測器正常標志
//-------------------------------------
//延時1
//-------------------------------------
void delay1(uint x)
{
uchar i;
while(x--) for(i=0;i<200;i++);
}
//-------------------------------------
//延時2
//-------------------------------------
void Delay(uint x)
{
while(x--);
}
//------------------------------------
//忙檢查
//------------------------------------
void write_com(uchar com)//液晶寫命令函數
{
rs=0;
lcden=0;
P0=com;
delay1(5);
lcden=1;
delay1(5);
lcden=0;
}
void Write_LCD_Data(uchar date)//液晶寫數據函數
{
rs=1;
lcden=0;
P0=date;
delay1(5);
lcden=1;
delay1(5);
lcden=0;
}
//-----------------------------
//設置LCD顯示位置
//---------------------------------
void Set_Disp_Pos(uchar Pos)
{
write_com(Pos|0x80);
}
//-----------------------------
//LCD初始化
//---------------------------------
void Initialize_LCD()
{
uchar num;
rd=0; //軟體將矩陣按鍵第4列一端置低用以分解出獨立按鍵
la=0;//關閉兩鎖存器鎖存端,防止操作液晶時數碼管會出亂碼
wela=0;
lcden=0;
write_com(0x38);//初始化1602液晶
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);//設置顯示初始坐標
for(num=0;num<14;num++)//顯示年月日星期
{
Write_LCD_Data(Temp_Disp_Title[num]);
delay1(5);
}
}
//-------------------------------------
//函數功能:初始化DS18B20
//出口參數:status---DS18B20是否復位成功的標志
//-------------------------------------
uchar Init_DS18B20()
{
uchar status; //儲存DS18B20是否存在的標志,status=0,表示存在;status=1,表示不存在
DQ=1;Delay(8); //先將數據線拉高 //略微延時約6微秒
DQ=0;Delay(90); //再將數據線從高拉低,要求保持480~960us
//略微延時約600微秒 以向DS18B20發出一持續480~960us的低電平復位脈沖
DQ=1;Delay(8); //釋放數據線(將數據線拉高) //延時約30us(釋放匯流排後需等待15~60us讓DS18B20輸出存在脈沖)
status=DQ;Delay(100); //讓單片機檢測是否輸出了存在脈沖(DQ=0表示存在) //延時足夠長時間,等待存在脈沖輸出完畢
DQ=1; // 將數據線拉高
return status; //返回檢測成功標志
}
//-------------------------------------
//函數功能:讀一位元組
//出口參數:dat---讀出的數據
//-------------------------------------
uchar ReadOneByte()
{
uchar i,dat=0;
DQ=1;_nop_(); // 先將數據線拉高 //等待一個機器周期
for (i=0;i<8;i++)
{
DQ=0; //單片機從DS18B20讀書據時,將數據線從高拉低即啟動讀時序
dat>>=1;
_nop_();//等待一個機器周期
DQ=1; //將數據線"人為"拉高,為單片機檢測DS18B20的輸出電平作準備
_nop_();_nop_(); //延時約6us,使主機在15us內采樣
if (DQ) dat|=0x80; //如果讀到的數據是1,則將1存入dat,如果是0則保持原值不變
Delay(30); //延時3us,兩個讀時序之間必須有大於1us的恢復期
DQ=1; // 將數據線拉高,為讀下一位數據做准備
}
return dat;
}
//-------------------------------------
//函數功能:寫一位元組
//入口參數:dat---待寫入的數據
//-------------------------------------
void WriteOneByte(uchar dat)
{
uchar i;
for (i=0;i<8;i++)
{
DQ=0; //將數據線從高拉低時即啟動寫時序
DQ=dat & 0x01; //利用與運算取出要寫的某位二進制數據,
//並將其送到數據線上等待DS18B20采樣
Delay(5); //延時約30us,DS18B20在拉低後的約15~60us期間從數據線上采樣
DQ=1; //釋放數據線
dat>>=1; //將dat中的各二進制位數據右移1位
}
}
//-------------------------------------
//函數功能:讀取溫度值
//出入口參數:無
//-------------------------------------
void Read_Temperature()
{
if(Init_DS18B20() == 1) //DS18B20故障
DS18B20_IS_OK=0;
else
{
WriteOneByte(0xCC); // 跳過讀序號列號的操作
WriteOneByte(0x44); // 啟動溫度轉換
Init_DS18B20(); //將DS18B20初始化
WriteOneByte(0xCC); //跳過讀序號列號的操作
WriteOneByte(0xBE); //讀取溫度寄存器,前兩個分別是溫度的低位和高位
Temp_Value[0]=ReadOneByte(); //溫度低8位
Temp_Value[1]=ReadOneByte(); //溫度高8位
DS18B20_IS_OK=1;
}
}
//-------------------------------------
//函數功能:在LCD上顯示當前溫度
//入口參數:
//-------------------------------------
void Display_Temperature()
{
uchar i;
//延時值與負數標識
uchar t=150,ng=0;
//高5位全為1(0xF8)則為負數,為負數時取反加1,並設置負數標示
if ((Temp_Value[1] & 0xF8)==0xF8)
{
Temp_Value[1]=~Temp_Value[1];
Temp_Value[0]=~Temp_Value[0]+1;
if(Temp_Value[0]==0x00) Temp_Value[1]++; //加1後如果低位元組為00表示有進位,進位位再加到高位元組上
ng=1; //負數標示置1
}
Display_Digit[0]=df_Table[Temp_Value[0] & 0x0F]; //查表得到溫度小數部分
//獲取溫度整數部分(高位元組的低3位與低位元組中的高4位,無符號)
CurrentT=((Temp_Value[0] & 0xF0)>>4)|((Temp_Value[1] & 0x07)<<4);
//將整數部分分解為3位待顯示數字
Display_Digit[3]=CurrentT/100;//百位 digit[CurrentT/100];
Display_Digit[2]=CurrentT%100/10;//十位
Display_Digit[1]=CurrentT%10;//個位
//刷新LCD顯示緩沖
Current_Temp_Display_Buffer[11]=Display_Digit[0]+'0';//先將'0'轉換成整數48,然後與前面數字相加,得到相應數字的ASCII字元
Current_Temp_Display_Buffer[10]='.';
Current_Temp_Display_Buffer[9]=Display_Digit[1]+'0'; //個位
Current_Temp_Display_Buffer[8]=Display_Digit[2]+'0'; //十位
Current_Temp_Display_Buffer[7]=Display_Digit[3]+'0'; //百位
//高位為0時不顯示
if(Display_Digit[3]==0) Current_Temp_Display_Buffer[7]=' ';
//高位為0且次高位為0時,次高位不顯示
if(Display_Digit[2]==0 && Display_Digit[3]==0)
Current_Temp_Display_Buffer[8]=' ';
//負數符號顯示在恰當位置
if(ng)
{
if (Current_Temp_Display_Buffer[8]==' ')
Current_Temp_Display_Buffer[8]='-';
else if(Current_Temp_Display_Buffer[7]==' ')
Current_Temp_Display_Buffer[7]='-';
else
Current_Temp_Display_Buffer[6]='-';
}
//在第一行顯示標題
Set_Disp_Pos(0x00);
for(i=0;i<16;i++)
{
Write_LCD_Data(Temp_Disp_Title[i]);
}
Set_Disp_Pos(0x40); //在第二行顯示當前溫度
for(i=0;i<16;i++)
{
Write_LCD_Data(Current_Temp_Display_Buffer[i]);
}
//顯示溫度符號
//Set_Disp_Pos(0x4D);Write_LCD_Data(0x00);
Set_Disp_Pos(0x4D);Write_LCD_Data(0xdf);
Set_Disp_Pos(0x4E);Write_LCD_Data('C');
}
//-------------------------------------
//函數功能:主函數
//入口參數:
//-------------------------------------
void main()
{
Initialize_LCD();
Read_Temperature();
Delay(50000);
Delay(50000);
while (1)
{
Read_Temperature();
if (DS18B20_IS_OK) Display_Temperature();
delay1(100);
}
}
⑹ msp430溫度感測器,c語言程序,我想在電腦上看到它返回的溫度數值,可是總看不到返回值。
1、說幾點我沒去看F2XX的手冊,這個是F5X的串口中斷,不知道你的中斷#pragma vector=USCIAB0RX_VECTOR對不對,建議在官方下載常式看一下。
2、主程序裡面只有接收中斷哪裡可以呢,你這個屬於發送中斷了,應為你沒有直接在主函數裡面發出去,估計是你修改的官方的例子,是串口發送一個數據返回一個數據的例子吧
IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt
3、UCA0RXBUF = get_temperature();這一句建議使用定義的變數,不要使用UCA0RXBUF這個寄存器,因為你的USCIAB0RX_VECTOR中斷是包含發送和接收中斷的,你這玩意不就是直接發出去嘛,可以不需要中斷直接在主函數裡面發送出去。
4、一樓完全是扯淡的,低功耗當然是進入了,在AD中不是有 __bis_SR_register(CPUOFF + GIE); // LPM0 with interrupts enabled這一句么,沒問題的,中斷中是會對SR操作的,這個自然就自己處理了。只需要再次配置就OK。
4、建議你屏蔽主函數裡面的UCA0RXBUF = get_temperature();這一句,在PC端發送數據給單片機看看串口是否通了。
5、配置串口發送中斷,應該可以解決問題。
6、F5438的串口中斷程序如下:
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{
switch(__even_in_range(UCA0IV,4))
{
case 0:break; // Vector 0 - no interrupt
case 2: // Vector 2 - RXIFG
while (!(UCA0IFG&UCTXIFG)); // USCI_A0 TX buffer ready?
UCA0TXBUF = UCA0RXBUF; // TX -> RXed character
break;
case 4:break; // Vector 4 - TXIFG
default: break;
}
}
7、如果覺得回答的可以,建議追加分數。
⑺ 大蝦們~小弟急需mlx90615紅外感測器在單片機中的c語言編程~跪求~大謝!
紅外測溫模塊?
不是很難吧。
⑻ 紅外線遙控器解碼C語言程序代碼 SM0038接受頭
//////////////////////////////////////
//晶振頻率為6MHz 一個機器周期2us //
//實現按鍵地址碼、指令碼的數碼管顯示//
//2010-06-01 //
//////////////////////////////////////
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit la=P2^6;
sbit wela=P2^7;
bit overflag,dataover;//開始接收數據,數據處理完畢
uchar timedata;//定時器0溢出次數
uchar chubus[33];//33Byte數據 timedata組成的數組
uchar jieguos[4];//地址碼,地址反碼,數據碼,數據反碼;
void initial()//初始化
{
IT0=1;EX0=1;//負邊沿觸發
TMOD=0x01;ET0=1;TR0=1;//模式1,十六位定時器
TH0=0xff;TL0=0x06;//0.5ms溢出
EA=1; //開總中斷
}
void time0() interrupt 1//定時器0中斷
{TH0=0xff;TL0=0x06;
timedata++;
}
void ex0() interrupt 0//外部中斷0,接收數據
{
static bit startflag;//開始接收
static uchar i;
if(startflag)
{
if(timedata<32&&timedata>=16) i=0;
chubus[i]=timedata;
timedata=0;
i++;
if(i==33){overflag=1;i=0;}
}
else
{
startflag=1;
timedata=0;
}
}
void chulidata()
{
uchar chubu;//初步數據
uchar jieguo;//結果數據
uchar x,y,z=1;
for(x=0;x<4;x++)//處理四組數據
{
for(y=1;y<=8;y++)//處理一組數據8Byte
{
chubu=chubus[z];
jieguo=jieguo>>1;
if(chubu>3) jieguo=jieguo|0x80;//大於1.5mS為1
z++;
}
jieguos[x]=jieguo;
jieguo=0;
}
dataover=1;
}
void delay(uint z)
{
uint x ,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display()
{
uchar gao,gao1;
uchar di,di1;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
gao1=table[jieguos[0]/16];
di1=table[jieguos[0]%16];
gao=table[jieguos[2]/16];
di=table[jieguos[2]%16];
la=1;
P0=gao1;
la=0;
P0=0xff;
wela=1;
P0=0x7e;
wela=0;
delay(2);
la=1;
P0=di1;
la=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(2);//地址碼
la=1;
P0=gao;
la=0;
P0=0xff;
wela=1;
P0=0x77;
wela=0;
delay(2);
la=1;
P0=di;
la=0;
P0=0xff;
wela=1;
P0=0x6f;
wela=0;
delay(2);//指令碼
}
void main()
{
initial();//初始化
while(1)
{
if(overflag)//數據接收完畢
{
chulidata();//處理數據,完成標志dataover
overflag=0;
}
if(dataover)
{
display();//數碼管顯示
}
}
}
⑼ DS18B20溫度感測器,89S52單片機,通過無線模塊(NRF24L01)發射、接收,用LCD1602顯示溫度,求完整c語言
我沒能幫你。但C語言是可以移植的,我給你一個DS18B20的程序,你再找關於無線模塊的資料,然後將它們整合到一起
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS=P2^2; //define interface
uint temp; // variable of temperature
uchar flag1; // sign of the result positive or negative
sbit la=P2^6;
sbit wela=P2^7;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
0x87,0xff,0xef};
void delay(uint count) //delay
{
uint i;
while(count)
{
i=200;
while(i>0)
i--;
count--;
}
}
///////功能:串口初始化,波特率9600,方式1///////
void Init_Com(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
}
void dsreset(void) //send reset and initialization command 18B20復位,初始化函數
{
uint i;
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
}
bit tmpreadbit(void) //read a bit 讀1位數據函數
{
uint i;
bit dat;
DS=0;i++; //i++ for delay
DS=1;i++;i++;
dat=DS;
i=8;while(i>0)i--;
return (dat);
}
uchar tmpread(void) //read a byte date 讀1位元組函數
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1); //讀出的數據最低位在最前面,這樣剛好一個位元組在DAT里
}
return(dat);
}
void tmpwritebyte(uchar dat) //write a byte to ds18b20 向1820寫一個位元組數據函數
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //write 1
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0; //write 0
i=8;while(i>0)i--;
DS=1;
i++;i++;
}
}
}
void tmpchange(void) //DS18B20 begin change 開始獲取數據並轉換
{
dsreset();
delay(1);
tmpwritebyte(0xcc); // address all drivers on bus 寫跳過讀ROM指令
tmpwritebyte(0x44); // initiates a single temperature conversion 寫溫度轉換指令
}
uint tmp() //get the temperature 讀取寄存器中存儲的溫度數據
{
float tt;
uchar a,b;
dsreset();
delay(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe);
a=tmpread(); //讀低8位
b=tmpread(); //讀高8位
temp=b;
temp<<=8; //two byte compose a int variable 兩個位元組組合為1個字
temp=temp|a;
tt=temp*0.0625; //溫度在寄存器中是12位,解析度是0.0625
temp=tt*10+0.5; //乘10表示小數點後只取1位,加0.5是四折五入
temp=temp+4; //誤差補償
return temp;
}
void readrom() //read the serial
{
uchar sn1,sn2;
dsreset();
delay(1);
tmpwritebyte(0x33);
sn1=tmpread();
sn2=tmpread();
}
void delay10ms() //delay
{
uchar a,b;
for(a=10;a>0;a--)
for(b=60;b>0;b--);
}
void display(uint temp) //顯示程序
{
uchar A1,A2,A2t,A3,ser;
ser=temp/10;
SBUF=ser;
A1=temp/100;
A2t=temp%100;
A2=A2t/10;
A3=A2t%10;
la=0;
P0=table[A1]; //顯示百位
la=1;
la=0;
wela=0;
P0=0x7e;
wela=1;
wela=0;
delay(2);
la=0;
P0=table1[A2]; //顯示十位
la=1;
la=0;
wela=0;
P0=0x7d;
wela=1;
wela=0;
delay(2);
P0=table[A3]; //顯示個位
la=1;
la=0;
P0=0x7b;
wela=1;
wela=0;
delay(1);
}
void main()
{
uchar a;
Init_Com();
do
{
tmpchange();
// delay(200);
for(a=10;a>0;a--)
{ display(tmp());
}
} while(1);
}
⑽ 求基於51單片機的溫度計設計 測溫感測器使用DS1631.只要C語言程序
真好,前些天寫的程序復制上來給你看看吧,注釋比較少有點亂。功能是讀取DS18b20的溫度1602顯示,順便顯示了幾個自定義字元。
#include<reg52.h>
#include<stdio.h>
sbitrs=P2^4;
sbitrw=P2^5;
sbiten=P2^6;
sbitdq=P1^0;
bitmark;
unsignedinttemp=0;
unsignedcharcodedat1[]="wellcomestudyC";
unsignedcharcodeERROR[]="ERROR";
unsignedcharmo[]={0x10,0x07,0x0C,0x08,0x08,0x0C,0x07,0x00,
0x00,0x0F,0x09,0x09,0x0F,0x09,0x09,0x0F,
0x00,0x0F,0x09,0x0F,0x09,0x0F,0x11,0x13,
0x1F,0x15,0x15,0x1F,0x1F,0x15,0x15,0x1F,
0x00,0x1F,0x04,0x04,0x04,0x04,0x1F,0x00,
0x00,0x04,0x04,0x04,0x0A,0x11,0x11,0x00,
0x00,0x1F,0x04,0x0F,0x05,0x05,0x1F,0x00,
0x10,0x07,0x0C,0x08,0x08,0x0C,0x07,0x00};
charcodetab[16]="0123456789ABCDEF";
/*1ms延時子程序*/
voiddelay_1ms(unsignedchartime)
{
unsignedchara,b;
for(a=time;a>0;a--)
for(b=200;b>0;b--);
}
/*2us延時子程序*/
voiddelay2us(unsignedchart)
{
while(--t);
}
/*1602命令寫入子程序*/
voidwcom(unsignedcharcom)
{
rs=0;
rw=0;
P0=com;
delay_1ms(3);
en=1;
en=0;
}
/*1602數據寫入子程序*/
voidwdat(unsignedchardat)
{
rs=1;
rw=0;
P0=dat;
delay_1ms(3);
en=1;
en=0;
}
/*1602初始化*/
voidstart()
{
wcom(0x38);
wcom(0x0c);
wcom(0x06);
wcom(0x01);
}
//1602顯示用戶自定義字元子程序
voiddisplay()
{
unsignedcharm=0;
for(m=0;m<64;m++)
{
wcom(0x40+m);//設定自定義字模數據的存儲地址
wdat(mo[m]);
}
wcom(0xc8);//顯示自定義字元「C」
for(m=0;m<8;m++)
{
wdat(0x00+m);
delay_1ms(255);
}
}
/*18b20復位子程序*/
bitds18b20(void)
{
bitflag;
dq=1;
delay2us(10);
dq=0;
delay2us(200);
delay2us(200);
dq=1;
delay2us(50);
flag=dq;
delay2us(25);
returnflag;
}
/*向18b20寫入一個位元組的數據*/
voidwrite_dat(unsignedchardat)
{
unsignedchari;
for(i=0;i<8;i++)
{
dq=0;
delay2us(2);
dq=dat&0x01;
delay2us(22);
dq=1;
dat>>=1;
}
}
/*讀取18b20一個位元組的數據*/
unsignedcharread_dat(void)
{
unsignedchari,dat=0;
for(i=0;i<8;i++)
{
dq=0;
dat>>=1;
dq=1;
if(dq)
dat|=0x80;
delay2us(25);
}
return(dat);
}
/*讀取溫度*/
voidget_temp(void)
{
unsignedinta,b;
ds18b20();
write_dat(0xcc);
write_dat(0x44);
delay_1ms(2);
ds18b20();
write_dat(0xcc);
write_dat(0xbe);
a=read_dat();
b=read_dat();
/*********************溫度數據處理程序段*/
if((b&0xf8)==0xf8)
{
mark=1;
b<<=8;
temp=((~(a+b))+1)*0.625;
}
else
{
mark=0;
b<<=8;
temp=(a+b)*0.625;
}
}
voidmain()
{
unsignedcharm;
start();
wcom(0x80);
for(m=0;m<16;m++)
{
wdat(dat1[m]);
delay_1ms(155);
}
display();
while(1)
{
get_temp();
if(ds18b20()) //若18b20初始化不成功或不存在即顯示ERROR
{
unsignedcharj;
wcom(0xc2);
for(j=0;j<6;j++)
{
wdat(ERROR[j]);
}
}
else
{
wcom(0xc2);
if(mark)
wdat(0xb0);
else
wdat(0xa0);
wdat(tab[temp/1000]);
wdat(tab[(temp%1000)/100]);
wdat(tab[((temp%1000)%100)/10]);
wdat(0x2e);
wdat(tab[((temp%1000)%100)%10]);
}
}
}