用KEIL编写C语言程序实现:单片机是AT89C51,实现一个计时器,数码管为6为的,有三个按键接在P0上。

作者&投稿:芮莉 (若有异议请与网页底部的电邮联系)
单片机程序,使用keil 编程,用Atmel,AT89C51编的~

很简单,只是电路能用吗?单片机能驱动的了数码管码?
如果纯粹是Protues玩,那就无所谓了。
利用定时计数器的计数功能,取GATE=1,C/T=1
BT2接INT0
BT3接T0

JB BT1,CLEAR

clear程序段中对P2清零

#include#define uchar unsigned charuchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //0到9uchar num;uchar led[]={1,2,3,4};void t0isr() interrupt 1{TH0=(65536-5000)/256;TL0=(65536-5000)%256;switch(num){case 0:P2=0x01;break;case 1:P2=0x02;break;case 2:P2=0x04;break;case 3:P2=0x08;break;default:break;}P0=~tab[led[num]];num++;num&=0x03;}main(){TMOD=0x11;TH0=(65536-5000)/256;TL0=(65536-5000)%256;TR0=1;ET0=1;EA=1;while(1);}

按照你的要求写的程序如下,你拿去测试吧!

 

#include "REG52.H"

sbit SHUG_01 = P2^0;    //数码管1

sbit SHUG_02 = P2^1;    //数码管2

sbit SHUG_03 = P2^2;    //数码管3

sbit SHUG_04 = P2^3;    //数码管4

sbit SHUG_05 = P2^4;    //数码管5

sbit SHUG_06 = P2^5;    //数码管6


 

sbit    KEY0_01 = P0^0;    //按键  启动或停止

sbit    KEY0_02 = P0^1;    //按键  加

sbit    KEY0_03 = P0^2;    //按键减


 

#define     LED_DATA        P1      //P1数据端口

unsigned char value_temp = 0;

unsigned char value_shio = 23;

unsigned char value_feno = 59;

unsigned char value_miao = 59;


 

