用 stc12c5a60s2单片机控制颜色传感器tcs3200的程序,我做得不知为什么识别不了,

作者&投稿:本宰 (若有异议请与网页底部的电邮联系)
单片机编程语言一般有哪几种~

单片机编程语言很多,大致分成三类:机器语言、汇编语言、高级语言。机器语言由于繁琐容易出错,大部分用户已经不再便用。
1.单片机的汇编语言
汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。其主要优点是占用资源少,程序执行效率高,由于它一条指令就对应一条机器码,每一步的执行动作都很清楚,并且程序大小和堆栈调用情况都容易控制,调试起来也比较方便。但是不同的类型的单片机,其汇编语言可能有点差异,所以不易移植,因为他们的指令系统是有区别的。但懂得汇编语言可帮助了解影响川可语言效率的特殊规定。例如,懂得汇编语言指令就可以便用在片内ram作变量的优势,因为片外变量需要几条指令才能设署累加器和数据指针进行存取。同样的,当要求便用浮点数和启用函数时也只有具备汇编编程经验才能避免生成庞大的、效率低的程序,对于这方面的编程,没有汇编语言是做不到的。
2.单片机的C语言
单片机的C语言是一种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备汇编语言的功能。C语言具有功能丰富的库函数,运算谏磨快,编译效率高,有良好的可移植性,而且可以实现直接对系统硬件的控制。此外,C语言程序具有完整的程序模块结构,从而为软件开发中栗用模块化程序设计方法提供了有力的保障。与汇编相比,有如下优点:
对单片机的指令系统不要求了解,仅要求对51的存储器结构有初步了解,至于寄存器分配、不同存储器的寻址及数据类型等细节均由编译器管理。程序有规范的结构,可分为不同的函数。这种方式可便程序结构化,将可变的选择与特殊操作组合在一起,改善了程序的可读性。
编程及程序调试时间显著缩短,从而提高效率。提供的库包含许多标准子程序,具有较强的数据处理能将已编好程序可容易的植入新程序,因为它具有方便的模块化编程技术。
功能强而有弹性,提供的库包含许多标准子程序,具有较强的数据处理能力,能将已编好程序容易的植入新程序,因为它具有方便的模块化编程技术。
单片机C语言作为一种非常方便的语言而得到广泛的支持,(语言程序本身并不依赖于机器硬件系统,基本上不做修改就可根据单片翻U均不同较快地移植过来。
用单片机c语言进行程序设计,已成为单片机软件开发的一个主流,作为一个技术全面并涉足较大规模的软件系统开发的单片机开发人员最好能够掌握基本的C语言编程。

拓展资料
单片机,全称单片微型计算机(英语:Single-Chip Microcomputer),又称微控制器(Microcontroller),是把中央处理器、存储器、定时/计数器(Timer/Counter)、各种输入输出接口等都集成在一块集成电路芯片上的微型计算机。与应用在个人电脑中的通用型微处理器相比,它更强调自供应(不用外接硬件)和节约成本。它的最大优点是体积小,可放在仪表内部,但存储量小,输入输出接口简单,功能较低。由于其发展非常迅速,旧的单片机的定义已不能满足,所以在很多应用场合被称为范围更广的微控制器;由于单芯片微电脑常用于当控制器故又名single chip microcontroller,但是目前在中国大陆仍多沿用“单片机”的称呼。

单片机编程的语言既可以用C,也可以用汇编。
用汇编的优势主要是程序可以被编程者优化,而不是由编译器优化,这样就可以绝对可控,程序的安全性和执行速度受编程者水平限制,不过总的执行速度较C语言快,代码占程序存储器的容量较C语言小。这样,汇编程序更适合程序存储器和数据存储器较小的老式单片机。但是,汇编程序毕竟是机器语言的汇编助记符,所以存在指令难记,指令功能弱的缺点,造成学习困难。
C语言的优势与缺点正好与汇编相反。C语言毕竟是一种高级语言,具有较好的学习性,几乎不必记忆指令,学习容易,而且编译时的优化由编译器管理,一般不受编程者水平限制。由于机器优化的局限性,C语言总的执行速度较汇编语言慢,代码占程序存储器的容量较汇编语言大。这样,C程序更适合程序存储器和数据存储器较大的新式单片机。
建议初学者先使用C语言快速入门,然后再研究汇编语言,优化程序设计。

1、参考网上程序或者模块提供的程序

2、仔细参读datasheet,尤其研究时序以及逻辑功能的实现

3、多动脑筋思考,学会调试程序,多百度Google。

/*模块的使用方法:把板距离白纸2CM处开机,使输出的数据位FFFFFFF(白平衡),接下来就可以正常使用
实现功能:对颜色传感器输出RGB
使用芯片:AT89S52 或者 STC89C52 或AT89S51 STC89C51
晶振:12MHZ
编译环境:Keil
作者:zhengzhongxign39*/
#include <reg52.h>
#define uchar unsigned char
#define uint  unsigned int
//==============LCD1602接口连接方法=====================
/*-----------------------------------------------------
       |DB0-----P0.0 | DB4-----P0.4 | RW-------P2.3    |
       |DB1-----P0.1 | DB5-----P0.5 | RS-------P2.4    |
       |DB2-----P0.2 | DB6-----P0.6 | E--------P2.2    |
       |DB3-----P0.3 | DB7-----P0.7 | 
    ---------------------------------------------------*/
//================================================*/              
#define LCM_Data     P0    //LCD1602数据接口
#define Busy         0x80   //用于检测LCM状态字中的Busy标识
sbit    LCM_RW     = P2^3;  //读写控制输入端,LCD1602的第五脚
sbit    LCM_RS     = P2^4;  //寄存器选择输入端,LCD1602的第四脚
sbit    LCM_E      = P2^2;  //使能信号输入端,LCD1602的第6脚

//=================颜色传感模块连接=====================
/*-----------------------------------------------------
       |EO-----GND
       |S0-----VCC | S2-----P2.0 | OUT-------P3.5 
       |S1-----VCC | S3-----P2.1 | 
  ---------------------------------------------------*/
sbit    tcs230_s2=P2^0;//TCS230 S2接单片机P2.0
sbit    tcs230_s3=P2^1;//TCS230 S3接单片机P2.1
sbit    tcs230_en=P3^0; //TCS230 EN(E0)接GND
//**************函数声明***************************************
void    WriteDataLCM                (uchar WDLCM);//LCD模块写数据
void    WriteCommandLCM        (uchar WCLCM,BuysC); //LCD模块写指令
uchar   ReadStatusLCM(void);//读LCD模块的忙标
void    DisplayOneChar(uchar X,uchar Y,uchar ASCII);//在第X+1行的第Y+1位置显示一个字符
void    LCMInit(void);//LCD初始
void    DelayMs(uint Ms);//1MS基准延时程序
void    baipingheng();//白平衡子程序
void    celiang();//实际颜色程序
uint    ryz,gyz,byz;//分别定义红色因子 绿色因子 蓝色因子
uint    rb,gb,bb;//RGB值
uchar   tab1[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
//***********************主程序******************************
main()   
{   
   TMOD=0x51;//设定T0以工作方式1定时10毫秒
   LCMInit();//LCD初始
   baipingheng();//上电时先白平衡一次
   while(1)
   {
       celiang();//颜色测试
       DisplayOneChar(0, 0,'R');//以十进制显示RGB中红色的分值
       DisplayOneChar(0, 1, rb/100+0x30); //显示百位数据
       DisplayOneChar(0, 2, rb/10%10+0x30);//显示十位数据
       DisplayOneChar(0, 3, rb%10+0x30);//显示个位数据
       DisplayOneChar(0, 5,'G');//以十进制显示RGB中绿色的分值
       DisplayOneChar(0, 6, gb/100+0x30); //显示百位数据
       DisplayOneChar(0, 7, gb/10%10+0x30);
       DisplayOneChar(0, 8, gb%10+0x30);
       DisplayOneChar(0, 10,'B');//以十进制显示RGB中蓝色的分值
       DisplayOneChar(0, 11, bb/100+0x30);
       DisplayOneChar(0, 12, bb/10%10+0x30);
       DisplayOneChar(0, 13, bb%10+0x30);
       //*****在LCD1602的第二行以16进制显示RGB*******************
       DisplayOneChar(1, 1, tab1[rb/16]); 
       DisplayOneChar(1, 2, tab1[rb%16]);
       DisplayOneChar(1, 3, 'H');
       DisplayOneChar(1, 6, tab1[gb/16]); 
       DisplayOneChar(1, 7, tab1[rb%16]);
       DisplayOneChar(1, 8, 'H');
       DisplayOneChar(1, 11,tab1[bb/16]);
       DisplayOneChar(1, 12,tab1[bb%16]);
       DisplayOneChar(1, 13,'H');
       DelayMs(250);//每隔0.25秒测试一次颜色
   }

//******************************************************
//白平衡子程序
void   celiang()
{
     //*********求R值************************************
     TH0=(65536-10000)/256;
           TL0=(65536-10000)%256;
     TH1=0;
     TL1=0;
     tcs230_s2=0;
     tcs230_s3=0;//选择红色滤光器
     tcs230_en=0;
     TR0=1;//10毫秒开始计时
     TR1=1;//开始计数
     while(TF0==0);//等待定时器溢出
     TF0=0;//清楚定时器0溢出标志
     TR0=0;//关闭定时0
     TR1=0;
     rb=(unsigned long)(TH1*256+TL1)*255/ryz;
     if(rb>255)rb=255;//判断RGB值是否合法
     //***********求B值**************************************
     TH0=(65536-10000)/256;
           TL0=(65536-10000)%256;
     TH1=0;
     TL1=0;
     tcs230_s2=0;
     tcs230_s3=1;//选择蓝色滤光器
     TR0=1;//10毫秒开始计时
     TR1=1;//开始计数
     while(TF0==0);//等待定时器溢出
     TF0=0;//清楚定时器0溢出标志
     TR0=0;//关闭定时0
     TR1=0;
     bb=(unsigned long)(TH1*256+TL1)*255/byz;
     if(bb>255)bb=255;//判断RGB值是否合法     
     //***********求G值**************************************   
     TH0=(65536-10000)/256;
           TL0=(65536-10000)%256;
     TH1=0;
     TL1=0;
     tcs230_s2=1;
     tcs230_s3=1;//选择绿色滤光器
     TR0=1;//10毫秒开始计时
     TR1=1;//开始计数
     while(TF0==0);//等待定时器溢出
     TF0=0;//清楚定时器0溢出标志
     TR0=0;//关闭定时0
     TR1=0;
     tcs230_en=1;
     gb=(unsigned long)(TH1*256+TL1)*255/gyz;
     if(gb>255)gb=255;//判断RGB值是否合法  
}
//******************************************************
//白平衡子程序
void    baipingheng()
{
     //**************求取红色因子***********************
     TH0=(65536-10000)/256;
           TL0=(65536-10000)%256;
     TH1=0;
     TL1=0;
     tcs230_s2=0;
     tcs230_s3=0;//选择红色滤光器
     tcs230_en=0;
     TR0=1;//10毫秒开始计时
     TR1=1;//开始计数
     while(TF0==0);//等待定时器溢出
     TF0=0;//清楚定时器0溢出标志
     TR0=0;//关闭定时0
     TR1=0;
     ryz=TH1*256+TL1;//其实这里的比例因子应该为255/(TH1*256+TL1)
     //**************求取蓝色因子***********************
     TH0=(65536-10000)/256;
           TL0=(65536-10000)%256;
     TH1=0;
     TL1=0;
     tcs230_s2=0;
     tcs230_s3=1;//选择蓝色滤光器
     TR0=1;//10毫秒开始计时
     TR1=1;//开始计数
     while(TF0==0);//等待定时器溢出
     TF0=0;//清楚定时器0溢出标志
     TR0=0;//关闭定时0
     TR1=0;
     byz=TH1*256+TL1;//其实这里的比例因子应该为255/(TH1*256+TL1)
     //**************求绿红色因子***********************
     TH0=(65536-10000)/256;
           TL0=(65536-10000)%256;
     TH1=0;
     TL1=0;
     tcs230_s2=1;
     tcs230_s3=1;//选择绿色滤光器
     TR0=1;//10毫秒开始计时
     TR1=1;//开始计数
     while(TF0==0);//等待定时器溢出
     TF0=0;//清楚定时器0溢出标志
     TR0=0;//关闭定时0
     TR1=0;
     tcs230_en=1;
     gyz=TH1*256+TL1;//其实这里的比例因子应该为255/(TH1*256+TL1)
}
/*======================================================================
 LCM初始化
其他程序网上自己找找参照


修好引脚 1602需要加一个103的电位器

3 创作背景

gcs




茂南区19138862410: 单片机STC12C5A60S2编程的头文件是什么? -
暴追胃刻: 你好! 很高兴为你解答,STC12C5A60S2也可以用89C52的,不过就是少了很多寄存器的地址说明,建议你将reg52.h这个头文件复制出来,在加上stc12c5a60s2的一些特殊寄存器的地址声明,然后改名为stc12c5a60s2.h(自己取名字)就可以了 ,希望我的回答对你有帮助!

茂南区19138862410: 用STC12C5A60S2单片机做矩阵键盘 -
暴追胃刻: 当然可以,与其他51单片机一样,没有区别,你的问题不是出在IO,出在延时上,最好数码管显示用定时器控制,这样才不会受延时程序的影响.

茂南区19138862410: 用stc12c5a60s2单片机实现1s延时 -
暴追胃刻: //12M晶振下1秒延时 void delay1s(void) { unsigned char a,b,c; for(c=182;c>0;c--) for(b=164;b>0;b--) for(a=99;a>0;a--); }

茂南区19138862410: 怎么用STC12C5a60s2自带的AD,单片机,C程序,具体如下图所述,互帮互助 -
暴追胃刻: stc12c5a60s2的datasheet有测试程序,从319页开始.主要是这几个寄存器 P1.0作为AD输入 初始值为: P1ASF=0x01;//P1.0作为AD使用 ADC_CONTR=0xe0;//ADC电源打开,每90个时钟转换1次,CHS选择P1.0 //默认为8位...

茂南区19138862410: STC12C5A60S2单片机寄存器怎么用?STC12C5A60
暴追胃刻: #include #define U8 unsigned char #define U16 unsigned int void DelayMs(U8 ms); ... i 3/CEX0/PCA0/PWM0(STC12C5A60S2系列) sfr CCAPM1 = 0xDB; //PCA模块1模式...

茂南区19138862410: STC12C5A60S2单片机串口接收数据 -
暴追胃刻: 定时器1设置波特率,与接收多少个字节没有关系,接收一个,几百个,就是不停地接收,只要波特率不变,设置的时间常数就不用变.至于接收多少字节为一帧数据,也不是用定器1来控制来计数的,它只管波特率.要控制接收多少字节,用一个变量计数.对于这种按帧来发送/接收的数据包,都应该有一个起始字节(固定的特殊的字节),当接收到起始字节就开始计数,算起始字节共接收到15个,就设置一个标志位,表示一帧接收结束.然后主程序查询到标志位后进行执行处理.这种以帧为一个数据包字的节数也不是固定的,所以,网上的例程也不过是个例程而已,不是拿来就直接用的,需要根据实际做适当修改的.哪有什么都照搬的.

茂南区19138862410: STC12C5A60S2的介绍 -
暴追胃刻: 在众多的51系列单片机中,要算国内STC 公司的1T增强系列更具有竞争力,因他不但和8051指令、管脚完全兼容,而且其片内的具有大容量程序存储器且是FLASH工艺的,如STC12C5A60S2单片机内部就自带高达60K FLASHROM,这种工艺的存储器用户可以用电的方式瞬间擦除、改写.而且STC系列单片机支持串口程序烧写.显而易见,这种单片机对开发设备的要求很低,开发时间也大大缩短.写入单片机内的程序还可以进行加密,这又很好地保护了你的劳动成果.

茂南区19138862410: 51单片机初学者 用什么STC的单片机? -
暴追胃刻: 不知道你干么使,推荐你用STC12C5A60S2,这款单片机资源比较丰富,有2个外部中断,2个串口,4个定时器,其中2个可做PWM,一个SPI,8路12位AD.

茂南区19138862410: 求一个使用STC12C5A60S2单片机的串口1向STC - ISP串口助手发送abcd字符串的程序 -
暴追胃刻: //串口通信 头文件 void Usart_Init() ; //串口初始化(11.0592MHZ晶振.9600波特率) void Usar_sent(unsigned char dat) ; // 串口发送数据 //unsigned char Usar_read() ; // 串口接受数据 void Usart_Init() {SCON=0X50; PCON=0X80; ...

茂南区19138862410: 可否用 STC12C5A60S2单片机内部PWM 做到这个频率? TH0 = 0xfe; TL0 = 0x33; //11.0592MHZ晶振, 0.5ms -
暴追胃刻: //初始化 void PWM_init (void) { CMOD=0x82; // 这里应该这样设置 PWM 频率 = fosc/(256*2)// CMOD=0x8a; // 这里应该这样设置 PWM 频率 = fosc/(256*4)// CMOD=0x8c; // 这里应该这样设置 PWM 频率 = fosc/(256*6)// CMOD=0x8e; // 这里...

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