51单片机基础C程序架构

51单片机基础C程序架构
51单片机基础C程序架构

51单片机基础C程序架构

作者:u010785142

keil基本步骤:

(1)新建一个工程:Project——New uVision Project

(2)选择型号:AT89C52

(3)新建.c文件:File——new——a.c

保存为:.c后缀

(4)添加.c文件:

(5)编写程序

以下是基本程序架构:很重要的笔记

A. 基本程序框架:(点亮小灯)

#include

sbit LED=P1^0;

void main (void)

{

LED=0; // P1 = 0xfe;

while (1)

{

//空循环

}

}

B. for循环语句:(小灯循环点亮)

unsigned char i;

for(i=0;i<10;i++)

{;}

执行顺序:i=0; —— i<10; —— {}中的内容—— i++ ——。。。

C. 左移/右移(小灯逐个往左/右移动亮)

P1=0xfe; // P1=0x7f;

for(i=0;i<8;i++) //加入for循环,表明for循环大括号中的程序循环执行8次 {

Delay(50000);

P1<<=1; //P1>>=1;

}

循环左移/右移:

for(i=0;i<8;i++) //加入for循环,表明for循环大括号中的程序循环执行8次 {

Delay(50000);

P1<<=1; //P1>>=1;

P1=P1|0x01; //P1=P1|0x80;

//左移后,最右端自动赋值0,所以需要该语句赋值1

}

P1=0xfe; //P1=0x7f; //重新赋初始值

D. 数组的使用:

unsigned char code table[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe, 0xff,0xff,0x00,0x00, 0x55,0x55,0xaa,0xaa};

for(i=0;i<16;i++)

{

P1=table[i];

Delay(3000);

}

E. PWM调光

sbit LED0=P1^0;

void main (void)

{

unsigned int CYCLE=600,PWM_LOW=0;

while(1)

{

LED0=1;

Delay(6000);

for(PWM_LOW=1;PWM_LOW

{

LED0=0;

Delay(PWM_LOW);

LED0=1;

Delay(CYCLE-PWM_LOW);

}

LED0=0;

for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)

{

LED0=0;

Delay(PWM_LOW);

LED0=1;

Delay(CYCLE-PWM_LOW);

}

}

F. 共阳数码管显示(循环显示数字)

unsignedchar code

dofly_table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};

P1=dofly_table[i];

{

P1=dofly_table[i];

Delay(60000);

}

G. 独立按键(按键控制数码管显示数字) switch选择语句

switch(P3) //P3口作为独立按键输入端

{

case0xfe:P1=dofly_table[1];break;

case 0xfd:P1=dofly_table[2];break;

default:break;

}

H. 数码管静态显示:位锁存与段锁存(8位数码管显示其中之一/二)

#define DataPort P0 //定义数据端口程序中遇到DataPort 则用P0 替换sbit LATCH1=P2^2;//定义锁存使能端口段锁存

sbit LATCH2=P2^3;// 位锁存

main()

{

while(1)

{

DataPort=0xfe; //取位码第一位数码管选通,即二进制1111 1110 之一// DataPort=0x7e; //取位码第一位数码管选通,即二进制0111 1110 之二LATCH2=1; //位锁存

LATCH2=0;

DataPort=0x4F; //取显示数据,段码“3”共阴字符码

LATCH1=1; //段锁存

LATCH1=0;

}

}

I. 数码管动态显示:位锁存与段锁存

#define DataPort P0 //定义数据端口程序中遇到DataPort 则用P0 替换sbit LATCH1=P2^2;//定义锁存使能端口段锁存

sbit LATCH2=P2^3;// 位锁存

unsignedchar code

dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

// 显示段码值01234567

unsigned char codedofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //分别对应相应的数码管点亮,即位码

main()

{

unsigned char i=0;

while(1)

{

DataPort=dofly_WeiMa[i]; //取位码

LATCH2=1; //位锁存

LATCH2=0;

DataPort=dofly_DuanMa[i]; //取显示数据,段码//DataPort=dofly_DuanMa[num+i]; LATCH1=1; //段锁存

LATCH1=0;

Delay(200); //扫描间隙延时,时间太长会闪烁,太短会造成重影

i++;

if(8==i) //检测8位扫描完全结束?如扫描完成则从第一个开始再次扫描8位

i=0;

}

}

J. 定时器0

(1)模式0(13位计数器)

void Init_Timer0(void) //初始化

{

TMOD &= 0xF0; //定时器0运行在模式0,13位计数器

// GATE0=0;C/T0#=0; M1=0; M0=0;

TH0 = 0x00; //设置初值0x00,所以计数值为8192,若是时钟频率为12MHz

TL0 = 0x00; //则8192μs中断一次;注:2的13次方是8192

ET0=1; //允许定时器0中断

EA=1; //允许总中断

TR0=1; //启动定时器0

}

voidTimer0_isr(void) interrupt 1

{ }

(2)模式1(16位定时器)重要

void Init_Timer0(void) //初始化

{

TMOD |= 0x01; //模式1,16位定时器,使用"|"符号在使用多个定时器时不受影响

TH0=0x00; //给定初值,这里用定时器最大值从0开始计数一直到65535溢出TL0=0x00; //一次最多可定时65.536ms

// TH0=(65535-50000)/256=0x3c=60(10); //50ms

// TL0=(65535-50000)%256=0xb0=176(10);

EA=1; //总中断打开

ET0=1; //定时器中断打开

TR0=1; //定时器开关打开

}

void Timer0_isr(void) interrupt 1 using 1

{

TH0=0x00; //重新赋值

TL0=0x00;

LED=~LED; //定时到了:执行的内容

}

注:时间计算

51单片机1个机器周期=12个时钟周期,频率为12MHZ,则一个机器周期为1US,具体到定时器程序就是,假如你想定1MS,那么单片机每次加一个一,就要过1US,那么1MS 就要加1000次,所以用65535-1000=64535;再把64535换成16进制为FC17,把FC 付给TH0,17给TLO,即可定时1MS,因为65535他就溢出进入中断。

(3)模式2(8位重装模式)

void Init_Timer0(void) //初始化

{

TMOD &= 0xF0; //模式2,8位重装模式

TMOD|=0x0A; //GATE0=1;C/T0#=0; M1=1; M0=0;

TH0=0x06; //设定初值;0x06= 0000 0110

TL0=0x06; //计数值为250,若为12MHz,相当于250us;

EA=1; //总中断打开

ET0=1; //定时器中断打开

TR0=1; //定时器开关打开

}

void Timer0_isr(void) interrupt 1 using 1

