单片机程序源代码
51单片机数码管0到99循环程序代码
51单片机数码管0到99循环程序代码1. 概述在嵌入式系统的开发中,数码管是一种常见的输出设备,可以用于显示数字、字符等信息。
而51单片机是一种广泛应用的微控制器,其结合了强大的功能和灵活的应用,能够很好地驱动数码管。
本文将介绍如何使用51单片机编写一个循环显示0到99的程序,通过数码管输出这些数字。
2. 电路连接我们需要连接51单片机和数码管。
通常我们使用的是共阴数码管,其连接方式如下:- VCC连接到5V电源- GND连接到GND- DIO(数据输入/输出)连接到51单片机的IO口3. 程序设计下面是一个简单的C语言程序设计,用于控制数码管显示0到99的数字。
```c#include <reg51.h>sbit DIO = P2^0; // 数码管数据输入/输出sbit CL = P2^1; // 数码管片选信号unsigned char code numCode[10] = { 0xc0, // 00xf9, // 10xa4, // 20xb0, // 30x99, // 40x92, // 50x82, // 60xf8, // 70x80, // 80x90 // 9};//延时函数void delay(unsigned int i) {unsigned int j,k;for (j=i;j>0;j--)for(k=110;k>0;k--);}void display(unsigned char num) { CL = 1; //关闭片选DIO = numCode[num / 10]; //十位 delay(2);CL = 0;DIO = 0xff; //消隐delay(2);CL = 1; //关闭片选DIO = numCode[num 10]; //个位 delay(2);CL = 0;DIO = 0xff; //消隐delay(2);}void m本人n() {unsigned char i,j;while(1) {for(i=0;i<10;i++) {for(j=0;j<10;j++) {display(i * 10 + j);}}}}```4. 程序说明- 首先定义了数码管的连接引脚,以及0~9的显示编码。
单片机程序源代码
步进电机程序源代码#include<reg52.h>unsigned char step[]={0x01,0x02,0x04,0x08};sbit beep=P3^4;void delay_50us(unsigned int){unsigned int j;for(;t>0;t--)for(j=19;j>0;j--);}void main(){unsigned int i,k;for(i=512;i>=0;i--){for(k=0;k<4;k++){P1=step[k];delay_50us(200);}delay_50us(2000);if(i==0){beep=1;delay_50us(1000);}elsebeep=0;}}数码管电子时钟程序源代码#include<reg52.h> //在数码管上显示1~65536的数字,间隔1秒。
#define uint unsigned int#define uchar unsigned charuchar code d[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};uchar code w[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//8个数码管的排列是从左到右:0,1,2,3,4,5,6,7sbit Exint0 = P3^2;sbit Exint1 = P3^3;sbit keyinc = P0^0; //单片机的第39脚sbit keydec = P0^1; //单片机的第38脚sbit SetH = P0^2; //单片机的第37脚sbit SetM = P0^3; //单片机的第36脚//sbit SetS = P0^4;char s,m,h; //定义秒、分、时变量uchar num=0,Stopgo = 1,hm = 0; void ExInt0init(void);void ExInt1init(void);void KeyScan(void);void delay(uint z){uint x,y;for(x=10;x>0;x--)for(y=z;y>0;y--);}void delay_50us(uint t){uint j;for(;t>0;t--)for(j = 19;j > 0;j--);}void display(){P1 = d[s%10];P2 = w[0];delay(10);P1 = d[s/10];P2 = w[1];delay(10);P1 = d[10]; //显示“-”P2 = w[2];delay(10);P2 = w[5];delay(10);delay(10);P1 = d[m%10];P2 = w[3];delay(10);P1 = d[m/10];P2 = w[4];delay(10);P1 = d[h%10];P2 = w[6];delay(10);P1 = d[h/10];P2 = w[7];delay(10);}void changenum(){if(num==20){num=0;if(Stopgo) s++; //让“ClockSet”来控制是否数字加1}if(s>=60){ s=0;if(++m>=60){ m=0;if(++h>=24)h=0;}}display();}void init_timer(){TMOD=0x01;TH0=(65535-50000)/256; //如果时间要完全精确,需用12MHZ的晶振TL0=(65535-50000)%256;EA=1; //开总中断开关ET0=1; //开定时器0中断开关TR0=1; //开始定时}void main(){init_timer(); //调用定时器初始化函数ExInt0init(); //调用外部中断0初始化函数ExInt1init(); //调用外部中断1初始化函数while(1){Exint0 = 1; //P3.2 = 1Exint1 = 1; //P3.3 = 1if(Stopgo == 0)KeyScan();elsechangenum();display();}}void ExInt0init(void){Exint0 = 1; //P3.2 = 1PX0 = 1;EX0 = 1; //打开外部中断0中断开关IT0 = 1; //设置外部中断的触发方式,IT0 = 0代表低电平触发;IT0 = 1代表下降沿触发EA = 1; //打开总中断开关}void ExInt1init(void){Exint1 = 1; //P3.3 = 1PX1 = 1;EX1 = 1;IT1 = 1; //设置外部中断的触发方式,IT0 = 0代表低电平触发;IT0 = 1代表下降沿触发EA = 1;}void timer() interrupt 1{TH0=(65535-50000)/256;TL0=(65535-50000)%256;TF0 = 0;num++;}void exInt0(void) interrupt 0{Stopgo = 0; //当按下停止按钮时,产生外部中断0,将标志“Stopgo”清0,停止数字加1。
单片机c语言实例程序300篇
单片机c语言实例程序300篇单片机C语言【程序1】题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。
组成所有的排列后再去掉不满足条件的排列。
2.程序源代码:main(){inti,j,k;printf("\n");for(i=1;i<5;i++)/某以下为三重循环某/for(j=1;j<5;j++)for(k=1;k<5;k++){if(i!=k&&i!=j&&j!=k)/某确保i、j、k三位互不相同某/printf("%d,%d,%d\n",i,j,k);}}==============================================================【程序2】题目:企业发放的奖金根据利润提成。
利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?1.程序分析:请利用数轴来分界,定位。
注意定义时需把奖金定义成长整型。
2.程序源代码:main()单片机C语言{longinti;intbonu1,bonu2,bonu4,bonu6,bonu10,bonu;canf("%ld",&i);bonu1=100000某0.1;bonu2=bonu1+100000某0.75;bonu4=bonu2+200000某0.5;bonu6=bonu4+200000某0.3;bonu10=bonu6+400000某0.15;if(i<=100000)bonu=i某0.1;eleif(i<=200000)bonu=bonu1+(i-100000)某0.075;eleif(i<=400000)bonu=bonu2+(i-200000)某0.05;eleif(i<=600000)bonu=bonu4+(i-400000)某0.03;eleif(i<=1000000)bonu=bonu6+(i-600000)某0.015;elebonu=bonu10+(i-1000000)某0.01;printf("bonu=%d",bonu);}============================================================ ==【程序3】题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。
单片机程序流程图及源代码
单片机上机实验报告【实验一】端口实验,掌握通过端口编程实现数据输出和输入的方法,并观察结果。
实验内容: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; 人眼可分辨。
MEGA16单片机定时器(16位)源代码
MEGA16单片机定时器(16位)源代码/* 程序名: mega16a 芯片16 位定时计数器;概括: 学会了控制8 位定时器,16 位定时器和它如出一辙,Its a piece of cake! 在芯片开发板上实现精确一秒闪烁... 心得: 电子技术和音乐一样,都是一门艺术,令人回味... finish time: 2014 年3 月8 日19:33:10; 作者: 肖邦;*/#include //头文件;typedef unsigned char uint8 ; //在程序中用uint8 相当于写unsigned char ;typedef unsigned int uint16; //用法同上;void reset_io(void) //初始化所有io 口;{ DDRA=0XFF; PORTA=0X00; DDRB=0XFF; PORTB=0X00; DDRC=0XFF; PORTC=0X00; PORTC|=1<<5; //12864 液晶屏复位引脚置1; PORTC&=~(1<<5); //12864 清零(复位) ; PORTC|=1<<5; //12864 液晶屏复位引脚置1; DDRD=0XFF; PORTD=0X00;}int main(void) //主函数!!!!!{ uint16 num=0; reset_io(); //初始化io 口; TCNT1=0xff44; //设置定时器初始值,1 毫秒溢出一次0xff45==65536-(12 兆/64 分频*0.001 秒); TCCR1B=0x03; //( 64 分频)设置定时器分频并开启定时器; PORTB=1<<2; while(1) { if(TIFR&0X04) //一旦溢出标志位置一,就进入; {// PORTA–0XFF; //物理引脚PA 口跳变,此语句没用; num++; if(num==1000) {PORTA–0XFF;num=0;} 每一毫秒num 变量加一,加1000 次是你秒; TCNT1=0XFF44; //回复初始值; TIFR|=0X04; //此语句很重要! !!!!!溢出标志位只有置一才会自动清零;}}}tips:感谢大家的阅读,本文由我司收集整编。
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的方式闪动。
单片机程序源代码完整版.doc
{
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);
{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)
利用89c51单片机的端口控制8个LED(D0~D7)循环点亮,刚开始时D0点亮,延时片刻后,接着D1点亮,然后依次点亮D2->D3->D4->D5 ->D6->D7,然后再点亮D7->D6->D5->D4 ->D3->D2->lt;reg52.h>
#include <intrins.h>
}
for(i=3;i>0;i--)
{
P1=table[i-1];
delay(500);
}
}
}
任务四:复杂广告灯的设计
利用89c51单片机的端口实现8个LED(D0~D7)复杂广告灯的控制,要求显示规律为:正向流水->反向流水->隔灯闪烁3次->高四盏、低四盏闪烁2次->隔两盏闪烁3次,再重复循环。
51单片机串口通讯UART头文件的源代码
bit bdata sendactive; //发送有效标志
/*串行中断服务程序*/
static void com_isr(void) interrupt 4 using 1
{
//----------接收数据---------------
char c;
if(RI) //接收中断置位
{
c=SBUF;//读字符
RI=0;//清接收中端标志
if(istart+ILEN!=iend)
inbuf[iend++&(ILEN-1)]=c; //缓冲区接收数据
}
//------------发送数据------
if(TI)
{
TI=0; //清发送中断标志
if(ostart!=oend)
char idata outbuf[OLEN]; //发送缓冲区存储数组
#define ILEN 8//串行接收缓冲区大小
unsigned char istart; //接受缓冲区起始索引
unsigned char iend; //接收缓冲区结束索引
char idata inbuf[ILEN]; //接收缓冲区存储数组
putbuf(0x0D); //对新行在LF前发送CR
}
while(sendfull);
putbuf(c);
return(c);
}
//替换标准库函数_getkey程序
//getchar和gets函数使用_getkey
char _getkey(void)
{
char c;
while(iend==istart) //判断接收缓冲区起始索引是否等于接收区结束索引
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特殊功能寄存器所有端口的定义。
stm32单片机小时计时程序代码
stm32单片机小时计时程序代码stm32单片机小时计时程序是一种基于stm32单片机的软件程序,用于实现小时计时的功能。
在本文中,我们将详细介绍如何编写这样一个程序,以及程序的实现原理和使用方法。
我们需要了解stm32单片机的基本知识。
stm32单片机是一种高性能、低功耗的嵌入式微控制器,具有丰富的外设和强大的计算能力。
它广泛应用于各种电子设备中,包括计时器、时钟、计步器等。
在编写小时计时程序之前,我们需要先了解stm32单片机的时钟模块。
时钟模块是单片机中非常重要的一个模块,它提供了系统时钟和外设时钟,控制单片机的时序和节拍。
在小时计时程序中,我们需要使用时钟模块来计算时间的流逝。
接下来,我们开始编写小时计时程序。
首先,我们需要初始化时钟模块。
在stm32单片机中,时钟模块的初始化包括设置系统时钟源、设置时钟分频器等。
我们可以根据实际需求选择适合的时钟源和分频系数。
初始化完时钟模块后,我们需要设置计时器。
在小时计时程序中,我们可以使用定时器模块来实现计时功能。
定时器模块可以通过配置计数器的初值和计数器的溢出时间来实现定时功能。
我们可以根据实际需求选择适合的定时器模块和计数器参数。
在设置计时器后,我们需要编写中断服务函数。
中断服务函数是在计数器溢出时自动调用的函数,用于处理计时器溢出事件。
在小时计时程序中,我们可以在中断服务函数中将计数器的值加1,以实现计时功能。
编写完中断服务函数后,我们需要设置中断优先级和使能中断。
在stm32单片机中,每个中断都有一个优先级,用于确定中断的响应顺序。
我们可以根据实际需求设置中断优先级,并使能中断,以保证中断能够正常工作。
我们可以在主函数中调用计时器模块,并通过串口或LCD等外设输出计时结果。
在小时计时程序中,我们可以使用串口模块将计时结果输出到电脑上进行显示,也可以使用LCD模块将计时结果显示在液晶屏上。
stm32单片机小时计时程序是一种基于stm32单片机的软件程序,用于实现小时计时的功能。
PIC16F917单片机c语言源程序ad变换,pwm输出,数码显示
PIC16F917单片机c语言源程序ad变换,pwm输出,数码显示//说明:完整的PIC16F917编写的c语言程序,通过编译,内容包含有ad变换,pwm输出,数码显示(通过串口移位显示),串行口通讯等#include;#define uchar unsigned char#define uint unsigned int__CONFIG(0x20e4);#define choose1 RC4#define choose2 RC3#define power_high RA6#define power_low RA4#define relay_w RE2#define relay_v RB5#define relay_u RA0#define data1 RD0#define clk1 RA7#define bell RD3#define power_supply RD6#define pha RB2#define phb RB3#define phc RB4#define spa RB0#define spb RB1#define up RC1#define down RC2#define up1 RD2#define down1 RC0#define safe RD7#define start RD5 #define speeder RD4 #define KDF RD1#define test_num1 1 #define test_num2 2 #define test_num3 3 #define test_num4 4 #define test_num5 5 #define test_num6 6 #define test_num7 7 #define test_num8 8 #define test_num9 9 #define test_num10 10#define test_num11 11 #define test_num12 12 #define test_num13 13 #define test_num14 14 #define test_num15 15 #define test_num16 16 #define test_num17 17 #define test_num18 18 #define test_num19 19 #define test_num20 20 #define test_num21 21 #define test_num22 22 #define test_num23 23 #define test_num24 24 #define test_num25 25 #define test_num26 26 #define test_num27 27 #define test_num28 28 #define hold 29#define stop 30#define setout 31#define test_err 32#define power 33#define TEST_5045 34#define TEST_5046 35#define TEST_5055B 36#define power1 37#define setout1 38#define setout2 39#define disp_refresh 100const uchartable[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0, 0xfe,0xf6,0xee,0xfe,0x9c,0xfc,0x9e,0x8e,2,0x10,0x 80,4};const uchartable1[]={0xfd,0x61,0xdb,0xf3,0x67,0xb7,0xbf,0xe1 ,0xff,0xf7,0xef,0xff,0x9d,0xfd,0x9f,0x8f,0x6f,0x0 d};ucharkeyvalue=1,keystate=0,keypull=0,status=setout,rcd ata1=0x55,rcdata2=0x55,rcdata3=0x55,status2=0; ucharerr_status=0,disp_run=0,ad_test=0,test15_tmp1=0,t est15_tmp2=0,test15_tmp3=0,test15_tmp4=0,disp_mod=0,disp_hold=0;uint rcdata,disp_time1=0,ad_data1,ad_data2; volatile unsigned intkeytime=0,bell_time=0,test_time=0,err_time=0,disp _time=0,tx_time=0;void disp(uchar num1,uchar num2,uchar num3); // 76usvoid disp10(uchar j); // 314usvoid keyscan(void);void key1(void);void init(void);void delaye(uint x);void outpwm(uchar x);void addisp(uint a);void addisp_8(uchar a);void disp20(uchar i,uchar j);void disp16(uint j);void err_disp(uchar j);void disp21(uchar i,uchar j);uint ad(uchar x);//3次加和一个除法 87usvoid main(){uchar tx_conut=0;init();while(1){if(status==setout1){if(disp_time>;disp_refresh){disp(table[18],table[18],table[18]);disp_time=0;}power_supply=0;power_high=0;power_low=0;relay_u=0 ;relay_v=0;relay_w=0;spa=1;spb=1;pha=1;phb=1;phc=0;up=0;down=0;safe=0; up1=0;down1=0;}else if(status==setout2){if(disp_time>;disp_refresh){disp(table[19],table[19],table[19]);disp_time=0;}power_supply=0;power_high=0;power_low=0;relay_u=0 ;relay_v=0;relay_w=0;spa=1;spb=1;pha=1;phb=1;phc=0;up=0;down=0;safe=0; up1=0;down1=0;}else if(status==setout){if(disp_time>;disp_refresh){disp(table[16],table[16],table[16]);disp_time=0;}power_supply=0;power_high=0;power_low=0;relay_u=0 ;relay_v=0;relay_w=0;spa=1;spb=1;pha=1;phb=1;phc=0;up=0;down=0;safe=0; up1=0;down1=0;// TRISC7=0;// RC7=1;// speeder=1;if(keypull==1){bell=0;bell_time=0;keypull=0;status=power1;test_time=0;}}else if(status==power1){if(status2==TEST_5055B){TRISC7=1;TXSTA=0x26;RCSTA=0x90;SPBRG=103; //4.8k波特率power_supply=1;power_high=0;power_low=0;relay_u=0 ;relay_v=0;relay_w=0;spa=1;spb=1;pha=1;phb=1;phc=0;up=0;down=0;safe=0; up1=0;down1=0;speeder=1;if(tx_time>;50&&TRMT==1){if(tx_conut==0){TXREG=0xfe;tx_time=0;tx_conut=1;}else if(tx_conut==1){TXREG=0xfd;tx_time=0;tx_conut=2;}else if(tx_conut==2){TXREG=0xfc;tx_time=0;tx_conut=3;}else if(tx_conut==3){TXREG=0xfb;tx_time=0;tx_conut=4;}else if(tx_conut==4){TXREG=0xfa;tx_time=0;tx_conut=0;}}if(rcdata1==0xaa)status=power;if(test_time>;1500)status=setout2; }elseif(status2==TEST_5046||status2==TEST_5045)status= power;}else if(status==power){power_supply=1;power_high=0;power_low=0;relay_u=0 ;relay_v=0;relay_w=0;spa=1;spb=1;pha=1;phb=1;phc=0;up=0;down=0;safe=0; up1=0;down1=0;if(disp_time>;disp_refresh){disp(table[17],table[17],table[17]);disp_time=0;}if(status2==TEST_5046||status2==TEST_5045){TRISC7=0;RC7=1;speeder=1;}if(keypull==1){bell=0;bell_time=0;keypull=0;status=test_num1;TRISC7=1;TXSTA=0x26;RCSTA=0x90;SPBRG=103; //4.8k波特率test_time=0;disp_run=1;disp_time1=0;ad_test=1;ADCON0=0x85; //通道1ADCON1=0x50;}}else if(status==test_num1){spa=1;spb=1;pha=1;phb=1;phc=1;up=1;down=1;safe=1;up1=0;down1=0;power_supply=1;power_high=0;power_low=0;relay_u=0 ;relay_v=0;relay_w=0;speeder=1;if(test_time>;100&&test_time;1000){status=test_err;err_status=1;err_time=0;disp_hold=1;}}else if(status==test_num2){spa=0;spb=0;pha=0;phb=0;phc=0;up=0;down=0;safe=0; up1=0;down1=0;power_supply=1;power_high=0;power_low=0;relay_u=0 ;relay_v=0;relay_w=0;speeder=1;if(test_time>;100&&test_time;1000){status=test_err;err_status=2;err_time=0;disp_hold=1;}}else if(status==test_num3){if(status2==TEST_5046){spa=1;spb=1;pha=1;phb=0;phc=0;up=1;down=1;safe=1; up1=1;down1=1;power_supply=1;power_high=0;power_low=0;relay_u=0 ;relay_v=0;relay_w=0;speeder=1;if(test_time>;100&&test_time;1000){status=test_err;err_status=3;err_time=0;disp_hold=1;}}else if(status2==TEST_5055B||status2==TEST_5045) {outpwm(200);test_time=0;status=test_num5;}}else if(status==test_num4){spa=0;spb=0;pha=0;phb=0;phc=0;up=0;down=0;safe=0; up1=0;down1=0;power_supply=1;power_high=0;power_low=0;relay_u=0 ;relay_v=0;relay_w=0;speeder=1;if(test_time>;100&&test_time;1000){status=test_err;err_status=4;err_time=0;disp_hold=1;}}else if(status==test_num5){speeder=0;power_supply=1;power_high=0;power_low=0 ;relay_u=0;relay_v=0;relay_w=0;spa=1;spb=0;pha=0;phb=0;phc=0;up=0;down=0;safe=0; up1=0;down1=0;if(test_time>;100&&test_time;172&&rcdata1;172&&rc data2;172&&rcdata3;1000){status=test_err;err_status=5;err_time=0;disp_hold=1;}}else if(status==test_num6){speeder=0;power_supply=1;power_high=0;power_low=0 ;relay_u=0;relay_v=0;relay_w=0;spa=1;spb=0;pha=0;phb=0;phc=0;up=0;down=0;safe=0; up1=0;down1=0;if(test_time>;100&&test_time;101&&rcdata1;101&&rc data2;101&&rcdata3;1000){status=test_err;err_status=6;err_time=0;disp_hold=1;}}else if(status==test_num7){speeder=0;power_supply=1;power_high=0;power_low=0 ;relay_u=0;relay_v=0;relay_w=0;spa=1;spb=0;pha=0;phb=0;phc=0;up=0;down=0;safe=0; up1=0;down1=0;if(test_time>;100&&test_time;70&&rcdata1;70&&rcda ta2;70&&rcdata3;1000){status=test_err;err_status=7;err_time=0;disp_hold=1;}}else if(status==test_num8){speeder=0;power_supply=1;power_high=0;power_low=0 ;relay_u=0;relay_v=0;relay_w=0;spa=1;spb=0;pha=0;phb=0;phc=0;up=0;down=0;safe=0; up1=0;down1=0;if(test_time>;100&&test_time;14&&rcdata1;14&&rcda ta2;14&&rcdata3;1000){status=test_err;err_status=8;err_time=0;disp_hold=1;}}else if(status==test_num9) //2.4---2.53{if(test_time;=200&&test_time;=500&&test_time;=500 &&test_time;500&&ad_data1;500&&ad_data2;=1100) {status=test_err;err_status=9;err_time=0;ADON=0;ad_test=0;disp_mod=1;}}}else if(status==test_num10){if(test_time;=200&&test_time;=500&&test_time;=500 &&test_time;500&&ad_data1;500&&ad_data2;=1100) {status=test_err;err_status=10;err_time=0;ADON=0;ad_test=0;disp_mod=1;}}}else if(status==test_num11){if(test_time;=200&&test_time;=500&&test_time;=500 &&test_time;500&&ad_data1;500&&ad_data2;=1100){status=test_err;err_status=11;err_time=0;ADON=0;ad_test=0;disp_mod=1;}}}else if(status==test_num12) //+u,-V{if(test_time;=1000&&test_time;1000){spa=0;spb=1;p ha=1;phb=0;}elseif(test_time;1005){spa=0;spb=1;pha=1;phb=1;}elseif(test_time;1015){spa=0;spb=1;pha=1;phb=0;}ad_data1=0;}elseif(test_time>;=1100&&test_time;1100&&test_time;14 00&&ad_data1>;473&&ad_data1;2200){status=test_err;err_status=12;err_time=0;// SPEN=0;// CREN=0;// TRISC7=0;// RC7=1;ADON=0;ad_test=0;disp_mod=1;}}}else if(status==test_num13) //+U,-v{if(test_time;=1000&&test_time;1000){spa=0;spb=1;p ha=1;phb=0;}elseif(test_time;1005){spa=0;spb=1;pha=1;phb=1;}elseif(test_time;1015){spa=0;spb=1;pha=1;phb=0;}ad_data1=0;}elseif(test_time>;=1100&&test_time;1100&&test_time;14 00&&ad_data1>;534&&ad_data1;2200){status=test_err;err_status=13;err_time=0;// SPEN=0;// CREN=0;// TRISC7=0;// RC7=1;ADON=0;ad_test=0;disp_mod=1;}}}else if(status==test_num14) //+v,-U{if(test_time;=1000&&test_time;1000){spa=0;spb=1;p ha=1;phb=0;}elseif(test_time;1005){spa=0;spb=1;pha=1;phb=1;}elseif(test_time;1015){spa=0;spb=1;pha=1;phb=0;}}else if(test_time>;=1100&&test_time;1100){spa=1;spb=1;pha=0;phb=1;power_supply=1;power_high=1;power_low=0;relay_u=1 ;relay_v=0;relay_w=0;speeder=0;phc=0;up=0;down=0;safe=0;up1=0;down1=0;if(test_time>;1400&&ad_data1>;473&&ad_data1;2200) {status=test_err;err_status=14;err_time=0;// SPEN=0;// CREN=0;// TRISC7=0;// RC7=1;ADON=0;ad_test=0;disp_mod=1;}}}else if(status==test_num15) //+V,-u{if(test_time;=1000&&test_time;1000){spa=0;spb=1;p ha=1;phb=0;}elseif(test_time;1005){spa=0;spb=1;pha=1;phb=1;}elseif(test_time;1015){spa=0;spb=1;pha=1;phb=0;} }elseif(test_time>;=1100&&test_time;1100&&test_time;14 00&&ad_data1>;534&&ad_data1;2200){status=test_err;err_status=15;err_time=0;// SPEN=0;// CREN=0;/// TRISC7=0;// RC7=1;ADON=0;ad_test=0;disp_mod=1;}}}else if(status==test_num16) //-W,+v{if(test_time;=1000&&test_time;1000){spa=0;spb=1;p ha=1;phb=0;}elseif(test_time;1005){spa=0;spb=1;pha=1;phb=1;}elseif(test_time;1015){spa=0;spb=1;pha=1;phb=0;} }elseif(test_time>;=1100&&test_time;1100&&test_time;14 00&&ad_data1>;473&&ad_data1;2200){status=test_err;err_status=16;err_time=0;// SPEN=0;// CREN=0;// TRISC7=0;// RC7=1;ADON=0;ad_test=0;disp_mod=1;}}}else if(status==test_num17) //+W-v{if(test_time;=1000&&test_time;1000){spa=0;spb=1;p ha=1;phb=0;}elseif(test_time;1005){spa=0;spb=1;pha=1;phb=1;}elseif(test_time;1015){spa=0;spb=1;pha=1;phb=0;}ad_data1=0;}else if(test_time>;=1100&&test_time;1100){spa=1;spb=1;pha=0;phb=0;power_supply=1;power_high=0;power_low=1;relay_u=0 ;relay_v=0;relay_w=1;speeder=0;phc=0;up=0;down=0;safe=0;up1=0;down1=0;if(test_time>;1400&&ad_data1>;534&&ad_data1;2200) {status=test_err;err_status=17;err_time=0;// SPEN=0;// CREN=0;// TRISC7=0;// RC7=1;ADON=0;ad_test=0;disp_mod=1;}}}else if(status==test_num18) //+v,-U{if(test_time;=1000&&test_time;1000){spa=0;spb=1;p ha=1;phb=0;}elseif(test_time;1005){spa=0;spb=1;pha=1;phb=1;}elseif(test_time;1015){spa=0;spb=1;pha=1;phb=0;}ad_data1=0;}else if(test_time>;=1100&&test_time;1100){spa=1;spb=1;pha=0;phb=1;power_supply=1;power_high=1;power_low=0;relay_u=1 ;relay_v=0;relay_w=0;speeder=0;phc=0;up=0;down=0;safe=0;up1=0;down1=0;if(test_time>;1400&&rcdata1>;115&&rcdata1;2200) {status=test_err;err_status=18;err_time=0;SPEN=0;CREN=0;// TRISC7=0;// RC7=1;// ADON=0;// ad_test=0;}}}else if(status==test_num19) //+U,-v{if(test_time;=1000&&test_time;1000){spa=0;spb=1;p ha=1;phb=0;}elseif(test_time;1005){spa=0;spb=1;pha=1;phb=1;}elseif(test_time;1015){spa=0;spb=1;pha=1;phb=0;}ad_data1=0;}elseif(test_time>;=1100&&test_time;1100&&test_time;14 00&&rcdata1>;130&&rcdata1;2200){status=test_err;err_status=19;err_time=0;SPEN=0;CREN=0;// TRISC7=0;// RC7=1;// ADON=0;}}}else if(status==test_num20) //-W,+v{if(test_time;=1000&&test_time;1000){spa=0;spb=1;pha=1;phb=0;}else if(test_time;1005){spa=0;spb=1;pha=1;phb=1;} else if(test_time;1015){spa=0;spb=1;pha=1;phb=0;} ad_data1=0;}elseif(test_time>;=1100&&test_time;1100&&test_time;1400&&rcdata1>;115&&rcdata1;2200){status=test_err;err_status=20;err_time=0;SPEN=0;CREN=0;// RC7=1;// ADON=0;// ad_test=0;}}}else if(status==test_num21) //+W-v{if(test_time;=1000&&test_time;1000){spa=0;spb=1;p ha=1;phb=0;}elseif(test_time;1005){spa=0;spb=1;pha=1;phb=1;}elseif(test_time;1015){spa=0;spb=1;pha=1;phb=0;}ad_data1=0;}else if(test_time>;=1100&&test_time;1100){spa=1;spb=1;pha=0;phb=0;power_supply=1;power_high=0;power_low=1;relay_u=0 ;relay_v=0;relay_w=1;speeder=0;phc=0;up=0;down=0;safe=0;up1=0;down1=0;if(test_time>;1400&&rcdata1>;130&&rcdata1;2200) {status=test_err;err_status=21;err_time=0;SPEN=0;CREN=0;// TRISC7=0;// RC7=1;// ADON=0;// ad_test=0;}}}else if(status==test_num22){if(status2==TEST_5055B){if(test_time;900&&test_time;700&&ad_data1>;490&&a d_data1;1500){status=test_err;err_status=22;err_time=0;ADON=0;ad_test=0;disp_mod=1;}}elseif(status2==TEST_5046||status2==TEST_5045)status= test_num26;}else if(status==test_num23){if(test_time;900&&test_time;700&&ad_data1>;490&&a d_data1;1500){status=test_err;err_status=23;err_time=0;ADON=0;ad_test=0;disp_mod=1;}}else if(status==test_num24){if(test_time;900&&test_time;700&&ad_data1>;490&&a d_data1;1500){status=test_err;err_status=24;err_time=0;ADON=0;ad_test=0;disp_mod=1;}}else if(status==test_num25){if(test_time;900&&test_time;700&&ad_data1>;490&&a d_data1;1500){status=test_err;err_status=25;err_time=0;ADON=0;ad_test=0;disp_mod=1;}}else if(status==test_num26){speeder=0;power_supply=1;power_high=0;power_low=0 ;relay_u=0;relay_v=0;relay_w=0;speeder=0;KDF=0; spa=1;spb=0;pha=1;phb=0;if(test_time>;100&&test_time;240&&rcdata;1000) {status=test_err;err_status=26;err_time=0;disp_hold=1;}}else if(status==test_num27){speeder=0;power_supply=1;power_high=0;power_low=0 ;relay_u=0;relay_v=0;relay_w=0;speeder=0;KDF=0; spa=1;spb=0;pha=0;phb=1;if(test_time>;200&&test_time;220&&rcdata;400) {status=test_err;err_status=27;err_time=0;SPEN=0;CREN=0;// TRISC7=0;// RC7=1;// ADON=0;}}else if(status==test_num28){if(status2==TEST_5046){disp_run=0;power_supply=1;power_high=0;power_low= 0;relay_u=0;relay_v=0;relay_w=0;speeder=0;KDF=0; spa=0;spb=0;pha=0;phb=1;test15_tmp3=rcdata1;test15_tmp4=rcdata2;if(test_time>;100){if((test15_tmp3&0x20)==0)test15_tmp1=test15_tmp3; else test15_tmp2=test15_tmp3;if((test15_tmp4&0x20)==0)test15_tmp1=test15_tmp4; else test15_tmp2=test15_tmp4;disp20(test15_tmp1,test15_tmp2);}}else if(status2==TEST_5045){disp_run=0;power_supply=1;power_high=0;power_low= 0;relay_u=0;relay_v=0;relay_w=0;speeder=0;KDF=0; spa=0;spb=0;pha=0;phb=1;test15_tmp3=rcdata1;test15_tmp4=rcdata2;if(test_time>;100){if((test15_tmp3&0x20)==0)test15_tmp1=test15_tmp3; else test15_tmp2=test15_tmp3;if((test15_tmp4&0x20)==0)test15_tmp1=test15_tmp4; else test15_tmp2=test15_tmp4;disp21(test15_tmp1,test15_tmp2);test_time=0;}}else if(status2==TEST_5055B)status=setout1;}else if(status==test_err){disp_run=0;//power_supply=0;power_high=0;power_low=0;relay_u=0 ;relay_v=0;relay_w=0;speeder=0;KDF=0;speeder=0; if(disp_hold==1){if(err_status==26){power_supply=1;power_high=0;power_low=0;relay_u= 0;relay_v=0;relay_w=0;speeder=0;KDF=0;speeder=0;} else{power_supply=1;power_high=0;power_low=0;relay_u= 0;relay_v=0;relay_w=0;speeder=0;KDF=0;speeder=1;} }if(disp_hold==0){power_supply=0;power_high=0;power_low=0;relay_u= 0;relay_v=0;relay_w=0;speeder=0;KDF=0;speeder=0;} if(err_time;disp_refresh){err_disp(err_status);disp_time=0;}}else if(err_time;1000){if(disp_time>;disp_refresh){if(disp_mod==1){addisp(ad_data1);disp_time=0;}else{disp10(rcdata1);disp_time=0;}}}else if(err_time>;2000)err_time=0; }}}void init(){/*PORTA *//*RA0 relay_w 0 *//*RA1 vol 1 *//*RA2 +5V 1 *//*RA3 TYJ 1 *//*RA4 power_low 0 *//*RA5 SX 1 *//*RA6 power_high 0 *//*RA7 CLK1 0 */TRISA=0x2e; //0010 1110ANSEL=0x7e; //模拟输入PORTA=0;/*PORTB *//*RB0 SPA *//*RB1 SPB *//*RB2 PHA *//*RB3 PHB *//*RB4 PHC *//*RB5 ralay_v *//*RB6 CLK *//*RB7 DATA */TRISB=0xc0; //1100 0000,rb0--rb5输出,rb6、rb7输入PORTB=0;/*PORTC *//*RC0 DOWN1 *//*RC1 UP *//*RC2 DOWN *//*RC3 choose2 *//*RC4 choose1 *//*RC5 PWM *//*RC6 TXD *//*RC7 RXD */TRISC=0x58; //0101 1000PORTC=0x80; //1000 0000/*PORTD*//*RD0 DATA1 *//*RD1 KFD *//*RD2 up1 *//*RD3 bell *//*RD4 speeder *//*RD5 start *//*RD6 power_supply *//*RD7 safe */TRISD=0x20; //0010 0000PORTD=0x18; //0001 1000/*PORTE*//*RE0 DF *//*RE1 JX *//*RE2 relay_u *//*RE3 VPP */TRISE=0xb; //0000 1011,全输入RE2=0;OSCCON=0xfe; //时钟选择8mhz,内部振荡器VLCDEN=0;OPTION=0xc3;LCDEN=0;CMCON0=7;CCP2CON=0;ADCON1=0x50;TMR0=7;PEIE=1;T0IE=1;GIE=1;if(choose1==0&&choose2==1)status2=TEST_5045; if(choose1==1&&choose2==1)status2=TEST_5046; if(choose1==1&&choose2==0)status2=TEST_5055B; }void keyscan(){if(!start&&keyvalue){keyvalue=0;keytime=0;}if(start&&!keyvalue){keyvalue=1;keytime=0;}}void key1(){if(keystate==0){if(keyvalue==0&&keytime>;10) {keystate=1;keypull=1;keytime=0;}}else if(keystate==1){if(keyvalue==1&&keytime>;10) {keystate=0;keytime=0;}}else keystate=0;}void interrupt tm0(){uint int_i;if(bell_time>;50)bell=1; if(T0IF){keyscan();key1();keytime++;bell_time++;err_time++;test_time++;disp_time++;disp_time1++;tx_time++;if(ad_test==1){if(GODONE==0){// ad_data3=ad_data2; ad_data2=ad_data1;int_i=ADRESH;ad_data1=ADRESL|int_i;110)disp_time=0; if(disp_time1==100){disp10(status);disp_time1=0;}}T0IF=0;TMR0=7;}}void disp(uchar num1,uchar num2,uchar num3) {uchar i;uchar num_tmp1,num_tmp2;// cs1=0; //关闭显示// clr=0; //清除74ls164数据// clr=1;clk1=0; //上升沿移位num_tmp1=num1;for(i=8;i>;0;i--){num_tmp2=num_tmp1;num_tmp2=num_tmp2&0x01; if(num_tmp2==1)data1=1;elsedata1=0;clk1=1;clk1=0;num_tmp1=num_tmp1>;>;1; }num_tmp1=num2;for(i=8;i>;0;i--){num_tmp2=num_tmp1;num_tmp2=num_tmp2&0x01; if(num_tmp2==1)data1=1;elsedata1=0;clk1=1;clk1=0;。
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、编程语言选择:选择适合单片机的编程语言,如汇编语言、C语言等。
3、程序架构设计:根据功能需求和编程语言,设计出合理的程序框架和算法流程。
二、源代码编写源代码编写是单片机编程的第二步,如同外交领域的拟定草案一样,程序员必须将前面制定的程序设计方案转化为实际可用的计算机程序。
在源代码编写阶段,需要按照设计方案,利用所选的编程语言,编写出相应的源代码。
源代码编写阶段的任务包括:1、语言语法:根据选定的编程语言语法规则,编写程序源代码。
2、程序注释:注释的编写是编写源代码的重要环节之一,它用于描述程序设计的原理、算法和对程序中某一行或块的功能描述,方便其他程序员或自己查看代码时快速了解程序。
3、代码风格与规范:在源代码编写的过程中,需要遵守一定的代码风格和规范,使得代码易于维护和阅读。
三、代码调试代码调试是单片机编程的第三步,它是指通过调试工具,在单片机上运行程序,并观察程序的运行结果,进行调试或优化代码。
在代码调试阶段,需要将编写好的源代码下载到单片机中,通过调试工具对程序进行调试和测试,找出程序中出现的错误或问题,并进行修复或调整。
代码调试阶段的任务包括:1、单步执行:通过单步执行功能,一步一步对程序进行调试,观察程序运行的结果,找出程序中的错误。
单片机原理及应用实验代码 -回复
单片机原理及应用实验代码-回复什么是单片机?单片机(Microcontroller,简称MCU)是一种集成了处理器、存储器和输入输出设备的微型计算机系统。
它具有体积小、功耗低、可编程性强等特点,被广泛应用于嵌入式系统和电子产品中。
单片机的基本原理单片机系统由CPU、存储器和输入输出设备等部分组成。
CPU是单片机的核心,它负责处理数据和控制系统的运行。
存储器包括程序存储器(ROM)和数据存储器(RAM),分别用于存储程序和数据。
输入输出设备用于与外部环境进行通信。
单片机主要靠程序来控制其内部运行。
程序是通过编程语言编写的一系列指令,通过存储器加载到单片机中。
单片机按照程序中的指令逐条执行,完成各种任务。
应用实验代码下面,我将为你介绍一些基本的单片机应用实验,并给出相应的代码示例:1. 点亮LED实验这是最基础的单片机应用实验之一。
通过编写程序控制单片机输出电平,从而点亮LED。
代码示例:include <reg52.h>sbit LED = P1^0; 定义LED连接的IO口void main(){LED = 0; 将LED引脚置低,点亮LEDwhile(1){无限循环,保持LED亮}}2. 数码管显示实验数码管是一种常见的输出设备,可用于显示数字和字符。
通过编写程序控制单片机输出电平,实现数码管上数字的显示。
代码示例:include <reg52.h>sbit SDA = P1^0; 定义SDA引脚sbit SCL = P1^1; 定义SCL引脚void delay(unsigned int x){unsigned int i, j;for(i = 0; i < x; i++){for(j = 0; j < 500; j++){空循环延时,具体时间根据单片机时钟频率确定}}}void IIC_Start(){SDA = 1;SCL = 1;SDA = 0;delay(5);SCL = 0;}void IIC_Stop(){SDA = 0;SCL = 1;SDA = 1;delay(5);}void IIC_Send_Byte(unsigned char dat){unsigned char i;for(i = 0; i < 8; i++){SDA = (dat & 0x80) >> 7;dat <<= 1;SCL = 1;SCL = 0;}}void main(){IIC_Start(); 发送起始信号IIC_Send_Byte(0x76); 发送数据,例如0x76用于控制数码管上显示的数字IIC_Stop(); 发送停止信号while(1){无限循环,保持数字的显示}}这里只是展示了两个简单的单片机实验示例,实际应用中单片机可以实现更复杂的功能,如控制电机、传感器数据处理等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第二章任务一:闪烁广告灯的设计利用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的拉幕式与闭幕式广告灯设计。
拉幕式:开始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数码管,编写程序,使数码管循环显示从0~9的加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;}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,0x8 6,0x8e};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 LED1=P2^0;sbit LED2=P2^1;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位。