单片机程序源代码
单片机源代码
num=0;
while(1)
{
p2_0=num;
}
}
void int_1()interrupt 3
{
unsigned char n;
TH1=0x3c;
TL1=0xb0;
TR1=1;
n++;
if(n==10)
{
num=~num;
n=0;}
}
左右跑马灯
for(j=255;j>0;j--);
}
二进制加法实验
#include<reg52.h>
void delay(unsigned int i);//声明延时 函数
main()
{
unsigned char Num=oxff;
while(1)
{
p2=Num;
delay(1000);
#include<Function.h>
bit ISendstr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
{
unsigned char i;
start_12c();//启动总线
sendByte(sla);//发送器件地址
SendByte(suba);//发送器件子地址
if(ack==0)return(0);
for(i==o;i<no;i++)
{
SendByte(*s);//发送数据
if(ack==0)return(0);
单片机程序流程图及源代码
单片机上机实验报告【实验一】端口实验,掌握通过端口编程实现数据输出和输入的方法,并观察结果。
实验内容:1)输出实验:假定4个端口全部连接发光二极管,编程实现所有发光二极管同时亮,延迟一定时间(自定)后,又同时灭,如此循环。
2)输入:从P0口输入某个数据到累加器A,打开观察窗口观察数据是否进入累加器A。
实现方式:通过peripherals实现端口数据观察实验。
程序流程图:将P0到P3端口先赋值为0,调用延迟后,再赋1,然后循环执行。
源代码:ORG 0000H ;程序入口地址LJMP MAIN ;跳转到主程序ORG 0300H ;主程序地址MAIN:MOV P0,#00H;MOV P1 ,#00H;MOV P2 ,#00H;MOV P3 ,#00H ;P0~P3均赋值为0ACALL DEL;调用延迟MOV P0 ,#0FFH;MOV P1 ,#0FFH;MOV P2 ,#0FFH;MOV P3 ,#0FFH;P0~P3均设为1MOV A,P0;将P0口值赋给累加器ACALL DEL;AJMP MAIN;跳转到主程序入口ORG 0200H;延迟程序入口地址DEL:MOV R5,#04H;寄存器实现延迟,F3:MOV R6,#0FFH;若主频为12MHZ则F2:MOV R7,#0FFH;延时为256*256*4F1:DJNZ R7,F1;0.26S,人眼可分辨DJNZ R6,F2;DJNZ R5,F3;RET;从延迟程序返回END;结束3.假设P0口外接一个数码管(共阴),如图,请在数码管上轮流显示数字0~9(采用软件延时)。
程序流程图:将数码管的真值编码0~9依次赋给P0并调用延迟,然后循环运行程序即可。
源代码:ORG 0000H; 程序入口SJMP MAIN; 跳转到主程序ORG 0300H; 主程序入口地址MAIN:MOV P0,#0FCH; 将数码管0的编码赋给P0口ACALL DELAY; 调用延迟,使数码管亮0持续0.33SMOV P0,#60H; show 1ACALL DELAY;MOV P0,#0DAH; show 2ACALL DELAY;MOV P0,#0F2H; show 3ACALL DELAY;MOV P0,#66H; show 4ACALL DELAY;MOV P0,#0B6H; show 5ACALL DELAY;MOVP0,#0BEH; show 6ACALL DELAY;MOV P0,#0E0H; show 7ACALL DELAY;MOV P0,#0FEH; show 8ACALL DELAY;MOV P0,#0F6H; show 9ACALL DELAY;AJMP LOOP; 跳转到主程序入口ORG 0200H; 延迟程序入口DEL:MOV R5,#05H; 采用软件延迟,若主频为12MHz,则DEL1:MOV R6,#0FFH; 定时时间为256*256*5*1uS=0.33S,DEL2:MOV R7,#0FFH; 人眼可分辨。
基于51单片机的CAN通讯源代码
EA=1;
}
/////////////////////////////////////////////////////////////
void can_rcv_prg(void)
{can_over_prg();}
if(_testbit_(rcv_flag)) //can总线接收数据
{can_rcv_prg();}
if(_testbit_(send_flag)) //can总线发送数据
*说明: CAN控制器进入复位工作模式 *
************************************************************************/
bit BCAN_ENTER_RETMODEL(void)
for(j=2;j<10;j++) //发送8组数据到串口
{
SBUF=rcv_data[j];
while(TI==0)
{}
TI=0;
}
ES=1; //串口中断开放
void T1_int(void);
void Sja_1000_Init(void);
//************************变量定义*****************************//
unsigned char data send_data[10],rcv_data[10]; //发送和接收数组定义
/*RS232_basiccan.c*/
#include<REG52.H>
#include <intrins.h>
STCCAS单片机各个模块程序代码
//**************************************************************************** //// STC12C5A60S2可编程时钟模块////// 说明:STC12C5A60S2单片机有三路可编程时钟输出CLKOUT0/T0/P3.4// CLKOUT1/T1/P3.5、CLKOUT2/P1.0//// 涉及寄存器:AUXR(辅助寄存器)、WAKE_CLKO(时钟与系统掉电唤醒控制寄存器) // BRT(独立波特率发生器定时器寄存器)//// 程序说明:// 本程序可选实现P3.4输出CLKOUT0时钟、P3.5输出CLKOUT1时钟// P1.0输出CLKOUT2时钟//////************************************************************************** **//#include <STC12C5A60S2.H>#include <intrins.h>//#define Port_BRT //如果想测试独立波特率发生器时钟输出请打开此句//若想测试CLKOUT1和CLKOUT0请注释此句#ifdef Port_BRT /*条件编译独立波特率发生器时钟输出*///*********************************//// CLKOUT2时钟初始化 ////*********************************//void CLKOUT_init(void){WAKE_CLKO = 0x04; //Bit2-BRTCLKO 允许P1.0配置为独立波特率发生器的时钟输出//BRT工作在1T模式下时的输出频率 = Sysclk/(256-BRT)/2 //BRT工作在12T模式下时输出频率 = Sysclk/12/(256-BRT)/2 AUXR = 0x14; //Bit4-BRTR 允许独立波特率发生器运行//Bit2-BRTx12 BRT工作在1T模式下BRT = 0xff; //更改该寄存器的值可实现对输出的时钟频率进行分频}#else /*条件编译CLKOUT0时钟输出*///*********************************//// CLKOUT0时钟和CLKOUT1初始化 ////*********************************//void CLKOUT_init(void){WAKE_CLKO = 0x03; //允许将P3.4/T0脚配置为定时器0的时钟输出CLKOUT0//T0工作在1T模式时的输出频率 = SYSclk/(256-TH0)/2//T0工作在12T模式时的输出频率 = SYSclk/12/(256-TH0)/2 //1T指的是每1个时钟加1,是普通C51的12倍//12T指的是每12个时钟加1与普通C51一样//允许将P3.5/T1脚配置为定时器1的时钟输出CLKOUT1,只能工作在定时器模式2下//T1工作在1T模式时的输出频率 = SYSclk/(256-TH0)/2//T1工作在12T模式时的输出频率 = SYSclk/12/(256-TH0)/2 //1T指的是每1个时钟加1,是普通C51的12倍//12T指的是每12个时钟加1与普通C51一样AUXR = 0xc0; //T0定时器速度是普通8051的12倍,即工作在1T模式下//T1定时器速度是普通8051的12倍,即工作在1T模式下TMOD = 0x22; //定时器0工作模式为方式2,自动装载时间常数//定时器1工作模式为方式2,自动装载时间常数TH0 = 0xff; //更改该寄存器的值可实现对输出的时钟频率进行分频TL0 = 0xff;TH1 = 0xff; //更改该寄存器的值可实现对输出的时钟频率进行分频TL1 = 0xff;TR1 = 1;TR0 = 1;}#endif//**********************************//// 主程序////**********************************//void main(){CLKOUT_init();while(1);}//**************************************************************************** //// STC12C5A60S2系统时钟模块////// 说明: STC12C5A60S2单片机有两个时钟源,内部R/C振荡时钟和外部晶体时钟// 出厂标准配置是使用外部晶体或时钟////// 涉及寄存器:CLK_DIV(时钟分频寄存器)// 由该寄存器的Bit0-2组合可实现对时钟源进行0、2、4、8、16 // 32、64、128分频// //// 程序说明:// 对外部时钟进行分频得到Sysclk,然后经过P1.0的独立波特率// 时钟输出功能Sysclk/2输出时钟频率//**************************************************************************** //#include <STC12C5A60S2.h>#include <intrins.h>#define Bus_clk 12 //若要修改系统时钟直接在此处修改//12 为 12M 的sysclk//6 为 6M 的sysclk//3 为 3M 的sysclk//1500 为 1.5M 的sysclk//750 为 750kHz 的sysclk//375 为 375kHz 的sysclk//187500 为 187.5kHz 的sysclk//93750 为 93.75kHz 的sysclk//*********************************************//// 系统时钟初始化 ////*********************************************//void Sysclk_init(void){WAKE_CLKO = 0x04; //配置P1.0口为频率输出AUXR = 0x14; //允许波特率时钟工作//工作模式为1TBRT = 0xff;#if( Bus_clk == 12 )CLK_DIV = 0x00;#elif( Bus_clk == 6 )CLK_DIV = 0x01;#elif( Bus_clk == 3 )CLK_DIV = 0x02;#elif( Bus_clk == 1500 )CLK_DIV = 0x03;#elif( Bus_clk == 750 )CLK_DIV = 0x04;#elif( Bus_clk == 375 )CLK_DIV = 0x05;#elif( Bus_clk == 187500 )CLK_DIV = 0x06;#elif( Bus_clk == 93750 )CLK_DIV = 0x07;#endif}//**********************************************//// 主程序////**********************************************//void main(){Sysclk_init();while(1);}//**************************************************************************** //// STC12C5A60S2系统省电模块////// 说明: STC12C5A60S2单片机有三种省电模式以降低功耗.空闲模式,低速模式// 掉电模式////// 涉及寄存器:PCON(电源控制寄存器)// Bit0 - IDL 控制单片机进入IDLE空闲模式// Bit1 - PD 控制单片机进入掉电模式// //// 程序说明:程序实现让单片机先工作一阵子(通过P0^3指示灯显示)// 然后进入掉电状态,利用外部中断0口来唤醒单片机工作// 唤醒后单片机将通过P0^0-3口的灯闪烁显示开始工作////************************************************************************** **//#include <STC12C5A60S2.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intuchar Power_Down_Flag = 0; //进入掉电状态标志sbit Chip_Start_LED = P0^0; //单片机开始工作指示灯sbit Power_Down_LED_INT0 = P0^1; //INT0口掉电唤醒指示灯sbit N_Power_Down_LED_INT0 = P0^2; //INT0口没有唤醒指示灯sbit Normal_Work_LED = P0^3; //正常工作指示灯sbit Power_Down_Wakeup_INT0= P3^2; //外中断唤醒输入口void Delay_ms( uint time );void Normal_work(void);void Intp_init(void);void After_Powr_Down(void);//***********************************//// 软件延时 ////***********************************//void Delay_ms( uint time ){uint t; //延时时间 = (time*1003+16)us while(time--){for( t = 0; t < 82; t++ );}}//***********************************//// 正常工作指示//***********************************//void Normal_work(void){Normal_Work_LED = 1;Delay_ms(500);Normal_Work_LED = 0;Delay_ms(500);}void After_Power_Down(void){uchar i ;for( i = 0; i < 100; i++ ){P0 = 0x0f;Delay_ms(500);P0 = 0x00;Delay_ms(500);}}//***********************************//// 中断初始化 ////***********************************//void Intp_init(void){IT0 = 0; //外部中断源0为低电平触发EX0 = 1; //允许外部中断EA = 1; //开总中断}//***********************************//// 主程序 ////***********************************//void main(){uchar j = 0;uchar wakeup_counter = 0; //记录掉电次数P0 = 0x00;Chip_Start_LED = 1; //单片机开始工作Intp_init(); //外中断0初始化while(1){P2 = wakeup_counter;wakeup_counter++;for( j = 0; j < 250; j++ ){Normal_work(); //系统正常工作指示}Power_Down_Flag = 1; //系统开始进入掉电状态PCON = 0x02;_nop_();_nop_();_nop_();_nop_();After_Power_Down(); //掉电唤醒后}}//**********************************//// 中断服务//**********************************//void INT0_Service(void) interrupt 0{if( Power_Down_Flag ) //掉电唤醒状态指示 {Power_Down_Flag = 0;Power_Down_LED_INT0 = 1;while( Power_Down_Wakeup_INT0 == 0 ){_nop_(); //等待高电平}Power_Down_LED_INT0 = 0;}else //未掉电状态{N_Power_Down_LED_INT0 = 1; //不是掉电唤醒指示while( Power_Down_Wakeup_INT0 == 0 ){_nop_();}N_Power_Down_LED_INT0 = 0;}}//**************************************************************************** //// STC12C5A60S2 A/D转换模块////// 说明: STC12C5A60S2单片机有8路10位高速AD转换器,P1^0-P1^7//// 涉及寄存器:P1ASF(模拟功能控制寄存器)、ADC_CONTR(ADC控制寄存器)// ADC_RES、ADC_RESL(转换结果寄存器)//// 注意: 1、初次打开内部A/D模拟电源需适当延时等内部模拟电源稳定后,再启动A/D转换// 启动A/D后,在转换结束前不改变任何I/O口的状态,有利于高精度A/D 转换// 若能将定时器/串行/中断系统关闭更好。
单片机的温度采集系统 源代码
dat=DS;
i=8;while(i>0)i--;
return(dat);
}
void tmpwritebyte(uchar dat) //写一个字节到DS18B20里
{
uint i;uchar j;bit testb;
for(j=1;j<=8;j++)
temp=tt*10+0.5; //放大十倍,将小数点后第一位转换为可显示数字,再四舍五入
return temp;
}
uchar tmpread(void) //读一个字节
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS=P3^3; //定义DS18B20接口
int temp; //全局温度变量
{
dsreset(); //初始化DS18B20
tmpwritebyte(0xcc); //跳过序列号命令
tmpwritebyte(0x44); //发送温度转换命令
}
int tmp() //获得温度
{
float tt;uchar a,b;
dsreset();
{
P2=0; //LED段选,共阴极 送1点亮某段
52单片机源程序C语言版
IT0=0; EX0=1; wela=1; P0=0x00; wela=0; while(1) {
for(num=0;num<16;num++) {
dula=1; P0=table[num]; dula=0; delay(200); } } }
{ for(a=100;a>0;a--) for(b=225;b>0;b--);
} void main() {
k=0xfe; while(1) {
delay10ms();
beep=0; delay10ms(); beep=1; j=_crol_(k,1); k=j; P1=j; } } 五、数码管试验 #include<reg52.h> sbit dula=P2^6; sbit wela=P2^7; unsigned char num; unsigned code table[]= {0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void delay(unsigned int y) { unsigned int a,b; for(a=y;a>0;a--) for(b=0;b<500;b++); } void main() { EA=1;
//广告灯向左移动移动函数
{
a=temp<<count;
b=temp>>(8-count);
P1=a|b; }
main() {
count=0; //初始华参数设置 temp=0xfe; P1=0xff; P1=temp; while(1) //永远循环,扫描判断按键是否按下 {
51单片机C语言程序设计源代码
新概念51单片机C语言教程----入门、提高、开发、拓展全攻略郭天祥编著电子工业出版社例2.2.1编写程序,点亮第一个发光二极管(part2_1.c P27)#include <reg52.h> //52系列单片机头文件sbit led1=P1^0; //声明单片机P1口的第一位void main() //主函数{led1=0; /*点亮第一个发光二极管*/}例2.2.2编写程序,点亮P1口的若干二极管(part2_2.c P39)#include <reg52.h> //52系列单片机头文件void main() //主函数{P1=0xaa;//while(1);}例2.5.1利用for语句延时特性,编写第一个发光二极管以间隔1S亮灭闪动的程序(part2_3.c P42)#include <reg52.h> //52系列单片机头文件#define uint unsigned int //宏定义sbit led1=P1^0; //声明单片机P1口的第一位uint i,j;void main() //主函数{while(1) //大循环{led1=0; /*点亮第一个发光二极管*/for(i=1000;i>0;i--) //延时for(j=110;j>0;j--);led1=1; /*关闭第一个发光二极管*/for(i=1000;i>0;i--) //延时for(j=110;j>0;j--);}}- 2 - 例2.6.1编写程序使第一个发光二极管以间隔500ms亮灭闪动。
(part2_4.c P48)#include <reg52.h> //52系列单片机头文件#define uint unsigned int //宏定义sbit led1=P1^0; //声明单片机P1口的第一位void delay1s(); //声明子函数void main() //主函数{while(1) //大循环{led1=0; /*点亮第一个发光二极管*/delay1s(); //调用延时子函数led1=1; /*关闭第一个发光二极管*/delay1s(); //调用延时子函数}}void delay1s() //子函数体{uint i,j;for(i=500;i>0;i--)for(j=110;j>0;j--);}例2.7.1编写程序使第一个二极管以亮200ms、灭800ms的方式闪动。
单片机程序源代码
第二章任务一:闪烁广告灯的设计利用89c51单片机的端口控制两个LED(D0和D1),编写程序,实现两个LED互闪。
#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit LED1=P0^0;sbit LED2=P0^1;void delayms(uint ms){uint i;while(ms--){for(i=0;i<120;i++);}}void main(){while(1){LED1=0;LED2=1;delayms(500);LED1=1;LED2=0;delayms(500);}}任务二:流水广告灯的设计利用89c51单片机的端口控制8个LED(D0~D7)循环点亮,刚开始时D0点亮,延时片刻后,接着D1点亮,然后依次点亮D2->D3->D4->D5 ->D6->D7 ,然后再点亮D7->D6->D5->D4 ->D3->D2->D1->D0,重复循环。
#include<reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charuint i;uchar temp;uint a[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};void delayms(uint ms){while(ms--){ uint j;for(j=0;j<120;j++);}}void main(){while(1){P0=0xfe;while(P0!=0x7f){//P1=temp;//delayms(500);P0=_crol_(P0,1);delayms(250);}temp=0x7f;while(P0!=0xfe){P0=temp;delayms(500);temp=_cror_(temp,1);}}}任务三:拉幕式与闭幕式广告灯的设计利用89c51单片机的P0端口实现8个LED D0~D7的拉幕式与闭幕式广告灯设计。
单片机编程全集(含源代码)
单片机编程全集(含源代码)单片机编程全集(含源代码)引言:单片机编程是一门重要的技术,它在各个行业中都有广泛的应用。
本文将介绍单片机编程所需的基础知识、常用的编程语言和相关的实例代码,以及如何进行单片机的调试和测试。
一、单片机编程基础知识1.1 单片机概述单片机是一种集成电路,它集成了中央处理器、存储器和输入输出设备等功能单元。
它具有体积小、功耗低、成本低等优点,适用于各种嵌入式系统中。
1.2 单片机体系结构单片机的体系结构包括CPU、存储器、输入输出端口、计时/计数器等模块。
理解单片机的体系结构对于编程非常重要。
1.3 常用的单片机常见的单片机有AT89S52、STM32F103C8T6等,它们具有不同的性能和功能特点。
选择适合自己项目需求的单片机是编程的第一步。
二、单片机编程语言2.1 汇编语言汇编语言是一种低级语言,直接操作单片机的寄存器和内存。
虽然难以学习和理解,但它可以精确控制硬件。
2.2 C语言C语言是一种高级语言,易于学习和使用,可以编写出高效的代码。
许多单片机开发板都支持C语言编程,方便开发者进行开发。
2.3 基本编程指令无论是汇编语言还是C语言,都有一些基本的编程指令,如赋值、条件判断、循环等。
掌握这些指令对于编程非常关键。
三、单片机编程实例3.1 LED闪烁通过编程控制单片机的GPIO口,可以实现LED灯的闪烁效果。
代码如下:```c#include <reg52.h>void Delay(unsigned int t){while(t--);}void main()while(1){P1=0xFF; // 点亮LED灯Delay(60000);P1=0x00; // 关闭LED灯Delay(60000);}}```3.2 温度检测通过连接温度传感器到单片机的模拟输入引脚,可以实现对环境温度的检测。
代码如下:```c#include <reg52.h>sbit AD = P2^0; // 温度传感器连接的引脚void Delay(unsigned int t){while(t--);void main(){unsigned int temp;while(1){temp = AD; // 读取温度传感器的值if(temp > 50){P1=0xFF; // 温度超过50度时点亮LED灯 }else{P1=0x00; // 温度低于50度时关闭LED灯 }Delay(60000);}}```四、单片机的调试与测试4.1 调试工具常用的单片机调试工具有Keil、IAR等,它们提供了仿真功能,可以在计算机上模拟单片机的运行。
51单片机经典实例源码
#include <reg52.h>#include "LCD1602.h"uint Num=0;uchar NumCode[4]={0,0,0,0};//---------------中断加一--------------void my_INT1(void) interrupt 0{Num++;}//-----------------------------void Disp(){uint m;NumCode[0]=Num/1000;NumCode[1]=Num%1000/100;NumCode[2]=Num%100/10;NumCode[3]=Num%10;for(m=0;m<4;m++){LCD_Disp(0,5+m,NumCode[m]+0x30);}}//---------------------void main(){IT0=1;EA=1;EX0=1;LCD_Init();while(1){Disp();}} #include <reg52.h>#include "LCD1602.h"uint Num=3728;uchar NumCode[4]={0,0,0,0};//-----------------------自动加一------------------------- void Disp(){uchar m;NumCode[0]=Num/1000;NumCode[1]=Num%1000/100;NumCode[2]=Num%100/10;NumCode[3]=Num%10;for(m=0;m<4;m++){LCD_Disp(0,6+m,NumCode[m]+0x30);}}//--------------------------------------------void main(){LCD_Init();while(1){Disp();Num++;Delay(50000);}}#include<reg51.h>#include "LCD1602.h"uint Num=5432;uchar NumCode[4]={0,0,0,0};//----------定时器T0按键加一--------------- void T0Init(){ TMOD=0x0d;TH0=5432/256;TL0=5432%256;TR0=1; }//------------------------------------------void Disp(){ int m;NumCode[0]=Num/1000;NumCode[1]=Num%1000/100;NumCode[2]=Num%100/10;NumCode[3]=Num%10;for(m=0;m<4;m++){LCD_Disp(0,5+m,NumCode[m]+0x30);}}//-------------------------------------------void main(){T0Init();LCD_Init();while(1){Num=TH0*256+TL0;Disp();}} #include<reg51.h>#define uchar unsigned charuchar T0Num;sbit LED=P1^0;//--------定时器TO使LED自动一秒闪一下--------- void T0Init(){TMOD=0x01;TH0=(65536-10000)/256;TL0=(65536-10000)%256;TR0=1;ET0=1;EA=1;}//---------------------------void T0Sever() interrupt 1{TH0=(65536-10000)/256;TL0=(65536-10000)%256;T0Num++;if(T0Num==100){LED=~LED;T0Num=0;}}//---------------------------void main(){T0Init();while(1){}}#include <reg52.h>#define uchar unsigned char#define uint unsigned intuchar num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f ,0x6f};uint shu;//-----------外部中断按键加减一----------void my_INT1(void) interrupt 0{shu--;}//-----------------------------------------------------void my_INT2(void) interrupt 2{shu++;}//------------------------------------------------------void main(){shu=5;IT0=1;EA=1;EX0=1;IT1=1;EA=1;EX1=1;while(1){P2=num[shu];if(shu==10){shu=0;}if(shu==-1){shu=9;}}} #include <reg51.h>#define uint unsigned int#define uchar unsigned charuchar Disp[4]={0x9a,0xca,0xa9,0xac};//------------------------交通灯--------------------- void delay3ms(uchar i){uint n,j,k;for(;i>=1;i--){for(n=2;n>=1;n--){for(j=250;j>=1;j--){for(k=200;k>=1;k--);}}}}//-------------------------------------void main(){while(1){P1=Disp[0];delay3ms(4);P1=Disp[1];delay3ms(1);P1=Disp[2];delay3ms(4);P1=Disp[3];delay3ms(1);}}#include <reg51.h>#define uchar unsigned charuchar T0Num=0;uchar PWM=50;sbit LED=P3^7;//------------PWM频率------void T0Init(){TMOD=0x01;TH0=(65536-100)/256;// 0.1msTL0=(65536-100)%256;ET0=1;EA=1;TR0=1;}//-----------------------void Ex0Init(){IT0=1;EX0=1;EA=1;}//------------------------void main(){T0Init();Ex0Init();while(1){}}//------------------------void T0Server() interrupt 1{TH0=(65536-100)/256;// 0.1msTL0=(65536-100)%256;T0Num++;if(T0Num==PWM){LED=1;}if(T0Num==100){T0Num=0;LED=0;}}//--------------------------void Int0Server() interrupt 0{PWM=PWM+5;if(PWM>=100){PWM=0;}}include<reg52.h>#define uchar unsigned charuchar i,Flagls,Scon,T0Num;uchar code LedCode[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40, 0x80};//-------串口74LS164驱动流水灯--------------void T0_Init(){TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=1;ET0=1;EA=1;}//----------------void Serial_Init(){Scon=0x00;}//------------------void SerialSend (uchar ch){SBUF=ch;while(TI==0){}TI=0;}//--------------void main(){T0_Init();Serial_Init();while(1){if(Flagls==1){Flagls=0;SerialSend(LedCode[i]);i++;if(i>7){i=0;}}}}//------------------void Toserver() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;T0Num++;if(T0Num>20){T0Num=0;Flagls=1;}}#include <reg51.h>#define uchar unsigned char#define uint unsigned intuchar DispCode[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0x3e,0xe0,0xfe,0xe6}; uint Num=9995;uchar NumCode[4]={0,0,0,0};uchar T1Num;bit Flag1s=0;//---------串口74LS164驱动数码管---------------- void SerialInit(){SCON=0x00;}//-----------------------------------------void T1Init(){TMOD=0x10;TH1= -10000/256;TL1= -10000%256;TR1=1;ET1=1;EA=1;}//------------------------------------------void Disp(){uchar i;NumCode[0]=Num/1000;NumCode[1]=Num%1000/100;NumCode[2]=Num%100/10;NumCode[3]=Num%10;for(i=0;i<4;i++){SBUF=DispCode[NumCode[3-i]];while(TI==0){}TI=0;}}//------------------------------------------ void main(){SerialInit();T1Init();while(1){if(Flag1s==1){Flag1s=0;Disp();}}}//----------------------------------------- void T1Server() interrupt 3{TH1= -10000/256;TL1= -10000%256;T1Num++;if(T1Num==100){T1Num=0;Flag1s=1;Num++;if(Num>9999){Num=0;}}}#include <reg51.h>#define uchar unsigned char#define uint unsigned intuchar T0Num;bit Flag1s=0;uchar DispCode[10]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f};//--------MUC_MUC串口自发自收-----------void SerialInit(){SCON=0x50; //方式1 允许接收PCON=0x00; //串口波特率不加倍TMOD|=0x20; //定时器1,方式2TH1=0xfd; //波特率为9600TL1=0xfd;TR1=1; //启动定时器ES=1;EA=1;}//--------------------------------void T0Init(){TMOD|=0x01;TH0=-10000/256;TL0=-10000%256;ET0=1;TR0=1;EA=1;}//--------------------------------void main(){uchar k;SerialInit();T0Init();while(1){if(Flag1s==1){Flag1s=0;SBUF=DispCode[k];k++;if(k>9){k=0;}}}}//--------------------------------void SerialServer() interrupt 4{if(RI==1){RI=0;P2=SBUF;}else{TI=0;}}//--------------------------------void T0Server() interrupt 1{TH0=-10000/256;TL0=-10000%256;T0Num++;if(T0Num==100){T0Num=0;Flag1s=1;}}#include <reg51.h>#define uchar unsigned char#define uint unsigned intuchar T0Num;bit Flag1s=0;uchar DispCode[10]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f};//-----------两机通信(主机代码)---------------------- void SerialInit(){SCON=0x50; //方式1 允许接收PCON=0x00; //串口波特率不加倍ES=1;EA=1;}//---------------------------------void T1Init(){TMOD=0x20; //定时器1,方式2TH1=0xfd; //波特率为9600TL1=0xfd;TR1=1; //启动定时器}//--------------------------------void T0Init(){TMOD|=0x01;TH0=-10000/256;TL0=-10000%256;ET0=1;TR0=1;EA=1;}//--------------------------------void main(){uchar k;SerialInit();T1Init();T0Init();while(1){if(Flag1s==1){Flag1s=0;P2=DispCode[k];SBUF=DispCode[k];k++;if(k>9){k=0;}}}}//--------------------------------void SerialServer() interrupt 4{if(RI==1){RI=0;}else{TI=0;}}//--------------------------------void T0Server() interrupt 1{TH0=-10000/256;TL0=-10000%256;T0Num++;if(T0Num==100){T0Num=0;Flag1s=1;}}#include <reg51.h>#define uchar unsigned charuchar Ch;//------两机通信(从机代码)---------------- void SerialInit(){SCON=0x50; //方式1 允许接收PCON=0x00; //串口波特率不加倍ES=1;EA=1;}//---------------------------------void T1Init(){TMOD=0x20; //定时器1,方式2TH1=0xfd; //波特率为9600TL1=0xfd;TR1=1; //启动定时器}//--------------------------------void main(){SerialInit();T1Init();while(1){P2=Ch;}}//--------------------------------void SerialServer() interrupt 4{if(RI==1){RI=0;Ch=SBUF;}else{TI=0;}} #include <reg51.h>#define uchar unsigned charuchar DispCode[10]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f};uchar Num=5;//----------------多机通信(主机代码)------------ void ExInit(){ IT0=1;IT1=1;EX0=1;EX1=1;EA=1;}//---------------------------------void SerialInit(){ SCON=0xd0; //方式3 允许接收PCON=0x00; //串口波特率不加倍TMOD=0x20; //定时器1,方式2TH1=0xfd; //波特率为9600TL1=0xfd;TR1=1; //启动定时器ES=1;EA=1;}//--------------------------------void SBUFSend(uchar Ch){ SBUF=Ch;while(TI==0){ }TI=0; }//--------------------------------void SendControl(uchar Addr,uchar Data) { TB8=1;SBUFSend(Addr);TB8=0;SBUFSend(Data);}//--------------------------------void main(){ SerialInit();ExInit();while(1){ }}//--------------------------------void SerialServer() interrupt 4{ uchar Ch;if(RI==1){ RI=0;Ch=SBUF;if(Ch=='b'){P2=DispCode[1];}if(Ch=='c'){P2=DispCode[2];}}else{TI=0;}}//-------------------------------void Ex0Server() interrupt 0{ Num++;if(Num>9){Num=0;}SendControl('b',Num);}//-----------------------------void Ex1Server() interrupt 2{Num--;if(Num==255){Num=9;}SendControl('c',Num);}************************************* #include <reg51.h>#define uchar unsigned charuchar DispCode[10]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f};//------------多机通信(从机1)--------------------- void SerialInit(){SCON=0xf0; //方式3 允许接收,SM2=1PCON=0x00; //串口波特率不加倍TMOD=0x20; //定时器1,方式2TH1=0xfd; //波特率为9600TL1=0xfd;TR1=1; //启动定时器ES=1;EA=1;}//-------------------------------void SBUFSend(uchar Ch){SBUF=Ch;while(TI==0){}TI=0;}//--------------------------------void main(){SerialInit();while(1){}}//--------------------------------void SerialServer() interrupt 4{uchar Ch;if(RI==1){RI=0;Ch=SBUF;if(RB8==1) //地址{if(Ch=='b'){SM2=0; //是自己的地址,置SM2=0,开始接收数据SBUFSend('b');}else{SM2=1; //不是自己的地址,置SM2=1。
51单片机智能小车PWM调速前进程序源代码、电路原理图和器件表
51单片机智能小车PWM调速前进程序源代码、电路原理图、电路器件表从控制电路角度划分,智能小车电路板分为核心板和驱动板。
核心板上的处理器的芯片型号是:STC15W4K56S4,这是一款51单片机。
驱动板上有电源电路、电机驱动电路以及一些功能模块接口。
智能小车前进只要控制智能小车四个轮子向前转动就可以了。
智能小车四个轮子由四个直流减速电机驱动。
直流减速电机驱动芯片采用L293D,一片电机驱动芯片L293D可以驱动两个直流减速电机,智能小车用到4个直流减速电机,需要用到两片L293D电机驱动芯片。
但有时候我们需要控制智能小车的速度,不希望智能小车全速前进。
比如在“智能小车循迹实验”中,如果智能小车速度过快,来不及反应做出方向的调整,智能小车会很容易跑离轨迹,这样就需要调整控制智能小车的速度了。
那么怎么样实现智能小车前进速度的调节呢?调节智能小车的速度,实际上是调节电机的运转速度,PWM调速是目前电机的主流调速方式。
智能小车采用脉宽调制(PWM)的办法来控制电机的转速,从而控制智能小车的速度。
在此种情况下,电池电源并非连续地向直流电机供电,而是在一个特定的频率下为直流电机提供电能。
不同占空比的方波信号,调节对直流电机的通断电,能起到对直流电机调速作用。
这是因为电机实际上是一个大电感,它有阻碍输入电流和电压突变的能力,因此脉冲输入信号被平均分配到作用时间上。
这样,改变L293D使能端EN1和EN2上输入方波的占空比就能改变加在电机两端的电压大小,从而改变了直流电机转速。
智能小车PWM调速前进程序如下:首先,定义了2个变量,这2个变量用于设置智能小车的速度。
unsigned char pwmval_left_init=6; //调节此值可以调节小车的速度。
unsigned char pwmval_right_init=6; //调节此值可以调节小车的速度。
通过以下函数初始化定时器0,每1毫秒中断一次。
void Timer0_Init(void) //定时器0初始化{TMOD=0x01;TH0=0xf8;TL0=0xcd;TR0=1;ET0=1;EA=1;}下面我们看定时器0的中断处理函数。
51单片机控制LCD液晶1602源代码
void Lcd1602_Clear_All(void);
void Lcd1602_Demo1(void);
void Lcd1602_Demo2(void);
void Delay_ms(unsigned char second);
if(++row==3)
return;
else
{
switch(row)//这种结构保持以后升级到多行显示液晶
_nop_();
LCD_EN=HIGH ;
_nop_();
LCD_EN=LOW;
LCD_DATA_PORT=0xFF; //prevent port is 0.
}
//===========================
case 2:Lcd1602_Write_Command(0x80+0x40);break; //将数据地址指针定位到第二行
default: break;
}
}
//==================================================
{
while(1)
{
Lcd1602_Demo1();
// Lcd1602_Demo2();
}
}
void Lcd1602_Ini(void)
{
Delay_ms(20);
Lcd1602_Write_Command_Nocheck(0x38);//设定LCD为16*2显示,5*7点阵,8位数据接口
{
Lcd1602_Write_String(row,column," ");
单片机编程全集(含源代码)
前言 (2)基础知识:单片机编程基础 (2)第一节:单数码管按键显示 (4)第二节:双数码管可调秒表 (6)第三节:十字路口交通灯 (7)第四节:数码管驱动 (9)第五节:键盘驱动 (10)第六节:低频频率计 (15)第七节:电子表 (18)第八节:串行口应用 (19)前言本文是本人上课的一个补充,完全自写,难免有错,请读者给予指正,可发邮件到************.CN,或郑郁正@中国;以便相互学习。
结合课堂的内容,课堂上的部分口述内容,没有写下来;有些具体内容与课堂不相同,但方法是相通的。
针对当前的学生情况,尽可能考虑到学生水平的两端,希望通过本文都学会单片机应用。
如果有不懂的内容,不管是不是本课的内容,都可以提出来,这些知识往往代表一大部分同学的情况,但本人通常认为大家对这些知识已精通,而在本文中没有给予描述,由此影响大家的学习。
对于这些提出问题的读者,本人在此深表谢意。
想深入详细学习单片机的同学,可以参考其它有关单片机的书籍和资料,尤其是外文资料。
如果有什么问题,我们可以相互探讨和研究,共同学习。
本文根据教学的情况,随时进行修改和完善,所以欢迎同学随时注意本文档在课件中的更新情况。
基础知识:单片机编程基础单片机的外部结构:1、DIP40双列直插;2、P0,P1,P2,P3四个8位准双向I/O引脚;(作为I/O输入时,要先输出高电平)3、电源VCC(PIN40)和地线GND(PIN20);4、高电平复位RESET(PIN9);(10uF电容接VCC与RESET,即可实现上电复位)5、内置振荡电路,外部只要接晶体至X1(PIN18)和X0(PIN19);(频率为主频的12倍)6、程序配置EA(PIN31)接高电平VCC;(运行单片机内部ROM中的程序)7、P3支持第二功能:RXD、TXD、INT0、INT1、T0、T1单片机内部I/O部件:(所为学习单片机,实际上就是编程控制以下I/O部件,完成指定任务)1、四个8位通用I/O端口,对应引脚P0、P1、P2和P3;2、两个16位定时计数器;(TMOD,TCON,TL0,TH0,TL1,TH1)3、一个串行通信接口;(SCON,SBUF)4、一个中断控制器;(IE,IP)针对AT89C52单片机,头文件AT89x52.h给出了SFR特殊功能寄存器所有端口的定义。
单片机流水灯汇编语言源代码大全(六款流水灯汇编语言源代码)
ORG 0
MOV R1,#3
LOOP1:MOV R0,#8
MOV A,#11111110B
LOOP2:MOV P0,A
RL A
CALL D200MS
DJNZ R0,LOOP2
DJNZ R1,LOOP1
MOV A,#00000000B
MOV P0,A
MOV P2,#0FFH
LOOP:MOV A,P2
ORG 0000H
JMP main
ORG 0003H
JMP int_0
main:
SETB IT0
SETB EX0
SETB EA
MOV A,#11111110B
s:RL A
MOV P2,A
CALL delay
JMP s
delay:
MOV R7,#100
d3:MOV R6,#200
d2:MOV R5,#250
ORG 0000H
MOV R0,#11111110B
start:MOV A,#11111110B
MOV P2,A
s:CALL delay
RL A
MOV P2,A
CALL delay
CJNE A,#01111111B,s
MOV A,R0
MOV P1,A
RL A
MOV R0,A
JMP start
delay:MOV R5,#100
CPL A
MOV P0,A
JMP LOOP
D200MS:
MOV R7,#250
D1:MOV R6,#200
D2:MOV R5,#2
DJNZ R5,$
DJNZ R6,D2
DJNZ R7,D1
stc单片机hhc595源代码
stc单片机hhc595源代码摘要:I.简介- 介绍STC单片机和HHc595- 示例代码目的II.硬件连接- STC单片机与HHc595的连接- LED灯的连接III.程序设计- 初始化代码- 控制LED灯闪烁的代码IV.测试与总结- 测试过程- 总结正文:I.简介STC单片机是一款基于Flash存储器的单片机,具有高性能、低功耗、多功能、易扩展等特点。
HHc595是一款8位串行输入、并行输出的移位寄存器,可扩展微控制器的I/O口。
本示例代码将展示如何使用STC单片机控制一个LED灯的闪烁。
II.硬件连接1.将STC单片机与HHc595相连接。
2.将LED灯的正极连接到HHc595的数据输出(DOUT),负极连接到地(GND)。
III.程序设计1.初始化代码```c#include <reg52.h>#include <intrins.h>sbit led = P2^0; // 定义LED灯连接的P2.0引脚void delay(unsigned int ms) // 延时函数{unsigned int i, j;for (i = ms; i > 0; i--)for (j = 110; j > 0; j--);}void main(){P2 = 0xfe; // 初始化P2口,全部输出低电平while (1){led = 0; // 点亮LED灯delay(500); // 延时500msled = 1; // 熄灭LED灯delay(500); // 延时500ms}}```2.控制LED灯闪烁的代码在主函数中,我们使用一个循环来控制LED灯的闪烁。
首先,点亮LED 灯,然后延时500ms,接着熄灭LED灯,最后再延时500ms。
这样,LED灯就会以每秒1Hz的频率闪烁。
IV.测试与总结将编写好的程序烧写到STC单片机后,观察LED灯是否按照预期的方式进行闪烁。
单片机颜色识别源代码&解释
//#define green {s2=1,s3=1}; //定义不同滤光
int r=0;
int g=0;
int b=0; //用于统计rgb三基色的不同比例。
int yanse_exercise=0; //用于储存最终的颜色测量结果,并与条形码结果比较
{
/* if(way==1)
{
s2=0;
s3=0;
r=yanse_jishu;
}
if(way==2)
{
s2=0;
s3=1;
b=yanse_jishu;
}
ቤተ መጻሕፍቲ ባይዱif(way==3)
{
s2=1;
s3=1;
g=yanse_jishu;
} */
switch(way)
{
case 1:s2=0;s3=0;r=yanse_jishu;break;
void yanse() //处理中断中统计的结果并把各个子函数全部调用
{
if(yanse_key)
{
EX1=0; //关中断
yanse_way(yanse_choose);
if(yanse_choose>=3)
{
yanse_choose=0;
yanse_find(r,g,b);
}
}
}
void timer0()interrupt 1 using 2 //定时中断
#include <AT89x51.H> //头文件
#define s2 P1_2
#define s3 P1_3
#define out P3_3 //最终经分析,只需要连接s2 s3 out即可,其他直接接地或接VCC.//最好是将out接外部中断P33我的程序是按P33编的,当然换其他的也行。
基于51单片机的液晶LCD1602显示程序源代码(带LCD1602液晶接口电路))
液晶LCD1602显示字符和数字程序源代码/***********************液晶LCD1602测试程序源代码*************************单片机型号:STC15W4K56S4,内部晶振:22.1184M。
功能:液晶LCD1602显示功能测试。
操作说明:液晶LCD1602显示字符和倒计时。
**************************************************************************/#include "stc15.h" //包含头文件stc15.h#include <intrins.h> //包含头文件intrins.h#define Busy 0x80 //LCD忙sbit LCD_D0 = P0^0; //LCD_D0对应P0.0sbit LCD_D1 = P0^1; //LCD_D1对应P0.1sbit LCD_D2 = P0^2; //LCD_D2对应P0.2sbit LCD_D3 = P0^3; //LCD_D3对应P0.3sbit LCD_D4 = P0^4; //LCD_D4对应P0.4sbit LCD_D5 = P0^5; //LCD_D5对应P0.5sbit LCD_D6 = P0^6; //LCD_D6对应P0.6sbit LCD_D7 = P0^7; //LCD_D7对应P0.7sbit LCD_RS = P1^0; //LCD_RS对应P1.0sbit LCD_RW = P1^1; //LCD_RW对应P1.1sbit LCD_EN = P3^4; //LCD_EN对应P3.4void delay(unsigned int t); //delay延时函数void delay_us(unsigned int t); //delay_us延时函数void delay_ms(unsigned int t); //delay_ms延时函数void Delay5Ms(void); //5Ms延时函数void GPIO_1602_Configuration(void); //LCD1602液晶IO口初始化void WriteDataLCD(unsigned char WDLCD); //LCD写数据函数void WriteCommandLCD(unsigned char WCLCD,BuysC); //LCD写命令函数unsigned char ReadDataLCD(void); //LCD读数据函数unsigned char ReadStatusLCD(void); //LCD读状态函数void LCDInit(void); //LCD初始化void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);//LCD显示一个字符void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);//LCD显示一个字符串unsigned char code welcome[] = {"Hello My Friends"};//液晶LCD1602显示Hello My Friendsunsigned char code countdown[] = {"CountDown: S"};//液晶LCD1602显示CountDown: Svoid delay(unsigned int t) //delay延时函数{while(t--);}void delay_us(unsigned int t) //delay_us延时函数{unsigned char i;while(t--){i=3;while(i--)delay(1);}}void delay_ms(unsigned int t) //delay_ms延时函数{while(t--){delay_us(t);}}void Delay5Ms(void) //5ms延时函数{unsigned int TempCyc = 3552;while(TempCyc--);}void GPIO_1602_Configuration(void) //LCD1602液晶IO口初始化{P0M1 = P3M1&0x00;P0M0 = P3M0&0x00;P1M1 = P3M1&0xfc;P1M0 = P3M0&0xfc;P3M1 = P4M1&0xef;P3M0 = P4M0&0xef;}unsigned char ReadStatusLCD(void) //测试LCD忙碌状态{LCD_D7 = 1; //LCD的D7置1LCD_RS = 0; //LCD管脚RS设置成低电平LCD_RW = 1; //LCD管脚RW设置成高电平LCD_EN = 0; //LCD管脚E设置成低电平LCD_EN = 0; //LCD管脚E设置成低电平LCD_EN = 1; //LCD管脚E设置成高电平while(LCD_D7); //检测忙信号return(Busy); //表示当前忙}void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测{if(BuysC) ReadStatusLCD(); //根据需要检测忙LCD_EN = 0; //LCD管脚E设置成低电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_RS = 0; //LCD管脚RS设置成低电平LCD_RW = 0; //LCD管脚RW设置成低电平_nop_(); //空操作,延时_nop_(); //空操作,延时P0 = WCLCD; //将数据送入P0口,即写入指令或地址_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 1; //E置高电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 0;//当E由高电平跳变成低电平时,液晶模块开始执行命令}void WriteDataLCD(unsigned char WDLCD) //LCD写数据函数{ReadStatusLCD(); //读取LCD状态LCD_EN = 0; //LCD管脚E设置成低电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_RS = 1; //LCD管脚RS设置成高电平LCD_RW = 0; //LCD管脚RW设置成低电平P0 = WDLCD;//将数据送入P0口,即将数据写入液晶模块_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 1; //E置高电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 0;//当E由高电平跳变成低电平时,液晶模块开始执行命令}void LCDInit(void) //LCD初始化{WriteCommandLCD(0x38,0); //三次显示模式设置,不检测忙信号Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);WriteCommandLCD(0x08,1); //关闭显示WriteCommandLCD(0x01,1); //显示清屏WriteCommandLCD(0x06,1); //显示光标移动设置WriteCommandLCD(0x0C,1); //显示开及光标设置}void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData){Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; //算出指令码WriteCommandLCD(X,0); //这里不检测忙信号,发送地址码WriteDataLCD(DData); //发送数据}void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData){unsigned char ListLength;ListLength = 0;Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1 while (DData[ListLength]>=0x20) //若到达字串尾则退出{if (X <= 0xF) //X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符ListLength++;X++;}}}void main(void){GPIO_1602_Configuration(); //LCD1602液晶IO口初始化delay_ms(10); //延时LCDInit(); //LCD1602初始化delay_ms(10); //延时DisplayListChar(0,0,welcome); //LCD1602显示Hello My Friends delay_ms(10); //延时DisplayListChar(0,1,countdown); //LCD1602显示CountDown: S delay_ms(10); //延时DisplayOneChar(14,1,0x39); //LCD1602显示9delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x38); //LCD1602显示8delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x37); //LCD1602显示7delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x36); //LCD1602显示6delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x35); //LCD1602显示5delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x34); //LCD1602显示4delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x33); //LCD1602显示3delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x32); //LCD1602显示2delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x31); //LCD1602显示1delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x30); //LCD1602显示0delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时while(1){;}}程序源代码是编译通过并在电路板上测试过参考液晶LCD1602接口电路图该程序的实际运行效果。
51单片机曼彻斯特码译码源程序
C51 Manchester译码源程序C51曼彻斯特码译码源程序2009-04-30 11:14/*manchester编码方式:0为10 1为01,如果与其相反则需要做相应的修改。
适用于125KHz非接触式ID卡,EM4100兼容格式ID卡(64bits, Manchester编码)MCU:stc12c54xxcrystal:11.0592M使用资源:外部中断0(INT0)+PCA0*/#include <stc12c5410ad.h>#include <stdio.h>#include<intrins.h>#define Channe256uS_H 0x00 //模块60mS 定时常数高位#define Channe256uS_L 0xEC //模块60mS 定时常数低位#define uint8 unsigned charsbit RFID_DATA = P3^2; //外部中断口接收数据/*/函数申明 */void start_Read() ;void Data_reveice() ;void Lmove_bite() ;uint8 find_head() ;uint8 Data_L_check() ;uint8 Data_R_check() ;void get_data();uint8 Data_Sever() ;void Get_EffectData(uint8 edata) ;void Init_PCA0();void DAT_Change(uint8 dat[]);void init_dev(void);uint8 tcount ;// 定时中断计数uint8 count ;//接收数据位数计数uint8 t_count ;//获得数据及校验变量。
uint8 temp ;// 临时变量uint8 temp_buf[16] ;//128个Machester位 55个数据位缓冲区。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第二章任务一:闪烁广告灯的设计利用89C51单片机的端口控制两个LED ( DO和D1 ),编写程序,实现两个LED互闪。
#include<reg52.h>#define uint unsigned int#define uChar unsigned Charsbit LED仁POP;sbit LED2=P0A1;void delayms(uint ms){uint i;while(ms--){for(i=O;i<12O;i++);}}void main(){while(1){LED1=O;LED2=1;delayms(5OO);LED1=1;LED2=O;delayms(5OO);}}任务二:流水广告灯的设计利用89c51单片机的端口控制8个LED( D0~D7 )循环点亮,刚开始时DO点亮,延时片刻后,接着D1 点亮,然后依次点亮D2->D3->D4->D5 ->D6->D7 ,然后再点亮D7->D6->D5->D4 ->D3->D2->D1->DO ,重复循环。
#include<reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charuint i;uchar temp;uint a[8]={Oxfe,Oxfd,Oxfb,Oxf7,Oxef,Oxdf,Oxbf,Ox7f};void delayms(uint ms){while(ms--){ uint j;for(j=0;j<120;j++);}}void main(){while(1){P0=0xfe; while(P0!=0x7f) {//P1=temp;//delayms(500);P0=_crol_(P0,1); delayms(250);}temp=0x7f;while(P0!=0xfe){P0=temp; delayms(500); temp=_cror_(temp,1);}}}任务三:拉幕式与闭幕式广告灯的设计利用89C51单片机的P0端口实现8个LED D0~D7的拉幕式与闭幕式广告灯设计。
拉幕式:开始D0~D7 全灭,延时片刻后首先D3 和D4 亮,其次是D2 和D5 亮,再是D1 和D6 亮,最后是D0 和D7 亮。
闭幕式:开始D0~D7 全亮,延时片刻后首先D0 和D7 灭,其次是D1 和D6 灭,再是D2 和D5 灭,最后是D3 和D4 灭。
#inClude<reg52.h>#define uint unsigned int#define uChar unsigned CharuChar Code table[]={0xe7,0xC3,0x81,0x00};void delay(uint x){uint i,j;for(i=x;i>0;i--)for(j=120;j>0;j--);}void main()uint i;while(1){P1=0xff;delay(500);for(i=0;i<4;i++){P1=table[i];delay(500);}for(i=3;i>0;i--){P1=table[i-1]; delay(500);}}}任务四:复杂广告灯的设计利用89c51 单片机的端口实现8 个LED(D0~D7 )复杂广告灯的控制,要求显示规律为:正向流水-> 反向流水-> 隔灯闪烁3 次-> 高四盏、低四盏闪烁2次-> 隔两盏闪烁3次,再重复循环。
#include<reg52.h>#define uint unsigned int#include<intrins.h>void delayms(uint ms){uint i;while(ms--){for(i=0;i<110;i++);}}void main(){uint i,j,xx[2]={0xaa,0xff},yy[2]={0xf0,0x0f},zz[2]={0xb6,0xff}; unsigned char aa;while(1){aa=0xfe;for(i=0;i<7;i++)P0=aa;aa=_crol_(aa,1);{} {delayms(500);for(i=0;i<8;i++){P0=aa; aa=_cror_(aa,1); delayms(500);}for(i=0;i<3;i++) for(j=0;j<2;j++) {P0=xx[j]; delayms(500);} for(i=0;i<2;i++) for(j=0;j<2;j++) { P0=yy[j] ; delayms(500);} for(i=0;i<3;i++) for(j=0;j<2;j++) {P0=zz[j] ; delayms(500);}}} 任务五:单个LED 数码管显示设计使用89c51 的P0 口作为输出口,外接LED 数码管,编写程序,使数码管循环显示从的加 1 计数。
#include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar table[10]={ 0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8, 0X80,0X90};uint key=0;void int_int()EA=1;IT0=1;EX0=1;0~9}void count_num() interrupt 0{if(key==9)key=0;else key++;}void main(){int_int();while(1){P0=table[key];}}任务六:多个LED 数码管显示设计使用单片机P0 和P2 口作为输出口,外接一个8 位LED 数码管,编写程序,使数码管显示“872AF635 ”。
#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned chardelay(ms){while(ms--){ int i;for(i=0;i<110;i++);}}main(){uchara[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};uchar b[8]={0x08,0x07,0x02,0x0a,0x0f,0x06,0x03,0x05},j;uint i;while(1){ j=0x01;for(i=0;i<8;i++){P2=j;P0=a[b[i]]; j=_crol_(j,1);delay(3);}}任务七:查询式按键设计将8 个按键从1~8 进行编号,如果其中一个键被按下,则在LED 数码管上显示相应的键值。
#include<reg52.h>#define uint unsigned int#define uchar unsigned charmain(){uchara[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};P0=0xff;while(P0!=0xff){ switch(P0){case 0xfe:P2=a[1]; break;case 0xfd:P2=a[2]; break;case 0xfb:P2=a[3]; break;case 0xf7:P2=a[4]; break;case 0xef:P2=a[5]; break;case 0xdf:P2=a[6]; break;case 0xbf:P2=a[7]; break;case 0x7f:P2=a[8];}}}任务八:LED 数码管显示矩阵键盘按键的设计设计一个4*4 的矩阵键盘,以P1.0~P1.3 作为行线,以P1.4~P1.7 作为列线。
要求:未按下按键时,LED数码管显示-”,按下按键时,在数码管上显示相应的键值。
#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchartable[17]={0xbf,0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86 ,0 x8e};uint num=0;void delay(uint x){uchar i,j;for(i=x;i>0;i--) for(j=120;j>0;j--);}keyscan(){ uint temp;temp=P2;temp&=0x0f;if(temp==0x0e){P2=0xf0;temp=P2;temp&=0xf0;switch(temp){case 0xe0:num=1;break;case 0xd0:num=2;break;case 0xb0:num=3;break;case 0x70:num=4;}}if(temp==0x0d){P2=0xf0;temp=P2;temp&=0xf0;switch(temp){case 0xe0:num=5;break;case 0xd0:num=6;break;case 0xb0:num=7;break;case 0x70:num=8;}}if(temp==0x0b){P2=0xf0;temp=P2;temp&=0xf0;switch(temp){case 0xe0:num=9;break; case 0xd0:num=10;break;case 0xb0:num=11;break;case 0x70:num=12;}}if(temp==0x07){P2=0xf0; temp=P2;temp&=0xf0;switch(temp){case 0xe0:num=13;break;case 0xd0:num=14;break;case 0xb0:num=15;break;case 0x70:num=16;}}return num;}void display(uint num){ if(num==0)P0=0xbf;P0=table[num] ;}main(){uint temp;while(1){P2=0x0f;temp=P2; if(temp!=0x0f) keyscan(); display(num);}}(2)#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit LED仁P2P;sbit LED2=P2A1;uchar num;uchar code LED_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};// 数码管字形码编码void delay(uint x){uchar i,j;for(i=x;i>0;i--)for(j=120;j>0;j--);}// 延时函数void display(uchar num){P0=LED_code[num];}// 数码管显示函数void keyscan()// 键盘扫描函数{uchar temp;P1=0xfe;//key1-key4 第一行按下temp=P1;temp&=0xf0;if(temp!=0xf0){delay(10);// 消除抖动temp=P1;temp&=0xf0;if(temp!=0xf0){temp=P1;switch(temp){case 0xee:num=1;break;case 0xde:num=2;break;case 0xbe:num=3; break; case 0x7e:num=4;break;}}while(temp!=0xf0)// 等待按键释放{temp=P1;temp&=0xf0;}}P1=0xfd;//key5-key8 第二行按下temp=P1;temp&=0xf0;if(temp!=0xf0){delay(10);// 消除抖动temp=P1;temp&=0xf0;if(temp!=0xf0){temp=P1;switch(temp){case 0xed: num=5; break;case 0xdd: num=6; break;case 0xbd: num=7; break;case 0x7d: num=8; break;}}while(temp!=0xf0)// 等待按键释放{temp=P1;temp&=0xf0;}}P1=0xfb;//key9-key12 第三行按下temp=P1;temp&=0xf0;if(temp!=0xf0){delay(10);// 消除抖动temp=P1;temp&=0xf0;if(temp!=0xf0){temp=P1;switch(temp){case 0xeb: num=9; break;case 0xdb: num=10; break;case 0xbb: num=11; break;case 0x7b: num=12; break;}}while(temp!=0xf0)// 等待按键释放{temp=P1; temp&=0xf0;}}P1=0xf7;//key13-key16 第四行按下temp=P1; temp&=0xf0;if(temp!=0xf0){delay(10);// 消除抖动temp=P1;temp&=0xf0;if(temp!=0xf0)temp=P1; switch(temp){{case 0xe7:num=13; break;case 0xd7:num=14; break;case 0xb7:num=15; break;case 0x77:num=16; break;}}while(temp!=0xf0)// 等待按键释放{temp=P1; temp&=0xf0;}}}void main(){while(1){keyscan();if(num==0)P0=0xbf;elsedisplay(num-1);}} 任务九:简单拨号键盘的设计使用4*4 的矩阵式键盘及8 位共阳极LED 数码管设计一个简单拨号键盘,要求在初始状态时,8位数码管均显示-”,每按下一个号码后,原8位LED数码管显示的内容向左移动1位。