導航:首頁 > 操作系統 > 單片機ofe

單片機ofe

發布時間:2025-07-28 08:24:06

1. Proteus模擬單片機測量空氣濕度

幾點說明:

1.主要是分以下幾個模塊寫的:SHT10,LCD1602,主函數,頭文件。

2.每支SHTxx感測器都在25℃(77 °F)和 3.3V條件下進行過標定並且完全符合精度指標.因為考慮到實際硬體5V的電壓比較好操作,所以SHT10用的精度採用的為5V時的參數。其他的都採取默認值(14bit濕度, 12bit 溫度)。

3.SHT10中所以部分我都編寫了。有的部分在本次程序中沒用到,也可以作為參考。

4.所有程序都已經加了注釋,且有模擬圖。

5.個人認為還可以在此基礎上添加個中斷。

6.程序編寫keil 4 ,模擬 protues7.5

/***********************************************************************************************************************************************************/

頭文件(tou.h):

#ifndef __TOU_H__

#define __TOU_H__

#include<reg52.h>

#include <intrins.h>

//#include <math.h> //Keil library

#define uchar unsigned char

enum {TEMP,HUMI};

sbit DATA = P1^7;

sbit SCK = P1^6;

sbit LcdRs= P2^4;

sbit LcdRw= P2^5;

sbit LcdEn= P2^6;

sfr DBPort= 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.數據埠

/******** DS1602函數聲明 ********/

void LCD_Initial();

void GotoXY(unsigned char x, unsigned chary);

void Print(unsigned char *str);

void LCD_Write(bit style, unsigned charinput);

/******** SHT10函數聲明 ********/

void s_connectionreset(void);

char s_measure(unsigned char *p_value,unsigned char *p_checksum, unsigned char mode);

void calc_sth10(float *p_humidity ,float*p_temperature);

//float calc_dewpoint(float h,float t);

#endif

/***********************************************************************************************************************************************************/

SHT10程序(SHT10.c):

#include<tou.h>

#define noACK 0 //繼續傳輸數據,用於判斷是否結束通訊

#define ACK 1//結束數據傳輸;

//地址命令 讀/寫

#define STATUS_REG_W 0x06 //0000011 0

#define STATUS_REG_R 0x07 //0000011 1

#define MEASURE_TEMP 0x03 //0000001 1

#define MEASURE_HUMI 0x05 //0000010 1

#define RESET 0x1e//000 1111 0

//寫位元組程序

char s_write_byte(unsigned char value)

{

unsignedchar i,error=0;

for(i=0x80;i>0;i>>=1)//高位為1,循環右移

{

if(i&value) DATA=1; //和要發送的數相與,結果為發送的位

else DATA=0;

SCK=1;

_nop_();_nop_();_nop_(); //延時3us

SCK=0;

}

DATA=1; //釋放數據線

SCK=1;

error=DATA; //檢查應答信號,確認通訊正常

_nop_();_nop_();_nop_();

SCK=0;

DATA=1;

returnerror; //error=1 通訊錯誤

}

//讀位元組程序

char s_read_byte(unsigned char ack)

//----------------------------------------------------------------------------------

{

unsignedchar i,val=0;

DATA=1; //釋放數據線

for(i=0x80;i>0;i>>=1) //高位為1,循環右移

{

SCK=1;

if(DATA) val=(val|i); //讀一位數據線的值

SCK=0;

}

DATA=!ack; //如果是校驗,讀取完後結束通訊;

SCK=1;

_nop_();_nop_();_nop_(); //延時3us

SCK=0;

_nop_();_nop_();_nop_();

DATA=1; //釋放數據線

returnval;

}

//啟動傳輸

void s_transstart(void)

// generates a transmission start

//_____ ________

// DATA: |_______|

//___ ___

// SCK : ___| |___||______

{

DATA=1; SCK=0; //准備

_nop_();

SCK=1;

_nop_();

DATA=0;

_nop_();

SCK=0;

_nop_();_nop_();_nop_();

SCK=1;

_nop_();

DATA=1;

_nop_();

SCK=0;

}

//連接復位

void s_connectionreset(void)

// communication reset: DATA-line=1 and atleast 9 SCK cycles followed by transstart

//_____________________________________________________ ________

// DATA:|_______|

//_ _ __ _ __ _ ____ ___

// SCK : __| |__| |__| |__| |__| |__| |__||__| |__| |______| |___| |______

{

unsignedchar i;

DATA=1;SCK=0; //准備

for(i=0;i<9;i++) //DATA保持高,SCK時鍾觸發9次,發送啟動傳輸,通迅即復位

{

SCK=1;

SCK=0;

}

s_transstart(); //啟動傳輸

}

//軟復位程序

char s_softreset(void)

// resets the sensor by a softreset

{

unsignedchar error=0;

s_connectionreset(); //啟動連接復位

error+=s_write_byte(RESET); //發送復位命令

returnerror; //error=1 通訊錯誤

}

/*讀狀態寄存器

char s_read_statusreg(unsigned char*p_value, unsigned char *p_checksum)

//----------------------------------------------------------------------------------

// reads the status register with checksum(8-bit)

{

unsignedchar error=0;

s_transstart(); //transmission start

error=s_write_byte(STATUS_REG_R);//send command to sensor

*p_value=s_read_byte(ACK); //read status register (8-bit)

*p_checksum=s_read_byte(noACK); //read checksum (8-bit)

returnerror; //error=1 incase of no response form the sensor

}

2. 關於單片機方面的英文文獻,最還有翻譯

基於單片機的電子表設計
摘要:近年來隨著計算機在社會領域的滲透和大規模集成電路的發展,單片機的應用正在不斷地走向深入,由於它具有功能強,體積小,功耗低,價格便宜,工作可靠,使用方便等特點,因此特別適合於與控制有關的系統,越來越廣泛地應用於自動控制,智能化儀器,儀表,數據採集,軍工產品以及家用電器等各個領域,單片機往往是作為一個核心部件來使用,在根據具體硬體結構,以及針對具體應用對象特點的軟體結合,以作完善。
本次做的電子表是以單片機(AT89S51)為核心,結合相關的元器件(共陰極LED數碼顯示器、BCD-鎖存/7段解碼等),再配以相應的軟體,達到實現時鍾日歷顯示的功能,也具有日歷計算、顯示和時鍾、日歷的校準,以及多路開關定時輸出等功能,其硬體部分難點在於元器件的選擇、布局及焊接。
Based on the design of electronic SCM
Abstract: In recent years, with computer penetration in the social sphere and the development of large-scale integrated circuits, MCU applications are constantly deepening, as it has a function of strong, small size, low power consumption, cheap, reliable, Easy to use, and other characteristics, and therefore particularly suited to control the system, more widely used in automatic control, intelligent instruments, meters, data acquisition, military procts and household appliances, and other fields, the MCU is often as a core Parts to use, in accordance with specific hardware and application-specific characteristics of the object with software to make perfect.
This is done in electronic form SCM (AT89S51) as the core, the combination of related components (of cathode LED digital display, BCD-latch / 7 of the decoder, and so on), Coupled with the corresponding software, to achieve Clock calendar shows that the function of the calendar also calculated, display and the clock, the calendar of calibration, and multi-channel Kaiguandingshi output, and other functions, some of its hardware components is difficult choice, layout and welding.

3. 51單片機兩個I/O口分別接ds18b20程序

//DS從機程序
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define SLAVE 0x01
#define BN 6
sbit LCD_RS = P2^5; /*定義LCD控制埠*/
sbit LCD_RW = P2^6;
sbit LCD_EN = P2^7;

