❶ 单片机59秒计数器程序求大佬注解
#include<reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
uchartab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//数码管共阴极段码
uchardata_L,data_H;
uchart,a;
sbitLSA=P2^2;//这是3-8译码器的输入信号
sbitLSB=P2^3;
sbitLSC=P2^4;
/****************************************/
voiddelay(uintk)//延时k毫秒
{
uintm,n;
for(m=0;m<k;m++)
{
for(n=0;n<120;n++);
}
}
/****************************************/
voiddisplay(void)//显示子程序
{
LSC=0,LSB=0,LSA=1;//第二位位码
P0=tab[data_H];//第二位段码
delay(1);
LSC=0,LSB=0,LSA=0;//第一位位码
P0=tab[data_L];//第一位段码
delay(1);
}
/****************************************/
voidTimer0(void)
{
if(TF0==1)//如果T0溢出
{
t++;//变量t加1
TH0=0x3C;//重赋初值
TL0=0xB0;
TF0=0;
}
}
/****************************************/
voiddata_tim(void)
{
Timer0();//调用定时器延时子程序
if(t==20)//如果延时1秒时间到
{
a++;//变量a加1
t=0;//t复位为0
if(a==60)//如果1分到
{a=0;}//清0
}
}
/****************************************/
voiddata_in(void)
{
data_L=a%10;//将分钟分成十位和各位
data_H=a/10;
}
/****************************************/
voidT0_init(void)
{
TMOD=0x01;//定时器0位模式1
TH0=0x3C;//定时时间50毫秒
TL0=0xB0;
ET0=0;//不允许定时器0中断
TR0=1;//启动定时器0
EA=0;//不允许中断
}
/****************************************/
voidmain(void)
{
a=0;
T0_init();//初始化定时器
while(1)
{
data_tim();//调用定时器延时函数
data_in();//转换显示数据
display();//显示
}
}
❷ 利用单片机内部定时器设计一个秒表,显示最大值为 59.99 秒。
#include<reg51.h>
#include<INTRINS.h>
#defineu16unsignedint
#defineu8unsignedchar
#definePin0 0x01
#definePin1 0x02
#definePin2 0x04
#definePin3 0x08
#definePin4 0x10
#definePin5 0x20
#definePin6 0x40
#definePin7 0x80sbitk1=P3^3;
sbitk2=P3^4;
sbitk3=P3^5;
#defineK1 Pin0
#defineK2 Pin1
#defineK3 Pin2
u8key=0xff;//消抖后的有效按键值
u8key_down=0x00;//按键下降沿扫描结果,1有效
u8key_up=0x00; //上升沿扫描结果,1有效
u8key_sc=0xff;//上次扫描的按键值
//按键扫描程序
voidscanKey(){
staticu8temp0;
staticu8ms;
u8temp=0;
if(k1==1)temp|=K1;
if(k2==1)temp|=K2;
if(k3==1)temp|=K3;
if(temp==temp0){//按键消抖
if(++ms>=5){//连续5次扫描的值一样,则认为是稳定状态
key=temp;
ms=0;
}
}else{
temp0=temp;
ms=0;
}
key_down=key_sc&(~key);//下降沿扫描
key_up=(~key_sc)&key;//下降沿扫描
key_sc=key;
}
u8readPIN(u8port,u8pin){
return((port&pin)==0?0:1);
}
u8ds[4];//数码管显示缓存
codeu8w[]={0x01,0x02,0x04,0x08,}; //位码
codeu8d[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};//断码
codeu8dand[]={0xff,0x7f,0xff,0xff};
voiddispaly(){//显示函数
staticu8a;
a++;
if(a>3)a=0;
P0=0xff;
P2=w[a];
P0=d[ds[a]]&dand[a];
}
voidTimer0Init(void) //1毫秒@11.0592MHz
{
AUXR&=0x7F; //定时器时钟12T模式
TMOD&=0xF0; //设置定时器模式
TMOD|=0x01; //设置定时器模式
TL0=0x66; //设置定时初值
TH0=0xFC; //设置定时初值
TF0=0; //清除TF0标志
TR0=1; //定时器0开始计时
}
voidinit() //初始化函数
{Timer0Init();
}
u16js_ms=0;
u8flag=0;
u16count=0;
voidmain()//主函数
{
init();
TR0=1;
while(1){
ds[0]=count/1000%10;//将当前分值送到数码管缓存
ds[1]=count/100%10;
ds[2]=count/10%10;
ds[3]=count%10;
scanKey();//扫描按键
if(readPIN(key_down,K1)==1){//k1,开始
flag=1;
}
if(readPIN(key_down,K2)==1){//k2,停止
flag=0;
}
if(readPIN(key_down,K3)==1){//k3,复位
count=0;
}
}
}voidtimer0()interrupt1//定时器,实现倒计时
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
dispaly();
if(++js_ms>=10&&flag!=0){
js_ms=0;
if(count<5999)count++;
}
}
❸ 利用单片机设计59秒计时器
共阳共阴只是你在选COM端时给其高低电平的问题无关大雅
我给一段PIC单片机的程序让你参考一下,如果你看懂的话应该能做出来了
#include <pic.h>
#include <math.h>
//此程序实现计时秒表功能,时钟显示范围00.00~99.99秒,分辨度:0.01秒
unsigned char s0,s1,s2,s3;
//定义0.01 秒、0.1 秒、1秒、10秒计时器
unsigned char s[4];
unsigned char k ,data ,sreg;
unsigned int i;
const table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90};
//不带小数点的显示段码表
const table0[10]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10};
//带小数点的显示段码表
//TMR0初始化子程序
void tmint()
{
T0CS=0; //TMR0工作于定时器方式
PSA=1; //TMR0不用分频
T0IF=0; //清除TMR0的中断标志
T0IE=1; //TMR0中断允许
}
//spi显示初始化子程序
void SPIINIT()
{
PIR1=0;
SSPCON=0x30;
SSPSTAT=0xC0;
//设置SPI的控制方式,允许SSP方式,并且时钟下降沿发送。与"74HC595,当其
//SCLK从低到高跳变时,串行输入寄存器"的特点相对应
TRISC=0xD7; //SDO引脚为输出,SCK引脚为输出
TRISA5=0; //RA5引脚置为输出,输出显示锁存信号
}
//系统其它部分初始化子程序
void initial()
{
TRISB1=0;
TRISB2=0;
TRISB4=1;
TRISB5=1; //设置与键盘有关的各口的输入输出方式
RB1=0;
RB2=0; //建立键盘扫描的初始条件
}
//SPI传输数据子程序
void SPILED(data)
{
SSPBUF=data; //启动发送
do {
;
}while(SSPIF==0);
SSPIF=0;
}
//显示子程序,显示4位数
void dispaly()
{
RA5=0; //准备锁存
for(k=4;k>0;k--)
{
data=s[k-1];
if(k==3) data=table0[data];//第二位需要显示小数点
else data=table[data];
SPILED(data); //发送显示段码
}
for(k=0;k<4;k++)
{
data=0xFF;
SPILED(data); //连续发送4个DARK,使显示好看一些
}
RA5=1; //最后给锁存信号,代表显示任务完成
}
//软件延时子程序
void DELAY()
{
for(i = 3553; --i ;) continue;
}
//键扫描子程序
void KEYSCAN()
{
while(1){
while(1)
{
dispaly(); //调用一次显示子程序
if ((RB5==0)||(RB4==0)) break;
}
DELAY(); //若有键按下,则软件延时
if ((RB5==0)||(RB4==0)) break;//若还有键按下,则终止循环扫描,返回
}
}
//等键松开子程序
void keyrelax()
{
while(1){
dispaly(); //调用一次显示子程序
if ((RB5==1)&&(RB4==1)) break;
} //为防止按键过于灵敏,每次等键松开才返回
}
//系统赋值初始化子程序
void ini()
{
s0=0x00;
s[0]=s0;
s1=0x00;
s[1]=s1;
s2=0x00;
s[2]=s2;
s3=0x00;
s[3]=s3; //s0=s1=s2=s3=0,并放入显示缓冲数组中
sreg=0x00; //tmr0中断次数寄存器清0
}
//中断服务程序
void interrupt clkint(void)
{
TMR0=0X13; //对TMR0写入一个调整值。因为写入TMR0后接着的
//两个周期不能增量,中断需要3个周期的响应时间,
//以及C语言自动进行现场保护要消耗周期
T0IF=0; //清除中断标志
CLRWDT();
sreg=sreg+1; //中断计数器加1
if(sreg==40) //中断次数为40后,才对S0,S1,S2,S3 操作
{
sreg=0;
s0=s0+1;
if(s0==10){
s0=0 ;
s1=s1+1;
if(s1==10){
s1=0 ;
s2=s2+1;
if(s2==10){
s2=0;
s3=s3+1;
if(s3==10) s3=0 ;
}
}
}
}
s[0]=s0;
s[1]=s1;
s[2]=s2;
s[3]=s3;
}
//主程序
main()
{
OPTION=0XFF;
tmint(); //TMR0初始化
SPIINIT(); //spi显示初始化
initial(); //系统其它部分初始化
di(); //总中断禁止
while(1) {
ini(); //系统赋值初始化
KEYSCAN(); //键扫描,直到开始键按下
keyrelax(); //等键松开
ei(); //总中断允许
TMR0=0X08;
KEYSCAN(); //键扫描直到停止键按下,在键扫描时有显示
keyrelax() ; //等键松开
di(); //总中断禁止
KEYSCAN(); //键扫描到清0键按下,在键扫描时有显示
keyrelax() ; //等键松开
}
}
❹ 如何用单片机c语言弄数码管59分59秒倒计时显示和初始化数值显示0000
使用一个4位数码管,然后动态扫描显示,你可以直接用两个变量分别表示分和秒,然后上电的时候变量为0就可以了
❺ 实现1~59秒的动态LED 循环显示 单片机89c51的程序 急急急!!!!!!
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit cs1=P2^0; //段
sbit cs2=P2^1; //位
sbit wr =P2^2; //使能
uchar num =0; //T0计时
uchar mark=0; //显示数码管标志
uchar time[2]; //显示时间暂存
uchar code col_table[]={0xfe,0xfd}; //数码管的第一位和第二位
uchar code table[]=
{
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
}; //共阳极数码管数字0-9的段码
/*-----1ms延时函数-----*/
void Delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=115;y>0;y--);
}
/*-----主函数-----*/
void main()
{
TMOD=0x01; //定时器工作在方式0
TH0=(65536-50000)/256; //装初值
TL0=(65536-50000)%256; //装初值
EA =1; //开总中断
ET0=1; //允许T0中断
TR0=1; //开T0
while(1) //死循环
{
P0=table[time[mark]]; //显示段数据
cs1=0;
wr =0;
wr =1;
cs1=1;
P0=col_table[mark]; //显示位数据
cs2=0;
wr =0;
wr =1;
cs2=1;
Delay(1); //延时1ms
mark++; //第一位和第二位间切换达到动态扫描显示
if(mark==2) mark=0;
}
}
/*-----T0-----*/
void Timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
if(num==2)
{
num=0;
time[0]++;
if(time[0]==10)
{
time[0]=0;
time[1]++;
if(time[1]==6) time[1]=0;
}
}
}
刚给你写的,你自己看看吧,希望对你有帮助~~~
❻ 单片机00-59秒计时器(利用软件延时)C语言源程序
哥,你这是在学单片机么?学单片机数组里面是什么东西你都看不出来吗?那分明是共阴极数码管显示从0到9的CODE表啊。你没看把数组里面的数一个求除一个求余送到两个端口了吗?那两个端口一定是数码管的,你这程序问题好多啊,送给数码管也不能用总线的形式操作啊。再说,你要定时这段程序也太繁琐了,完全可以减少一半的代码。而且我没听说谁定时还用delay()的,都用定时器中断定时,那样才会精准。好好学吧,单片机以后还是有发展的,多看看书,以后这些问题提出来会被人笑的。
❼ 修改单片机C语言程序:0~59秒计数器;1个独立按键控制,第一次按按键,实现暂停,第二次按按键,实现复位
#include<reg52.h>
#include<intrins.h>
#defineuintunsignedint
#defineucharunsignedchar
sbitKEY=P3^0;
ucharaa,num,flag;
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
voiddelay(uintms)
{
uchart;
while(ms--)for(t=0;t<123;t++);
}
voidmain()
{
num=0;
aa=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
EA=1;
P0=table[0];
P2=table[0];
while(1){
if(!KEY){
delay(10);
if(!KEY){
while(!KEY);
flag++;
if(flag==1)TR0=0;
if(flag==2){
P0=table[0];
P2=table[0];
flag=0;
aa=0;
num=0;
TR0=1;
}}}}
}
voidtimer0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
if(aa==20){
aa=0;
num++;
if(num==60)num=0;
P0=table[num/10];
P2=table[num%10];
}
}
仿真实验截图如下:
❽ 51单片机实验(关于定时器计数器)
6mz的晶振 可算出一个时钟周期为2微秒,200毫秒去除一下2微秒就是10000,然后吧10000取16进制为 27A0 ,用 FFFF减27A0再加1 得 C860,用定时方式一,TL0 ,#60H
TH0, #C8H
❾ 单片机程序 0-59s循环跑秒定时器 定时器值通过P1口连接8个LED灯显示出来
给你个思路,用
定时器中断
,然后计算中断时间,对变量进行计数,当等于一秒的时候,送给
数码管
显示,依次累加,同时送给
LED灯
,就可以看到效果了
❿ AT89c51单片机程序控制两个数码管显示00-59秒表的程序要怎么编啊
display(second)子函数与两个数码管的连接方式有关
void main(void )//主程序
{
TMOD=0x01;// 定时器1工作方式一
ET0=1;
EA=1;
TH0=(65536-10000)/256;//定时10ms
TL0=(65536-10000)%256;
TR0=0;//上电先不启动
while(1)
{
if(key1==0)//判断按键是否按下
{
Delay1ms(10);//延时消抖
if(key1==0)
{
while(key1==0);//等待按键抬起
TR0=!TR0;//启动或停止
}
}
if(key2==0&&TR0==0)//判断按键是否按下及是否在走时
{
Delay1ms(10);//延时消抖
if(key2==0)
{
while(key2==0);//等待按键抬起
a=0; second=0;
}
}
display(second);
}
}
//中断子程序
void Timer0(void) interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
a++;
if(a==100 ) second++;
if(second==60) second=0;
}