unsigned char code   value_tab0[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; //共阳极

unsigned char code   value_tab1[]={0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10}; //共阳极 

 

/*

 * 延时1ms延时子函数

**/

void Delay_1ms(unsigned int Time)

{

 unsigned int x, y;

 for(x = Time; x > 0; x--)

  for(y = 120; y > 0; y--);

}


 

/*

 * 按键开关【启动和停止】子函数

**/

void Scan_keyoutCmd(void)

{

 if(KEY0_01 == 0)           

 {

  Delay_1ms(10);         

  if(KEY0_01 == 0)           

  {

   TR0 = ~ TR0;   

  }

  while(KEY0_01 == 0);         

 } 


 

 if(KEY0_02 == 0)           

 {

  Delay_1ms(10);           

  if(KEY0_02 == 0)           

  {

   value_miao--;   

   if(value_miao == -1)

   {

    value_feno--;

    value_miao = 59;

    if(value_feno == 0)

    {

     value_shio--;

     value_feno = 59;

     if(value_shio == 0)

     {

      value_shio = 23;

     }

    } 

   }

   while(KEY0_02 == 0);       

  }

 } 


 

 if(KEY0_03 == 0)           

 {

  Delay_1ms(10);         

  if(KEY0_03 == 0)         

  {

   value_miao++;   

   if(value_miao == 60)

   {

    value_miao = 0;

    value_feno++;

    if(value_feno == 60)

    {

     value_feno = 0;

     value_shio++; 

     if(value_shio == 24)

     {

      value_shio = 0;

     }

    } 

   }

    while(KEY0_03 == 0);          //检测松手

  }

 } 

}


 

/*

 * 程序运行【启动和停止】子函数

**/

void Disp_layledketCmd(void)

{

 /***小时***/

 SHUG_01 = 1;   

 LED_DATA = value_tab0[value_shio / 10];   /*******小时的十位数显示***************/

 Delay_1ms(5);

 SHUG_01 = 0;

 SHUG_02 = 1;

 LED_DATA = value_tab1[value_shio % 10];   /*******小时的个位数显示***************/

 Delay_1ms(5);

 SHUG_02 = 0;


 

 /***分钟***/

    SHUG_03 = 1;   

 LED_DATA = value_tab0[value_feno / 10];   /*******分钟的十位数显示***************/

 Delay_1ms(5);

 SHUG_03 = 0;

 SHUG_04 = 1;

 LED_DATA = value_tab1[value_feno % 10];   /*******分钟的个位数显示***************/

 Delay_1ms(5);

 SHUG_04 = 0;


 

 /***秒钟***/

    SHUG_05 = 1;   

 LED_DATA = value_tab0[value_miao / 10];   /*******秒钟的十位数显示***************/

 Delay_1ms(5);

 SHUG_05 = 0;

 SHUG_06 = 1;

 LED_DATA = value_tab0[value_miao % 10];   /*******秒钟的个位数显示***************/

 Delay_1ms(5);

 SHUG_06 = 0;

}


 

void Tero_Init(void)

{

 TMOD = 0x01;

 TH0 = (65536 - 50000) / 256;

 TL0 = (65536 - 50000) % 256;

 ET0 = 1;

 TR0 = 1;

 EA = 1;

}


 

/*

 * 函数主体

**/

int main(void)

{

 P1 = P2 = P3 = 0x00;

 Tero_Init();

 

 while(1)

 {

  Scan_keyoutCmd();

  Disp_layledketCmd();  //执行应运程序 

 } 

}


 

/*

 * 定时器中断服务程序

**/

void Tmero()interrupt 1

{

 TH0 = (65536 - 50000) / 256;

 TL0 = (65536 - 50000) % 256;

 value_temp++;

 if(value_temp == 20)

 {

  value_temp = 0;

  value_miao--;

  if(value_miao == 0)

  {

   value_feno--;

   value_miao = 59;

   if(value_feno == 0)

   {

    value_shio--;

    value_feno = 59;

    if(value_shio == 0)

    {

     value_shio = 23;

    }

   }


 

  }

 } 

}



你可以参考下面这个程序,这个是加计时器.把对应端口改下,计时改减就可以了.
数码管的显示网上大把,移植一下就可以了.
//--------LCD 1601 clock----------------------------------------
//---modified from a LCD1602 program,2012/11/21-----------------
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
//----P3: key input for modify timer ---------------------------
#define KEY_IO P3
#define LCD_IO P0
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
//----P1.2: timer speaker output-------------------------------
sbit SPK = P1^2;
//----P2.4: timer LED indicator output------------------------
sbit LED = P2^4;
bit new_s, modify = 0;
char t0, sec = 50, min = 59, hour = 23;
//char code LCD_line1[] = "Designed by ZELD";
char code LCD_line2[] = "Timer: 00:00:00 ";
char Timer_buf[] = "23:59:50";
//---------------------------------------------------
void delay(uint z)
{
uint x, y;
for(x = z; x > 0; x--) for(y = 100; y > 0; y--);
}
//---------------------------------------------------
void W_LCD_Com(uchar com) //写指令
{
LCD_RS = 0; LCD_IO = com; // LCD_RS和R/W都为低电平时,写入指令
LCD_EN = 1; delay(5); LCD_EN = 0; //用EN输入一个高脉冲
}
//---------------------------------------------------
void W_LCD_Dat(uchar dat) //写数据
{
LCD_RS = 1; LCD_IO = dat; // LCD_RS为高、R/W为低时,写入数据
LCD_EN = 1; delay(5); LCD_EN = 0; //用EN输入一个高脉冲
}
//---------------------------------------------------
void W_LCD_STR(uchar *s) //写字符串
{
while(*s) W_LCD_Dat(*s++);
}
//---------------------------------------------------
void W_BUFF(void) //填写显示缓冲区
{
Timer_buf[7] = sec % 10 + 48; Timer_buf[6] = sec / 10 + 48;
Timer_buf[4] = min % 10 + 48; Timer_buf[3] = min / 10 + 48;
Timer_buf[1] = hour % 10 + 48;Timer_buf[0] = hour / 10 + 48;
// W_LCD_Com(0xc0 + 7); W_LCD_STR(Timer_buf);
//1602 start from address C0H(second row),1601 start from 40H-------
W_LCD_Com(0x80 + 7); W_LCD_STR(Timer_buf);

}
//---------------------------------------------------
uchar read_key(void)
{
uchar x1, x2;
KEY_IO = 255;
x1 = KEY_IO;
if (x1 != 255) {
delay(100);
x2 = KEY_IO;
if (x1 != x2) return 255;
while(x2 != 255) x2 = KEY_IO;
if (x1 == 0x7f) return 0;
else if (x1 == 0xbf) return 1;
else if (x1 == 0xdf) return 2;
else if (x1 == 0xef) return 3;
else if (x1 == 0xf7) return 4;
}
return 255;
}
//---------------------------------------------------
void Init()
{
LCD_RW = 0;
W_LCD_Com(0x38); delay(50);
W_LCD_Com(0x0c);
W_LCD_Com(0x06);
W_LCD_Com(0x01);
// W_LCD_Com(0x80); W_LCD_STR(LCD_line1);
// W_LCD_Com(0xC0); W_LCD_STR(LCD_line2);
W_LCD_Com(0x80); W_LCD_STR(LCD_line2);
TMOD = 0x01; //T0定时方式1
TH0 = 0x4c;
TR0 = 1; //启动T0
PT0 = 1; //高优先级, 以保证定时精度
ET0 = 1;
EA = 1;
}
//---------------------------------------------------
void main()
{
uint i, j;
uchar Key;
Init();
while(1) {
//-------------------------------
if (new_s) { //如果出现了新的一秒, 修改时间
new_s = 0; sec++; sec %= 60;
if(!sec) { min++; min %= 60;
if(!min) { hour++; hour %= 24;}
}
W_BUFF(); //写显示
//-------------------------------
if (!sec && !min) { //整点报时
for (i = 0; i < 200; i++) {
SPK = 0; for (j = 0; j < 100; j++);
SPK = 1; for (j = 0; j < 100; j++);
} }
}
//-------------------------------
Key = read_key(); //读出按键
switch(Key) { //分别处理四个按键
case 0: modify = 1; break;
case 1: if(modify) {min++; min %= 60; W_BUFF(); break;}
case 2: if(modify) {hour++; hour %= 24; W_BUFF(); break;}
case 3: modify = 0; break;
} }
}
//---------------------------------------------------
void timer0(void) interrupt 1 //T0中断函数, 50ms执行一次
{
TH0 = 0x4c;
t0++; t0 %= 20; //20, 一秒钟
if(t0 == 0) {new_s = 1; LED = ~LED;}
if(modify) LED = 0;
}
//===================================================


c语言编辑器和keil有什么区别?
独立软件需要安装,网页打开就能用,但相对功能简化。就像其它软件vs和codeslocks也用来编写c语言。而编译是软件里设置选择的编译器处理的,比如GCC,MSC,TurboC。从应用上讲,在线网页编译器使用简单,但功能也少,主要学习或调试一下代码。而专门的软件是用于开发的,比如上面的keil就用于单片机程序的开发 ...

用KEIL编写C语言程序实现:单片机是AT89C51,实现一个计时器,数码管为6...
按照你的要求写的程序如下,你拿去测试吧!include "REG52.H"sbit SHUG_01 = P2^0; \/\/数码管1 sbit SHUG_02 = P2^1; \/\/数码管2 sbit SHUG_03 = P2^2; \/\/数码管3 sbit SHUG_04 = P2^3; \/\/数码管4 sbit SHUG_05 = P2^4; \/\/数码管5 sbit SHUG_06 = P2^5;...

keil uvision4可以用C语言写吗?就是能编译C吗
可以啊,写完代码直接点【build】

我用Keil编写的C语言代码老是提示这个错误,帮我修正一下
Sbit P1_0=p1^0中的p1^0,应改为P1^0,在C51的系统中,I\/O口描述语句必须是大写的,reg51.h程序包中是这样定义的。

在keil中用c语言编写求最值的程序代码?
include <stdio.h>double max(double a,double b){ return a>b?a:b;}double min(double a,double b){ return a

keil uvision4调用C语言
KEIL中要编译C语言,首先肯定要建一个工程,再将C源程序添加到工程中或者新建C源程序。如果导入一个工程,在左边栏中,肯定有包含的源程序及头文件列表,双击源程序就打开显示了。

用keil软件编写C语言程序
1:定义一个变量,指ram80h的内容赋给变量,再把变量的量赋给外部ram2010h,

我在用keilc51编写C语言程序时最左边为什么不显示行数
要keil软件在编写C语言程序时最左边显示行数,设置一下就行了,点主莱单的Edit,见下图,选中设置选项一行,画红圈一行。弹出一个对话框,下图画红圈项打勾即可。

keil 如何生成c语言库函数
在左侧的项目树上,在项目根目录上(默认是target 1)点右键,选择option for target target 1,在选“output”页,再选Create Library,最后点OK就可以了。如果你的程序没有错误,编译通过了,那就会生成一个库文件,在以后的程序中调用了。

用keil软件编写单片机程序的步骤
一路点击确认后回到如下图所示的主界面,并如下图所示点击新建程序输入文本 点击后出现如下第一张图所示界面,并点击保存按钮 点击保存按钮后出现下第一张图所示对话框,在箭头所指的地方输入源文件名称加后缀名(如果你是用C语言编写程序后缀名为*.c;如果你是用汇编语言编写程序则后缀名为*.asm)并...

浉河区17682954598: 用keil软件如何将汇编与C语言结合起来一起编写单片机的程序 -
娄红唯新: 在混合编程中,最常用也是最实用的方法是在C语言中加入部分汇编语言的代码,分为两种方法. 方法1)在Keil C51的函数中直接插入汇编语句 方法2)按照Keil C51接口规则,编写汇编模块方法1是利用编译控制命令#pragma asm(用来标识...