sbit DS1=P1^0;
sbit DS2=P1^1;
sbit key3=P3^5;
sbit tem=P3^3;
sbit win=P3^4;
sbit key1=P3^6;
sbit key2=P3^7;
uint temp1,temp2,tempH,tempL; // variable of temperature
uchar flag1,aa,we;
uchar A1,A2,A3,A4,B1,B2,B3,B4; // sign of the result positive or negative
uchar dis1[16]={76,45,84,'0','0','.','0',32,32,72,45,84,'0','0','.','0'};
uchar dis2[16]={48,49,32,'0','0','.','0',32,32,48,50,32,'0','0','.','0'};
uchar code tab[] = {'0','1','2','3','4','5','6','7','8','9'};
uchar trbuf[6];
bit tready;
bit rready;
void str(void);
void sre(void);

void delay(int ms)
{
int i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}

/*******************************************************************/
/* */
/*檢查LCD忙狀態 */
/*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數據。 */
/* */
/*******************************************************************/

bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (bit)(P0&0x80);
LCD_EN = 0;
return result;
}

/*******************************************************************/
/* */
/*寫指令數據到LCD */
/*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。 */
/* */
/*******************************************************************/

void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN = 1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN = 0;
}

/*******************************************************************/
/* */
/*寫顯示數據到LCD */
/*RS=H,RW=L,E=高脈沖,D0-D7=數據。 */
/* */
/*******************************************************************/

void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN = 1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN = 0;
}

/*******************************************************************/
/* */
/* 設定顯示位置 */
/* */
/*******************************************************************/

void lcd_pos(uchar pos)
{
lcd_wcmd(pos|0x80); //數據指針=80+地址變數
}

/*******************************************************************/
/* */
/* LCD初始化設定 */
/* */
/*******************************************************************/

void lcd_init()
{
lcd_wcmd(0x38); //16*2顯示,5*7點陣,8位數據
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x38);
delay(5);

lcd_wcmd(0x0c); //顯示開,關游標
delay(5);
lcd_wcmd(0x06); //移動游標
delay(5);
lcd_wcmd(0x01); //清除LCD的顯示內容
delay(5);
lcd_wcmd(0x06); //向右移動游標
delay(5);
}

/*******************************************************************/
/* */
/* 閃動子程序 */
/* */
/*******************************************************************/

void flash()
{
delay(600); //控制停留時間
lcd_wcmd(0x08); //關閉顯示
delay(200); //延時
lcd_wcmd(0x0c); //開顯示
delay(200); //延時
lcd_wcmd(0x08); //關閉顯示
delay(200); //延時
lcd_wcmd(0x0c); //開顯示
delay(200);
}

/*void delay(uint count) //delay
{
uint i;
while(count)
{
i=100;
while(i>0)
i--;
count--;
}
} */
///////功能:串口初始化,波特率9600,方式1///////
void Init(void)
{
TMOD=0x20;
TL1=0xfd;
TH1=0xfd;
PCON=0x00;
TR1=1;
SCON=0xf0;
ES=1;
EA=1;
}

void dsreset(uchar DS) //send reset and initialization command 18B20復位,初始化函數
{
uint i;
if(DS==1)
{
DS1=0;
i=103;
while(i>0)i--;
DS1=1;
i=4;
while(i>0)i--;
}
if(DS==2)
{
DS2=0;
i=103;
while(i>0)i--;
DS2=1;
i=4;
while(i>0)i--;
}
}

bit tmpreadbit(uchar DS) //read a bit 讀DS2 1位數據函數
{
uint i;
bit dat;
if(DS==1)
{
DS1=0;i++; //i++ for delay
DS1=1;i++;i++;
dat=DS1;
i=8;while(i>0)i--;
}
if(DS==2)
{
DS2=0;i++; //i++ for delay
DS2=1;i++;i++;
dat=DS2;
i=8;while(i>0)i--;
}
return (dat);
}

uchar tmpread(uchar DS) //read a byte date 讀1位元組函數
{
uchar i,j,dat;
dat=0;
if(DS==1)
{
for(i=1;i<=8;i++)
{
j=tmpreadbit(1);
dat=(j<<7)|(dat>>1); //讀出的數據最低位在最前面,這樣剛好一個位元組在DAT里
}
}
if(DS==2)
{
for(i=1;i<=8;i++)
{
j=tmpreadbit(2);
dat=(j<<7)|(dat>>1); //讀出的數據最低位在最前面,這樣剛好一個位元組在DAT里
}
}
return(dat);
}

void tmpwritebyte(uchar dat,uchar DS) //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(DS==1)
{
if(testb) //write 1
{
DS1=0;
i++;i++;
DS1=1;
i=8;while(i>0)i--;
}
else
{
DS1=0; //write 0
i=8;while(i>0)i--;
DS1=1;
i++;i++;
}
}
if(DS==2)
{
if(testb) //write 1
{
DS2=0;
i++;i++;
DS2=1;
i=8;while(i>0)i--;
}
else
{
DS2=0; //write 0
i=8;while(i>0)i--;
DS2=1;
i++;i++;
}
}
}
}

void tmpchange(uchar DS) //DS18B20 begin change 開始獲取數據並轉換
{
if(DS==1)
{
dsreset(1);
delay(1);
tmpwritebyte(0xcc,1); // address all drivers on bus 寫跳過讀ROM指令
tmpwritebyte(0x44,1);
} // initiates a single temperature conversion 寫溫度轉換指令
if(DS==2)
{
dsreset(2);
delay(1);
tmpwritebyte(0xcc,2); // address all drivers on bus 寫跳過讀ROM指令
tmpwritebyte(0x44,2);
} // initiates a single temperature conversion 寫溫度轉換指令
}

uint tmp1(void) //get the temperature 讀取寄存器中存儲的溫度數據
{
float tt;
uchar a,b;
dsreset(1);
delay(1);
tmpwritebyte(0xcc,1);
tmpwritebyte(0xbe,1);
a=tmpread(1); //讀低8位
b=tmpread(1); //讀高8位
temp1=b;
temp1<<=8; //two byte compose a int variable 兩個位元組組合為1個字
temp1=temp1|a;
tt=temp1*0.0625; //溫度在寄存器中是12位,解析度是0.0625
temp1=tt*10+0.5; //乘10表示小數點後只取1位,加0.5是四折五入
//temp1=temp1+5; //誤差補償
return temp1;
}
uint tmp2( void) //get the temperature 讀取寄存器中存儲的溫度數據
{
float tt;
uchar a,b;
dsreset(2);
delay(1);
tmpwritebyte(0xcc,2);
tmpwritebyte(0xbe,2);
a=tmpread(2); //讀低8位
b=tmpread(2); //讀高8位
temp2=b;
temp2<<=8; //two byte compose a int variable 兩個位元組組合為1個字
temp2=temp2|a;
tt=temp2*0.0625; //溫度在寄存器中是12位,解析度是0.0625
temp2=tt*10+0.5; //乘10表示小數點後只取1位,加0.5是四折五入
//temp2=temp2+5; //誤差補償
return temp2;
}
void delay10ms() //delay
{
uchar a,b;
for(a=10;a>0;a--)
for(b=60;b>0;b--);
}

uchar display(uint temp1,uint temp2) //顯示程序
{
uchar i;
A1=temp1/100;
A2=temp1%100/10;
A3=temp1%100%10;

B1=temp2/100;
B2=temp2%100/10;
B3=temp2%100%10;

trbuf[0]=A1;
trbuf[1]=A2;
trbuf[2]=A3;
trbuf[3]=B1;
trbuf[4]=B2;
trbuf[5]=B3;

dis1[3]=tab[tempL*10/100];
dis1[4]=tab[tempL*10%100/10];
dis1[6]=tab[tempL*10%100%10];

dis1[12]=tab[tempH*10/100];
dis1[13]=tab[tempH*10%100/10];
dis1[15]=tab[tempH*10%100%10];
dis2[3]=tab[A1];
dis2[4]=tab[A2];
dis2[6]=tab[A3];

dis2[12]=tab[B1];
dis2[13]=tab[B2];
dis2[15]=tab[B3];

delay(1);
lcd_pos(0); //設置顯示位置為第一行的第1個字元
delay(2);
for(i=0;i<16;i++)
{
lcd_wdat(dis1[i]);
}
delay(2);
lcd_pos(0x40);
delay(2);
for(i=0;i<16;i++)
{
lcd_wdat(dis2[i]);
}

return (A1,A2,A3,B1,B2,B3);
}
void TemC()
{
if(temp1<=(tempL*10)||temp2<=(tempL*10)) tem=0;
else tem=1;
if (temp1>=(tempH*10)||temp2>=(tempH*10)) win=0;
else win=1;
}

