×

c51单片机编程实例

c51单片机编程实例(c51单片机c语言交通灯的程序)

admin admin 发表于2022-09-16 09:10:18 浏览587 评论0

抢沙发发表评论

本文目录

c51单片机c语言交通灯的程序

Proteus仿真原理图:

程序如下:

#include 《reg51.h》

#define uchar unsigned char

#define uint  unsigned int

uchar data buf;

uchar data sec_dx=20;//东西数默认

uchar data sec_nb=30;//南北默认值

uchar data set_timedx=20;

uchar data set_timenb=30;

int n;

uchar data b;//定时器中断次数

sbit  k1=P1^6;//定义5组开关

sbit  k2=P1^7;

sbit  k3=P2^7;

sbit  k4=P3^0;

sbit  k5=P3^1;

sbit Yellow_nb=P2^5;       //南北黄灯标志

sbit Yellow_dx=P2^2;       //东西黄灯标志

sbit Green_nb=P2^4;

sbit Green_dx=P2^1;

sbit Buzz=P3^7;

bit Buzzer_Indicate;

bit time=0;//灯状态循环标志

bit   set=1;//调时方向切换键标志

uchar code table={       //共阴极字型码

0x3f,  //--0

0x06,  //--1

0x5b,  //--2

0x4f,  //--3

0x66,  //--4

0x6d,  //--5

0x7d,  //--6

0x07,  //--7

0x7f,  //--8

0x6f,  //--9

0x00   //--NULL

};

//函数的声明部分

void delay(int ms);//延时子程序

void key();//按键扫描子程序

void key_to1();//键处理子程序

void key_to2();

void key_to3();

void display();//显示子程序

void logo();   //开机LOGO

void Buzzer();

//主程序

void main()

{

TMOD=0X01;    

TH0=0XD8;

TL0=0XF0;

EA=1;

ET0=1;

TR0=1;

EX0=1;

EX1=1;

logo();

P2=0Xc3;// 开始默认状态,东西绿灯,南北黄灯

sec_nb=sec_dx+5;

while(1)

{       

key(); //调用按键扫描程序

display(); //调用显示程序

Buzzer();

}     

}

//函数的定义部分

void key()    //按键扫描子程序

{

if(k1!=1)

{

delay(10);

if(k1!=1)

{

while(k1!=1)

{

key_to1();

for(n=0;n《40;n++)

{ display();}

}

}

}

if(k2!=1)

{

delay(10);

if(k2!=1)

{

while(k2!=1)

{

key_to2();

for(n=0;n《40;n++)

{ display();}

}

}

}

if(k3!=1)

{     

TR0=1;   //启动定时器

Buzzer_Indicate=0;

sec_nb=set_timenb;  //从中断回复,仍显示设置过的数值

sec_dx=set_timedx;

if(time==0)

{ P2=0X99;sec_nb=sec_dx+5; }

else { P2=0xC3;sec_dx=sec_nb+5; }

}       

if(k4!=1)

{

delay(5);

if(k4!=1)

while(k4!=1);

set=!set;

}

}

if(k5!=1)

{

delay(5);

if(k5!=1)

{

while(k5!=1)    

key_to3();

}

}

}

void display() //显示子程序

{    

buf=sec_dx/10; //第1位 东西秒十位

buf=sec_dx%10; //第2位 东西秒个位

buf=sec_nb/10; //第3位 南北秒十位

buf=sec_nb%10; //第4位 南北秒个位       

P1=0xff;                                // 初始灯为灭的

P0=0x00;

P1=0xfe;                              //片选LCD1

P0=table;

delay(1);

P1=0xff;

P0=0x00;

P1=0xfd;                           //片选LCD2

P0=table;

delay(1);

P1=0xff;

P0=0x00;

P1=0Xfb;              //片选LCD3

P0=table;

delay(1);

P1=0xff;

P0=0x00;

P1=0Xf7;

P0=table;               //片选LCD4  

delay(1);

}

void time0(void) interrupt 1 using 1  //定时中断子程序

