㈠ C52单片机输出1K频率的程序(c语言)最好可以有如何计算频率的方法
#include<reg51.h>
//设CPU是时钟12MHz的8051系列
voidSetupTimer0()
{
TMOD&=0XF0;//仅保留T1信息
TMOD|=0X02;//设置T0:定时功能,方式2,自动重载8位定时器/计数器
TH0=256-250;//每个周期为1us,250us=0.25ms,定时每0.25ms中断一次
TL0=256-250;//自动重装,TL0,TH0均置256-250
TR0=1;//开启定时器
ET0=1;//定时器0中断打开
}
voidTimer0_ISR()interrupt1//中断服务程序
{
staticdataunsignedcharus250;
staticdataunsignedcharp1;
if(++us250>=2)
{
us250=0;//每0.25msx2=0.5ms中断一次。
p1^=1;P1=p1;//p1完成翻转后输出到P1,两次翻转完成一个周期输出
}
}
voidmain()
{
dataunsignedcharp1,p2;
SetupTimer0();
EA=1;//全局中断打开
while(1);//死循环,中断程序完成波形输出
}
㈡ 用52单片机C语言编写程序,实现00~59计时。要求用T0,工作方式1。
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit la=P2^6; //段选
sbit wela=P2^7; //位选
uchar shi,ge,num1,num2; //变量
uchar code table[]={0x3f,0x06,0x5b,0x4f, //共阴极字型码
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint x) //延时子程序
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
void init()
{
TMOD=0x01; //设置定时器0的工作方式
TH0=(65536-50000)/256; //装初值
TL0=(65536-50000)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
}
void display() //显示子程序
{
la=1;
P0=table[ge]; //送段选数据
la=0;
P0=0xff; //送位选数据前关闭所有显示
wela=1;
P0=0xfe; //送位选数据
wela=0;
delay(5); //延时
la=1;
P0=table[shi];
la=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(5);
}
void main()
{
init();
while(1)
{
display();
}
}
void timer() interrupt 1
{
TH0=(65536-50000)/256; //重装初值
TL0=(65536-50000)%256;
num1++;
if(num1==20) //到了20次,1秒时间到
{
num1=0; //清0重新计数
num2++;
if(num2==60)
num2=0;
P1=0x00;
delay(500);
P1=0xff;
shi=num2/10; //把一个2位数分离后分别送数码管显示
ge=num2%10; //十位和个位
}
}
试了的,可以放心,采纳吧!
㈢ 单片机C语言关于定时计数器程序运行时序问题
这个和你设置的定时器的工作模式有关系,你要在定时时间到后,依然想要TH0=0xfc; TL0=0x18。这两个寄存器值存在的话,你就要设置定时器的工作模式为:自动重装初值
㈣ 求单片机定时器简单程序(C语言)详解。不胜感激~
用定时器0中断做流水灯,程序如下:#include<reg52.h>#include<intrins.h> //包含_crol_()循环左移函数
unsigned char temp,count;void init() //初始化函数{ TMOD=0x01;//设置定时器0为工作方式1 TH0=(65536-50000)/256;//装初值,高8位 TL0=(65536-50000)%256;//装初值,低8位 EA=1;//开总中断 ET0=1;//开定时器0中断 TR0=1;//启动定时器0 temp=0xfe; count=0;//记数值清0}void main(){ init(); while(1){ P1=temp;}}void timer0() interrupt 1 using 1 //定时器0中断函数{ TH0=(65536-50000)/256;//重装初值,同上 TL0=(65536-50000)%256; count++;//计数值加1 if(count==10)//500ms{ count=0;//计数值清0 temp=_crol_(temp,1);循环左移一位}
㈤ 求教,关于52单片机的3个定时/计数器
我认为你这时候就不要用定时器去模拟pwm了,直接找个带pwm的单片机比这简单的多。
㈥ 怎样使52单片机一个定时器定时,另一个同时计数啊,高手出现解决,有程序最好
简单,有不清楚的来qq共同探讨 181325995
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar count,num;
init()//初始化
{
TMOD=0x15; //T1 定时 ,T0计数,方式1
EA=1;
ET0=1;
ET1=1;
TH0=0;
TL0=0;
TH1=0xb1; //定时20ms
TL1=0xe0;
TR0=1;
TR1=1;
}
void main()
{
init();
while(1)
{
......
}
}
void time0() interrupt 1 //T0计数 接P3^4口
{
TH0=0;
TL0=0;
num++; //计数溢出一次num加1,n次,就是 65526 * num
}
void time1() interrupt 3 //定时20ms 晶振12M
{
TH1=0xb1;
TL1=0xe0;
count++;
if(count==50) // 定时1秒
{
count=0;
。。。 //执行指令
}
}
㈦ 51或者52单片机 基于c语言的 定时器中断从哪里开始
TMOD=0x11;//设置定时器0为工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
你的这几句话,把定时器设置成工作方式1,总的初值是15536,当TR0 = 1的时候,开始计数,一直计到65535之后,再计一个数,变成了0,这个时候,触发中断,进到void time0() interrupt 1执行你的中断函数,
这个时候计数并没有停止,在你执行中断函数的过程中,仍然在计数,但是,你在中断里又把初值写成了15536,这样又开始从15536计数,当执行到t++完了之后,本次中断就退出,然后再次等待执行到65535,再计到0,又引发第二次中断,然后.....周而复始
㈧ 求基于AT89C52单片机共阴数码管0到59秒循环计时器c语言代码
#include<reg51.h>
#include<INTRINS.h>
#defineu16unsignedint
#defineu8unsignedchar/*********************************************************/
u8ds[2];//数码管显示缓存
//共阴
codeu8w[]={~0x01,~0x02,~0x04,~0x08}; //位码
codeu8d[]={~0xc0,~0xf9,~0xa4,~0xb0,~0x99,~0x92,~0x82,~0xf8,~0x80,~0x90,};//断码
voiddispaly(){//显示函数
staticu8a;
if(++a>2)a=0;
P0=~0xff;
P2=w[a];
P0=d[ds[a]];
}
/****************************************/
voidinit() //初始化函数
{TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
EA=1;
ET0=1;
}
/***********************************/
u16js_ms=0;
u8count=0; //计数
voidmain()//主函数
{
init();//系统初始化
TR0=1;//定时器开始计时
while(1){
ds[0]=count/10%10;
ds[1]=count%10;
}
}
/****************************/
voidtimer0()interrupt1//1ms定时器
{
TH0=(65536-1000)/256;//重载初值
TL0=(65536-1000)%256;
dispaly();//显示
if(++js_ms>=1000){
js_ms=0;
if(++count>59)count=0;
}
}
㈨ 请问单片机C语言定时器程序怎么写
你看过汇编吗?与汇编的格式是一样的。具体就是先开中断允许标志位(IE里面对应的各个位)在设定TMOD工作方式。下一步就是设定初始值了(TH、TL)。设置完这些就可以开定时器了。写中断中段函数是是需要另加interrupt 加上一个常数(比如是定时器0就在后面加上1)。我用89S52芯片编过一个定时器程序你参考一下,希望对你有一点帮助。
//功能:感应外界温度并用数码管显示
//时间:2005年6月20日
//设计人:
#include<reg52.h>
#define uchar unsigned char
sbit ad0809_oe=P1^0; //定义各个位
sbit ad0809_start=P1^1;
sbit ad0809_ale=P1^2;
sbit ls595_rclk=P1^3;
sbit ad0809_eoc=P1^5;
sbit ls595_oe=P1^4;
sbit ls595_ser=P3^0;
sbit ls595_srclr=P3^1;
uchar nn,mm;
uchar code tab[]={0x81,0xcf,0x92,0x86,0xcc,0xa4,0xa0,0x8f,0x80,0x84};
send(uchar); //声明函数
AD(uchar);
void display(uchar);
void init();
//********普通口输入数据*****************
send(uchar shu) //普通口串行输入
{
unsigned char i,k;
k=0x01;
for(i=0;i<8;i++)
{
if(k==(k&shu)) //判断每位上是否为1
ls595_ser=1;
else
ls595_ser=0;
k<<=1; //左移一位
ls595_srclr=0; //输入一个上升沿讲数送入595中
ls595_srclr=1;
}
}
//*****************595显示子程序********************
void display(uchar )
{
uchar ge,shi,flge; //ge拆字后个位的存放处shi拆字后十位的存放处flge ℃的存放处
shi=tab[/10]; //拆字
send(shi); //给595送数
ge=tab[%10];
send(ge);
flge=0xb1;
send(flge);
ls595_rclk=0; //上升沿送出数据
ls595_rclk=1;
}
//*******************初始化程序********************
void init() //初始化AD、定时器
{
ad0809_start=0; //Start管教上升沿将AD内部寄存器清零
ad0809_start=1;
ad0809_ale=1; //ALE高电平选择通道
nn=0;
mm=0;
TMOD=0x01; //定时器初始化
//IE=0x82;
EA=1;
ET0=1;
TCON=0x00;
TL0=(65536-50000)%256; //定时50ms
TH0=(65536-50000)/256;
}
AD(uchar wen)
{
// unsigned char tt=0;
// ad0809_ale=1; //选择通道
ad0809_start=1;
ad0809_start=0; //start下降沿启动转换信号
while(ad0809_eoc==0); //判断转换是否结束
ad0809_oe=1; //转换结束送出转换数据
wen=P2;
return (wen);
}
//**************中断服务程序*********************
void tiam0() interrupt 1 using 1 //中断服务程序
{
TL0=(65536-50000)%256; //定时50ms
TH0=(65536-50000)/256;
nn++;
if(nn==10) //0.5秒M加一
{
mm++;
nn=0;
}
}
//****************主程序***************************
void main()
{
unsigned char bb,aa,cc; //bb=计算后得到温度,aa=AD输出数据
unsigned char wen; //wen存放转换的得到的数据
init();
// wen=17;
ls595_oe=0;
cc=0;
TR0=1;
while(1)
{
aa=AD(wen);
// ad0809_oe=0;
aa=~aa;
bb=aa/4;
if(mm==2)
{
mm=0;
cc=bb;
}
display(cc); //调用显示子程序
}
}
㈩ 52单片机制作秒表问题