uchar chan()
{
if(key1==0)
{
tempL++;
while(key1==0);
if(tempL>35)
tempL=0;
}

if(key2==0)
{
tempH++;
while(key2==0);
if(tempH>35)
tempH=0;
}
return (tempH,tempL);
}

/******************************************************************************/

void main()
{ //uchar a;

//uchar i;
delay(10);
lcd_init();
Init();
tempH=35;
tempL=15;
while(1)
{
tmpchange(1);
tmpchange(2);
tmp1();
tmp2();
chan();
TemC();
display(temp1,temp2);

tready=1;
rready=1;
}
}
void ssio(void)interrupt 4
{
uchar a;
RI=0;
ES=0;
if(SBUF!=SLAVE)
{
ES=1;
goto reti;
}
SM2=0;
SBUF=SLAVE;
while(TI!=1);
TI=0;
while(RI!=1);
RI=0;

if(RB8==1)
{
SM2=1;
ES=1;
goto reti;
}
a=SBUF;
if(a==0x02)
{
if(tready==1)
SBUF=0x02;
else
SBUF=0x00;
while(TI!=1);
TI=0;

str();
goto reti;
}
else
{
SBUF=0x08;
while(TI!=1);
TI=0;
SM2=1;
ES=1;
}
reti:RI=0;
SM2=1;
ES=1;

}
void str(void)
{
uchar i;
tready=0;
while(1)
{

tmpchange(1);
tmpchange(2);
tmp1();
tmp2();
chan();
TemC();
display(temp1,temp2);
for(i=0;i<BN;i++)
{
SBUF=trbuf[i];
while(TI!=1);
TI=0;
}
while(RI!=1);
RI=0;
if(RB8==1)goto loop;
}
loop:SM2=1;
ES=1;
}

4. C51單片機中怎麼寫一個中斷程序,可以用一個溫度感測器來實現。當溫度過高時就自動報警。

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS=P3^7; //define interface 定義DS18B20介面
uint temp; // variable of temperature
uchar flag1; // sign of the result positive or negative
sbit p0_5=P0^5;
sbit p2_7=P2^7;
sbit p2_4=P2^4;
sbit p2_5=P2^5;
sbit p2_6=P2^6;

unsigned char code TABLE[]={
0xd7,0x11,0xcd,0x5d,0x1b,
0x5e,0xde,0x15,0xdf,0x5f,
0x9f,0xdf,0xc6,0xd7,0xce,0x8e};
void delay(uint count) //delay
{
uint i;
while(count)
{
i=200;
while(i>0)
i--;
count--;
}
}
void Init_Com(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
}
void dsreset(void) //send reset and initialization command
{
uint i; //DS18B20初始化
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
}
bit tmpreadbit(void) //read a bit 讀一位
{
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 讀一個位元組
{
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
{ //寫一個位元組到DS18B20里
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //write 1 寫1部分
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0; //write 0 寫0部分
i=8;while(i>0)i--;
DS=1;
i++;i++;
}
}
}

void tmpchange(void) //DS18B20 begin change 發送溫度轉換命令
{
dsreset(); //初始化DS18B20
delay(1); //延時
tmpwritebyte(0xcc); // 跳過序列號命令
tmpwritebyte(0x44); //發送溫度轉換命令
}
uint tmp() //get the temperature 獲得溫度
{
float tt;
uchar a,b;
dsreset();
delay(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe); //發送讀取數據命令
a=tmpread(); //連續讀兩個位元組數據
b=tmpread();
temp=b;
temp<<=8; //two byte compose a int variable
temp=temp|a; //兩位元組合成一個整型變數。
tt=temp*0.0625; //得到真實十進制溫度值,因為DS18B20
//可以精確到0.0625度,所以讀回數據的最低位代表的是
//0.0625度。
temp=tt*10+0.5; //放大十倍,這樣做的目的將小數點後第一位
//也轉換為可顯示數字,同時進行一個四捨五入操作。
return temp; //返回溫度值
}
void delay10ms() //delay
{
uchar a,b;
for(a=10;a>0;a--)
for(b=60;b>0;b--);
}
void display(uint temp)
{
uchar a,b,c,d;
a=temp/100;
b=temp/10-a*10;
d=temp%10;
c=(temp%100-d)/10;

P0=TABLE[d];
p0_5=0;
p2_7=0;
delay(1);
p2_7=1;

P0=TABLE[c];
p2_4=0;
delay(1);
p2_4=1;

P0=TABLE[b];
p0_5=1;
p2_5=0;
delay(1);
p2_5=1;

P0=TABLE[a];
p2_6=0;
delay(1);
p2_6=1;
}

void main() //主函數
{
uchar a;
Init_Com(); //初始化串口
do
{
tmpchange(); //溫度轉換
for(a=10;a>0;a--)
{
display(tmp()); //顯示十次
}
}
while(1);
}

5. 用單片機設計製作一個模擬的十字路口交通信號燈控制系統。

摘 要

在日常生活中,交通信號燈的使用,使交通得以有效管理,對於疏導交通流量、提高道路通行能力,減少交通事故有明顯效果。交通燈控制系統由80C51單片機、鍵盤、LED顯示、交通燈延時組成。系統除具有基本交通燈功能外,還具有時間設置、LED信息顯示功能,市交通實現有效控制。

關鍵字:交通燈;單片機;自動控制;LED

Abstract

In daily life, the use of traffic lights, so traffic can be managed effectively in smoothing traffic flow, increase road capacity and rece traffic accidents have remarkable results. Traffic light control system consists of 80C51 microcontroller, keypad, LED display, traffic light delay component. In addition to the traffic light system has the basic functions, but also with time settings, LED information display function, achieving effective control of city traffic

Key Words:traffic lights; SCM; control; LED

目 錄

1 交通燈任務、功能要求說明及總體方案介紹 …………………………………1
1.1 交通燈任務…………………………………………………………………1
1.2 功能要求說明………………………………………………………………1
1.3 設計總體方案介紹及工作原理說明………………………………………2
2 交通燈硬體系統的設計 …………………………………………………………4
2.1 硬體系統各模塊功能介紹…………………………………………………4
2.2 電路原理圖 ………………………………………………………………5
2.3 電路PCB圖 ………………………………………………………………5
2.4 元器件布局圖 ……………………………………………………………5
2.5 元器件清單 ………………………………………………………………5
3 交通燈軟體系統的設計 …………………………………………………………7
3.1 單片機的使用資源情況 …………………………………………………7
3.2 軟體模塊功能介紹 ………………………………………………………8
3.3 程序流程圖 ………………………………………………………………8
3.4 程序清單 …………………………………………………………………10
4 設計總結…………………………………………………………………………11
4.1 使用說明 …………………………………………………………………11
4.2 誤差分析 …………………………………………………………………11
4.3 設計體會 …………………………………………………………………11
4.4 教學建議 …………………………………………………………………12
參考文獻 ……………………………………………………………………………13
致 謝 ………………………………………………………………………………14
附錄一 電路原理圖 ………………………………………………………………15
附錄二 電路PCB頂層圖 …………………………………………………………16
附錄三 電路PCB底層圖 …………………………………………………………17
附錄四 元器件布局圖 ……………………………………………………………18
附錄五 元器件清單 ………………………………………………………………19
附錄六 程序清單…………………………………………………………………20
1 交通燈任務、功能要求說明及總體方案介紹

