實(shí)驗(yàn)2 中斷和定時(shí)計(jì)數(shù)器實(shí)驗(yàn)
1.當(dāng)單片機(jī)的INT0進(jìn)入低電平觸發(fā)方式,進(jìn)入相應(yīng)的中斷服務(wù)程序,P0口做輸出口,接8只發(fā)光二極管,點(diǎn)亮發(fā)光二級(jí)管,控制蜂鳴器響。當(dāng)INT1為低電平時(shí)進(jìn)入中斷服務(wù)程序,發(fā)光二級(jí)管滅。
接線:將P0和JP1連接、P3和JP5連接
#include
#define uchar unsigned char
#define uint unsigned int
sbit beer=P1^5;//蜂鳴器
sbit button0=P3^2;//獨(dú)立按鍵3
sbit button1=P3^3;//獨(dú)立按鍵4
voidint0()interrupt0//外部中斷0
{
P0=0;
beer=0;
}
voidint1()interrupt2//外部中斷1
{
P0=0xff;
beer=1;
}
voidinit(){//初始化中斷
IT0=0;
IT1=0;
EA=1;//開啟中斷總允許
EX0=1;//外部中斷0允許位
EX1=1;//外部中斷2允許位
}
intmain(){
init();
while(1){}//讓程序跑死
return0;
}
2.選擇外部中斷0(P3.2),邊沿觸發(fā),進(jìn)入相應(yīng)中斷服務(wù)程序,在中斷服務(wù)程序中,數(shù)碼管顯示加1,在0-9之間循環(huán)接線:JP5+P3;J12+P0
#include
#define uchar unsigned char
#define uint unsigned int
uint code NumTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//數(shù)字的編碼
sbit button0=P3^2;//獨(dú)立按鍵3
uchar Count=0;
//延時(shí)函數(shù)
voiddelay_1ms(uint x){
uint i=x;
uint j;
for(;i>0;--i){
for(j=110;j>0;--j);
}
}
/**
在數(shù)碼管上顯示對(duì)應(yīng)的值
**/
voiddisplay(uchar Num)
{
P0=NumTable[Num];
delay_1ms(1);
P0=0;//送完段選信號(hào)后,進(jìn)行消影的處理
}
voidint0()interrupt0//外部中斷0
{
Count++;
}
voidinit(){//初始化中斷
IT0=1;
EA=1;//開啟中斷總允許
EX0=1;//外部中斷0允許位
}
intmain(){
init();//初始化
while(1){
if(Count==10){
Count=0;
}else{
display(Count);
}
}
return0;
}
3實(shí)驗(yàn)板上完成如下功能:用定時(shí)0實(shí)現(xiàn)8個(gè)發(fā)光二極管以1s間隔閃爍,用定時(shí)器1實(shí)現(xiàn)數(shù)碼管的前兩位59s循環(huán)計(jì)時(shí)。#include
#define uint unsigned int
#define uchar unsigned char
/**
用定時(shí)0實(shí)現(xiàn)8個(gè)發(fā)光二極管以1s間隔閃爍,用定時(shí)器1實(shí)現(xiàn)數(shù)碼管的前兩位59s循環(huán)計(jì)時(shí)。
1、定時(shí)器0的初始化
2、時(shí)鐘1s的計(jì)算
3、定時(shí)器1循環(huán)計(jì)時(shí)
接線方式:
1、P0接數(shù)碼管J12,實(shí)現(xiàn)段選
2、譯碼器和數(shù)碼管位選輸入短接,J15+J16
3、P3控制發(fā)光二極管,P3+JP1
4、P2用來控制譯碼器的輸入
**/
//========全局變量區(qū)============================================
uint code NumTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//數(shù)字的編碼
sbit high=P2^4;
sbit mid=P2^3;
sbit low=P2^2;
uint T_High_50ms=(65536-45872)/256;
uint T_Low_50ms=(65536-45872)%256;
uchar Count,Count_T1,Count_1s;//Count用來記錄每50ms的計(jì)數(shù),Count_T1用來記錄1s的次數(shù)
//========全局變量區(qū)結(jié)束========================================
//========函數(shù)區(qū)================================================
//延時(shí)
voiddelay_1ms(uint x){
uint i=x;
uint j;
for(;i>0;--i){
for(j=110;j>0;--j);
}
}
/**
在數(shù)碼管上顯示對(duì)應(yīng)的值
**/
voiddisplay(unsignedcharNum)
{
P0=NumTable[Num];
delay_1ms(1);
P0=0;//送完段選信號(hào)后,進(jìn)行消影的處理
}
/**
控制數(shù)碼管顯示后3位,并分解計(jì)數(shù)值
**/
voidDisplayNumByOrder(uint Count){
low=0;mid=0;high=0;display(0);
low=1;mid=0;high=0;display(0);
low=0;mid=1;high=0;display(0);
low=1;mid=1;high=0;display(0);
low=0;mid=0;high=1;display(0);
low=1;mid=0;high=1;display(0);
low=0;mid=1;high=1;display(Count%100/10);
low=1;mid=1;high=1;display(Count%10);
}
/**
初始化
**/
voidinit(){//初始化中斷
TMOD=0x01;//對(duì)TMOD賦值,以確定T0和T1的工作方式。
TH0=TH1=T_High_50ms;//計(jì)算初值,并將其寫入TH0、TL0或TH1、TL1。
TL0=TL1=T_Low_50ms;
EA=1;//開啟中斷總允許
ET0=ET1=1;
IT0=IT0=1;//開啟定時(shí)器0,1中斷允許
TR0=TR1=1;//使TR0或TR1置位,啟動(dòng)定時(shí)/計(jì)數(shù)器定時(shí)或計(jì)數(shù)
Count=Count_T1=Count_1s=0;//計(jì)數(shù)
}
voidmain(){
init();
while(1){
if(Count==20){//定時(shí)器0 1s時(shí)間到
Count=0;//開始下一輪1s的計(jì)時(shí)
P3=~P3;
}
if(Count_T1==20){//定時(shí)器1 1s時(shí)間到
Count=0;
Count_1s++;
}
if(Count_1s==60){
Count_1s=0;
}
DisplayNumByOrder(Count_1s);//在數(shù)碼管上顯示對(duì)應(yīng)的數(shù)值
}
}
//========函數(shù)區(qū)結(jié)束============================================
//========中斷函數(shù)區(qū)============================================
/**
用定時(shí)0實(shí)現(xiàn)8個(gè)發(fā)光二極管以1s間隔閃爍
**/
voidint0()interrupt1//定時(shí)/計(jì)數(shù)器T0中斷
{
TH0=T_High_50ms;//計(jì)算初值,并將其寫入TH0、TL0或TH1、TL1。
TL0=T_Low_50ms;
Count++;
}
/**
用定時(shí)器1實(shí)現(xiàn)數(shù)碼管的前兩位59s循環(huán)計(jì)時(shí)。
**/
voidint1()interrupt3//定時(shí)/計(jì)數(shù)器T1中斷
{
TH1=T_High_50ms;//計(jì)算初值,并將其寫入TH0、TL0或TH1、TL1。
TL1=T_Low_50ms;
Count_T1++;
}
//========中斷函數(shù)結(jié)束==========================================
4、同時(shí)用兩個(gè)定時(shí)器控制蜂鳴器發(fā)聲,定時(shí)器0控制頻率,定時(shí)器1控制同個(gè)頻率持續(xù)的時(shí)間,間隔300ms依次輸出1,10,50,100,200,400,800,1k(hz)的方波。#include
#define uchar unsigned char
#define uint unsigned int
/**
同時(shí)用兩個(gè)定時(shí)器控制蜂鳴器發(fā)聲,
定時(shí)器0控制頻率,定時(shí)器1控制同個(gè)頻率持續(xù)的時(shí)間,
間隔300ms依次輸出1,10,50,100,200,400,800,1Table_Index(hz)的方波。
**/
#include
#define uchar unsigned char
#define uint unsigned int
uchar code Table_F[]={1,10,50,100,200,400,800,1000};//頻率表
uint Count_T0=0;
uchar Table_Index=0;//頻率表下標(biāo)
uint Count_T1=0;
sbit beep=P1^5;
uint f;//頻率
uint T_High_50ms=(65536-45872)/256;
uint T_Low_50ms=(65536-45872)%256;
voidtimer0()interrupt1
{
Count_T0++;
if(Count_T0==6){//間隔300ms
Table_Index++;
if(Table_Index==8)
Table_Index=0;
f = Table_F[Table_Index];