Description
設計單片機的Proteus仿真電路,實現如下功能:
- P1口控制8個發光二極管,P0連接數碼管
- 利用定時器/計數器T0產生定時,采用中斷方式,讓8個發光二極管每隔1s依次點亮,全亮后全滅,再次開始循環
- 數碼管從1開始,每點亮一個發光二極管,顯示+1,顯示9時二極管全滅,再次開始循環
- 系統的晶振頻率 f o s c = 12 M H z f_{osc}=12MHz fosc=12MHz,用Proteus仿真驗證如下連續矩形脈沖
實驗電路圖
實驗分析
- 八個發光二極管每隔1s依次點亮,同時數碼管從1顯示到8,9時全滅,然后不斷循環。采用定時器0中斷,事先寫好依次點亮時的八種狀態,然后每隔一秒P1變換到下一個狀態。
- 高電平40ms,低電平360ms,采用定時器1中斷,每次定時40ms,40ms時由高電平到低電平,400ms時候翻轉即可。
源程序
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar t = 0, cnt = 1, n;
sbit wave = P2^7;
bit flag;
uchar code DSY_CODE[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //0-9
uchar code LED_CODE[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00}; //依次點亮
void init_time0() {
P1 = LED_CODE[cnt - 1];
P0 = DSY_CODE[cnt];
TMOD = 0x01; //設置T0為定時器模式,工作方式在1
EA = 1;
ET0 = 1;
TR0 = 1;
}
void init_time1() {
TMOD = 0x11;
EA = 1;
ET1 = 1;
TR1 = 1;
wave = 1; //高電平
flag = 1;
}
void time0() interrupt 1 { //定時器0中斷服務程序
TH0=(65536-50000) / 256;
TL0=(65536-50000) % 256;
if(++t == 20) { //1s
t = 0;
cnt++;
P1 = LED_CODE[cnt - 1];
P0 = DSY_CODE[cnt];
if(cnt == 9) {
P1 = 0xff;
cnt = 0;
}
}
}
void timer1() interrupt 3 {
TH1=(65536-40000) / 256; //40ms高電平
TL1=(65536-40000) % 256;
if(flag) {
wave = ~wave; //變為低電平
flag = 0;
}
n++;
if(n == 10) { //400ms時候,此時低電平已經持續360ms,翻轉
n = 0;
wave = ~wave;
flag = 1;
}
}
void main() {
init_time0();
init_time1();
while(1);
}
附錄
矩形脈沖截圖如下:
高電平:-760-(-800)=40ms,低電平:-400-(-760)=360ms。