1.1 交通燈任務
設計一個具有特定功能的十字路口交通燈。該交通燈上電或按鍵復位後能自動顯示系統提示符「P.」, 進入准備工作狀態。按開始鍵則開始工作,按結束鍵則返回「P.」狀態。要求甲車道和乙車道兩條交叉道路上的車輛交替運行,甲車道為主車道,每次通車時間為60秒,乙車道為次車道,每次通車時間為30秒,要求黃燈亮3秒,並且1秒閃爍一次。有應急車輛出現時,紅燈全亮,應急車輛通車時間10秒,同時禁止其他車輛通過。
1.2 功能要求說明
本次課程設計在硬體方面的接法如下:P2口接二極體,P2.0、P2.1、P2.2口線分別來控制東西方向的綠燈、黃燈和紅燈;P2.3、P2.4、P2.5口線分別控制南北方向的紅燈、黃燈和綠燈。P0口作為數碼管的位控(這里只用到了P0.0、和P0.1兩根口線),P1口作為數碼管的段控,P3口作為輸入部分(這里用到了P3.0、P3.1、P3.2口線),控制數碼管的顯示情況和二極體的亮滅情況。
當交通燈上電或按鍵復位後能自動顯示系統提示符「P.」,進入准備工作狀態。
當按下啟動按鈕K1並釋放後,數碼管顯示將會從「60」開始倒計時,每隔一秒減1,此時南北方向開始一直亮綠燈,東西方向一直亮紅燈,直到顯示為「00」時,數碼管將會從「03」開始倒計時,每隔一秒減1,此時南北方向每隔一秒黃燈就閃爍一次,東西方向亮一直紅燈,直到顯示為「00」時,數碼管將會從「30」開始倒計時,此時南北方向一直亮紅燈,東西方向一直亮綠燈,直到顯示為「00」時,數碼管又將從「03」開始倒計時,此時南北方向一直亮紅燈,東西方向每隔一秒黃燈就閃爍一次;當沒有其他鍵按下時,交通燈將這樣一直循環下去。
當按下結束鍵K2並釋放後,數碼管將顯示「P.」,東西南北方向無燈亮。
當按下緊急鍵K3並釋放後,數碼管將顯示「09」,並且每隔一秒就減1,
東西南北方向全部紅燈亮。
單片機採用AT89S52,fosc=12MHZ。其按鍵功能如表1.1所示。

表1.1 按鍵功能
按鍵 鍵名 功能
P3.4 K1鍵 啟動鍵
P3.7 K2鍵 結束鍵
P3.6 K3鍵 緊急鍵
1.3 設計總體方案介紹及工作原理說明
1.3.1 總體方案介紹
該交通燈電路由單片機AT98S52、鍵盤介面電路、顯示介面電路、發光二極體控制電路、時鍾電路和復位電路構成,原理框圖如圖1.1所示。
圖1.1 原理框圖
(1) 電源提供方面
採用獨立的穩壓電源,此方案的優點是穩定可靠,且有各種成熟電路可供使用。
(2) 顯示方面
完全採用數碼管顯示,用來顯示有限符號和數碼字元。
(3) 鍵盤輸入方面
直接在I/O口線上接按鍵開關,因為設計時精簡和優化了電路,所以剩餘的口資源還比較多。我們共用到了4個按鍵,分別為:K0、K1、K2、K3。
1.3.2 工作原理
首先時鍾電路產生單片機工作時所需要的時鍾信號,這是單片機能夠正常工作的前提,而單片機有無定時的基礎以及定多長的時間,這些還需要我們人為的確定。我是採用10ms延時程序來反復調用來定時,在我們的硬體電路中,按鍵的鍵功能程序在中斷服務中,在正常情況下會不斷運行主程序,當有鍵按下時,CPU去轉去執行中斷程序,而中斷程序可以執行三種鍵功能:第一個是十秒倒計時緊急紅燈亮;第二個是結束倒計時,顯示P.;第三個是重新開始倒計時。其原理是INTO=P3.4&P3.6&P3.7,當有鍵按下時,外部中斷0口線就會變成低電平,通過鍵掃程序來具體判斷到底是哪個鍵按下,CPU才會去執行中斷裡面的某個鍵功能。12個發光二極體是由P0口控制的,P0口與二極體之間串接一個限流電阻使二極體不易燒壞,採用送低電平有效。

2 交通燈硬體系統的設計

2.1 硬體系統各模塊功能介紹
2.1.1 顯示電路
在本次課程設計中,我們採用的是四位一體共陽數碼管。本設計的顯示驅動是採用三極體作為驅動。並且,無論是位控線上還是段控線上都串接一個電阻,以提高其輸出功率,在這里採用220歐母電阻。
2.1.2 指示燈控制電路
本次課程設計採用P3口控制二極體的發光情況,口線送低電平有效,具體設計如下:P3.2控制東西方向的綠燈,P3.4口控制東西方向的黃燈,P3.5控制東西方向的紅燈,P3.1控制南北方向的紅燈,P3.7控制南北方向的黃燈,P3.0控制南北方向的綠燈。
2.1.3 鍵盤控制電路
鍵盤是最常用的輸入設備,是實現人機對話的紐帶。按其結構形式可分為非編碼鍵盤和編碼鍵盤。
編碼鍵盤採用硬體方法產生鍵碼。每按下一個鍵,鍵盤能自動生成鍵盤代碼,鍵數較多,且具有去抖動功能。這種鍵盤使用方便,但硬體較復雜。非編碼鍵盤僅提供按鍵開關工作狀態,其鍵碼由軟體確定,這種鍵盤鍵數較少,硬體簡單,廣泛應用於各種單片機應用系統,在單片機控制電路中,可把單片機使用的鍵盤分為獨立式和矩陣式兩種。獨立式實際上就是一組獨立的按鍵,這些按鍵可直接與單片機的I/O口連接,即每個按鍵獨佔一條口線,這種接法簡單。矩陣式鍵盤也稱行列式鍵盤,因為鍵的數目較多,所以鍵按行列組成矩陣。本設計中鍵盤數目較少,且為安裝方便,因此在本設計中採用獨立式接法。
按從一個鍵到鍵的功能被執行主要應包括兩項工作:一是鍵的識別,即在鍵盤中找出被按的是哪個鍵,另一項是鍵功能的實現。第一項工作是使用介面電路實現的,而第二項工作則是通過執行中斷服務程序來完成。具體來說,鍵盤介面應完成以下操作功能:
(1) 鍵盤掃描,以判定是否有鍵被按下(稱之為「閉合鍵」)。
(2) 鍵識別,以確定閉合鍵的行列位置。
(3) 產生閉合鍵的鍵碼。
(4) 排除多鍵、串鍵(復鍵)及去抖動。
以上這些內容通常是以軟硬體結合的方式來完成的,即在軟體的配合下由介面電路來完成。但具體哪些由硬體哪些由軟體完成,要看介面電路的情況。總的原則是,硬體復雜軟體就簡單,硬體簡單軟體就得復雜一些。
2.1.4 時鍾電路
時鍾電路用來產生單片機工作所需要的時鍾信號,單片機本身就是一個復雜的同步時序電路,為了保證同步工作方式的實現,電路應在唯一的時鍾信號控制下嚴格地按時序進行工作。通過在晶元的外部XTAL1和XTAL2兩個引腳跨接晶體振盪器和微調電容,形成反饋電路,就構成了一個穩定的自激振盪電路。時鍾電路為單片機產生時鍾脈沖序列,本設計中採用的晶振頻率為12MHz,電容為33pF。
2.1.5 復位電路
復位電路用於產生復位信號,通過RST引腳送入單片機,復位是單片機的初始操作,其主要功能是:為一些專用寄存器設置初始狀態、程序狀態字PSW清0、程序計數器PC被賦值為0000H等,除了進入系統的正常初始化之外,當由於程序運行出錯或操作錯誤使系統處於死鎖狀態時,為擺脫困境,也需安裝復位鍵以重新啟動。RST引腳是復位信號的輸入端,復位信號是高電平有效,完成復位操作共需要24個狀態周期,復位結束後,單片機從地址0000H單元開始執行程序,SP為07H,其它寄存器大多數被置為00H,本設計使用頻率為12MHz的晶振,所以復位信號持續時間應超過2μs才能完成復位操作。復位電路分為上電復位、按鍵復位、按鍵脈沖復位三種,本次課程設計採用的是按鍵復位。
2.1.6 單片機最小系統
它採用單片機AT89S52晶元,能實現基本I/O口實驗,定時計數器實驗等等。具有單片機並口的輸入、輸出的功能特點。
2.2 電路原理圖
電路原理圖見附錄一所示。
2.3 電路PCB圖
電路PCB頂層圖見附錄二所示;
電路PCB頂層圖見附錄三所示。
2.4 元器件布局圖
元器件布局圖見附錄四所示。
2.5 元器件清單
元器件清單見附錄五所示。