{

n=n++; //没中断一次,n+1,每两次中间间隔250us

if(n=40)//n=40,就是中断40次,相当于250*4=10ms

{

n=0;

m++; //每10ms,m+1

if(m==100) //m=100,相当于10ms*100=1s

{m=0;

}

}

(4)模式3

定时器0工作于方式3 时,占用了定时器1的TR1和TF0。

K. 定时器1(功能与定时器0一样,定时器1还可以用做串口的波特率发生器)voidInit_Timer1(void) //初始化

{

TMOD |= 0x10; //模式1,16位定时器,使用"|"符号在使用多个定时器时不受影响

TH1=0x00; //给定初值,这里用定时器最大值从0开始计数一直到65535溢出

TL1=0x00;

// TH0=(65535-50000)/256=0x3c=60(10); //50ms

// TL0=(65535-50000)%256=0xb0=176(10);

EA=1; //总中断打开

ET1=1; //定时器中断打开

TR1=1; //定时器开关打开

}

void Timer1_isr(void) interrupt 3 using 1

{

TH1=0x00; //重新赋值

TL1=0x00;

LED=~LED; //LED闪烁

}

L. 定时器2

voidTIM2Inital(void) //初始化

{

RCAP2H = (65536-60000)/256; //晶振12M 60ms 16bit 自动重载

RCAP2L = (65536-60000)%256;

ET2=1; //打开定时器中断

EA=1; //打开总中断

TR2=1; //打开定时器开关

}

void TIM2(void) interrupt 5 using 1//定时器2中断

{

TF2=0;

LED=~LED; //执行函数

}

M. 产生方波(定时器0模式1)

(1)产生1ms方波

sbitOUT=P1^2;

voidInit_Timer0(void)

{

TMOD |= 0x01;//使用模式1,16位定时器

//TH0=0x00; //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出 //TL0=0x00;

EA=1; //总中断打开

ET0=1; //定时器中断打开

TR0=1; //定时器开关打开

}

main()

{

Init_Timer0();

while(1);

}

void Timer0_isr(void) interrupt 1 using 1

{

TH0=(65536-500)/256; //重新赋值12M晶振计算,指令周期1uS,

TL0=(65536-500)%256; //1mS方波半个周期500uS,即定时500次

//溢出然后输出端取反

OUT=~OUT; //用示波器可看到方波输出

}

(2)产生200ms方波

void Timer0_isr(void)interrupt 1 using 1

{

staticunsigned char i;

TH0=(65536-10000)/256; //重新赋值12M晶振计算,指令周期1uS,

TL0=(65536-10000)%256; //直接定时器不够用,定时10ms,然后循环10次 i++;

if(i==11)

{

i=0;

OUT=~OUT; //用示波器可看到方波输出

}

}

N. 独立按键(控制一个led)

KEY=1; //按键输入端口电平置高

while (1) //主循环

{

if(!KEY) //如果检测到低电平,说明按键按下

LED=0;

else

LED=1;

}

一个led状态转换:

while (1) //主循环

{

if(!KEY) //如果检测到低电平,说明按键按下

{

DelayMs(10); //延时去抖,一般10-20ms

if(!KEY) //再次确认按键是否按下,没有按下则退出

{

while(!KEY);//如果确认按下按键等待按键释放,没有释放则一直等待

{

LED=!LED;//释放则执行需要的程序

}}}}

O. 外部中断0(P3^2)

main()

{

P1=0x55; //P1口初始值

EA=1; //全局中断开

EX0=1; //外部中断0开

IT0=0; //电平触发

//IT0=1; //边沿触发

while(1)

{

//在此添加其他程序

}

}

voidISR_Key(void) interrupt 0 using 1

{

P1=~P1; //进入中断程序执行程序,

//此时可以通过EA=0指令暂时关掉中断

}

P. 外部中断1(P3^3)

main()

{

LED=0; //LED灯点亮

EA=1; //全局中断开

EX1=1; //外部中断0开

IT1=0; //T1=0表示电平触发

// IT1=1; //IT1=1表示边沿触发

while(1)

{

//在此添加其他程序

}

}

void ISR_INT1(void) interrupt 2

{

if(!INT1)

{

DelayMs(10);//在此处可以添加去抖动程序,防止按键抖动造成错误 if(!INT1)

while(!INT1);//等待按键释放

{

LED=!LED;

}

}

Q. T0/T1外部计数输入

voidInit_Timer0(void)

{

TMOD |= 0x01 | 0x04; //模式1,16位计数器,用"|"符号在使用多个定时器时不受影响 TH0=0xFF; //给定初值

TL0=245; //从245计数到255

EA=1; //总中断打开

ET0=1; //定时器中断打开

TR0=1; //定时器开关打开

}

main()

{

Init_Timer0();

while(1);

}

void Timer0_isr(void) interrupt 1 using 1

{

TH0=0xFF; //重新给定初值

TL0=245;

LED=~LED; //指示灯反相,可以看到闪烁

}

void Init_Timer1(void)

{

TMOD |= 0x10 | 0x40; //模式1,16位计数器,用"|"符号用多个定时器时不受影响

TH1=0xFF; //给定初值

TL1=245; //从245计数到255

EA=1; //总中断打开

ET1=1; //定时器中断打开

TR1=1; //定时器开关打开

}

R. 看门狗溢出测试

sfr WDTRST = 0xA6;

voidRst_Watchdog( void ) //喂狗

{

WDTRST = 0x1E; //先赋值1E 然后赋值E1

WDTRST = 0xE1;

}

void main( void)

{

int i; // 设置看门狗时间为1个时钟循环后

Rst_Watchdog(); //关看门狗一个时钟循环

for( i = 0; i < 500; i++)

{

Rst_Watchdog();

}

P1=0x00;

while(!key) //按下按键不松开,表示程序一直在按键处循环,

//并用LED显示0x55

{

P1=0x55; //模拟出错正常情况应该一直显示LED,

//但是加看门狗之后不间断复位,倒是LED闪烁}

}

S. 步进电机转动原理

sbit A1=P1^0; //定义步进电机连接端口

sbit B1=P1^1;

sbit C1=P1^2;

sbit D1=P1^3;

#define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电

#define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电

#define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电

#define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电

#define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电

unsigned char Speed;

main()

{

//unsigned int i=64*16; //转2周停止

Speed=5; //调整速度

while(1)

{

Coil_A1 //遇到Coil_A1 用{A1=1;B1=0;C1=0;D1=0;}代替

DelayMs(Speed); //改变这个参数可以调整电机转速,

//数字越小,转速越大,力矩越小

Coil_B1

DelayMs(Speed);

Coil_C1

DelayMs(Speed);

Coil_D1

DelayMs(Speed);

}

}

T. 串口通讯

voidInitUART (void)

{

SCON = 0x50; // SCON: 模式1, 8-bit UART, 使能接收

TMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit 重装

TH1 = 0xFD; // TH1: 重装值9600 波特率晶振11.0592MHz TR1 = 1; // TR1: timer 1 打开

EA = 1; //打开总中断

//ES = 1; //打开串口中断

}

void SendByte(unsigned char dat) //发送一个字节

{

SBUF = dat;

while(!TI);

TI = 0;

}

void SendStr(unsigned char *s) //发送一个字符串

{

while(*s!='\0')// \0 表示字符串结束标志,

//通过检测是否字符串末尾

{

SendByte(*s);

s++;

}

}

void main (void)

{

InitUART();

while (1)

{

SendStr("UART test,技术论坛:https://www.360docs.net/doc/385262032.html, thankyou!");

DelayMs(240);//延时循环发送

DelayMs(240);

}

}

U. 串口通讯中断

voidInitUART (void)

{

SCON = 0x50; // SCON: 模式1, 8-bit UART, 使能接收

TMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit 重装

TH1 = 0xFD; // TH1: 重装值9600 波特率晶振11.0592MHz TR1 = 1; // TR1: timer 1 打开

EA = 1; //打开总中断

// ES = 1; //打开串口中断

}

void main (void)

{

InitUART();

SendStr("UART test,技术论坛:https://www.360docs.net/doc/385262032.html,请在发送区输入任意信息"); ES = 1; //打开串口中断

while (1)

{ }

}

void UART_SER (void) interrupt 4 //串行中断服务程序

{

unsigned char Temp; //定义临时变量

if(RI) //判断是接收中断产生

{

RI=0; //标志位清零

Temp=SBUF; //读入缓冲区的值

P1=Temp; //把值输出到P1口,用于观察

SBUF=Temp; //把接收到的值再发回电脑端

}

if(TI) //如果是发送标志位,清零

TI=0;

}

V. RS485通讯原理(与串口通讯类似)

voidmain (void)

{

InitUART();

Ctrl_EN=1; //发送模式(多了这条设定)

while (1)

{

SendStr("UART test,技术论坛:https://www.360docs.net/doc/385262032.html, thank you!");

DelayMs(240);//延时循环发送

DelayMs(240);

}

}

单片机中断程序大全

单片机中断程序大全公司内部编号:(GOOD-TMMT-MMUT-UUPTY-UUYY-DTTI-

//实例42:用定时器T0查询方式P2口8位控制L E D闪烁#include // 包含51单片机寄存器定义的头文件void main(void) { // EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x01; //使用定时器T0的模式1 TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 TR0=1; //启动定时器T0 TF0=0; P2=0xff; while(1)//无限循环等待查询 { while(TF0==0) ; TF0=0; P2=~P2; TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 //实例43:用定时器T1查询方式控制单片机发出1KHz音频

#include // 包含51单片机寄存器定义的头文件sbit sound=P3^7; //将sound位定义为P3.7引脚 void main(void) {// EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x10; //使用定时器T1的模式1 TH1=(65536-921)/256; //定时器T1的高8位赋初值 TL1=(65536-921)%256; //定时器T1的高8位赋初值 TR1=1; //启动定时器T1 TF1=0; while(1)//无限循环等待查询 { while(TF1==0); TF1=0; sound=~sound; //将P3.7引脚输出电平取反 TH1=(65536-921)/256; //定时器T0的高8位赋初值 TL1=(65536-921)%256; //定时器T0的高8位赋初值 } } //实例44:将计数器T0计数的结果送P1口8位LED显示 #include // 包含51单片机寄存器定义的头文件sbit S=P3^4; //将S位定义为P3.4引脚

根据单片机的三路抢答器的设计王辉

基于单片机的三路抢答器的设计 1课程设计的任务与要求 1.1 课程设计的任务 (1)设计一个可供3人进行的抢答器。 (2)系统设置复位按钮,按动后,重新开始抢答。 (3)抢答器开始时数码管显示序号00,选手抢答实行优先显示,优先抢答选手的编号一直保持到主持人将系统清除为止。抢答后显示优先抢答者序号,同时发出音响,并且不出现其他抢答者的序号。 (4)抢答器具有定时抢答功能,且一次抢答的时间有主持人设定,本抢答器的时间设定为30秒,当主持人启动“开始”开关后,定时器开始减计时。 (5)设定的抢答时间内,选手可以抢答,这时定时器停止工作,显示器上显示选手的号码和抢答时间。并保持到主持人按复位键。 1.2 课程设计的要求 (1)基于单片机的三路抢答器的设计,并用Proteus设计与仿真出来。 (2)程序用Keil编程出来,并且生成Hex文件。 (3)设计的方案要能够长期,有效,稳定的运行。 (4)力求简单实用。 1.3 课程设计的研究基础 本设计是以三路抢答为基本理念。考虑到依需设定限时回答的功能,利用AT89C51单片机及外围接口实现的抢答系统,利用单片机的定时器/计数器定时和记数的原理,将软、硬件有机地结合起来,使得系统能够正确地进行计时,同时使数码管能够正确地显示时间。用开关做键盘输出,扬声器发生提示。同时系统能够实现:在抢答中,只有开始后抢答才有效,如果在开始抢答前抢答为无效;抢答时间和回答问题时间倒记时显示,满时后系统计时手动复位。 2 基于单片机三路抢答器系统方案制定 2.1 方案提出 方案一:

图1 方案一设计方案 方案二: 图2 方案二设计方案 2.2 方案比较 第一个方案比第二个方案多了一个驱动电路,所以第一个方案的电路会比较复杂。 2.3 方案论证 该系统采用51系列单片机AT89C52作为控制核心,该系统可以完成运算控制、信号识别以及显示功能的实现。由于用了单片机,使其技术比较成熟,应用起来方便、简单并且单片机周围的辅助电路也比较少,便于控制和实现。整个系统具有极其灵活的可编程性,能方便地对系统进行功能的扩张和更改。 2.4 方案选择 通过以上两个方案的比较,选择第二个方案。 3 基于单片机三路抢答器系统方案设计 3.1各单元模块功能介绍及电路设计

51单片机常用子程序汇总

目录 1、通过串口连续发送n个字节的数据 /*************************************************************** 模块功能:通过串口连续发送n个字节的数据 参数说明: s:待发送数据的首地址 n:要发送数据的字节数 ***************************************************************/ void SendD(unsigned char *s,unsigned char n) { unsigned char unX; if(n>0) { ES=0; // 关闭串口中断 for(unX=0;unX #include #define Nop() _nop_() //空指令

sbit SDA=P1^3; sbit SCL=P1^2; bit ACK; void Start_I2c() { SDA=1; Nop(); SCL=1; Nop(); Nop(); Nop(); Nop(); Nop(); SDA=0; Nop(); Nop(); Nop(); Nop(); Nop(); SCL=0; //钳住I2C总线,准备发送或接受数据Nop(); Nop(); } (2)结束总线函数 /*************************************************************** 模块功能:发送I2C总线结束条件 ***************************************************************/ void Stop_I2c() { SDA=0; Nop(); SCL=1; Nop(); Nop(); Nop(); Nop(); Nop(); SDA=1; Nop(); Nop(); Nop(); Nop();

基于51单片机的6路抢答器

摘要 此次设计选择使用AT89C51单片机为核心的控制元件,设计制作一个简易的抢答器。本设计是以AT89C51单片机作为控制的主要核心,LED显示器,蜂鸣器等六路抢答器的程序,并且利用了单片机的延迟时电路,时钟电路,键复位电路以及定时器/中断等其他电路。六路抢答器的设计特点是让选手应答时间与选手号码实时显示出来,利用复位电路开始新一轮的比赛或者游戏,我们使用的也是我们所掌握的C 语言来进行编程,实现了一些基本功能。 该系统的设计是可行的,以确定准确,简便,强烈的扩展能力。它的体现的功能主要是比赛开始时,主持人读完题目后按下抢答键,语音提示答题开始,提示音结束后开始倒计时,这时数码管开始进行10s 的倒计时,当有选手进行抢答时,选手按下抢答键,这时候数码管显示屏上就会显示出对应答题者的编号以及抢答所剩余的时间。如果10秒计时时间到了还没有人做出抢答,蜂鸣器就会发出声音并且语音提示抢答结束,这一题就作废即所有人均不得分,然后开始新一轮的抢答。在下一轮抢答开始之前按下复位键将时间归零,再按下开始键进行新的一轮。抢答者回答正确后,评审员按下加分键,该选手编号所对应的数码管显示的数字就增加(按一次加一分,最高显示9分)。相反,如果抢答者回答错误,在抢答者分数不为0的情况下,评审员按下减分键,该选手编号所对应的数码管显示数字就减少(按一次减一分,最低显示0分)。 关键词:单片机、AT89C51、抢答器 Abstract:The design options using AT89C51 microcontroller as the core control elements, design a simple Responder. The design is based on the six-way Responder AT89C51 microcontroller as the main core control, LED display, beeper and other procedures, and use of the single-chip delay circuit, clock circuit, key reset circuit and a timer / interrupt other circuits. Six-way Responder design feature is to allow players the response time and the player numbers displayed in real time, using the reset circuit to start a new round of the competition or game, we used our disposal C language programming, to achieve some basic functions. The design of the system is feasible to determine the accurate, simple, strong expansion capability. Its main function is to reflect the start of the game, the host title after reading press answer key, voice

51单片机实用汇编程序库(word)

51 单片机实用程序库 4.1 流水灯 程序介绍:利用P1 口通过一定延时轮流产生低电平 输出,以达到发光二极管轮流亮的效果。实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。 程序实例(LAMP.ASM) ORG 0000H AJMP MAIN ORG 0030H MAIN: 9 MOV A,#00H MOV P1,A ;灭所有的灯 MOV A,#11111110B MAIN1: MOV P1,A ;开最左边的灯 ACALL DELAY ;延时 RL A ;将开的灯向右边移 AJMP MAIN ;循环 DELAY: MOV 30H,#0FFH D1: MOV 31H,#0FFH D2: DJNZ 31H,D2 DJNZ 30H,D1 RET END 4.2 方波输出 程序介绍:P1.0 口输出高电平,延时后再输出低电 平,循环输出产生方波。实际应用中例如:波形发生器。 程序实例(FAN.ASM): ORG 0000H MAIN: ;直接利用P1.0 口产生高低电平地形成方波////////////// ACALL DELAY SETB P1.0 ACALL DELAY 10 CLR P1.0 AJMP MAIN ;////////////////////////////////////////////////// DELAY: MOV R1,#0FFH DJNZ R1,$ RET

五、定时器功能实例 5.1 定时1 秒报警 程序介绍:定时器1 每隔1 秒钟将p1.o 的输出状态改变1 次,以达到定时报警的目的。实际应用例如:定时报警器。程序实例(DIN1.ASM): ORG 0000H AJMP MAIN ORG 000BH AJMP DIN0 ;定时器0 入口 MAIN: TFLA G EQU 34H ;时间秒标志,判是否到50 个 0.2 秒,即50*0.2=1 秒 MOV TMOD,#00000001B;定时器0 工作于方式 1 MOV TL0,#0AFH MOV TH0,#3CH ;设定时时间为0.05 秒,定时 20 次则一秒 11 SETB EA ;开总中断 SETB ET0 ;开定时器0 中断允许 SETB TR0 ;开定时0 运行 SETB P1.0 LOOP: AJMP LOOP DIN0: ;是否到一秒//////////////////////////////////////// INCC: INC TFLAG MOV A,TFLAG CJNE A,#20,RE MOV TFLAG,#00H CPL P1.0 ;////////////////////////////////////////////////// RE: MOV TL0,#0AFH MOV TH0,#3CH ;设定时时间为0.05 秒,定时 20 次则一秒 RETI END 5.2 频率输出公式 介绍:f=1/t s51 使用12M 晶振,一个周期是1 微秒使用定时器1 工作于方式0,最大值为65535,以产生200HZ 的频率为例: 200=1/t:推出t=0.005 秒,即5000 微秒,即一个高电

基于80C51单片机的八路抢答器设计分析

专业论文 题目:基于80C51单片机的八路抢答器设 计

摘要:八路智力抢答器是一个可供八个参赛组进行智力竞赛的电路装置,该装置主要是由单片机最小系统、控制电路(八个选手抢答按钮;三个主持人控制按钮;四个修改按钮)、数码显示电路与蜂鸣器电路组成的。单片机(MCU)是目前在电气控制技术中广泛应用的重要元件。它具有体积小,稳定性高,应用范围广,控制能力强,升级改造容易等诸多优点。本论文介绍采用ATMEL公司AT89S52单片机设计八路智能抢答器。软件采用汇编语言编程,汇编语言属于计算机领域的低级语言,具有简明易懂,执行效率高等的优点。智能八路抢答器具有抢答时间与答题时间调整,抢答错误报警提示等功能,可以广泛应用于各类知识竞赛。 关键词:抢答器;单片机;硬件系统;软件编程

基于80C51单片机的八路抢答器设计 一、系统概述与原理方框图 在文中,我对八路抢答器的总体设计及其主要的功能特点进行简单的分析,并给出它的特点,实现的功能以及系统的简单操作,以对单片机及其控制系统的了解。 (一)单片机技术发展的概述与系统问题的提出 目前,单片机正朝着高性能和多品种方向发展,单片机的发展正朝着 CMOS化,低功耗,小体积,大容量,高性能,低价格和外围电路的内装化等 几个方面 发展。近几年,由于某种原因CHMOS技术的进步,大大地促进了单片机的CMOS 化,此种芯片除了低功耗外,还具有功耗的可控性,使单片机可以工作在功 耗精细管理状态,特别是IIC,API等串行总线的引入,可以使单片机的引脚 设计得更少,单片机系统结构更加简化及规范化。 我们设计出的8路抢答器是一种基于MCS-51单片机的硬件和软件设计及 实现方法,这种电路设计具有按键有效提示,输入错误提示,控制报警电路, 在线修改功能等多种功能,保密性强,灵活性高,特别适用于家庭!办公室!学 生宿舍及宾馆等场所。它具有全集成化,智能化,高精度,高性能,高可靠 性和低价格等优点,是一个值得推广的一种方法。接下来我们就对方案与设 计原理方框图进行比较分析。 (二)设计思路与系统组成及主要特点 为了使设计更具有针对性,使用性更强,我对其进行精心的设计,在设 计过程中,我们想到了很多的设计方案。 1.设计思路 设计一个八路抢答器,可同时供8名选手或者8个代表队参加比赛,他 们的编号分别为1——8,各用一个抢答器按钮,按钮的编号与选手的编号相 对应,分别设为S1…S8。节目主持人设置一组控制开关,用来控制系统的清 零和抢答器的开始,修改抢答时间与答题时间,如果想调节抢答时间或答题 时间,按"抢答时间调节"键或"答题时间调节"键进入调节状态。并且抢答器具 有数据锁存和显示的功能,抢答开始,若有选手按动抢答按钮,编号立即锁

51单片机实用子程序(汇编)

《MCS-51单片机实用子程序库(96年版)》 周航慈 目前已有若干版本的子程序库公开发表,它们各有特色。笔者在1988年也编制了两个子程序库(定点子程序库和浮点子程序库),并在相容性、透明性、容错性和算法优化方 面作了一些工作。本程序库中的开平方算法为笔者研究的快速逼近算法,它能达到牛顿迭代法同样的精度,而速度加快二十倍左右,超过双字节定点除法的速度。经过八年来全国广大用户的实际使用,反馈了不少信息,陆续扩充了一些新的子程序,纠正了一些隐含错误,成为现在这个最新版本。 本子程序库对《单片机应用程序设计技术》一书附录中的子程序库作了重大修订:(1)按当前流行的以 IBM PC 为主机的开发系统对汇编语言的规定,将原子程序库的标号和位地址进行了调整,读者不必再进行修改,便可直接使用。 (2)对浮点运算子程序库进行了进一步的测试和优化,对十进制浮点数和二进制浮点数的相互转换子程序进行了彻底改写,提高了运算精度和可靠性。 (3)新增添了若干个浮点子程序(传送、比较、清零、判零等),使编写数据处理 程序的工作变得更简单直观。 在使用说明中开列了最主要的几项:标号、入口条件、出口信息、影响资源、堆栈 需求,各项目的意义请参阅《单片机应用程序设计技术》第六章 6.3.7 节的内容。程序 清单中开列了四个栏目:标号、指令、操作数、注释。为方便读者理解,注释尽力详细。 子程序库的使用方法如下: 1.将子程序库全部内容链接在应用程序之后,统一编译即可。优点是简单方便,缺点是程序太长,大量无关子程序也包含在其中。 2.仅将子程序库中的有关部分内容链接在应用程序之后,统一编译即可。有些子程序需要调用一些低级子程序,这些低级子程序也应该包含在内。优点是程序紧凑,缺点是需要对子程序库进行仔细删节。 (一)MCS-51定点运算子程序库及其使用说明 定点运算子程序库文件名为DQ51.ASM,为便于使用,先将有关约定说明如下: 1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据。地址小的单元存放数据的高字节。例如:[R0]=123456H,若(R0)=30H,则(30H)=12H,(31H)=34H,(32H)=56H。 2.运算精度:单次定点运算精度为结果最低位的当量值。 3.工作区:数据工作区固定在PSW、A、B、R2~R7,用户只要不在工作区中存放无 关的或非消耗性的信息,程序就具有较好的透明性。

51单片机课程设计

课程设计说明书
课程设计名称






学生姓名
指导教师
单片机原理及应用课程设计 电子信息工程 140405 20141329 李延琦 胡黄水
2016 年 12 月 26 日

课程设计任务书
课程设计 题目
酒精测试仪
起止日期
2016 年 12 月 26 日— 2017 年 1 月 6 日
设计地点
计算机科学与工程学 院单片机实验室 3409
设计任务及日程安排: 设计任务:分两部分: (一)、设计实现类:进行软、硬件设计,并上机编程、联线、调试、 实现; 1.电子钟的设计 2.交通灯的设计 3.温度计的设计 4.点阵显示 5.电机调速 6.电子音乐发声(自己选曲) 7.键盘液晶显示系统 (二)、应用系统设计类:不须上机,查资料完成软、硬件设计画图。 查资料选定题目。 说明:第 1--7 题任选其二即可。(二)里题目自拟。 日程安排: 本次设计共二周时间,日程安排如下: 第 1 天:查阅资料,确定题目。 第 2--4 天:进实验室做实验,连接硬件并编写程序作相关的模块实验。 第 5--7 天:编写程序,并调试通过。观察及总结硬件实验现象和结果。 第 8--9 天:整理资料,撰写课程设计报告,准备答辩。 第 10 天:上交课程设计报告,答辩。 设计报告要求:
1. 设计报告里有两个内容,自选题目内容+附录(实验内容),每 位同学独立完成。 2. 自选题目不须上机实现,要求能正确完成硬件电路和软件程序 设计。内容包括: 1) 设计题目、任务与要求 2)硬件框图与电路图 3) 软件及流程图 (a)主要模块流程图 (b)源程序清单与注释 4) 总结 5) 参考资料 6)附录 实验上机调试内容
注:此任务书由指导教师在课程设计前填写,发给学生做为本门课程设计 的依据。

MCS-51系列单片机程序的设计论文一

MCS-51系列单片机程序的设计论文 程序设计是单片机开发最重要的工作,程序设计就是利用单片机的指令系统,根据应用系统(即目标产品)的要求编写单片机的应用程序,其实我们前面已经开始这样做过了,这一课我们不是讲如何来设计具体的程序,而是教您设计单片机程序的基本方法。不过在讲解程序设计是单片机开发最重要的工作,程序设计就是利用单片机的指令系统,根据应用系统(即 目标产品)的要求编写单片机的应用程序,其实我们前面已经开始这样做过了,这一课我们不是讲如何 来设计具体的程序,而是教您设计单片机程序的基本方法。不过在讲解之前还是有必要先了解一下单片 机的程序设计语言。 一.程序设计语言 这里的语言与我们通常理解的语言是有区别的,它指的是为开发单片机而设计的程序语言,如果 您没有学过程序设计可能不太明白,我给大家简单解释一下,您知道微软的VB,VC 吗?VB,VC 就是为 某些工程应用而设计的计算机程序语言,通俗地讲,它是一种设计工具,只不过这种工具是用来设计计 算机程序的。要想设计单片机的程序当然也要有这样一种工具(说设计语言更确切些),单片机的设计 语言基本上有三类: 1.完全面向机器的机器语言 机器语言就是能被单片机直接识别和执行的语言,计算机能识别什么?以前我们讲过--是数字“0” 或“1”,所以机器语言就是用一连串的“0”或“1”来表示的数字。比如:MOV A,40H;用机器语言 来表示就是11100101 0100000,很显然,用机器语言来编写单片机的程序不太方便,也不好记忆,我 们必须想办法用更好的语言来编写单片机的程序,于是就有了专门为单片机开发而设计的语言: 2.汇编语言 汇编语言也叫符号化语言,它使用助记符来代替二进制的“0”和“1”,比如:刚才的MOV A, 40H 就是汇编语言指令,显然用汇编语言写成的程序比机器语言好学也好记,所以单片机的指令普遍采 用汇编指令来编写,用汇编语言写成的程序我们就叫它源程序或源代码。可是计算机不能识别和执行用 汇编语言写成的程序啊?怎么办?当然有办法,我们可以通过“翻译”把源代码译成机器语言,这个过 程就叫做汇编,汇编工作现在都是由计算机借助汇编程序自动完成的,不过在以前,都是靠手工来做的。 值得注意的是,汇编语言也是面向机器的,它仍是一种低级语言。每一类计算机

基于51单片机8路抢答器设计

创新实践课 课程名称:创新实践课 实践题目:基于51单片机8路抢答器设计学院:信息工程与自动化学院 专业:生物医学工程 年级:2014级 学生:4 丽莎2海星 指导教师:嘉林 日期:2016-12-30 教务处制

目录 一、前言 (3) 二、电路原理图设计 (3) 三、印制版图设计 (7) 四、软件设计 (9) 五、测试数据及分析 (16) 六、总结 (18)

一、前言 目前,抢答器已经作为一种必不可少的工具广泛应用于各种智力和知识竞赛场合,但一般的抢答器可靠性低,使用寿命短,介于这些不方便因素,此次设计提出了用51单片机为核心控制元件,设计一个简易的八路抢答器。本方案以51单片机作为主控核心,与晶振、数码管、蜂鸣器等通过外围接口实现的八路抢答器,利用了单片机的延时电路、按键复位电路、时钟电路、定时器/计数器等,设计的八路抢答器不仅具有实时显示抢答选手的和抢答时间的功能,同时还利用汇编语言编程,使其实现复位、定时和报警的功能。本次设计的系统实用性强、判断精确、操作简单、扩展功能强。 功能:以STC89C52RC单片机作为主控核心,与晶振、数码管、蜂鸣器等通过外围接口实现的八路抢答器,利用了单片机的延时电路、按键复位电路、时钟电路等,设计的八路抢答器不仅具有实时显示抢答选手的和抢答时间的功能,同时还利用汇编语言编程,使其实现复位和报警的功能。 此系统是基于51单片机,led发光二极管,一位共阳数码管,蜂鸣器,按键,等分立元件设计而成。 元件设计的意义:关于按键:共设计了10个独立按键,其中8个分别为八位选手抢答输入用,另外两个分别为开始和停止按键!只有裁判按下了开始键才进入正常抢答,否则属于犯规抢答,抢答完毕,裁判按下停止,数码管显示0。关于led发光二极管:共设计了9个发光二极管,其中一个为电源指示,其他8个为选手抢答状态指示,正确抢答时led发光二极管缓慢闪烁,犯规抢答时,快速闪烁。关于数码管:选手按下自己的按键时显示相应的选手编号!裁判按下开始键时数码管显示倒计时,

51单片机控制LED灯程序设计

51单片机:LED灯亮灯灭程序设计 1.功能说明:控制单片机P1端口输出,使P1.0位所接的LED点亮,其他7只灯熄灭。 程序: 01: MOV A , #11111110B ; 存入欲显示灯的位置数据 02: MOV P1,A ; 点亮第一只灯 03: JMP $ ; 保持当前的输出状态 04: END ; 程序结束 2.功能说明:单片机P1端口接8只LED,点亮第1、3、4、6、7、8只灯。 程序:

01:START: MOV A , #00010010B ; 存入欲显示灯的位置数据 02:MOV P1,A ; 点亮灯 03:JMP START ; 重新设定显示值 04:END ; 程序结束 3.功能说明:单片机P1端口接8只LED,每次点亮一只,向左移动点亮,重复循环。 程序: 01:START: MOV R0, #8 ;设左移8次 02:MOV A, #11111110B ;存入开始点亮灯位置

03:LOOP: MOV P1, A ;传送到P1并输出 04:RL A ;左移一位 05:DJNZ R0, LOOP ;判断移动次数 06:JMP START ;重新设定显示值 07:END ;程序结束 4.功能说明:单片机P1端口接8只LED,每次点亮一只,向右移动点亮,重复循环。 程序: 01:START: MOV R0, #8 ;设右移8次

02:MOV A, #01111111B ;存入开始点亮灯位置03: LOOP: MOV P1, A ;传送到P1并输出 04: ACALL DELAY ;调延时子程序05: RR A ;右移一位 06: DJNZ R0, LOOP ;判断移动次数07: JMP START ;重新设定显示值08: DELAY: MOV R5,#50 ; 09:DLY1: MOV R6,#100 ; 10: DLY2: MOV R7,#100 ;

51单片机DIY做PLC编程精编版

51单片机DIY做PLC编程 有朋友想定制一个净水机控制器,有一些独特的功能要增加,但是商品控制板没有这样的功能,问我能否做一个,我觉得单片机完全能满足这种简单的控制需要,上手开始编程序时候突然感到,用PLC逻辑编这种功能是非常简单轻松的,而如果用汇编或C编却感觉有点棘手,编程效率不高,所以想为何不在单片机上实现PLC的逻辑呢? 上网搜索尝试看能否找到合适的程序下载来稍微改改就能用的呢?方案几年前就有了,实际上是利用三菱的低档PLC编程软件编辑好梯形图,存盘后用专用的格式转换工具转换成HEX单片机烧写文件烧进去,尝试下载三菱PLC工具软件,但是在我的WIN7-64位系统上不能正常工作,好容易换了系统装好开发工具,但是初次上手这款开发工具,界面挺复杂的,懒得研究各个按钮的使用,由于是单片机的硬件,对于程序的编制和转换有很多限制条件,否则是转换不成功的,嫌麻烦,放弃! 某宝倒是有百元PLC板出售,但是为了这么个简单的东西专门买个全功能板子有点浪费,而且其编程软件仍然是三菱的盗版软件,算了,再想办法把。 由于工作中经常接触PLC程序,对其工作原理也略知一二,网上也有相关的说明介绍,其实就是三个主要步骤,第一步扫描IO输入,第二步执行逻辑,第三步输出逻辑到IO,很简单的,最早PLC也是用单片机实现的,我为何不用汇编在51上搭建一个架构,简单的逻辑编制进去就能运转呢? 其中逻辑执行步骤还是有点意思的,需要把PLC逻辑翻译成单片机的汇编语言执行,这块开始也没有把握,后来搜索到一篇百度文章,介绍了一下三菱PLC逻辑是如何翻译成汇编的,我看了下估计其实是利用反汇编工具把HEX反编译成的ASM代码,并不清晰明了,而且还带着反汇编时候的行号,仅供参考了。 搜索结果中也有几篇论文,涉及到在51单片机上实现PLC逻辑的内容,但是那些论文都是充数的,仅仅几个IO逻辑,没有什么定时器,计数器功能的体现,哎!仅供参考! 看来这个PLC系统还是需要自己写了!OK!既然决定自己重写,那就开工吧!利用春节休假时间,编制了如下ASM51汇编PLC代码: 代码主要架构如下: 1、IO定义部分:根据所使用的单片机IO口数量,任意指定多少个I多少个O,那几个脚是I,哪几个是O都可以任意指定,在这个51系统里面设计了最大32个I,32个O,占用64个位寻址区域,其实用不到那么多,也可以分配给其它需要的标志位用,因为51系统总可位寻址地址只有128位,需要仔细分配.

基于51单片机八路抢答器的设计大学论文

毕业设计(论文) 题 目: 基于51单片机的抢答器系统设计 函授站点: 中国矿业大学继续教育学院 学习层次: 专科 班级名称: 徐工技师学院 函机电2015班 姓名: 学号: 中国矿业大学继续教育学院 20 年 月 日

摘要 随着科学技术的发展和普及,各种各样的竞赛越来越多,其中抢答器的作用也就显而易见。目前很多抢答器基本上采用小规模数字集成电路设计,使用起来不够理想。因此设计一更易于使用和区分度高的抢答器成了非常迫切的任务。现在单片机已进入各个领域,以其功耗小、智能化而著称,所以若利用单片机来设计抢答器,便使以上问题得以解决.针对以上情况,本文设计出以STC89C52RC单片机为核心的八路抢答器。我们采用了数字显示器直接指示,自动锁存显示结果,并自动复位的设计思想,它能根据不同的抢答输入信号,经过单片机的控制处理并产生不同的与输入信号相对应的输出信号,最后通过LED数码管显示相应的路数,即使两组的抢答时间相差几微秒,也可分辨出是哪组优先按下的按键,它充分利用了单片机系统的优点,具有结构简单、功能强大、可靠性好、实用性强的特点。 本设计是以八路抢答为基本理念。考虑到依需设定限时回答的功能,利用51单片机及外围接口实现的抢答系统,利用单片机的定时器/计数器定时和记数的原理,将软、硬件有机地结合起来,使得系统能够正确地进行计时,同时使数码管能够正确地显示时间。用开关做键盘输出,扬声器发生提示。同时系统能够实现:在抢答中,只有开始后抢答才有效,如果在开始抢答前抢答为犯规;满时后系统计时自动复位及主控强制复位;按键锁定,在有效状态下,按键无效非法。 关键词:STC89C52RC;共阴数码管;按键;蜂鸣器

51单片机实用汇编程序库

51 单片机实用程序库 4、1 流水灯 程序介绍:利用P1 口通过一定延时轮流产生低电平 输出,以达到发光二极管轮流亮得效果。实际应用中例如: 广告灯箱彩灯、霓虹灯闪烁。 程序实例(LAMP、ASM) ORG 0000H AJMP MAIN ORG 0030H MAIN: 9 MOV A,#00H MOV P1,A;灭所有得灯 MOV A,#11111110B MAIN1: MOV P1,A;开最左边得灯 ACALL DELAY ;延时 RL A ;将开得灯向右边移 AJMP MAIN ;循环 DELAY: MOV 30H,#0FFH D1: MOV 31H,#0FFH D2: DJNZ 31H,D2 DJNZ30H,D1 RET END 4、2 方波输出 程序介绍:P1、0 口输出高电平,延时后再输出低电 平,循环输出产生方波。实际应用中例如:波形发生器。 程序实例(FAN、ASM): ORG 0000H MAIN: ;直接利用P1、0 口产生高低电平地形成方波////////////// ACALL DELAY SETB P1、0 ACALL DELAY 10 CLR P1、0 AJMP MAIN ;////////////////////////////////////////////////// DELAY: MOV R1,#0FFH DJNZ R1,$ RET

五、定时器功能实例 5、1 定时1 秒报警 程序介绍:定时器1 每隔1 秒钟将p1、o得输出状态改变1 次,以达到定时报警得目得。实际应用例如:定时报警器。 程序实例(DIN1、ASM): ORG 0000H AJMP MAIN ORG 000BH AJMP DIN0 ;定时器0入口 MAIN: TFLA G EQU34H ;时间秒标志,判就是否到50个 0、2 秒,即50*0、2=1 秒 MOVTMOD,#00000001B;定时器0 工作于方式 1 MOVTL0,#0AFH MOV TH0,#3CH ;设定时时间为0、05 秒,定时 20 次则一秒 11 SETB EA;开总中断 SETB ET0;开定时器0 中断允许 SETBTR0 ;开定时0 运行 SETB P1、0 LOOP: AJMP LOOP DIN0: ;就是否到一秒//////////////////////////////////////// INCC:INC TFLAG MOV A,TFLAG CJNE A,#20,RE MOV TFLAG,#00H CPLP1、0 ;////////////////////////////////////////////////// RE: MOV TL0,#0AFH MOV TH0,#3CH ;设定时时间为0、05秒,定时 20 次则一秒 RETI END 5、2 频率输出公式 介绍:f=1/t s51 使用12M 晶振,一个周期就是1微秒使用定时器1 工作于方式0,最大值为65535,以产生200HZ 得频率为 例: 200=1/t:推出t=0、005秒,即5000微秒,即一个高电

51单片机常用数码管显示程序

51单片机常用数码管显示程序---之汇编篇 2010-07-21 03:35:46| 分类:单片机| 标签:51单片机数码管汇编程序|字号大中小订阅一)显示数据缓存寄存器70H,71H,72H,73H,74H,75H,76H,77H。 START: MOV 70H,#1 MOV 71H,#2 MOV 72H,#3 MOV 73H,#4 MOV 74H,#5 MOV 75H,#6 MOV 76H,#7 MOV 77H,#8 ACALL DISP AJMP START DISP: MOV R1,#70H MOV R5,#0FEH PLAY: MOV P0,#0FFH MOV A,R5 ANL P2,A