浉河区17682954598: 用KEIL编写C语言程序实现:单片机是AT89C51,实现一个计时器,数码管为6为的,有三个按键接在P0上. -
娄红唯新: 按照你的要求写的程序如下,你拿去测试吧!#include "REG52.H" sbit SHUG_01 = P2^0; //数码管1 sbit SHUG_02 = P2^1; //数码管2 sbit SHUG_03 = P2^2; //数码管3 sbit SHUG_04 = P2^3; //数码管4 sbit SHUG_05 = P2^4; //数码管5 ...

浉河区17682954598: 把C语言程序写入单片机 -
娄红唯新: 用Keil软件吧,在设置里面的output下选中要生成那种文件,再编译一下只要通过了就有了…

浉河区17682954598: keil软件用单片机控制8个LED流水灯来回点亮(C语言程序) -
娄红唯新: #include "reg51.h"main(){unsigned int i,j;while(1){P1=0xfe; //点亮第一个LEDfor(i=200;i>0;i--)for(j=500;j>0;j--);P1=0xfd; //点亮第二个LEDfor(i=200;i>0;i--)for(j=500;j>0;j--);P1=0xfb; //点亮第三个LEDfor(i=200;i>0;i--)for(j=500;j>...

浉河区17682954598: 所有的单片机都能运行用keil软件写的C语言程序吗? -
娄红唯新: KEIL是用C语言编写单片机程序的,但是单片机并不认识C语言,KEIL还可以把扩展名为C的文件转换为扩展名为HEX的文件,绝大多数单片机都认识HEX文件.

