説明
以下の機能を実現するために、シングルチップマイクロコンピュータのプロテウスシミュレーション回路を設計します。
- P1ポートは8つのLEDを制御し、P0はデジタルチューブに接続します
- タイマー/カウンターT0を使用してタイミングを生成し、割り込みモードを採用して、8つのLEDを1秒ごとに順番に点灯させ、その後すべてを消灯させて、サイクルを再開します。
- デジタルチューブは1から始まり、発光ダイオードが点灯するたびに+1が表示され、9が表示されるとダイオードがすべてオフになり、サイクルが再開します。
- システムの結晶周波数fosc = 12 MH z f_ {osc} = 12MHzfOのC=1 2 M H z、Proteusシミュレーションを使用して、次の連続長方形パルスを検証します
実験回路図
実験分析
- 8つの発光ダイオードが1秒ごとに順番に点灯し、ニクシーチューブは1から8まで表示され、9時に消灯し、その後サイクルを続けます。タイマー0を使用して中断し、順次点灯するときに8つの状態を事前に書き込みます。その後、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。