MOV A,@R1 MOV DPTR,#TAB MOVC A,@A+DPTR MOV P0,A LCALL DL1MS INC R1 MOV A,P2 JNB ACC.7,ENDOUT RL A MOV R5,A MOV P2,#0FFH AJMP PLAY ENDOUT: MOV P2,#0FFH MOV P0,#0FFH RET TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH;共阳数码管 ; 1MS延时子程序,LED显示用 DL1MS: MOV R6,#14H ; DL1: MOV R7,#19H DL2: DJNZ R7,DL2 DJNZ R6,DL1 RET END 二)

START:;ORG 00H MOV 70H,#0C0H;0 MOV 71H,#0F9H;1 MOV 72H,#0A4H;2 MOV 73H,#0B0H;3 MOV 74H,#99H ;4 MOV 75H,#92H ;5 MOV 76H,#82H ;6 MOV 77H,#0F8H;7 ACALL DISP AJMP START DISP: MOV P0,70H CLR P2.7 ACALL DL1MS SETB P2.7 MOV P0,71H CLR P2.6 ACALL DL1MS SETB P2.6 MOV P0,72H CLR P2.5 ACALL DL1MS SETB P2.5 MOV P0,73H CLR P2.4 ACALL DL1MS SETB P2.4 MOV P0,74H CLR P2.3 ACALL DL1MS SETB P2.3 MOV P0,75H CLR P2.2 ACALL DL1MS SETB P2.2 MOV P0,76H CLR P2.1 ACALL DL1MS SETB P2.1 MOV P0,77H CLR P2.0 ACALL DL1MS SETB P2.0 RET