3 交通燈軟體系統的設計

3.1 單片機的使用資源情況
3.1.1 硬體資源使用說明
 P0口為二極體的控制端
 P1口用作地址/數據匯流排
 P2口用作地址/數據匯流排
 P3.4、P3.6、P3.7口線作為鍵盤輸入端
 採用了INTO外部中斷
既在AT89S52的P0口用來接十二個發光二極體的陰極,控制其亮與滅,P1口和P2口外接由2個LED數碼管(LED1、LED0)構成的顯示器,用P2口作LED的段碼輸出口(P2.0~P2.7對應於LED的a~dp),P1口作LED的位控輸出線(P1.1、P1.0分別對應於LED1、LED0),其中在P1的串列口外接2個三極體作為顯示驅動,顯示為2個數碼管(LED0~LED1)進行動態顯示。P3口外接三個個按鍵K1、K2、K3(分別對應於P3.4、P3.7、P3.6口)用於調整顯示介面電路。
3.1.2 交通燈的分配表
交通燈的口線分配如表3.1所示,「1」表示送高電平,「0」表示送低電平。
表3.1 交通燈分配表
P0.2 東西綠燈 1 1 0 1
P0.3 東西黃燈 1 1 1 0
P0.4 東西紅燈 0 0 1 1
P0.5 南北紅燈 1 1 0 0
P0.6 南北黃燈 1 0 1 1
P0.7 南北綠燈 0 1 1 1
控制碼 6FH AFH DBH D7H

狀態說明 南北放行,東西禁止 南北警告,東西禁止 南北禁止,東西放行 南北禁止,東西放行
3.2 軟體模塊功能介紹
主程序模塊的主要任務是程序的初始化顯示「P.P.」,當沒任何鍵按下時,顯示模塊將一直不變,交通燈全部是熄滅的,當K0鍵按下並松開後開始倒計時,
其中在時間顯示的過程中判斷是否有K0、K1和K2鍵按下,當再次按下K0時,顯示將重新開始倒計時,如果是K1按下,將顯示「P.」,並且發光二極體全部熄滅,如果是K2按下,數碼管將開始十秒倒計時,並且東西南北全部亮起紅燈。
3.3 程序流程圖
主程序的流程圖如圖3.1所示,按鍵判斷程序流程圖如圖3.2所示

圖3.1 主程序流程圖

圖3.2 判斷按鍵程序流程圖

3.4 程序清單
程序清單詳見附錄六 。

4 設計總結

4.1 使用說明
本實驗主要是利用單片機AT89S52、數碼管和發光二極體組成,整個電路結構比較簡單,它能實現以下幾個功能:
 時間的顯示。
 紅黃綠燈的發光與熄滅。
具體操作說明如下: 當交通燈上電或按鍵復位後能自動顯示系統提示符「P.」,進入准備工作狀態。當按下啟動按鈕K1並釋放後,數碼管顯示將會從「60」開始倒計時,每隔一秒減1,此時南北方向開始一直亮綠燈,東西方向一直亮紅燈,直到顯示為「00」時,數碼管將會從「03」開始倒計時,每隔一秒減1,此時南北方向沒隔一秒黃燈就閃爍一次,東西方向亮一直紅燈,直到顯示為「00」時,數碼管將會從「30」開始倒計時,此時南北方向一直亮紅燈,東西方向一直亮綠燈,直到顯示為「00」時,數碼管又將從「03」開始倒計時,此時南北方向一直亮紅燈,東西方向每隔一秒黃燈就閃爍一次;當沒有其他鍵按下時,交通燈將這樣一直循環下去。當按下結束鍵K2並釋放後,數碼管將顯示「P.」,東西南北方向無燈亮,當有其它鍵按下時,就退出,去執行該鍵的鍵功能。當按下緊急鍵K3並釋放後,數碼管將顯示「10」,並且每隔一秒就減1,東西南北方向全部紅燈亮,當沒亮到顯示「00」就有其它鍵按下時,就退出,執行該鍵的鍵功能,當顯示到「00」時,就會自動退出中斷繼續完成主程序。
4.2 誤差分析
本次課程設計的誤差就在於顯示時間,我採用的是調用延時程序來讓顯示器上數字共顯示一秒鍾,而循環一次的時間並不僅僅只是2次調用延時程序的時間,其間CPU還執行其它指令,例如說將緩存區的內容送給累加器A、查表指令、將段控碼送給P2口等等,因為它們都是微秒級的,而延時程序是毫秒級的,因此在計算的過程中就可以省略了,每次循環除兩次調用延時程序外,所用時間為22微秒,而顯示一秒鍾共循環了50次,因此在顯示器上只需要顯示1秒數字,事實上多顯示了1100微秒,誤差率=1.1%。
4.3 設計體會
經過一個多星期的時間,終於完成了這次的課程設計。在這期間,其他同學提出了許多寶貴的意見,使這次設計終於完滿成功了。
我覺得作為一名自動化專業的學生,單片機的課程設計是很有意義的。更重要的是如何把自己平時所學的東西應用到實際中。雖然自己對於這門課懂的並不多,很多基礎的東西都還沒有很好的掌握,覺得很難,也沒有很有效的辦法通過自身去理解,但是靠著這一個多禮拜的「學習」,在同學的幫助和講解下,漸漸對這門課逐漸產生了些許的興趣,自己開始主動學習並逐步從基礎慢慢開始弄懂它。我認為這個收獲應該說是相當大的。
經過這次課程設計,也讓我更加深刻的認識到學好單片機的重要意義。當今單片機滲透到我們生活的各個領域比如從導彈的導航裝置、飛機上各種儀表的控制、計算機的網路通訊與數據傳輸、自動控制領域的機器人、智能儀表、醫療器械、工業自動化過程的實時控制和數據處理等等到我們生活中接觸到的各種智能IC卡、民用豪華轎車的安全保障系統、錄像機、攝像機、全自動洗衣機的控制以及程式控制玩具、電子寵物等等,這些都離不開單片機。它主要是作為控制部分的核心部件。因此,單片機的學習、開發在各行各業異常重要。在今後的學習中,我會更加努力的學習鞏固單片機,為以後的工作打下堅固的基礎。
4.4 教學建議
在王韌老師的嚴格要求與耐心指導下,經過一個學期對單片機技術這門課程的學習,使我對單片機這一技術的應用有了一定的了解,並對單片機的學習產生了濃厚的興趣。
通過本次單片機控制交通燈的設計,結合本人的學習過程與切身感受向老師提出以下幾點教學意見:希望老師以後能夠在一開始教這門課的時候就讓整個班分好小組,讓那些對單片機比較熟悉的同學幫助基礎較差的同學,那樣可以提高學習的效率與熱情;另外,王老師可以多介紹些與單片機相關的資料書給學生,培養學生查閱資料書的能力;最後一點,就是王老師在單片機擴展方面不必講解的過細,重點在於引導思路,形成單片機的整體框架結構。