{

b++;

if(b==19)                        // 定时器中断次数

{      b=0;

sec_dx--;

sec_nb--;

if(sec_nb《=5&&time==0)  //东西黄灯闪       

{  Green_dx=0;Yellow_dx=!Yellow_dx;}                                     

if(sec_dx《=5&&time==1)  //南北黄灯闪       

{  Green_nb=0;Yellow_nb=!Yellow_nb;}                                                     

if(sec_dx==0&&sec_nb==5)

sec_dx=5;

if(sec_nb==0&&sec_dx==5)

sec_nb=5;

if(time==0&&sec_nb==0)

{ P2=0x99;time=!time;sec_nb=set_timenb;sec_dx=set_timenb+5;}

if(time==1&&sec_dx==0)

{P2=0Xc3;time=!time;sec_dx=set_timedx;sec_nb=set_timedx+5;}

}    

}

void key_to1()    //键盘处理子程序之+

{

TR0=0;          //关定时器  

if(set==0)

set_timenb++;    //南北加1S

else

set_timedx++;    //东西加1S

if(set_timenb==100)

set_timenb=1;

if(    set_timedx==100)

set_timedx=1;   //加到100置1

sec_nb=set_timenb ;    //设置的数值赋给东西南北

sec_dx=set_timedx;  

}

void key_to2()       //键盘处理子程序之-

{

TR0=0;         //关定时器

if(set==0)

set_timenb--;  //南北减1S

else

set_timedx--;  //东西减1S

if(set_timenb==0)

set_timenb=99;  

if(    set_timedx==0 )

set_timedx=99;   //减到1重置99

sec_nb=set_timenb ;    //设置的数值赋给东西南北

sec_dx=set_timedx;  

}

void key_to3()   //键盘处理之紧急车通行

{

TR0=0;

P2=0Xc9;

sec_dx=00;

sec_nb=00;

Buzzer_Indicate=1;

}

void int0(void) interrupt 0 using 1  //只允许东西通行

{

TR0=0;

P2=0Xc3;

Buzzer_Indicate=0;

sec_dx=00;

sec_nb=00;

}

void int1(void) interrupt 2 using 1       //只允许南北通行

{

TR0=0;

P2=0X99;

Buzzer_Indicate=0;

sec_nb=00;

sec_dx=00;

}

void logo()//开机的Logo  “- - - -“

{ for(n=0;n《50;n++)

{

P0=0x40;

P1=0xfe;

delay(1);

P1=0xfd;

delay(1);

P1=0Xfb;

delay(1);

P1=0Xf7;

delay(1);

P1 = 0xff;

}

}

void Buzzer()

{

if(Buzzer_Indicate==1)

Buzz=!Buzz;

else Buzz=0;

}

void delay(int ms)            //延时子程序

{

uint j,k;

for(j=0;j《ms;j++)

for(k=0;k《124;k++);

}


编写一个完整的单片机C51程序


#include《reg51.h》
sbit led=P1^0; //单片机管脚位声明
void main()
{
TMOD=0x01; //定时器TO工作在方式1
TH0=(65536-5000)/256; //装初值,12M晶振 1为1us; 5000为5000us=5ms;
TL0=(65536-5000)%256;
EA =1; //开总中断
ET0=1; //开定时器TO中断
TR0=1; //启动定时器
P1=0; //初始化P1口
while(1) ; //程序在这里等待中断发生
}
void T0_time() interrupt 1
{
unsigned char num;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
num++;
if(num==100) //0.5S (1s闪烁1次==0.5S亮0.5S灭)
{
num=0;
led=~led; //led状态取反
}
}
-c51单片机编程实例

单片机c51编程


也不晓楼主把这个C程序发出来,有不有什么问题需要帮助的
我自各儿做的一个数字钟:00-00-00型的,为24小时制的,汇编程序和Protues都发给了你,注意查收噢!(twp……@126.com)

51单片机C语言开发与实例的目录