基于51单片机的抢答器

/**********************51单片机实验开发板例程************************ * 名称:本例程为一抢答器;其中主持人操控S7与S8两个按键。选手共六位,分别操控S1--S6中的一个按键。 当主持人按下抢答开始按键S7后,倒计时开始,计时5s。此后最先按下按键的选手号码将显示与数码管上。 后来按下的将无显示。 若五秒计时结束后,再按下按键也不会显示。 若主持人没有按开始键,就有选手抢答,则视为犯规。此时犯规的选手号码将被显示于数码管上(最多显示五位犯规选手) 同时,蜂鸣器发出长笛声报警,数码管全亮。 而当主持人按下清零键S8后,一切状态均恢复,可以开始新一轮的抢答。 按键功能简介 S8抢答开始S7 清零 S1--S6 分别为1到6号选手按键 ******************************************************************/ #include #define uchar unsigned char sbit dula=P2^6; sbit wela=P2^7; sbit beep=P2^3; uchar key,j,k,temp,daojishi=5,wei; bit begin,end,clear,fangui; uchar a0,b0=16;c0=16;d0=16;e0=16;f0=5; unsigned int pp; unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; void delay(unsigned char i) { for(j=i;j>0;j--) for(k=125;k>0;k--); } void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f) { dula=0; P0=table[a]; dula=1; dula=0; wela=0; P0=0xfe; wela=1;