附錄一 電路原理圖

附錄二 PCB頂層圖

附錄三 PCB底層圖

附錄四 元器件布局圖

附錄五 交通燈元器件清單

元器件及材料名稱 規格 數目 備注
AT89S52加底座 1
四位一體共陽數碼管加底座 2 0.5寸
晶振 12MHz 1 三晶
發光二極體 大個的 9
單排插 40腳 1
三極體 9012 9
蜂鳴器 1 5V
小按鍵 9 6*6*4.3mm
下載口座子 十芯 1 FC-10P
18b20溫度感測器 1
六腳按鍵開關 1 6*6*4.3mm
Usb電源線加介面 1 USB線加USB介面
電阻 200 1
電阻 4.7K 1
電阻 1K 3
電阻 470 24
電解電容 22uf 1
瓷片電容 33pf 2
排阻 10k 2
短路帽 3
杜邦線8P 1
PCB板子 150mm*200mm 1
電源白色插座 1

附錄六 程序清單

ORG 0000H
LJMP MAIN
ORG 001BH
LJMP LOOP1
ORG 0030H
MAIN: MOV PSW, #00H; 初始化
MOV SP, #7FH
MOV TMOD, #10H;
MOV TH1, #3CH;
MOV TL1, #0B0H;
MOV TH0, #0FCH;
MOV TL0, #18H;
MOV 78H, #11H;
MOV 79H, #10H;
MOV 7AH, #10H;
MOV 7BH, #10H;
MOV 7CH, #10H;
MOV 7DH, #10H;
MOV 7EH, #10H;
MOV 7FH, #10H;
MOV R7, #0FAH;
MOV R6, #32H;
MOV R5, #05H;
MOV R4, #39H;
MOV R1, #20;
SETB EA;
SETB ET1;
PP: LCALL DIR;
START: LCALL KEY;
JB 20H.0, K0;
LJMP PP;
K0: MOV R4, #39H;
MOV R1, #20;
SETB TR1;
MOV 78H, #07H;
MOV 79H, #05H;
MOV 7AH, #10H;
MOV 7BH, #10H;
MOV 7CH, #10H;
MOV 7DH, #10H;
MOV 7EH, #10H;
MOV 7FH, #10H;
LCALL DIR;
CYCLE0: MOV P3, #0DEH;主綠副紅
JB 20H.2, OUT;
KK0: JB 20H.1, JINJI;

CJNE R4, #00, CYCLE0;延時60秒
MOV R4, #03H;

MOV 78H, #03H;
MOV 79H, #00H;
CYCLE1: MOV P3, #0DFH;
JB 20H.2, OUT;
JB 20H.1, JINJI;
CJNE R1, #10, CYCLE1;
CYCLE2: MOV P3, #0DDH;
JB 20H.2, OUT;
JB 20H.1, JINJI;
CJNE R1, #20, CYCLE2;
CJNE R4, #00H, CYCLE1;
MOV R4, #1EH;

MOV 78H, #07H;
MOV 79H, #02H;
CYCLE3: MOV P3, #0F3H;主紅副綠
JB 20H.2, OUT;
JB 20H.1, JINJI;
CJNE R4, #00, CYCLE3;延時30秒
MOV R4, #03H;

MOV 78H, #03H;
MOV 79H, #00H;
CYCLE4: MOV P3, #0DFH;
JB 20H.2, OUT;
JB 20H.1, JINJI;
CJNE R1, #10, CYCLE4;
CYCLE5: MOV P3, #0DDH;
JB 20H.2, OUT;
JB 20H.1, JINJI;
CJNE R1, #20, CYCLE5;
CJNE R4, #00H, CYCLE4;
MOV R4, #39H;
LJMP K0;

JINJI: MOV R4, #10;緊急車輛按鍵
CYCLE6: MOV P3, #0DBH
CJNE R4, #00, CYCLE6;
LJMP K0;

OUT: MOV P3, #0FFH;
MOV 78H, #11H;
MOV 79H, #10H;
MOV 7AH, #10H;
MOV 7BH, #10H;
MOV 7CH, #10H;
MOV 7DH, #10H;
MOV 7EH, #10H;
MOV 7FH, #10H;
MOV R7, #0FAH;
LJMP PP;

DIR: PUSH DPH; 顯示子程序
PUSH DPL;
PUSH ACC;
PUSH PSW;
SETB RS0;
CLR RS1;
MOV R0, #78H;
MOV R3, #0FEH;
MOV A, R3;
LD0: MOV P2, A;
MOV DPTR, #TABLE;
MOV A, @R0;
MOVC A, @A+DPTR;
MOV P0, A;
LCALL DELAY;
INC R0;
MOV A, R3;
JB ACC.7, LD1;
RL A;
MOV R3, A;
LJMP LD0;
LD1: CLR RS0; 恢復當前通用寄存器組組號
CLR RS1;
POP PSW;
POP ACC; 恢復現場
POP DPL;
POP DPH;
RET;

TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H; 0--6
DB 0F8H,80H,90H,88H,83H,0C6H,0A1H; 7--D
DB 86H,8EH,0FFH,0CH; E--F,滅,P.

KEY: LCALL KEYCHULI;鍵掃程序
JZ EXIT;
LCALL XX0;
LCALL KEYCHULI
JZ EXIT;
MOV B, 20H;
KEYSF: LCALL KEYCHULI;
JZ KEY1;
LCALL XX0;
LJMP KEYSF;
KEY1: MOV 20H, B;
EXIT: RET;

KEYCHULI: MOV P1, #0FFH;
MOV A, P1;
CPL A;
ANL A, #0FH;
MOV 20H, A;
RET;

DELAY: DJNZ R7, DELAY;顯示延時子程序
MOV R7, #0FAH;
DJNZ R5, DELAY;
MOV R5, #05H;
RET;

; 定時1秒中斷程序:
LOOP1:
MOV TH1, #3CH;定時器0賦初值,定時50ms
MOV TL1, #0B0H;
LCALL DIR;
LCALL KEY;
DJNZ R1, RETURN;
DEC R4;
MOV R1, #20;
MOV R0, #79H;
LCALL DADD1;
RETURN: RETI;

; 去抖延時子程序:
XX0: DJNZ R7, XX0;
MOV R7, #0FAH;
DJNZ R6, XX0;
MOV R6, #32H;
RET;

減一子程序:
DADD1: MOV A, @R0;
DEC R0;
SWAP A;
ORL A, @R0;
SUBB A, #01H;
DA A;
MOV R2, A;
ANL A, #0FH;
MOV @R0, A;
MOV A, R2;
INC R0;
ANL A, #0F0H;
SWAP A;
MOV @R0, A;
RET;

END

6. 單片機中的看門狗是什麼東西,有什麼作用

看門狗(WDT)是一個定時器。看門狗是用來防止萬一單片機程序出錯造成重大損失的。防錯的原理很簡單,它在硬體上就是一個定時器,當它溢出的時候就會讓單片機強制復位使程序重新開始執行。

正常的情況下是不能讓它溢出的,所以在程序上每隔一段時間要給他置一次值(俗稱喂狗),只要程序中正常給它喂他就不會溢出。

一旦程序跑飛了,有干擾或者進入死循環之類的情況時,不能正常執行程序了,那麼就永遠執行不到喂狗的指令了,但此時定時器是硬體控制的,仍然會走,所以溢出了,單片機就復位了。

一般安全性要求比較高的,系統跑飛了會造成重大事故的都會加一個「狗」保安全。

通常,看門狗的溢出時間越短越靈敏,跑飛之後復位的時間越短,也就越安全,但是,喂狗的操作也要更頻繁。

(6)單片機ofe擴展閱讀:

看門狗工作原理:

使用時,WDT將遞增直到溢出或「超時」。 除非處於休眠或空閑模式,否則WDT超時將強制器件復位。 為避免WDT超時復位,用戶必須使用PWRSAV或CLRWDT指令定期清除看門狗定時器。 如果WDT在休眠或空閑模式下超時。

