Ⅰ 51單片機,怎麼用匯編語言編程一個程序。實現4個按鍵控制4種報警聲音(110、119、120、防空警報聲)。
沒有四種聲音的頻率庫,其他的給你做個示範吧:
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV SP,#5FH
MOV TMOD,#11H
SETB EA
SETB ET0
SETB ET1
LOOP:
LCALL KEYSCAN
MOV A,R2
JNZ LP1
MOV DPTR,#TAB110
SJMP LPRUN
LP1:
DEC A
JNZ LP2
MOV DPTR,#TAB119
SJMP LPRUN
LP2:
DEC A
JNZ LP3
MOV DPTR,#TAB120
SJMP LPRUN
LP3:
DEC A
JNZ LP4
MOV DPTR,#TABBOMB
SJMP LPRUN
LP4:
LJMP LOOP
LPRUN:
MOVX A,@DPTR
MOV TL0,A
INC DPTR
MOVX A,@DPTR
MOV TH0,A
............;時長控制也可以做到表裡,計算後賦值給T1
LJMP LOOP
END
Ⅱ 單片機設計倒計時蜂鳴器報警的編程代碼
int sec=60;
int cnt=0;
char Buzzer=1;//關閉蜂鳴器
void Timer0Init(void) //5毫秒@11.0592MHz
{
AUXR &= 0x7F; //定時器時鍾12T模式
TMOD &= 0xF0; //設置定時器模式
TL0 = 0x00; //設置定時初值
TH0 = 0xEE; //設置定時初值
TF0 = 0; //清除TF0標志
ET0 = 1;//開T0中斷
EA = 1;//開總中斷
TR0 = 1; //定時器0開始計時
}
void Timer0Interrupt(void) interrupt 1
{
cnt++;
if(cnt>=200)
{
cnt=0;sec--;
if(sec==0)EA=0;
}
}
其它就自己寫了。
if(sec==0)Buzzer=0;
Ⅲ C51單片機系列警報器編程
#include<stc89xx.h>
#define uchar unsigned char
sbit fmq=P4^4;
sbit key=P1^7;
bit flag;
uchar times;
uchar cnt;
void t0isr() interrupt 1
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
if(flag)
{
fmq=~fmp;
num++;
if(num>=10)
{
flag=~flag;
num=0;
}
}
else
{
cnt++;
cnt%=2;
if(cnt==0)
{
fmq=~fmq;
num++;
if(num>=10)
{
num=0;
flag=~flag;
}
}
}
}
main()
{
TMOE=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
ET0=1;
EA=1;
while(1)
{
if(key==0)
{
TR0=1;
}
else TR0=0;
}
}
Ⅳ 想用單片機開發一個溫度濕度警報器,當溫度濕度過高時,觸發警報。需要哪些東西
單片機最小系統就不用說了吧 就是能讓單片機工作起來 然後是濕度的感測器 和報警器 這些分別與單片機的某些引腳連接 接著就是單片機的編程 這個東西不大 用54應該能實現了 編程也就是說 當開啟電源後 感測器開始檢測 寫一個報警的值 當達到這個值時 單片機發送個電平給報警器讓起工作 報警.
Ⅳ 單片機溫度報警器的溫度上下限按鍵調控的C語言程序怎麼編
溫度報警器就是需要溫度感測器不停地對監控的對象進行檢測,例如pt100溫度感測器,pt100感測器是不同溫度下,阻值會不同,在同一溫度下,阻值是相同的。根據這個原理通過電路轉換成電壓,然後模擬量轉換成數字量輸入到單片機,單片機根據讀取到的電壓值判斷實際溫度值,然後根據設定的報警值比較,如果超過 就進行報警動作。
在實際設計過程中那個報警溫度的設定,可以直接對那個變數進行加減的,例如
void actfuntion(unsigned char temp)
{
temp++;
}
然後在檢測到按鍵有電平跳變的時候,就調用這個含參子函數對定義的溫度設定值進行加操作,減操作也是一樣,還可以在調用的後面進行最大值或者最小值的判斷。
如果覺得這樣一下一下的按太麻煩了,可以對按鍵進行長按連續觸發進行判斷,就是在定時器里進行判斷按下時間,然後不停的調用這個子函數。
當然這個設定值是需要考慮掉電保存的,或者是按鍵保存。可以在設定好溫度值之後,在按下其他的按鍵,進行把溫度設定值 保存到單片機內部eeprom就可以了,不需要保存太多數據的情況下,現在市面上很多單片機都有的內部eeprom就夠用的了,不需要進行外部擴展。
然後在單片機上電,也就是主函數的開頭進行讀取eeprom中保存的設定值。
Ⅵ STC89C52單片機,用C語言編溫度報警器的程序
我們可以給你提供。 //初始化DS18B20
//讓DS18B20一段相對長時間低電平, 然後一段相對非常短時間高電平, 即可啟動
void dsInit()
{
//對於11.0592MHz時鍾, unsigned int型的i, 作一個i++操作的時間大於8us
unsigned int i;
ds = 0;
i = 100; //拉低約800us, 符合協議要求的480us以上
while(i>0) i--;
ds = 1; //產生一個上升沿, 進入等待應答狀態
i = 4;
while(i>0) i--;
}
void dsWait()
{
unsigned int i;
while(ds);
while(~ds); //檢測到應答脈沖
i = 4;
while(i > 0) i--;
}
//向DS18B20讀取一位數據
//讀一位, 讓DS18B20一小周期低電平, 然後兩小周期高電平,
//之後DS18B20則會輸出持續一段時間的一位數據
bit readBit()
{
unsigned int i;
bit b;
ds = 0;
i++; //延時約8us, 符合協議要求至少保持1us
ds = 1;
i++; i++; //延時約16us, 符合協議要求的至少延時15us以上
b = ds;
i = 8;
while(i>0) i--; //延時約64us, 符合讀時隙不低於60us要求
return b;
}
//讀取一位元組數據, 通過調用readBit()來實現
unsigned char readByte()
{
unsigned int i;
unsigned char j, dat;
dat = 0;
for(i=0; i<8; i++)
{
j = readBit();
//最先讀出的是最低位數據
dat = (j << 7) | (dat >> 1);
}
return dat;
}
}
//向DS18B20發送溫度轉換命令
void sendChangeCmd()
{
dsInit(); //初始化DS18B20, 無論什麼命令, 首先都要發起初始化
dsWait(); //等待DS18B20應答
delay(1); //延時1ms, 因為DS18B20會拉低DQ 60~240us作為應答信號
writeByte(0xcc); //寫入跳過序列號命令字 Skip Rom
writeByte(0x44); //寫入溫度轉換命令字 Convert T
}
//向DS18B20發送讀取數據命令
void sendReadCmd()
{
dsInit();
dsWait();
delay(1);
writeByte(0xcc); //寫入跳過序列號命令字 Skip Rom
writeByte(0xbe); //寫入讀取數據令字 Read Scratchpad
}
//獲取當前溫度值
int getTmpValue()
{
int value; //存放溫度數值
float t;
unsigned char low, high;
sendReadCmd();
//連續讀取兩個位元組數據
low = readByte();
high = readByte();
tmpvalue = high;
tmpvalue <<= 8;
tmpvalue |= low;
value = tmpvalue;
//使用DS18B20的默認解析度12位, 精確度為0.0625度, 即讀回數據的最低位代表0.0625度
t = value * 0.0625;
value = t * 100 + (value > 0 ? 0.5 : -0.5); //大於0加0.5, 小於0減0.5
return value;
}
unsigned char const timeCount = 3; //動態掃描的時間間隔
//顯示當前溫度值, 精確到小數點後一位
//若先位選再段選, 由於IO口默認輸出高電平, 所以當先位選會使數碼管出現亂碼
/*void display()
{
unsigned int tmp = abs(tempValue);
switch(sum)
{
case 1: PA8255=table[tmp % 10]; PB8255=0xfe; delay(1);
PA8255=table[ tmp % 100 / 10]; PB8255=0xfd; delay(1);
PA8255=tableWidthDot[ tmp % 1000 / 100]; PB8255=0xfb; delay(1);
PA8255=table[tmp % 10000 / 1000]; PB8255=0xf7; delay(1); PB8255=0xff;break; //顯示溫度
case 2: PA8255=table[0]; PB8255=0xfe; delay(1);
PA8255=tableWidthDot[high%10]; PB8255=0xfd; delay(1);
PA8255=table[high/10]; PB8255=0xfb; delay(1); PB8255=0xff; break; //顯示上限溫度
case 3: PA8255=table[0]; PB8255=0xfe; delay(1);
PA8255=tableWidthDot[low%10]; PB8255=0xfd; delay(1);
PA8255=table[low/10]; PB8255=0xfb; delay(1); PB8255=0xff; break; //顯示下限溫度
default: break;
}
} */
Into() interrupt 0
{ sum++;
if(sum==4)
sum=1;
}
uchar keyscan() //鍵盤掃描,調整溫度上下限
{
PC8255=0xfc;
if((PC8255&0xc0)!=0xc0)
{
delay(40);
if((PC8255&0xc0)!=0xc0)
PC8255=0xfe;
if((PC8255&0xc0)==0x80)
high++;
if((PC8255&0xc0)==0x40)
high--;
PC8255=0xfd;
if((PC8255&0xc0)==0x80)
low++;
if((PC8255&0xc0)==0x40)
low--;
}
}
void main()
{
unsigned int tmp ;
COM8255=0x88;
IT0=1; //外部中斷0,採用外部中斷0進行實時溫度,上限溫度和下限溫度之間的顯示切換
EX0=1;
EA=1;
P1_0=0x1;
sum=1;
high=22; //初始溫度上下限設定
low=10;
while(1)
{
//啟動溫度轉換
sendChangeCmd();
tempValue = getTmpValue();
keyscan();// 讀取鍵值
tmp = abs(tempValue); //讀取溫度
switch(sum)
{
case 1: PA8255=table[tmp % 10]; PB8255=0xfe; delay(1);
PA8255=table[ tmp % 100 / 10]; PB8255=0xfd; delay(1);
PA8255=tableWidthDot[ tmp % 1000 / 100]; PB8255=0xfb; delay(1);
PA8255=table[tmp % 10000 / 1000]; PB8255=0xf7; delay(1); PB8255=0xff;break; //顯示溫度
case 2: PA8255=table[0]; PB8255=0xfe; delay(1);
PA8255=tableWidthDot[high%10]; PB8255=0xfd; delay(1);
PA8255=table[high/10]; PB8255=0xfb; delay(1); PB8255=0xff; break; //顯示上限溫度
case 3: PA8255=table[0]; PB8255=0xfe; delay(1);
PA8255=tableWidthDot[low%10]; PB8255=0xfd; delay(1);
PA8255=table[low/10]; PB8255=0xfb; delay(1); PB8255=0xff; break; //顯示下限溫度
default: break;
}
if(tmp>(high*100)|tmp<(low*100) ) //&&tempValue>low) //超過溫度設定范圍,系統自動報警
{
P1_0=0;
}
else
P1_0=1; }
}
Ⅶ 51單片機蜂鳴器程序是什麼
51單片機蜂鳴器程序為:
#include"reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit beep=P1^5;
void delay(u16 i)
{
while(i--);
}
void main()
{
while(1)
{
beep=~beep;
delay(1000);//控制音調頻率
beep=~beep;/控制聲音大小
delay(10);
}
}
(7)單片機警報器編程擴展閱讀:
BUZZER蜂鳴器的分類:
1、按其驅動方式的原理分,可分為:有源蜂鳴器(內含驅動線路,也叫自激式蜂鳴器)和無源蜂鳴器(外部驅動,也叫他激式蜂鳴器)。
2、按構造方式的不同,可分為:電磁式蜂鳴器和壓電式蜂鳴器。
3、按封裝的不同,可分為:DIP BUZZER(插針蜂鳴器)和SMD BUZZER(貼片式蜂鳴器)。
4、按電流的不同,可分為:直流蜂鳴器和交流蜂鳴器,其中,以直流最為常見壓電式蜂鳴器,用的是壓電材料,即當受到外力導致壓電材料發生形變時壓電材料會產生電荷。同樣,當通電時壓電材料會發生形變。
電磁式蜂鳴器,主要是利用通電導體會產生磁場的特性,用一個固定的永久磁鐵與通電導體產生磁力推動固定在線圈上的鼓膜。
由於兩種蜂鳴器發音原理不同,壓電式結構簡單耐用但音調單一音色差,適用於報警器等設備。而電磁式由於音色好,所以多用於語音、音樂等設備。
Ⅷ 51單片機數碼管0832煙霧報警器的編程程序
#include<at89x52.h>
#include <intrins.h>
sbit ST=P3^2;
sbit OE=P3^0;
sbit EOC=P3^1;
unsigned char aa,bb,cc;
unsigned char ge,shi,dge,dshi;
unsigned adata[]={5,10,15,20,25,30,35,40,50,60,75,80,85,90,95,99,70};
void delay30ms()
{
unsigned char a,b;
for(a=10;a>0;a--)
for(b=50;b>0;b--);
}
delay1ms()
{
unsigned int a,b;
for(a=50;a>0;a--)
for(b=50;b>0;b--);
}
unsigned char code tab1[]=
{
0x3f,6,0x5b,0x4f,0x66,0x6d,0x7d,7,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
void disly()
{
P2_2=0;
P2_3=1;
P2_4=1;
P2_5=1;
P0=tab1[ge];
delay1ms();
P2_2=1;
P2_3=0;
P2_4=1;
P2_5=1;
P0=tab1[shi];
delay1ms();
P2_2=1;
P2_3=1;
P2_4=0;
P2_5=1;
P0=tab1[dge];
delay1ms();
P2_2=1;
P2_3=1;
P2_4=1;
P2_5=0;
P0=tab1[dshi];
delay1ms();
}
void zhuan()
{
ge=aa%10;
shi=aa/10;
dge=bb%10;
dshi=bb/10;
}
void get1 ()
{
ST=0;
ST=1;
ST=0;
while(EOC==0);
OE=1;
cc=P1;
OE=0;
}
void main()
{
bb=50;
P0=0xff;
while(1)
{
get1() ;
aa=cc/2.56;
zhuan();
disly();
if(aa>=bb){ P2_0=~P2_0;
P2_1=1;}
else { P2_0=0;
P2_1=0;
}
if(P3_4==0) {delay1ms();
bb++;
}
if(P3_5==0) {delay1ms();
bb-- ;
}
}
}
Ⅸ 單片機報警器程序
請問你需要對什麼報警呢?溫度,濕度?
還是只是單純的給個時間讓蜂鳴器響?我有寫好的程序,