AT89C51用C语言写延时1ms函数
时间: 2024-02-11 08:10:02 浏览: 132
假设AT89C51的时钟频率为12MHz,可以使用以下代码实现延时1ms的函数:
```c
void delay_ms(unsigned int ms) {
unsigned int i, j;
while (ms--) {
i = 12000;
j = 30;
while (j--) {
while (i--);
i = 12000;
}
}
}
```
使用该函数可以在程序中调用delay_ms(1)来实现延时1毫秒。
相关问题
AT89C51单片机用C语言写1ms基准延时程序
在 AT89C51 单片机上,可以使用定时器来实现基准延时。下面是使用 C 语言编写的 1ms 基准延时程序:
```c
#include <reg51.h>
void delay_ms(unsigned int ms)
{
unsigned int i, j;
while (ms--)
{
for (i = 0; i < 250; i++)
{
for (j = 0; j < 184; j++);
}
}
}
void main()
{
// 设置定时器
TMOD = 0x01; // 定时器0工作在模式1(16位定时器)下
TH0 = 0xFC; // 定时器初值为0xFC67
TL0 = 0x67;
TR0 = 1; // 启动定时器
// 延时1秒
delay_ms(1000);
// 关闭定时器
TR0 = 0;
while (1);
}
```
上面的程序使用了定时器0,将其设置为 16 位模式,并将初值设为 0xFC67,这样定时器每过 1ms 就会溢出一次。然后在 `delay_ms` 函数中,循环等待定时器溢出,等待 `ms` 次后,1ms 的基准延时就完成了。
需要注意的是,在使用定时器的时候,需要根据实际情况调整初值和计数器的值,以达到精确的延时效果。
帮我用AT89C51用c语言写数字钟程序
好的,下面是一个简单的数字钟程序,基于AT89C51,使用C语言编写。
```c
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
// 定义数码管显示的数字
uchar code numTable[10] = {0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};
// 定义变量
uchar hour = 0, minute = 0, second = 0;
uchar ledState = 0; // 用于控制冒号的闪烁
// 延时函数,约为1ms
void delay()
{
uint i,j;
for(i=100;i>0;i--)
for(j=110;j>0;j--);
}
// 显示函数,显示时分秒
void display()
{
uchar temp1,temp2;
// 显示小时
temp1 = hour / 10;
temp2 = hour % 10;
P2 = 0xfe; // 选择第一位数码管
P0 = numTable[temp1]; // 显示十位数
delay();
P2 = 0xfd; // 选择第二位数码管
P0 = numTable[temp2]; // 显示个位数
delay();
// 显示冒号,每隔1秒闪烁一次
if(ledState == 0 || ledState == 1)
{
P2 = 0xfb; // 选择第三位数码管
P0 = 0xbf; // 显示冒号
delay();
}
// 显示分钟
temp1 = minute / 10;
temp2 = minute % 10;
P2 = 0xf7; // 选择第四位数码管
P0 = numTable[temp1]; // 显示十位数
delay();
P2 = 0xef; // 选择第五位数码管
P0 = numTable[temp2]; // 显示个位数
delay();
// 显示冒号,每隔1秒闪烁一次
if(ledState == 0 || ledState == 1)
{
P2 = 0xdf; // 选择第六位数码管
P0 = 0xbf; // 显示冒号
delay();
}
// 显示秒钟
temp1 = second / 10;
temp2 = second % 10;
P2 = 0xbf; // 选择第七位数码管
P0 = numTable[temp1]; // 显示十位数
delay();
P2 = 0x7f; // 选择第八位数码管
P0 = numTable[temp2]; // 显示个位数
delay();
// 冒号闪烁
if(++ledState >= 20) ledState = 0;
}
// 定时器中断函数,每1秒触发一次
void timer() interrupt 1
{
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256;
// 每秒钟执行一次
if(++second >= 60)
{
second = 0;
if(++minute >= 60)
{
minute = 0;
if(++hour >= 24)
{
hour = 0;
}
}
}
}
void main()
{
// 初始化定时器
TMOD = 0x01;
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256;
EA = 1;
ET0 = 1;
TR0 = 1;
while(1)
{
display(); // 显示时分秒
}
}
```
这个程序使用了8个共阳数码管,按照时分秒的顺序依次显示,冒号每隔1秒闪烁一次。在程序中,我们定义了一个numTable数组,用于存储数码管显示的数字,使用TMOD寄存器初始化定时器,并在定时器中断函数中更新时分秒的值。最后在主函数中不断调用display函数,实现时钟的显示。
阅读全文