❶ 定时器延时问题(51单片机,c语言)
你的这两个函数void delayms(uint)和void display(uchar,uchar,uchar,uchar)我可以肯定的告诉你,没有问题。你的这个程序其实就是想显示0000~5959之间的数,而且这个数是每20秒+1顺序递增的。之所以没有任何反应,那是你的主程序没有挂起,也就是在while(1)里没有没有大括号,程序执行一次就结束了,所以你什么都看不到。应该这样
while(1)
{//加入的成对大括号
for(thou=0;thou<=5;thou++) //千位
for(hun=0;hun<=9;hun++) //百位
for(ten=0;ten<=5;ten++) //十位
for(one=0;one<=9;one++) //个位
{
while(num!=20) //循环一秒
{
display(thou,hun,ten,one);//数码管显示四个数字
}
num=0;
}
}
这样你就可以看到程序运行的结果了,但结果是这样的:四个LED显示管闪得很严重,计划是一亮一灭的,而且0000~5959这个数字几乎显示得不成样子。主要是delayms(5),这个延迟程序你应该尽量控制在20ms之内(主要是人眼残辉的时间极限),短了感觉就全亮,长了就一闪一灭。
不过我很看不惯你的这个程序,我给你一个CPU负担更小,而显示又非常好的程序供你参考:
#include<AT89X52.H>
#define uint unsigned int
#define uchar unsigned char
sbit LED4=P2^0; //数码管千分位
sbit LED3=P2^1; //数码管百分位
sbit LED2=P2^2; //数码管十分位
sbit LED1=P2^3; //数码管个分位
uchar ms20,s1;//20毫秒和1s变量定义(声明)
//定时器T0初始化,10ms秒初值
void InitTimer0(void)
{
TMOD=0x01;
TH0=0x0D8;
TL0=0x0F0;
EA=1;
ET0=1;
TR0=1;
}
void Display(uchar dat4,uchar dat3,uchar dat2,uchar dat1)
{
static uchar k;
P2=P2|0xf0;
switch(k++)
{
case 0:
P0=dat4;
LED4=1;
break;
case 1:
P0=dat3;
LED3=1;
break;
case 2:
P0=dat2;
LED2=1;
break;
case 3:
P0=dat1;
LED1=1;
break;
default:k=0;return;
}
}
void Timer0(void) interrupt 1//1ms中断
{
TH0=0x0D8;
TL0=0x0F0;
ms20++;
s1++;
}
void Main(void)
{
uchar thou,hun,ten,one;
InitTimer0();
while(1)
{
if(s1>=100)//每1秒钟one+1
{
s1=0;
if(one++>=9)
{
one=0;
if(ten++>=5)
{
ten=0;
if(hun++>=9)
{
hun=0;
if(thou++>=5) thou=0
}
}
}
}
if(ms20==2)//每20毫秒调用一次显示函数
{
Display(thou,hun,ten,one);
ms20=0;
}
}
}
❷ 利用51单片机定时器产生PWM波的c语言程序,要求如下
#include<reg51.h>
#define uchar unsigned char
uchar pwm=50,cnt;
sbit pluse=P1^0;
sbit keyu=P1^4;
sbit keyd=P1^5;
void t0isr() interrupt 1
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;
cnt++;
if(pwm>0)
{
if(cnt>100)cnt=0;
if(cnt<=pwm)pluse=1;
else pluse=0;
}
else pluse=0;
}
main()
{
TMOD=0x01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
if(keyu==0)
{
while(keyu==0);
pwm++;
if(pwm>100)pwm=100;
}
if(keyd==0)
{
while(keyd==0);
if(pwm>0)pwm--;
}
}
}
❸ 求高手写 用51单片机C语言 TMOD=0X01 定时一秒的程序
#include <reg51.h>
#define uchar unsigned char
sbit LED=P1^0;
uchar time;
void initT0( )
{
TMOD = 0x01; //定时器0,工作方式1
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256; //50ms中断一次
EA = 1;
ET0 = 1;
TR0 = 1;
}
void main(void)
{
initT0();
while(1)
if(time==20) //中断20次,1s
{
time=0;
LED=~LED; //P1.0上的LED1s亮或灭一次
}
}
void T0int( ) interrupt 1
{
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
time++;
}
❹ 求 定时器初始化程序 51单片机C语言的 THANKU~
写一个关于定时器0的初始化子函数给你,加上注释
void timer0() interrupt 1
{
TMOD=0X01;//选择定时器0
TH0=(65536-50000)/256;//装入50MS的初值
TL0=(65536-50000)%256;
EA=1;//打开总中断
ET0=1;//打开定时器0中断
TR0=1;//开启定时器0
}
❺ c51单片机c语言编程中定时器和中断的关系,程序如下,坐等!!!
你的定时器中断进不了吧,
因为你没开定时器中断允许位ET0=1
另:
定时器模式设置好后TMOD=0x01,
打开定时器中断允许ET0=1,
然后TR0=1启动定时器就可以了
❻ 单片机定时器c程序
你可以设定定时器T0,每50MS中断一次,中断一次计数一次,计数20次,刚好1秒,到1秒就把状态改变就行了。
❼ 用51单片机做一个定时器,程序用C语言写,有人会吗
这么简单的问题 随便一本51单片机书上就有 实在不行 参考下面代码
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code shu[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //开启0-7数码管
uint aa=0,chu=0;
char num;
sbit d3=P1^3;
sbit d1=P1^1;
sbit d0=P1^0;
sbit d2=P1^2;
sbit s1=P2^4;
sbit s2=P2^5;
delay(uint z)
{
uint x,y;
for(x=110;x>0;x--)
for(y=z;y>0;y--);
}
void init ()
{
TMOD=0x01;
EA=1;
ET0=1;
TR0=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}
void main()
{
d3=0;
d2=0;
P0=0X00;
init();
while(1)
{
//写你想写的代码 num每加一次 表示秒钟增加一次
}
}
void an() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
if(aa==20)
{
aa=0;
num++;
}
}
❽ 求单片机89C51 的c程序 ---->实现 30秒定时器。
//说多了没用,直接帮你写出这段程序,给你慢慢琢磨
#include<REG51.H>
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};0-9的段码(共阴极数码管)
unsigned char code dispbit[]={0xFE,0xFD,0xFB,0xF7,
0xEF,0xDF};1-6位数码管的位码
unsigned char cont;//动态扫描计数器
unsigned char dispbuf[6]={1,2,3,4,5,6};//显示缓冲区,改变里面的数值就改变了显示内容
sbit DULA=P2^6;
sbit WELA=P2^7;
void delay(void)
{
unsigned char i;
for(i=255;i>0;i--);
}
void main(void)
{
DULA=0;
WELA=0;
while(1)
{
P0=0XFF;//清显示
WELA=1;
WELA=0;
P0=dispcode[dispbuf[cont]];//取段码到端口
DULA=1;//送到数码管段引脚
DULA=0;
P0=dispbit[cont];//取位码到端口
WELA=1;//送到数码管位引脚
WELA=0;//此时某个数码管被点亮,
if(++cont>=6)cont=0;//循环6次为一个动态扫描周期
delay();//延时保持显示
}
}
❾ c编程时,51单片机怎么用定时器写一个延时1ms的子函数
好办
用C51,方式一
void delay(unsigned int T) //T的单位取微秒
{
signed int cnt; //这里用符号数的相反数 就是2^16-n的原码,也可以定义无符号数自己换成2^16-n
cnt=-(fosec*1.0/12)*T; // fosec的单位MHz
TMOD=0x01;
TH0=(unsigned char)(cnt>>8);
TL0=(unsigned char)cnt;
TR0=1;
while(!TF0);
TR0=0;
TF0=0;//加这句是为了可以循环使用
}