第1章 MCS-51单片机与C语言
1.1 MCS-51单片机的特点
1.1.1 MCS-51单片机简介
1.1.2 MCS-51单片机的内部结构
1.1.3 MCS-51单片机的存储器组织
1.2 汇编语言
1.3 C语言
1.4 单片机汇编语言与C语言程序设计对照
1.5 汇编语言和C语言混合编程
1.5.1 在C51中嵌入汇编
1.5.2 C程序中调用汇编功能程序
1.5.3 汇编程序调用C程序
第2章 KeilC51的数据结构
2.1 KeilC51
2.2 数据类型
2.3 存储种类及存储区
2.3.1 整型常量
2.3.2 字符型常量
2.3.3 字符串常量
2.3.4 位标量
2.4 变量
2.4.1 变量的定义
2.4.2 存储器类型
2.4.3 存储器模式
2.4.4 重新定义数据类型
2.5 数组
2.6 指针
2.7 结构
2.8 联合
2.9 枚举
第3章 KeilC51程序设计
3.1 预处理
3.2 运算符与表达式
3.3 控制流语句
3.3.1 条件语句
3.3.2 while循环
3.3.3 do-while循环
3.3.4 for循环
3.3.5 goto语句
3.3.6 switch语句
3.3.7 Break语句和continue语句
3.3.8 返回语句return
3.4 函数
3.4.1 定义函数
3.4.2 调用函数
3.4.3 中断服务函数
3.4.4 函数的递归调用与再入函数
第4章 KeilC51集成开发环境
4.1 KeilC51安装
4.2 μVision3集成开发环境
4.3 μVision3的栏目和窗口
4.4 创建项目
4.5 简单的程序调试
4.6 含有多个文件的项目
4.7 代码优化
4.8 技巧和窍门
4.9 KeilC编译器常见警告与错误信息的解决方法
第5章 用KeilC51开发8051单片机内部资源
5.1 用KeilC51开发输入/输出端口
5.1.1 输入/输出端口简介
5.1.2 输出端口应用实例
5.1.3 输入端口实例
5.2 用KeilC51开发定时器/计数器
5.2.1 定时器/计数器简介
5.2.2 控制和状态寄存器
5.2.3 定时器/计数器设置实例
5.2.4 定时器/计数器2
5.2.5 编程实例
5.3 中断系统编程
5.3.1 中断系统
5.3.2 中断系统的控制寄存器
5.3.3 中断的响应过程
5.3.4 中断实例
5.4 用KeilC51开发串行口
5.4.1 数据通信的基本概念
5.4.2 MCS-51的串行口控制寄存器
5.4.3 工作方式
5.4.4 数据传输率的确定
5.4.5 串行通信实例
第6章 单片机的资源扩展
第7章 8051单片机的系统设计
第8章 8051单片机程序固化方法
第9章 单片机的断电保护
第10章 单片机与PC机通信
第11章 在系统编程和在应用中编程
第12章 单片机之间的通信
第13章 I2C总线接口技术
第14章 用C51开发线切割机床控制器
第15章 步进电机驱动
第16章 红外器件应用
附录A MCS-51指令表
附录B KeilC51的库函数-c51单片机编程实例

用c51单片机控制一个闪光灯循环闪光5次以后熄灭不再闪光,用C语言编程,求程序

用C语言编程,求程序的方法:

#include//包含单片机寄存器的头文件

/****************************************函数功能:延迟一段时间

*****************************************/

Voiddelay(Void)//Void表示没有返回值,也没有传递参数。

Unsignedint我;定义一个最大值为65535的无符号整数。

For (I = 0;我《 20000;i++) //执行20000个空循环。

;//什么也不做,等待一个机器周期。

/*******************************************************

函数函数:主函数(C语言规则必须有且只能有一个主函数)。

********************************************************/空白主要(空白)

而(1)//无限循环。

P0=0xfe;//P1=11111110B,P0.0输出低电平。

延迟();//推迟一段时间。

P0=0XFF;//P1=11111111B,P0.0输出高电平。

延迟();//推迟一段时间。

单片机驱动LED光源程序:

#include//头文件。

定义uint无符号int

#定义uchar无符号字符

SbitLED1=P1^7;//定义。

空白delay_ms(单位);//带参数的ms级延时函数。

Voidmain()

而(1)

LED1=0;

Delay_ms(1000);

LED1=1;

Delay_ms(1000);

Voiddelay_ms(uintz)//delay子例程

使用Uintx,y;

For (x = z;X 》 0;X -)

For (y = 110;Y 》 0;Y -);

扩展资料:

单片机应用分类:

一般类型:

这是关于微控制器的。例如80C51通用型单片机,它并不是为特定的目的而设计的;专用单片机是为某一类产品甚至某一种产品而设计生产的。例如,为了满足电子体温计的要求,芯片中集成了具有ADC接口的温度测量控制电路等功能。-c51单片机编程实例

主线:

这是由微控制器是否提供并行总线来区分的。总线微控制器一般安装有并行地址总线、数据总线、控制总线,这些引脚扩展并行外围设备可以通过串口与单片机连接。

另外,很多单片机都需要将外围设备和外围设备的接口集成在一块,所以在很多情况下不能并行扩展总线,大大降低了封装成本和芯片体积,这种单片机被称为非总线单片机。

控制类型:

这是关于微控制器的一般应用。一般来说,工业控制寻址范围大,计算能力强。家用电器的单片机大多是专用的。

它通常是小包装、低价格、高集成的外围设备和外围接口。显然,上述分类并不独特和严格。例如,80C51类单片机既是通用的,又是总线的,还可以用于工业控制。

c51单片机编程

一位共阳数码管接在P0口,为静态显示。P3口接有8个独立式按键,按键为K1~K8,按键8个按键中的任意一个,数码管则显示出按键编号。仿真图如下,这是按下K6时显示6。

c51单片机程序实例

#include《reg51.h》
#define uchar unsigned char
uchar tab={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};  //0到9
uchar num,cnt,disn;
uchar keyval,disk;
uchar led={1,2,3,4};
void dealdat(uchar a)
{
led=0;
led=0;
led=0;
led=0;
led=disk;
}
void delay(unsigned int a)
{
unsigned int i,j;
for(i=0;i《a;i++)
for(j=0;j《1000;j++);
}
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;
num++;
num&=0x03;
cnt++;
if(cnt》100)
{
cnt=0;
disn++;
disn%=4;
dealdat(disn);
}
}
uchar kbscan(void)
{
unsigned char sccode,recode;
P3=0x0f;  //发0扫描,列线输入
if ((P3 & 0x0f) != 0x0f)  //有键按下
{
// delay(20);   //延时去抖动
if ((P3&0x0f)!= 0x0f)
{
sccode = 0xef;    //逐行扫描初值
while((sccode&0x01)!=0)
{
    P3=sccode;
if((P3&0x0f)!=0x0f)
{
    recode=(P3&0x0f)|0xf0;
return((~sccode)+(~recode));
 }
        else
sccode=(sccode《《1)|0x01;
}
}
}
return 0;  //无键按下,返回0
}
void getkey(void)
{
unsigned char key;
key=kbscan();
if(key==0){keyval=0xff;return;}
switch(key)
{
case 0x11:keyval=7;break;
case 0x12:keyval=4;break;
case 0x14:keyval=1;break;
case 0x18:keyval=10;break;
case 0x21:keyval=8;break;
case 0x22:keyval=5;break;
case 0x24:keyval=2;break;
case 0x28:keyval=0;break;
case 0x41:keyval=9;break;
case 0x42:keyval=6;break;
case 0x44:keyval=3;break;
case 0x48:keyval=11;break;
case 0x81:keyval=12;break;
case 0x82:keyval=13;break;
case 0x84:keyval=14;break;
case 0x88:keyval=15;break;
default:keyval=0xff;break;
}
}
main()
{
TMOD=0x11;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
getkey();
if(keyval!=0xff)disk=keyval;
delay(10);
}
}-c51单片机编程实例

C51单片机编程


51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8004单片机,后来随着Flash rom技术的发展,8004单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。需要注意的是51系列的单片机一般不具备自编程能力。
-c51单片机编程实例

单片机C51程序编程题


#include
#define uchar unsigned char
#define uint unsigned int
sbit LED = P1^0;
uchar T_Count = 0;
void main()
{
TMOD = 0x01;
TH0 = (65535-5000)/256;
TL0 = (65535-5000)%256;
IE = 0x82;
TR0 = 1;
while(1);
}
void LED_Flash() interrupt 1
{
TH0 = (65535-5000)/256;
TL0 = (65535-5000)%256;
if(++T_Count == 100)
{
LED = !LED;
T_Count = 0;
}
}
-c51单片机编程实例