器件將喚醒並從執行PWRSAV指令的位置繼續執行代碼。 在以上兩種情況下,WDTO位(RCON <4>)將被置1,表明器件復位或喚醒事件是由WDT超時引起的。

如果WDT將CPU從睡眠或空閑模式喚醒,則還將置位「睡眠」狀態位(RCON <3>)或「空閑」狀態位(RCON <2>),表明該設備先前已上電。 保存模式。

在正常操作期間,WDT超時將產生設備復位。 當設備處於睡眠狀態時,WDT超時將喚醒設備以繼續正常操作(稱為WDT喚醒)。 清零WDTE設置位可以永久關閉WDT。 後分頻器分配完全由軟體控制,也就是說,可以在程序執行期間隨時更改它。

為避免不可預測的器件復位,當從Timer0預分頻器分配更改為WDT後分頻器分配時,必須執行以下指令序列。 即使禁止了WDT,也必須執行該指令序列。

7. 基於51單片機的溫度控制器

圖片為溫度控制電路圖。溫度到達上限時led燈亮,並停止對RT的加熱,溫度達到下限時led燈滅並開始對RT進行加熱。A1和A2為uA741運算放大器。引腳號在圖上已經標出。再給你一個單片機採集DS18B20溫度的程序,用四位數碼管顯示的。你把DS18B20接在RT附近就可以測試出RT的溫度,調節圖中的滑動變阻器可改變溫度的上下限。這樣就能做到溫度控制了。

//安裝目錄下的EXE文件打開後可在電腦上顯示當前溫度值

#include<reg52.h>

#defineucharunsignedchar

#defineuintunsignedint

sbitDS=P1^0;//defineinterface

uinttemp;//variableoftemperature

ucharflag1;//

//sbitla=P2^6;

//sbitwela=P2^7;

//unsignedcharcodetable2[]={0x3f,0x30,0x5b,0x4f,0x66,0x6d,0x7d,

//0x07,0x7f,0x67/*,0x77,0x7c,0x39,0x5e,0x79,0x71*/};

//unsignedcharcodetable1[]={0xbf,0xb0,0xdb,0xcf,0xe6,0xed,0xfd,

//0x87,0xff,0xe7};

//unsignedcharcodetable2[]={0x40,0x5e,0x24,0x21,0x13,0x09,0x08,

//0x63,0x00,0x03/*,0x77,0x7c,0x39,0x5e,0x79,0x71*/};

//unsignedcharcodetable1[]={0xc0,0xde,0xa4,0xa1,0x93,0x89,0x88,

//0xe7,0x8f,0x87};

unsignedcharcodetable5[]={0x77,0x22,0x6d,0x5d,0x1e,0x5b,0x7b,

0x15,0x7f,0x1f};

unsignedcharcodetable6[]={0xf7,0xa2,0xed,0xdd,0x9e,0xdb,0xfb,

0x95,0xff,0x9f};

voiddelay(uintcount)//delay

{

uinti;

while(count)

{

i=200;

while(i>0)

i--;

count--;

}

}

///////功能:串口初始化,波特率9600,方式1///////

voidInit_Com(void)

{

TMOD=0x20;

PCON=0x00;

SCON=0x50;

TH1=0xFd;

TL1=0xFd;

TR1=1;

}

voiddsreset(void)//復位,初始化函數

{

uinti;

DS=0;

i=103;

while(i>0)i--;

DS=1;

i=4;

while(i>0)i--;

}

bittmpreadbit(void)//readabit讀1位數據函數

{

uinti;

bitdat;

DS=0;i++;//i++fordelay

DS=1;i++;i++;

dat=DS;

i=8;while(i>0)i--;

return(dat);

}

uchartmpread(void)//readabytedate讀1位元組函數

{

uchari,j,dat;

dat=0;

for(i=1;i<=8;i++)

{

j=tmpreadbit();

dat=(j<<7)|(dat>>1);//讀出的數據最低位在最前面,這樣剛好一個位元組在DAT里

}

return(dat);

}

voidtmpwritebyte(uchardat)//writeabytetods18b20向1820寫一個位元組數據函數

{

uinti;

ucharj;

bittestb;

for(j=1;j<=8;j++)

{

testb=dat&0x01;

dat=dat>>1;

if(testb)//write1

{

DS=0;

i++;i++;

DS=1;

i=8;while(i>0)i--;

}

else

{

DS=0;//write0

i=8;while(i>0)i--;

DS=1;

i++;i++;

}

}

}

voidtmpchange(void)//DS18B20beginchange開始獲取數據並轉換

{

dsreset();

delay(1);

tmpwritebyte(0xcc);//addressalldriversonbus寫跳過讀ROM指令

tmpwritebyte(0x44);//寫溫度轉換指令

}

uinttmp()//getthetemperature讀取寄存器中存儲的溫度數據

{

floattt;

uchara,b;

dsreset();

delay(1);

tmpwritebyte(0xcc);

tmpwritebyte(0xbe);

a=tmpread();//讀低8位

b=tmpread();//讀高8位

temp=b;

temp<<=8;//twobytecomposeaintvariable兩個位元組組合為1個字

temp=temp|a;

tt=temp*0.0625;//溫度在寄存器中是12位,解析度是0.0625

temp=tt*10+0.5;//乘10表示小數點後只取1位,加0.5是四折五入

returntemp;

}

voidreadrom()//readtheserial

{

ucharsn1,sn2;

dsreset();

delay(1);

tmpwritebyte(0x33);

sn1=tmpread();

sn2=tmpread();

}

voiddelay10ms()//delay

{

uchara,b;

for(a=10;a>0;a--)

for(b=60;b>0;b--);

}

voiddisplay(uinttemp) //顯示程序

{

ucharA1,A2,A2t,A3,ser;

ser=temp/10;

SBUF=ser;

A1=temp/100;

A2t=temp%100;

A2=A2t/10;

A3=A2t%10;

//la=0;

d4=0;

P0=table5[A1];

delay(1);

d4=1; //顯示百位

//la=1;

//la=0;

/*wela=0;

P0=0x7e;

wela=1;

wela=0; */

//la=0;

d3=0;

P0=table6[A2];

delay(1);

d3=1; //顯示十位

//la=1;

//la=0;

/*wela=0;

P0=0x7d;

wela=1;

wela=0; */

d2=0;

P0=table5[A3];

delay(1);

d2=1; //顯示個位

//la=1;

//la=0;

/*P0=0x7b;

wela=1;

wela=0; */

}

voidmain()

{

uchara;

Init_Com();

do

{

tmpchange();

//delay(200);

for(a=1;a>0;a--)

{display(tmp());

}

}while(1);

}

8. 求《單片機溫度測量系統設計》的相關資料!

要:本文介紹了一種基於MSP430 單片機的溫度測控裝置。該裝置可實現對溫度的測量,並能根據設定值對環境溫度進行調節,實現控溫的目的。控制演算法基於數字PID演算法。

0 引言
溫度是工業控制中主要的被控參數之一,特別是在冶金、化工、建材、食品、機械、石油等工業中,具有舉足重輕的作用。隨著電子技術和微型計算機的迅速發展,微機測量和控制技術得到了迅速的發展和廣泛的應用[1]。單片機具有處理能強、運行速度快、功耗低等優點,應用在溫度測量與控制方面,控制簡單方便,測量范圍廣,精度較高。
本文設計了一種基於MSP430單片機的溫度測量和控制裝置,能對環境溫度進行測量,並能根據溫度給定值給出調節量,控制執行機構,實現調節環境溫度的目的。

1 整體方案設計
單片機溫度控制系統是以MSP430單片機為控制核心。整個系統硬體部分包括溫度檢測系統、信號放大系統、A/D轉換、單片機、I/O設備、控制執行系統等。
單片機溫度控制系統控制框圖如下所示:

溫度感測器將溫度信息變換為模擬電壓信號後,將電壓信號放大到單片機可以處理的范圍內,經過低通濾波,濾掉干擾信號送入單片機。在單片機中對信號進行采樣,為進一步提高測量精度,采樣後對信號再進行數字濾波。單片機將檢測到的溫度信息與設定值進行比較,如果不相符,數字調節程序根據給定值與測得值的差值按PID控制演算法設計控制量,觸發程序根據控制量控制執行單元。如果檢測值高於設定值,則啟動製冷系統,降低環境溫度;如果檢測值低於設定值,則啟動加熱系統,提高環境溫度,達到控制溫度的目的。

2 溫度信號檢測
本系統中對檢測精度要求不是很高,室溫下即可,所以選用高精度熱敏電阻作為溫度感測器。熱敏電阻具有靈敏度較高、穩定性強、互換精度高的特點。可使放大器電路極為簡單, 又免去了互換補償的麻煩。
熱敏電阻具有負的電阻溫度特性,當溫度升高時,電阻值減小,它的阻值—溫度特性曲線是一條指數曲線,非線性度較大。而對於本設計,因為溫度要求不高,是在室溫環境下,熱敏電阻的阻值與環境溫度基本呈線性關系[2],這樣可以通過電阻分壓簡單地將溫度值轉化為電壓值。
給熱敏電阻通以恆定的電流,可得到電阻兩端的電壓,根據與熱敏電阻特性有關的溫度參數T0 以及特性系數k,可得下式
T=T0-kV(t) (1)
式中T為被測溫度。
根據上式,可以把電阻值隨溫度的變化關系轉化為電壓值隨溫度變化的關系,由於熱敏電阻的電信號一般都是毫伏級,必須經過放大,將熱敏電阻測量到的電信號轉化為0~3.6之間,才能在單片機中使用。
下圖為放大電路原理圖。穩壓管的穩壓值為1.5V。

由於感測器輸出微弱的模擬信號,當信號中存在環境干擾時,干擾信號也被同時放大,影響檢測的精度,需用濾波電路對先對模擬信號進行處理,以提高信號的抗干擾能力。本系統採用巴特沃斯二階有源低通濾波電路。選取該巴特沃斯二階有源低通濾波電路的截止頻率
fH=10 kHz 。

3 控制系統設計
3.0 軟體設計
單片機溫度控制器控制溫度范圍100℃到400℃,採用通斷控制,通過改變給定控制周期內加熱和製冷設備的導通和關斷時間,來提高和降低溫度,以達到調節溫度的目的。
軟體設計中選取控制周期TC 為200(T1×C) ,導通時間取Pn ×T1×C ,其中Pn 為輸出的控制量,Pn值介於0~200之間, T1 為定時器定時的時間,C為常數。由上兩式可看出,通過改變T1 定時時間或常數C,就可改變控制周期TC 的大小。溫度控制器控制的最高溫度為400℃,當給定溫度超過400℃時以400℃計算。
圖3為采樣中斷流程圖。

數模轉換部分使用單片機自帶的12位A/D轉換器,能同時實現數模轉換和控制,免去使用專用的轉換晶元,使系統處理速度更快,精度更高,使電路簡化。采樣周期為500 μs ,當採集完16個點的數據以後,設置標志「nADCFlag =1」,通知主程序採集完16個點的數據,主程序從全局緩沖區里讀出數據。
為進一步減小隨機信號對系統精度的影響,A/D轉換後,用平均值法對采樣值進行數字濾波。每16個采樣點取一次平均值。然後將計算到的平均值作為測量數據進行顯示。同時,按照PID演算法,對溫度采樣值和給定值之間的偏差進行控制,得到控制量。采樣全過程完成後就可屏蔽采樣中斷,同時啟動T1定時[3],進入控制過程。
溫度值和熱敏電阻的測量值在整個溫度采樣區間內基本呈線性變化,因此在程序中不需要對測量數據進行線性校正。MSP430的T1定時器中斷作為控制中斷,溫度采樣過程和控制輸出過程採用了互鎖結構,即在進行溫度采樣,溫度值處理和運算等過程時T1不定時,待采樣全過程進行完時再啟動T1定時並同時屏蔽采樣中斷。T1定時開始就進入控制過程,在整個控制過程中都不採樣,直到200(T1×C) 定時時間到,要開始新一輪的控制周期。在啟動采樣的同時屏蔽T1中斷。
圖4為T1定時中斷流程圖。

圖中,M代表定時器控制周期計數值,N則表示由調節器計算出的控制量。首先判斷控制周期TC是否己經結束。若控制周期TC已結束(即M=0),則屏蔽T1定時器中斷,進行新一輪溫度采樣;若控制周期TC還未結束〔即M≠0 〕,則開始判斷導通時間是否結束。若導通時間己結束(即N=0),則置輸出控制信號為低,並重新賦常數C值,啟動定時器定時,同時退出中斷服務程序;若導通時間還未結束(即N ≠0 ),則置輸出控制信號為高,控制執行其間繼續導通,重新賦常數C值,啟動定時器定時,同時退出中斷服務程序。

3.1 數字PID
本文控制演算法採用數字PID 控制,數字PID 演算法表達式如下所示:

其中,KP 為比例系數;KI=KPT/TI 為積分系數;T 為采樣周期,TI 為積分時間系數;KD=KPTD/T 為微分系數,TD 為微分時間系數。u(k) 為調節器第k次輸出, e(k) 為第k 次給定與反饋偏差。
對於PID 調節器,當偏差值輸出較大時,輸出值會很大,可能導致系統不穩定,所以在實際中,需要對調節器的輸出限幅[4],即當|u|>umax 時,令u=umax 或u=-umax ,或根據具體情況確定。

3.2 溫度調節
PI 控制器根據溫度給定值和測量值之間的偏差調節,給出調節量,再通過單片機輸出PWM 波,調節可控硅的觸發相位的相位角,以此來控制執行部件的關斷和開啟時間,達到使溫度升高或降低的目的。隨後整個系統再通過檢測前一階段控制後的溫度,進行近一步的控制修正,最終實現預期的溫度監控目的。

4 結論
本設計利用單片機低功耗、處理能力強的特點,使用單片機作為主控制器,對室內環境溫度進行監控。其結構簡單、可靠性較高,具有一定的實用價值和發展前景。

參考文獻
[1] 趙麗娟,邵欣.基於單片機的溫度監控系統的設計與實現.機械製造,2006,44(1)
[2] 張開生,郭國法.MCS-51 單片機溫度控制系統的設計.微計算機信息,2005,(7)
[3] 沈建華,楊艷琴,翟驍曙..MSP430 系列16 位超低功耗單片機原理與應用.清華大學出版社,2004,148-155
[4] 賴壽宏.微型計算機控制技術.北京:機械工業出版社,1994:90-95

閱讀全文

與單片機ofe相關的資料

熱點內容
材料力學劉鴻文第五版pdf 瀏覽:420
雲伺服器容易崩潰嗎 瀏覽:929
廣州的程序員在哪裡上班 瀏覽:55
一帶一路pdf 瀏覽:11
倒扣19個點演算法 瀏覽:708
paperwhitepdf 瀏覽:147
全款解壓的車能要不 瀏覽:766
設計模式之禪pdf 瀏覽:291
女程序員轉行學什麼好 瀏覽:741
部隊退伍程序員 瀏覽:323
模擬時鍾python 瀏覽:451
飢荒伺服器如何變流暢 瀏覽:704
微信電腦版不能連接到伺服器地址 瀏覽:354
一秒解壓多少mb 瀏覽:405
我命令你馬上娶我晉江 瀏覽:245
php中引入html 瀏覽:104
伺服器配置文件怎麼調 瀏覽:339
怎麼用cmd命令啟動weblogic 瀏覽:679
今日頭條程序員創作 瀏覽:885
java網路編程第四版pdf 瀏覽:628