浉河区17682954598: 在51单片机中用c语言keil写程序实现用一个按键控制6个灯的亮和灭(按下按 -
娄红唯新: #include<reg51.h> sbit key=P1^0; sfr LED=P0; main() { while(1) if(key==0)P0=0xc0; else P0=0xff; }

浉河区17682954598: 用KEIL 为89S51单片机写个C语言音乐程序 -
娄红唯新: //此程序在硬件上调试通过 //本程序的单片机晶振采用11.0592M #include <reg51.h> sbit speaker=P1^1; unsigned char timer0h,timer0l,time; //世上只有妈妈好数据表 code unsigned char sszymmh[]={ 6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1, 6,2,...

浉河区17682954598: keil软件中怎样添加STC系列单片机 -
娄红唯新: 用keil软件,不过是两种用途,一是编译C语言程序,纯粹是编译,不用仿真.如果是这种,也不必要添加STC单片机.其实,只是在建工程时,需要选单片机型号.而编写的程序,与型号无关.所以,用实物STC单片机,建工程时,随便选一款51单片机就行.具体程序就应该按STC单片机来编写.对于STC单片机增加的寄存器可以加载STC的头文件即可.二是写程序后仿真.但是,即使是添加了STC单片机,照样不能仿真STC单片机所增加的寄存器,还是按传统51单片机来仿真,这就没有什么实际意义了. 非要添加,就去STC官网下载一个数据文件. 添加后,不论是编译还是仿真,都没有什么实际的用处.

浉河区17682954598: keil和vc++,单片机编程 -
娄红唯新: 1、从编程思路的角度说,单片机上用keil编程,和用VC++编程没什么不同;2、二者语言规则不同;3、主要不同在于二者针对的对象不同,所以编译架构也就不同.不一定非要用keil,也有很多别的编译软件,有支持汇编,也有支持C的,也有...

浉河区17682954598: 单片机用keil 编程C语言,控制某I/O口通断 -- 通断的循环,公式怎么编,比如循环通断100次,并编写多种延时 -
娄红唯新: 用FOR 循环或 While也可以 for (k=0; k<100; k++){ P1=0; Delay(); // 这里自己加个...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网