1. Experimental tasks
Use the timer/counter T0 of the AT89S51 microcontroller to generate a one-second timing time as the second counting time. When one second is generated, the second counting increases by 1. When the second counting reaches 60, it automatically starts from 0. The hardware circuit is shown in the figure below
2. Circuit schematic
Figure 4.15.1
3. Hardware wiring on the system board
(1). Connect the P0.0/AD0-P0.7/AD7 ports in the "SCM System" area to any a-h port in the "Four Static Digital Display Module" area with an 8-core cable; Requirement: P0. 0/AD0 corresponds to a, P0.1/AD1 corresponds to b,..., P0.7/AD7 corresponds to h.
(2). Connect the P2.0/A8-P2.7/A15 ports in the "SCM System" area to any a-h port in the "Four Static Digital Display Module" area with an 8-core cable; Requirements: P2. 0/A8 corresponds to a, P2.1/A9 corresponds to b,..., P2.7/A15 corresponds to h.
4. Programming content
The internal 16-bit timer/counter of the AT89S51 microcontroller is a programmable timer/counter. It can work in 13-bit timing mode, 16-bit timing mode and 8-bit timing mode. Just by setting the special function register TMOD, it can be completed. When the timer/counter works is also accomplished by setting the TCON special function register through software.
Now we choose the 16-bit timing working mode. For T0, the maximum timing is only 65536us, which is 65.536ms, which cannot achieve the 1 second timing we need. Therefore, we must deal with this problem through software. Suppose we take T0 The maximum timing is 50ms, that is, 20 times of 50ms are required to time for 1 second. For these 20 times, we can use software to count them.
Therefore, we set TMOD=00000001B, that is, TMOD=01H
Next we need to load the preset initial values for TH0 and TL0 of the T0 timer/counter, which can be calculated by the following formula
TH0=(216-50000) / 256
TL0=(216-50000) MOD 256
When T0 is working, how do we know that the 50ms timing time has expired? This time we detect the TF0 flag in the TCON special function register. If TF0 = 1, it means that the timing time has expired.
5. program
Figure 4.15.2
6. Assembly source program (query method)
SECOND EQU 30H
TCOUNT EQU 31H
ORG 00H
START: MOV SECOND,#00H
MOV TCOUNT,#00H
MOV TMOD,#01H
MOV TH0,#(65536-50000) / 256
MOV TL0,#(65536-50000) MOD 256
SETB TR0
DISP: MOV A,SECOND
MOV B,#10
DIV AB
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
MOV A,B
MOVC A,@A+DPTR
MOV P2,A
WAIT: JNB TF0,WAIT
CLR TF0
MOV TH0,#(65536-50000) / 256
MOV TL0,#(65536-50000) MOD 256
INC TCOUNT
MOV A,TCOUNT
CJNE A,#20,NEXT
MOV TCOUNT,#00H
INC SECOND
MOV A,SECOND
CJNE A,#60,NEX
MOV SECOND,#00H
NEX: LJMP DISP
NEXT: LJMP WAIT
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
7. C language source program (query method)
#include
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
unsigned char second;
unsigned char tcount;
void main(void)
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%6;
TR0=1;
tcount=0;
second=0;
P0=dispcode[second/10];
P2=dispcode[second];
while(1)
{
if(TF0==1)
{
tcount++;
if(tcount==20)
{
tcount=0;
second++;
if(second==60)
{
second=0;
}
P0=dispcode[second/10];
P2=dispcode[second];
}
TF0=0;
TH0=(65536-50000)/256;
TL0=(65536-50000)%6;
}
}
}
8. Assembling source program (interrupt method)
SECOND EQU 30H
TCOUNT EQU 31H
ORG 00H
LJMP START
ORG 0BH
LJMP INT0X
START: MOV SECOND,#00H
MOV A,SECOND
MOV B,#10
DIV AB
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
MOV A,B
MOVC A,@A+DPTR
MOV P2,A
MOV TCOUNT,#00H
MOV TMOD,#01H
MOV TH0,#(65536-50000) / 256
MOV TL0,#(65536-50000) MOD 256
SETB TR0
SETB ET0
SETB OF
SJMP $
INT0X:
MOV TH0,#(65536-50000) / 256
MOV TL0,#(65536-50000) MOD 256
INC TCOUNT
MOV A,TCOUNT
CJNE A,#20,NEXT
MOV TCOUNT,#00H
INC SECOND
MOV A,SECOND
CJNE A,#60,NEX
MOV SECOND,#00H
NEX: MOV A,SECOND
MOV B,#10
DIV AB
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
MOV A,B
MOVC A,@A+DPTR
MOV P2,A
NEXT: RETI
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
9. C language source program (interruption method)
#include
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
unsigned char second;
unsigned char tcount;
void main(void)
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%6;
TR0=1;
ET0=1;
EA=1;
tcount=0;
second=0;
P0=dispcode[second/10];
P2=dispcode[second];
while(1);
}
void t0(void) interrupt 1 using 0
{
tcount++;
if(tcount==20)
{
tcount=0;
second++;
if(second==60)
{
second=0;
}
P0=dispcode[second/10];
P2=dispcode[second];
}
TH0=(65536-50000)/256;
TL0=(65536-50000)%6;
}
Previous article:AT89S51 microcontroller realizes the design of presetable and reversible 4-bit counter
Next article:Introduction to the internal structure and functions of the AT89S51 microcontroller serial port
Recommended ReadingLatest update time:2024-11-16 09:40
Professor at Beihang University, dedicated to promoting microcontrollers and embedded systems for over 20 years.
- Innolux's intelligent steer-by-wire solution makes cars smarter and safer
- 8051 MCU - Parity Check
- How to efficiently balance the sensitivity of tactile sensing interfaces
- What should I do if the servo motor shakes? What causes the servo motor to shake quickly?
- 【Brushless Motor】Analysis of three-phase BLDC motor and sharing of two popular development boards
- Midea Industrial Technology's subsidiaries Clou Electronics and Hekang New Energy jointly appeared at the Munich Battery Energy Storage Exhibition and Solar Energy Exhibition
- Guoxin Sichen | Application of ferroelectric memory PB85RS2MC in power battery management, with a capacity of 2M
- Analysis of common faults of frequency converter
- In a head-on competition with Qualcomm, what kind of cockpit products has Intel come up with?
- Dalian Rongke's all-vanadium liquid flow battery energy storage equipment industrialization project has entered the sprint stage before production
- Allegro MicroSystems Introduces Advanced Magnetic and Inductive Position Sensing Solutions at Electronica 2024
- Car key in the left hand, liveness detection radar in the right hand, UWB is imperative for cars!
- After a decade of rapid development, domestic CIS has entered the market
- Aegis Dagger Battery + Thor EM-i Super Hybrid, Geely New Energy has thrown out two "king bombs"
- A brief discussion on functional safety - fault, error, and failure
- In the smart car 2.0 cycle, these core industry chains are facing major opportunities!
- The United States and Japan are developing new batteries. CATL faces challenges? How should China's new energy battery industry respond?
- Murata launches high-precision 6-axis inertial sensor for automobiles
- Ford patents pre-charge alarm to help save costs and respond to emergencies
- New real-time microcontroller system from Texas Instruments enables smarter processing in automotive and industrial applications
- How to use the VGA_SYNC_N signal in the VGA of DE1-SOC?
- CCS Tips: Remove the prompt when burning DSP/BIOS
- SEED-DEC6416 is available for purchase, second-hand is also acceptable
- Calculation of stack usage in C2000 DSP
- IRLR024 Output Current
- Bidirectional thyristor circuit wiring problem
- "Goodbye 2019, Hello 2020" + The wind and clouds are free and happy
- A simple question for help
- The power problem of the series resistance of the atomizer heating wire
- [GD32F310 Review] Interrupt test and GPIO usage