小只推荐:51单片机知识大汇总看你了解有多少

小只推荐:51单片机知识大汇总看你了解有多少 基于51单片机的函数信号发生器利用单片机AT89C52 采用程序设计方法产生锯齿波、三角波、正弦波、方波四种波形,再通过D/A 转换器DAC0832 将数字信号转换成模拟信号,滤波放大,最终由示波器显示出来,能产生10Hz—10kHz 的波形。下面就对51单片机进行详细论述。 ? ?1.取指译码执行模型:首先我们来看看单片机是如何工作的,我们拿电脑的主板来作为对比,我们买电脑时,总是追求处理器的主频。处理器的工作原理是从存储器上取出一条指令,然后对指令译码,译码完后执行。然后取下一条指令,译码,执行。它为什幺能这幺有序的工作?是因为它有一个工作时钟,在这个工作时钟的统一管理下,处理器有序的工作,这里的主频就是工作时钟的速度,当然,现在你可能也知道主频越高,取指译码速度越快,性能越好。那幺你可能会问,这跟51单片机有什幺关系,OK,切入正题,单片机的工作也是这个原理,从存储器上取指,译码,执行。但是单片机的存储器在哪?在单片机的内部,对于电脑来说,是把处理器,内存集中在一块主板上。而现在你应该很明确,对于单片机它就相当于一块电脑主板,把处理器,存储器集中到一块芯片内部。从这个宏观的角度看,所有的单片机是不是都是一个原理,服从于取指,译码,执行的基本模型。OK,继续…… 2. 51单片机的外设:我们在学习单片机时,所做的第一个实验都是一样的,点灯。也许你已经学会了用单片机做出好看的花样灯,或者用单片机驱动数码管显示出数字或字母。或者可以检测按键了。不错,我们仔细想想这些是什幺,无非,你就是控制那一排排引脚输出高低电平,我们称这些引脚叫I/O口,输入输出,按键是输入,点灯是输出。其实你以为你学了三样东

51单片机50个实例代码

51单片机50个例程代码程序里有中断,串口等驱动,直接复制即可使用1-IO输出-点亮1个LED灯方法1 /*----------------------------------------------- 名称:IO口高低电平控制 论坛:https://www.360docs.net/doc/385262032.html, 编写:shifang 日期:2009.5 修改:无 内容:点亮P1口的一个LED灯 该程序是单片机学习中最简单最基础的, 通过程序了解如何控制端口的高低电平 ------------------------------------------------*/ #include //包含头文件,一般情况不需要改动, //头文件包含特殊功能寄存器的定义 sbit LED=P1^0;// 用sbit 关键字定义LED到P1.0端口, //LED是自己任意定义且容易记忆的符号 /*------------------------------------------------ 主函数 ------------------------------------------------*/ void main (void) { //此方法使用bit位对单个端口赋值 LED=1; //将P1.0口赋值1,对外输出高电平 LED=0; //将P1.0口赋值0,对外输出低电平 while (1) //主循环 { //主循环中添加其他需要一直工作的程序 } } 2-IO输出-点亮1个LED灯方法2 /*-----------------------------------------------

名称:IO口高低电平控制 论坛:https://www.360docs.net/doc/385262032.html, 编写:shifang 日期:2009.5 修改:无 内容:点亮P1口的一个LED灯 该程序是单片机学习中最简单最基础的, 通过程序了解如何控制端口的高低电平 ------------------------------------------------*/ #include //包含头文件,一般情况不需要改动, //头文件包含特殊功能寄存器的定义 /*------------------------------------------------ 主函数 ------------------------------------------------*/ void main (void) { //此方法使用1个字节对单个端口赋值 P1 = 0xFF; //P1口全部为高电平,对应的LED灯全灭掉, //ff换算成二进制是1111 1111 P1 = 0xfe; //P1口的最低位点亮,可以更改数值是其他的灯点亮 //0xfe是16进制,0x开头表示16进制数, //fe换算成二进制是1111 1110 while (1) //主循环 { //主循环中添加其他需要一直工作的程序 } } 3-IO输出-点亮多个LED灯方法1 /*----------------------------------------------- 名称:IO口高低电平控制 论坛:https://www.360docs.net/doc/385262032.html, 编写:shifang 日期:2009.5 修改:无 内容:点亮P1口的多个LED灯

相关文档
最新文档